Oops -- fully allow headers with ambiguous owners.
(I didn't actually test the previous CL on real code. It works now.)
Before this CL, Crubit tried to "guess" the owning target. Now it's passed explicitly, so that we can have multiple distinct owning targets for the public headers, only one of which is the current target.
PiperOrigin-RevId: 503496444
diff --git a/rs_bindings_from_cc/bazel_support/generate_bindings.bzl b/rs_bindings_from_cc/bazel_support/generate_bindings.bzl
index bddaea1..0b62228 100644
--- a/rs_bindings_from_cc/bazel_support/generate_bindings.bzl
+++ b/rs_bindings_from_cc/bazel_support/generate_bindings.bzl
@@ -53,6 +53,7 @@
rs_bindings_from_cc_flags = [
"--stderrthreshold=2",
+ "--target=" + str(ctx.label),
"--rs_out",
rs_output.path,
"--cc_out",
diff --git a/rs_bindings_from_cc/cmdline.cc b/rs_bindings_from_cc/cmdline.cc
index 4485e14..51736c6 100644
--- a/rs_bindings_from_cc/cmdline.cc
+++ b/rs_bindings_from_cc/cmdline.cc
@@ -44,6 +44,7 @@
"public headers of the cc_library this tool should generate bindings "
"for, in a format suitable for usage in google3-relative quote "
"include (#include \"\").");
+ABSL_FLAG(std::string, target, "", "The target to generate bindings for.");
ABSL_FLAG(std::string, targets_and_headers, std::string(),
"Information about which headers belong to which targets, encoded as "
"a JSON array. For example: "
@@ -89,8 +90,9 @@
absl::StatusOr<Cmdline> Cmdline::Create() {
return CreateFromArgs(
- absl::GetFlag(FLAGS_cc_out), absl::GetFlag(FLAGS_rs_out),
- absl::GetFlag(FLAGS_ir_out), absl::GetFlag(FLAGS_namespaces_out),
+ absl::GetFlag(FLAGS_target), absl::GetFlag(FLAGS_cc_out),
+ absl::GetFlag(FLAGS_rs_out), absl::GetFlag(FLAGS_ir_out),
+ absl::GetFlag(FLAGS_namespaces_out),
absl::GetFlag(FLAGS_crubit_support_path),
absl::GetFlag(FLAGS_clang_format_exe_path),
absl::GetFlag(FLAGS_rustfmt_exe_path),
@@ -104,15 +106,19 @@
}
absl::StatusOr<Cmdline> Cmdline::CreateFromArgs(
- std::string cc_out, std::string rs_out, std::string ir_out,
- std::string namespaces_out, std::string crubit_support_path,
- std::string clang_format_exe_path, std::string rustfmt_exe_path,
- std::string rustfmt_config_path, bool do_nothing,
- std::vector<std::string> public_headers,
+ std::string current_target, std::string cc_out, std::string rs_out,
+ std::string ir_out, std::string namespaces_out,
+ std::string crubit_support_path, std::string clang_format_exe_path,
+ std::string rustfmt_exe_path, std::string rustfmt_config_path,
+ bool do_nothing, std::vector<std::string> public_headers,
std::string targets_and_headers_str, std::vector<std::string> extra_rs_srcs,
std::vector<std::string> srcs_to_scan_for_instantiations,
std::string instantiations_out, std::string error_report_out) {
Cmdline cmdline;
+ if (current_target.empty()) {
+ return absl::InvalidArgumentError("please specify --target");
+ }
+ cmdline.current_target_ = BazelLabel(std::move(current_target));
if (rs_out.empty()) {
return absl::InvalidArgumentError("please specify --rs_out");
@@ -205,19 +211,8 @@
}
}
- CRUBIT_ASSIGN_OR_RETURN(cmdline.current_target_,
- cmdline.FindHeader(cmdline.public_headers_[0]));
for (const HeaderName& public_header : cmdline.public_headers_) {
- CRUBIT_ASSIGN_OR_RETURN(BazelLabel header_target,
- cmdline.FindHeader(public_header));
-
- if (cmdline.current_target_ != header_target) {
- return absl::InvalidArgumentError(absl::Substitute(
- "Expected all public headers to belong to the current target '$0', "
- "but header '$1' belongs to '$2'",
- cmdline.current_target_.value(), public_header.IncludePath(),
- header_target.value()));
- }
+ CRUBIT_RETURN_IF_ERROR(cmdline.FindHeader(public_header).status());
}
return cmdline;
diff --git a/rs_bindings_from_cc/cmdline.h b/rs_bindings_from_cc/cmdline.h
index 2f1f7d6..0bb9a9f 100644
--- a/rs_bindings_from_cc/cmdline.h
+++ b/rs_bindings_from_cc/cmdline.h
@@ -25,22 +25,22 @@
// Creates `Cmdline` based on the provided cmdline arguments - `cc_out`,
// `rs_out`, and so forth.
static absl::StatusOr<Cmdline> CreateForTesting(
- std::string cc_out, std::string rs_out, std::string ir_out,
- std::string namespaces_out, std::string crubit_support_path,
- std::string clang_format_exe_path, std::string rustfmt_exe_path,
- std::string rustfmt_config_path, bool do_nothing,
- std::vector<std::string> public_headers,
+ std::string current_target, std::string cc_out, std::string rs_out,
+ std::string ir_out, std::string namespaces_out,
+ std::string crubit_support_path, std::string clang_format_exe_path,
+ std::string rustfmt_exe_path, std::string rustfmt_config_path,
+ bool do_nothing, std::vector<std::string> public_headers,
std::string targets_and_headers_str,
std::vector<std::string> extra_rs_sources,
std::vector<std::string> srcs_to_scan_for_instantiations,
std::string instantiations_out, std::string error_report_out) {
return CreateFromArgs(
- std::move(cc_out), std::move(rs_out), std::move(ir_out),
- std::move(namespaces_out), std::move(crubit_support_path),
- std::move(clang_format_exe_path), std::move(rustfmt_exe_path),
- std::move(rustfmt_config_path), do_nothing, std::move(public_headers),
- std::move(targets_and_headers_str), std::move(extra_rs_sources),
- std::move(srcs_to_scan_for_instantiations),
+ std::move(current_target), std::move(cc_out), std::move(rs_out),
+ std::move(ir_out), std::move(namespaces_out),
+ std::move(crubit_support_path), std::move(clang_format_exe_path),
+ std::move(rustfmt_exe_path), std::move(rustfmt_config_path), do_nothing,
+ std::move(public_headers), std::move(targets_and_headers_str),
+ std::move(extra_rs_sources), std::move(srcs_to_scan_for_instantiations),
std::move(instantiations_out), std::move(error_report_out));
}
@@ -86,11 +86,11 @@
Cmdline();
static absl::StatusOr<Cmdline> CreateFromArgs(
- std::string cc_out, std::string rs_out, std::string ir_out,
- std::string namespaces_out, std::string crubit_support_path,
- std::string clang_format_exe_path, std::string rustfmt_exe_path,
- std::string rustfmt_config_path, bool do_nothing,
- std::vector<std::string> public_headers,
+ std::string current_target, std::string cc_out, std::string rs_out,
+ std::string ir_out, std::string namespaces_out,
+ std::string crubit_support_path, std::string clang_format_exe_path,
+ std::string rustfmt_exe_path, std::string rustfmt_config_path,
+ bool do_nothing, std::vector<std::string> public_headers,
std::string targets_and_headers_str,
std::vector<std::string> extra_rs_sources,
std::vector<std::string> srcs_to_scan_for_instantiations,
diff --git a/rs_bindings_from_cc/cmdline_test.cc b/rs_bindings_from_cc/cmdline_test.cc
index 26e8406..0dad907 100644
--- a/rs_bindings_from_cc/cmdline_test.cc
+++ b/rs_bindings_from_cc/cmdline_test.cc
@@ -23,11 +23,13 @@
namespace {
-absl::StatusOr<Cmdline> TestCmdline(std::vector<std::string> public_headers,
- const std::string& targets_and_headers) {
+absl::StatusOr<Cmdline> TestCmdline(std::string target,
+ std::vector<std::string> public_headers,
+ std::string targets_and_headers) {
return Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path", "rustfmt_exe_path", "rustfmt_config_path",
+ std::move(target), "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
+ "rustfmt_config_path",
/*do_nothing=*/false, std::move(public_headers),
std::move(targets_and_headers),
@@ -37,16 +39,23 @@
/* error_report_out= */ "");
}
+absl::StatusOr<Cmdline> TestCmdline(std::vector<std::string> public_headers,
+ std::string targets_and_headers) {
+ return TestCmdline("//:target", std::move(public_headers),
+ std::move(targets_and_headers));
+}
+
} // namespace
TEST(CmdlineTest, BasicCorrectInput) {
ASSERT_OK_AND_ASSIGN(
Cmdline cmdline,
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path", "rustfmt_exe_path", "rustfmt_config_path",
+ "//:t1", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
+ "rustfmt_config_path",
/* do_nothing= */ false, {"h1"},
- R"([{"t": "t1", "h": ["h1", "h2"]}])", {"extra_file.rs"},
+ R"([{"t": "//:t1", "h": ["h1", "h2"]}])", {"extra_file.rs"},
{"scan_for_instantiations.rs"}, "instantiations_out",
"error_report_out"));
EXPECT_EQ(cmdline.cc_out(), "cc_out");
@@ -60,14 +69,15 @@
EXPECT_EQ(cmdline.instantiations_out(), "instantiations_out");
EXPECT_EQ(cmdline.error_report_out(), "error_report_out");
EXPECT_EQ(cmdline.do_nothing(), false);
- EXPECT_EQ(cmdline.current_target().value(), "t1");
+ EXPECT_EQ(cmdline.current_target().value(), "//:t1");
EXPECT_THAT(cmdline.public_headers(), ElementsAre(HeaderName("h1")));
EXPECT_THAT(cmdline.extra_rs_srcs(), ElementsAre("extra_file.rs"));
EXPECT_THAT(cmdline.srcs_to_scan_for_instantiations(),
ElementsAre("scan_for_instantiations.rs"));
- EXPECT_THAT(cmdline.headers_to_targets(),
- UnorderedElementsAre(Pair(HeaderName("h1"), BazelLabel("t1")),
- Pair(HeaderName("h2"), BazelLabel("t1"))));
+ EXPECT_THAT(
+ cmdline.headers_to_targets(),
+ UnorderedElementsAre(Pair(HeaderName("h1"), BazelLabel("//:t1")),
+ Pair(HeaderName("h2"), BazelLabel("//:t1"))));
}
TEST(CmdlineTest, TargetsAndHeadersEmpty) {
@@ -97,7 +107,7 @@
}
TEST(CmdlineTest, TargetsAndHeadersIntInsteadOfHeadersArray) {
- ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "t1", "h": 123}])"),
+ ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "//:t1", "h": 123}])"),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("--targets_and_headers"),
HasSubstr(".h"), HasSubstr("array"))));
@@ -111,17 +121,25 @@
}
TEST(CmdlineTest, TargetsAndHeadersMissingHeader) {
- ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "t1"}])"),
+ ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "//:t1"}])"),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("--targets_and_headers"),
HasSubstr(".h"), HasSubstr("missing"))));
}
TEST(CmdlineTest, TargetsAndHeadersEmptyHeader) {
- ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "t1", "h": ["", "h2"]}])"),
- StatusIs(absl::StatusCode::kInvalidArgument,
- AllOf(HasSubstr("--targets_and_headers"),
- HasSubstr("`h`"), HasSubstr("empty string"))));
+ ASSERT_THAT(
+ TestCmdline({"//:t1", "h1"}, R"([{"t": "//:t1", "h": ["", "h2"]}])"),
+ StatusIs(absl::StatusCode::kInvalidArgument,
+ AllOf(HasSubstr("--targets_and_headers"), HasSubstr("`h`"),
+ HasSubstr("empty string"))));
+}
+
+TEST(CmdlineTest, TargetsAndHeadersEmptyCurrentTarget) {
+ ASSERT_THAT(
+ TestCmdline("", {"//:t1", "h1"}, R"([{"t": "//:t1", "h": ["h1"]}])"),
+ StatusIs(absl::StatusCode::kInvalidArgument,
+ AllOf(HasSubstr("please specify --target"))));
}
TEST(CmdlineTest, TargetsAndHeadersEmptyTarget) {
@@ -139,32 +157,28 @@
}
TEST(CmdlineTest, TargetsAndHeadersIntInsteadOfHeader) {
- ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "t1", "h": [123, "h2"]}])"),
+ ASSERT_THAT(TestCmdline({"h1"}, R"([{"t": "//:t1", "h": [123, "h2"]}])"),
StatusIs(absl::StatusCode::kInvalidArgument,
AllOf(HasSubstr("--targets_and_headers"),
HasSubstr(".h"), HasSubstr("string"))));
}
TEST(CmdlineTest, TargetsAndHeadersDuplicateHeader) {
- constexpr absl::string_view kHeaders = R"([
- {"t": "t1", "h": ["h1"]},
- {"t": "t2", "h": ["h1", "h2"]} ])";
- ASSERT_OK_AND_ASSIGN(
- Cmdline cmdline,
- Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path", "rustfmt_exe_path", "rustfmt_config_path",
- /* do_nothing= */ false, {"h1"}, std::string(kHeaders),
- {"extra_file.rs"}, {"scan_for_instantiations.rs"},
- "instantiations_out", "error_report_out"));
- EXPECT_THAT(cmdline.headers_to_targets(),
- UnorderedElementsAre(Pair(HeaderName("h1"), BazelLabel("t1")),
- Pair(HeaderName("h2"), BazelLabel("t2"))));
+ for (const char* target : {"//:t1", "//:t2"}) {
+ ASSERT_OK_AND_ASSIGN(Cmdline cmdline, TestCmdline(target, {"h1"}, R"([
+ {"t": "//:t1", "h": ["h1"]},
+ {"t": "//:t2", "h": ["h1", "h2"]} ])"));
+ EXPECT_THAT(
+ cmdline.headers_to_targets(),
+ UnorderedElementsAre(Pair(HeaderName("h1"), BazelLabel("//:t1")),
+ Pair(HeaderName("h2"), BazelLabel("//:t2"))));
+ EXPECT_EQ(cmdline.current_target().value(), target);
+ }
}
TEST(CmdlineTest, PublicHeadersEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(TestCmdline({}, std::string(kTargetsAndHeaders)),
StatusIs(absl::StatusCode::kInvalidArgument,
@@ -173,7 +187,7 @@
TEST(CmdlineTest, PublicHeadersWhereFirstHeaderMissingInMap) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
TestCmdline({"missing-in-map.h"}, std::string(kTargetsAndHeaders)),
@@ -184,7 +198,7 @@
TEST(CmdlineTest, PublicHeadersWhereSecondHeaderMissingInMap) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
TestCmdline({"a.h", "missing.h"}, std::string(kTargetsAndHeaders)),
@@ -194,25 +208,30 @@
TEST(CmdlineTest, PublicHeadersCoveringMultipleTargets) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]},
- {"t": "target2", "h": ["c.h", "d.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]},
+ {"t": "//:target2", "h": ["c.h", "d.h"]}
])";
- ASSERT_THAT(TestCmdline({"a.h", "c.h"}, std::string(kTargetsAndHeaders)),
- StatusIs(absl::StatusCode::kInvalidArgument,
- AllOf(HasSubstr("Expected all public headers to belong "
- "to the current target"),
- HasSubstr("target1"), HasSubstr("target2"),
- HasSubstr("c.h"))));
+ ASSERT_OK_AND_ASSIGN(Cmdline cmdline,
+ TestCmdline("//:target1", {"a.h", "c.h"},
+ std::string(kTargetsAndHeaders)));
+ EXPECT_EQ(cmdline.current_target().value(), "//:target1");
+ EXPECT_THAT(
+ cmdline.headers_to_targets(),
+ UnorderedElementsAre(Pair(HeaderName("a.h"), BazelLabel("//:target1")),
+ Pair(HeaderName("b.h"), BazelLabel("//:target1")),
+ Pair(HeaderName("c.h"), BazelLabel("//:target2")),
+ Pair(HeaderName("d.h"), BazelLabel("//:target2"))));
}
TEST(CmdlineTest, InstantiationsOutEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
(Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path", "rustfmt_exe_path", "rustfmt_config_path",
+ "//:target1", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
+ "rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
/* extra_rs_srcs= */ {}, {"lib.rs"},
/* instantiations_out= */ "", "error_report_out")),
@@ -225,12 +244,13 @@
TEST(CmdlineTest, RustSourcesEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path", "rustfmt_exe_path", "rustfmt_config_path",
+ "//:target1", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
+ "rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
/* extra_rs_srcs= */ {},
/* srcs_to_scan_for_instantiations= */ {}, "instantiations_out",
@@ -244,10 +264,11 @@
TEST(CmdlineTest, CcOutEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
Cmdline::CreateForTesting(
+ "//:target1",
/* cc_out= */ "", "rs_out", "ir_out", "namespaces_out",
"crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
"rustfmt_config_path",
@@ -261,11 +282,11 @@
TEST(CmdlineTest, RsOutEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
Cmdline::CreateForTesting(
- "cc_out", /* rs_out= */ "", "namespaces_out", "ir_out",
+ "//:target1", "cc_out", /* rs_out= */ "", "namespaces_out", "ir_out",
"crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
"rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
@@ -278,10 +299,10 @@
TEST(CmdlineTest, IrOutEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_OK(Cmdline::CreateForTesting(
- "cc_out", "rs_out", /* ir_out= */ "", "namespaces_out",
+ "//:target1", "cc_out", "rs_out", /* ir_out= */ "", "namespaces_out",
"crubit_support_path", "clang_format_exe_path", "rustfmt_exe_path",
"rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
@@ -292,11 +313,12 @@
TEST(CmdlineTest, ClangFormatExePathEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
+ "//:target1", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path",
/* clang_format_exe_path= */ "", "rustfmt_exe_path",
"rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
@@ -309,12 +331,12 @@
TEST(CmdlineTest, RustfmtExePathEmpty) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h", "b.h"]}
+ {"t": "//:target1", "h": ["a.h", "b.h"]}
])";
ASSERT_THAT(
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- "clang_format_exe_path",
+ "//:target1", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", "clang_format_exe_path",
/* rustfmt_exe_path= */ "", "rustfmt_config_path",
/* do_nothing= */ false, {"a.h"}, std::string(kTargetsAndHeaders),
/* extra_rs_srcs= */ {},
diff --git a/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc b/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
index 58e0235..c8aa1b4 100644
--- a/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
+++ b/rs_bindings_from_cc/generate_bindings_and_metadata_test.cc
@@ -39,8 +39,8 @@
ASSERT_OK_AND_ASSIGN(
Cmdline cmdline,
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- std::string(kDefaultClangFormatExePath),
+ "//:target", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", std::string(kDefaultClangFormatExePath),
std::string(kDefaultRustfmtExePath), "nowhere/rustfmt.toml",
/* do_nothing= */ false,
/* public_headers= */ {"a.h"}, std::string(kTargetsAndHeaders),
@@ -71,8 +71,8 @@
ASSERT_OK_AND_ASSIGN(
Cmdline cmdline,
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- std::string(kDefaultClangFormatExePath),
+ "//:target", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", std::string(kDefaultClangFormatExePath),
std::string(kDefaultRustfmtExePath), "nowhere/rustfmt.toml",
/* do_nothing= */ false,
/* public_headers= */ {"a.h"}, std::string(kTargetsAndHeaders),
@@ -101,8 +101,8 @@
CRUBIT_ASSIGN_OR_RETURN(
Cmdline cmdline,
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_out", "crubit_support_path",
- std::string(kDefaultClangFormatExePath),
+ "//:target", "cc_out", "rs_out", "ir_out", "namespaces_out",
+ "crubit_support_path", std::string(kDefaultClangFormatExePath),
std::string(kDefaultRustfmtExePath), "nowhere/rustfmt.toml",
/* do_nothing= */ false,
/* public_headers= */
@@ -215,7 +215,7 @@
TEST(GenerateBindingsAndMetadataTest, NamespacesJsonGenerated) {
constexpr absl::string_view kTargetsAndHeaders = R"([
- {"t": "target1", "h": ["a.h"]}
+ {"t": "//:target1", "h": ["a.h"]}
])";
constexpr absl::string_view kHeaderContent = R"(
namespace top_level_1 {
@@ -234,7 +234,7 @@
namespace top_level_1 {}
)";
constexpr absl::string_view kExpected = R"({
- "label": "target1",
+ "label": "//:target1",
"namespaces": [
{
"children": [
@@ -269,7 +269,7 @@
ASSERT_OK_AND_ASSIGN(
Cmdline cmdline,
Cmdline::CreateForTesting(
- "cc_out", "rs_out", "ir_out", "namespaces_json",
+ "//:target1", "cc_out", "rs_out", "ir_out", "namespaces_json",
"crubit_support_path", std::string(kDefaultClangFormatExePath),
std::string(kDefaultRustfmtExePath), "nowhere/rustfmt.toml",
/* do_nothing= */ false,
diff --git a/rs_bindings_from_cc/test/rs_bindings_from_cc_test.sh b/rs_bindings_from_cc/test/rs_bindings_from_cc_test.sh
index adb167b..8847c70 100755
--- a/rs_bindings_from_cc/test/rs_bindings_from_cc_test.sh
+++ b/rs_bindings_from_cc/test/rs_bindings_from_cc_test.sh
@@ -18,10 +18,13 @@
function test::cmd_line_api() {
EXPECT_FAIL "${RS_BINDINGS_FROM_CC}" "generator should return non-zero with no arguments"
EXPECT_SUCCEED \
- "${RS_BINDINGS_FROM_CC} 2>&1 | grep 'please specify --rs_out' > /dev/null" \
+ "${RS_BINDINGS_FROM_CC} 2>&1 | grep 'please specify --target' > /dev/null" \
+ "generator should show help message for --target"
+ EXPECT_SUCCEED \
+ "${RS_BINDINGS_FROM_CC} --target=//:target 2>&1 | grep 'please specify --rs_out' > /dev/null" \
"generator should show help message for --rs_out"
EXPECT_SUCCEED \
- "${RS_BINDINGS_FROM_CC} --rs_out=/foo 2>&1 | \
+ "${RS_BINDINGS_FROM_CC} --target=//:target --rs_out=/foo 2>&1 | \
grep 'please specify --cc_out' > /dev/null" \
"generator should show help message for --cc_out"
@@ -30,6 +33,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" 2>&1 | \
grep 'please specify --crubit_support_path' > /dev/null" \
@@ -37,6 +41,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" 2>&1 \
--crubit_support_path=test/crubit/support/path | \
@@ -45,6 +50,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" 2>&1 \
--crubit_support_path=test/crubit/support/path \
@@ -54,6 +60,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" 2>&1 \
--crubit_support_path=test/crubit/support/path \
@@ -67,6 +74,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -84,6 +92,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -108,6 +117,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -140,6 +150,7 @@
EXPECT_FAIL \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//:target \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -170,6 +181,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//foo/bar:baz \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -199,6 +211,7 @@
# Testing the default `rustfmt` config.
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//foo/bar:baz \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -228,6 +241,7 @@
EOF
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//foo/bar:baz\
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/crubit/support/path \
@@ -267,6 +281,7 @@
EXPECT_SUCCEED \
"\"${RS_BINDINGS_FROM_CC}\" \
+ --target=//foo/bar:baz \
--rs_out=\"${rs_out}\" \
--cc_out=\"${cc_out}\" \
--crubit_support_path=test/specific/crubit/support/path \