Skip to content

Commit dd46bbc

Browse files
committed
Add lib-srcs to show all sources mentioned in rules.
Counter part of `lib-headers` that now also is accessible via `lib-hdrs` for symmetry and brevity (and deprecating the `lib-headers` command).
1 parent 67456aa commit dd46bbc

File tree

5 files changed

+67
-2
lines changed

5 files changed

+67
-2
lines changed

bant/bant.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ Commands (unique prefix sufficient):
128128
→ 2 column table: (target, dependency*)
129129
has-dependent : List cc library targets and the libraries that depend on it
130130
→ 2 column table: (target, dependent*)
131-
lib-headers : Print headers provided by cc_library()s matching pattern.
131+
lib-hdrs : Print headers provided by cc_library()s matching pattern.
132132
→ 2 column table: (header-filename, cc-library-target)
133+
lib-srcs : Print sources provided by cc_library()s matching pattern.
134+
→ 2 column table: (source-filename, cc-library-target)
133135
genrule-outputs: Print generated files by genrule()s matching pattern.
134136
→ 2 column table: (filename, genrule-target)
135137

bant/cli-commands.cc

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ enum class Command {
6868
kListLeafs,
6969
kListWorkkspace,
7070
kLibraryHeaders,
71+
kLibrarySources,
7172
kAliasedBy,
7273
kGenruleOutputs,
7374
kDWYU,
@@ -210,6 +211,7 @@ CliStatus RunCommand(Session &session, Command cmd,
210211
case Command::kDWYU:
211212
case Command::kParse:
212213
case Command::kLibraryHeaders:
214+
case Command::kLibrarySources:
213215
case Command::kGenruleOutputs:
214216
case Command::kListTargets:
215217
case Command::kListLeafs:
@@ -274,6 +276,12 @@ CliStatus RunCommand(Session &session, Command cmd,
274276
ExtractHeaderToLibMapping(project, session.info()));
275277
break;
276278

279+
case Command::kLibrarySources: //
280+
bant::PrintProvidedSources(
281+
session, "source", print_pattern,
282+
ExtractSourceToLibMapping(project, session.info()));
283+
break;
284+
277285
case Command::kGenruleOutputs:
278286
bant::PrintProvidedSources(
279287
session, "generated-file", print_pattern,
@@ -377,7 +385,9 @@ CliStatus RunCliCommand(Session &session, std::span<std::string_view> args) {
377385
{"list-targets", Command::kListTargets},
378386
{"list-leafs", Command::kListLeafs},
379387
{"workspace", Command::kListWorkkspace},
380-
{"lib-headers", Command::kLibraryHeaders},
388+
{"lib-hdrs", Command::kLibraryHeaders},
389+
{"lib-headers", Command::kLibraryHeaders}, // deprecated
390+
{"lib-srcs", Command::kLibrarySources},
381391
{"aliased-by", Command::kAliasedBy},
382392
{"depends-on", Command::kDependsOn},
383393
{"has-dependents", Command::kHasDependents},

bant/explore/header-providers.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ static void IterateCCLibraryHeaders(const ParsedBuildFile &build_file,
112112
// Unfortunately, grpc does not simply have a cc_library(), but its own
113113
// rule or macro, making it invisible if we just look at cc_library.
114114
// Hacking it up here to look also for the grpc version.
115+
// TODO: this might be doable with macros these days ?
115116
static const std::initializer_list<std::string_view> kInterestingLibRules{
116117
"cc_library",
117118
"grpc_cc_library",
@@ -336,6 +337,35 @@ ProvidedFromTargetSet ExtractHeaderToLibMapping(const ParsedProject &project,
336337
return result;
337338
}
338339

340+
static void AppendCCLibrarySources(const ParsedBuildFile &build_file,
341+
std::ostream &info_out,
342+
ProvidedFromTargetSet &result) {
343+
query::FindTargets(
344+
build_file.ast, {"cc_library"}, [&](const query::Result &cc_lib) {
345+
auto cc_library = build_file.package.QualifiedTarget(cc_lib.name);
346+
if (!cc_library.has_value()) return;
347+
348+
auto srcs = query::ExtractStringList(cc_lib.srcs_list);
349+
for (const std::string_view src : srcs) {
350+
const std::string src_fqn = build_file.package.QualifiedFile(src);
351+
result[src_fqn].emplace(*cc_library);
352+
}
353+
});
354+
}
355+
356+
ProvidedFromTargetSet ExtractSourceToLibMapping(const ParsedProject &project,
357+
std::ostream &info_out) {
358+
ProvidedFromTargetSet result;
359+
360+
for (const auto &[_, build_file] : project.ParsedFiles()) {
361+
if (!build_file->ast) continue;
362+
363+
AppendCCLibrarySources(*build_file, info_out, result);
364+
}
365+
366+
return result;
367+
}
368+
339369
ProvidedFromTarget ExtractGeneratedFromGenrule(const ParsedProject &project,
340370
std::ostream &info_out,
341371
bool suffix_index) {

bant/explore/header-providers.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ ProvidedFromTargetSet ExtractHeaderToLibMapping(const ParsedProject &project,
4848
std::ostream &info_out,
4949
bool suffix_index = false);
5050

51+
// Similar for sources. Much simpler, as we don't deal with multiple search
52+
// paths. Mostly just for printing.
53+
ProvidedFromTargetSet ExtractSourceToLibMapping(const ParsedProject &project,
54+
std::ostream &info_out);
55+
5156
// Find all the output generated by genrules. Should really only be 1:1.
5257
// If "suffix_index" is set, output is compatible with FinxBySuffix().
5358
ProvidedFromTarget ExtractGeneratedFromGenrule(const ParsedProject &project,

bant/explore/header-providers_test.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,24 @@ cc_library(
103103
Ts("//prefix/dir:baz"))));
104104
}
105105

106+
// Sources are much simpler. Just matter-of-fact, no include path fiddling.
107+
TEST(SourceToLibMapping, CCRuleExtraction) {
108+
ParsedProjectTestUtil pp;
109+
pp.Add("//some/path", R"(
110+
cc_library(
111+
name = "foo",
112+
srcs = ["foo.cc", "bar.cc"],
113+
hdrs = ["foo.h"]
114+
)
115+
)");
116+
std::stringstream log_absorb;
117+
auto srcs_map = ExtractSourceToLibMapping(pp.project(), log_absorb);
118+
EXPECT_THAT(srcs_map,
119+
Contains(Pair("some/path/foo.cc", Ts("//some/path:foo"))));
120+
EXPECT_THAT(srcs_map,
121+
Contains(Pair("some/path/bar.cc", Ts("//some/path:foo"))));
122+
}
123+
106124
TEST(HeaderToLibMapping, InludePathsAreRelativePathCanonicalized) {
107125
ParsedProjectTestUtil pp;
108126
pp.Add("//", R"(

0 commit comments

Comments
 (0)