Skip to content

Commit c20e3dc

Browse files
committed
Make lib-hdrs and lib-srcs the simple output; lib-headers all reachable paths.
lib-headers emits all reachable ways how to get to a header (e.g. due to `includes = []`, while lib-hdrs and lib-srcs just plainly emit all the direct paths.
1 parent d717f1e commit c20e3dc

File tree

6 files changed

+72
-49
lines changed

6 files changed

+72
-49
lines changed

bant/bant.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ Commands (unique prefix sufficient):
135135
→ 2 column table: (header-filename, cc-library-target)
136136
lib-srcs : Print sources provided by cc_library()s matching pattern.
137137
→ 2 column table: (source-filename, cc-library-target)
138+
lib-headers : like lib-hdrs, but expands all reachable paths due to
139+
includes = [] expansion; so same header can show up
140+
multiple times.
141+
→ 2 column table: (header-filename, cc-library-target)
138142
genrule-outputs: Print generated files by genrule()s matching pattern.
139143
→ 2 column table: (filename, genrule-target)
140144

bant/cli-commands.cc

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ enum class Command {
6767
kListTargets,
6868
kListLeafs,
6969
kListWorkkspace,
70-
kLibraryHeaders,
71-
kLibrarySources,
70+
kLibraryHdrs,
71+
kLibrarySrcs,
72+
kExpandedLibraryHeaders,
7273
kAliasedBy,
7374
kGenruleOutputs,
7475
kDWYU,
@@ -210,8 +211,9 @@ CliStatus RunCommand(Session &session, Command cmd,
210211
switch (cmd) {
211212
case Command::kDWYU:
212213
case Command::kParse:
213-
case Command::kLibraryHeaders:
214-
case Command::kLibrarySources:
214+
case Command::kLibraryHdrs:
215+
case Command::kExpandedLibraryHeaders:
216+
case Command::kLibrarySrcs:
215217
case Command::kGenruleOutputs:
216218
case Command::kListTargets:
217219
case Command::kListLeafs:
@@ -270,16 +272,24 @@ CliStatus RunCommand(Session &session, Command cmd,
270272
}
271273
break;
272274
}
273-
case Command::kLibraryHeaders: //
275+
case Command::kExpandedLibraryHeaders: //
274276
bant::PrintProvidedSources(
275277
session, "header", print_pattern,
276-
ExtractHeaderToLibMapping(project, session.info()));
278+
ExtractExpandedHeaderToLibMapping(project, session.info()));
277279
break;
278280

279-
case Command::kLibrarySources: //
281+
case Command::kLibrarySrcs: //
280282
bant::PrintProvidedSources(
281283
session, "source", print_pattern,
282-
ExtractSourceToLibMapping(project, session.info()));
284+
ExtractComponentToLibMapping(project, ExtractComponent::kSrcs,
285+
session.info()));
286+
break;
287+
288+
case Command::kLibraryHdrs: //
289+
bant::PrintProvidedSources(
290+
session, "header", print_pattern,
291+
ExtractComponentToLibMapping(project, ExtractComponent::kHdrs,
292+
session.info()));
283293
break;
284294

285295
case Command::kGenruleOutputs:
@@ -385,9 +395,9 @@ CliStatus RunCliCommand(Session &session, std::span<std::string_view> args) {
385395
{"list-targets", Command::kListTargets},
386396
{"list-leafs", Command::kListLeafs},
387397
{"workspace", Command::kListWorkkspace},
388-
{"lib-hdrs", Command::kLibraryHeaders},
389-
{"lib-headers", Command::kLibraryHeaders}, // deprecated
390-
{"lib-srcs", Command::kLibrarySources},
398+
{"lib-hdrs", Command::kLibraryHdrs},
399+
{"lib-srcs", Command::kLibrarySrcs},
400+
{"lib-headers", Command::kExpandedLibraryHeaders},
391401
{"aliased-by", Command::kAliasedBy},
392402
{"depends-on", Command::kDependsOn},
393403
{"has-dependents", Command::kHasDependents},

bant/explore/header-providers.cc

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,8 @@ static void AppendProtoLibraryHeaders(
316316
}
317317
} // namespace
318318

319-
ProvidedFromTargetSet ExtractHeaderToLibMapping(const ParsedProject &project,
320-
std::ostream &info_out,
321-
bool suffix_index) {
319+
ProvidedFromTargetSet ExtractExpandedHeaderToLibMapping(
320+
const ParsedProject &project, std::ostream &info_out, bool suffix_index) {
322321
ProvidedFromTargetSet result;
323322

324323
const auto aliased_by_index = ExtractAliasedBy(project);
@@ -337,30 +336,27 @@ ProvidedFromTargetSet ExtractHeaderToLibMapping(const ParsedProject &project,
337336
return result;
338337
}
339338

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) {
339+
ProvidedFromTargetSet ExtractComponentToLibMapping(const ParsedProject &project,
340+
ExtractComponent which,
341+
std::ostream &info_out) {
358342
ProvidedFromTargetSet result;
359343

360344
for (const auto &[_, build_file] : project.ParsedFiles()) {
361345
if (!build_file->ast) continue;
362346

363-
AppendCCLibrarySources(*build_file, info_out, result);
347+
query::FindTargets(
348+
build_file->ast, {"cc_library"}, [&](const query::Result &cc_lib) {
349+
auto cc_library = build_file->package.QualifiedTarget(cc_lib.name);
350+
if (!cc_library.has_value()) return;
351+
352+
auto srcs = query::ExtractStringList((which == ExtractComponent::kSrcs)
353+
? cc_lib.srcs_list
354+
: cc_lib.hdrs_list);
355+
for (const std::string_view src : srcs) {
356+
const std::string src_fqn = build_file->package.QualifiedFile(src);
357+
result[src_fqn].emplace(*cc_library);
358+
}
359+
});
364360
}
365361

366362
return result;

bant/explore/header-providers.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,23 @@ using ProvidedFromTarget = OneToOne<std::string, BazelTarget>;
4242
using ProvidedFromTargetSet = OneToNSet<std::string, BazelTarget>;
4343

4444
// Givent the "project", creates a mapping of all headers that are exported by
45-
// cc_library() targets to their respective targets.
45+
// cc_library() targets to their respective targets. If a header can be reached
46+
// multiple ways (e.g. due to include = [] directives), thes are also part
47+
// of the target set.
4648
// If "suffix_index" is set, output is compatible with FinxBySuffix()
47-
ProvidedFromTargetSet ExtractHeaderToLibMapping(const ParsedProject &project,
48-
std::ostream &info_out,
49-
bool suffix_index = false);
49+
ProvidedFromTargetSet ExtractExpandedHeaderToLibMapping(
50+
const ParsedProject &project, std::ostream &info_out,
51+
bool suffix_index = false);
5052

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);
53+
// Unlike the Expanded*, this is much simpler, as we don't deal with multiple
54+
// search paths. Just extract the mentioned component.
55+
enum class ExtractComponent {
56+
kSrcs,
57+
kHdrs,
58+
};
59+
ProvidedFromTargetSet ExtractComponentToLibMapping(const ParsedProject &project,
60+
ExtractComponent which,
61+
std::ostream &info_out);
5562

5663
// Find all the output generated by genrules. Should really only be 1:1.
5764
// If "suffix_index" is set, output is compatible with FinxBySuffix().

bant/explore/header-providers_test.cc

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ cc_library(
8585
)
8686
)");
8787
std::stringstream log_absorb;
88-
auto header_map = ExtractHeaderToLibMapping(pp.project(), log_absorb);
88+
auto header_map = ExtractExpandedHeaderToLibMapping(pp.project(), log_absorb);
8989
EXPECT_THAT(header_map,
9090
Contains(Pair("some/path/foo.h", Ts("//some/path:foo"))));
9191

@@ -110,15 +110,20 @@ TEST(SourceToLibMapping, CCRuleExtraction) {
110110
cc_library(
111111
name = "foo",
112112
srcs = ["foo.cc", "bar.cc"],
113-
hdrs = ["foo.h"]
113+
hdrs = ["baz.h"]
114114
)
115115
)");
116116
std::stringstream log_absorb;
117-
auto srcs_map = ExtractSourceToLibMapping(pp.project(), log_absorb);
117+
auto srcs_map = ExtractComponentToLibMapping(
118+
pp.project(), ExtractComponent::kSrcs, log_absorb);
118119
EXPECT_THAT(srcs_map,
119120
Contains(Pair("some/path/foo.cc", Ts("//some/path:foo"))));
120121
EXPECT_THAT(srcs_map,
121122
Contains(Pair("some/path/bar.cc", Ts("//some/path:foo"))));
123+
auto hdrs_map = ExtractComponentToLibMapping(
124+
pp.project(), ExtractComponent::kHdrs, log_absorb);
125+
EXPECT_THAT(hdrs_map,
126+
Contains(Pair("some/path/baz.h", Ts("//some/path:foo"))));
122127
}
123128

124129
TEST(HeaderToLibMapping, InludePathsAreRelativePathCanonicalized) {
@@ -140,7 +145,7 @@ cc_library(
140145
)");
141146

142147
std::stringstream log_absorb;
143-
auto header_map = ExtractHeaderToLibMapping(pp.project(), log_absorb);
148+
auto header_map = ExtractExpandedHeaderToLibMapping(pp.project(), log_absorb);
144149
EXPECT_THAT(header_map, Contains(Pair("foo.h", Ts("//:foo"))));
145150
EXPECT_THAT(header_map, Contains(Pair("bar.h", Ts("//:bar"))));
146151
}
@@ -161,7 +166,7 @@ cc_library(
161166
)
162167
)");
163168
std::stringstream log_absorb;
164-
auto header_map = ExtractHeaderToLibMapping(pp.project(), log_absorb);
169+
auto header_map = ExtractExpandedHeaderToLibMapping(pp.project(), log_absorb);
165170
const ProvidedFromTargetSet::mapped_type expected_set{T("//some/path:foo"),
166171
T("//some/path:bar")};
167172
EXPECT_THAT(header_map, Contains(Pair("some/path/foo.h", expected_set)));
@@ -188,7 +193,7 @@ cc_grpc_library( # GRPC form of a proto library.
188193
)
189194
)");
190195
std::stringstream log_absorb;
191-
auto header_map = ExtractHeaderToLibMapping(pp.project(), log_absorb);
196+
auto header_map = ExtractExpandedHeaderToLibMapping(pp.project(), log_absorb);
192197
EXPECT_THAT(header_map, Contains(Pair("ptest/data.pb.h", Ts("//ptest:foo"))));
193198
EXPECT_THAT(header_map,
194199
Contains(Pair("ptest/general.pb.h", Ts("//ptest:foo"))));

bant/tool/dwyu.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,8 +671,9 @@ DWYUGenerator::DWYUGenerator(Session &session, const ParsedProject &project,
671671
Stat &stats = session_.GetStatsFor("DWYU preparation", "indexed targets");
672672
const ScopedTimer timer(&stats.duration);
673673

674-
headers_from_libs_ = ExtractHeaderToLibMapping(project, session.info(),
675-
/*suffix_index=*/true);
674+
headers_from_libs_ =
675+
ExtractExpandedHeaderToLibMapping(project, session.info(),
676+
/*suffix_index=*/true);
676677
files_from_genrules_ = ExtractGeneratedFromGenrule(project, session.info());
677678
InitKnownLibraries();
678679
stats.count = known_libs_.size();

0 commit comments

Comments
 (0)