Add -Lnative link search paths for non-Rust deps Make non-Rust deps of Rust targets use -Lnative instead of -Ldependency Change-Id: I205c60bde0ff2d969a5ff6cbc7990666896b4999 Reviewed-on: https://gn-review.googlesource.com/c/gn/+/5160 Commit-Queue: Julie Hockett <juliehockett@google.com> Reviewed-by: Brett Wilson <brettw@google.com>
diff --git a/tools/gn/ninja_rust_binary_target_writer.cc b/tools/gn/ninja_rust_binary_target_writer.cc index 869cac8..3014df9 100644 --- a/tools/gn/ninja_rust_binary_target_writer.cc +++ b/tools/gn/ninja_rust_binary_target_writer.cc
@@ -127,12 +127,17 @@ order_only_deps.push_back(input_dep); std::vector<OutputFile> rustdeps; + std::vector<OutputFile> nonrustdeps; for (const auto* non_linkable_dep : non_linkable_deps) { order_only_deps.push_back(non_linkable_dep->dependency_output_file()); } for (const auto* linkable_dep : linkable_deps) { - rustdeps.push_back(linkable_dep->dependency_output_file()); + if (linkable_dep->source_types_used().RustSourceUsed()) { + rustdeps.push_back(linkable_dep->dependency_output_file()); + } else { + nonrustdeps.push_back(linkable_dep->dependency_output_file()); + } deps.push_back(linkable_dep->dependency_output_file()); } @@ -142,7 +147,7 @@ WriteCompilerBuildLine(target_->rust_values().crate_root(), deps.vector(), order_only_deps, tool_->name(), tool_outputs); WriteExterns(); - WriteRustdeps(rustdeps); + WriteRustdeps(rustdeps, nonrustdeps); WriteEdition(); } } @@ -191,7 +196,8 @@ } void NinjaRustBinaryTargetWriter::WriteRustdeps( - std::vector<OutputFile>& rustdeps) { + const std::vector<OutputFile>& rustdeps, + const std::vector<OutputFile>& nonrustdeps) { if (rustdeps.empty()) return; out_ << " rustdeps ="; @@ -201,6 +207,13 @@ out_, rustdep.AsSourceFile(settings_->build_settings()).GetDir(), PathOutput::DIR_NO_LAST_SLASH); } + + for (const auto& rustdep : nonrustdeps) { + out_ << " -Lnative="; + path_output_.WriteDir( + out_, rustdep.AsSourceFile(settings_->build_settings()).GetDir(), + PathOutput::DIR_NO_LAST_SLASH); + } out_ << std::endl; }
diff --git a/tools/gn/ninja_rust_binary_target_writer.h b/tools/gn/ninja_rust_binary_target_writer.h index ab738e2..4302abf 100644 --- a/tools/gn/ninja_rust_binary_target_writer.h +++ b/tools/gn/ninja_rust_binary_target_writer.h
@@ -25,7 +25,8 @@ void WriteSources(const OutputFile& input_dep, const std::vector<OutputFile>& order_only_deps); void WriteExterns(); - void WriteRustdeps(std::vector<OutputFile>& rustdeps); + void WriteRustdeps(const std::vector<OutputFile>& rustdeps, + const std::vector<OutputFile>& nonrustdeps); void WriteEdition(); const RustTool* tool_;
diff --git a/tools/gn/ninja_rust_binary_target_writer_unittest.cc b/tools/gn/ninja_rust_binary_target_writer_unittest.cc index 9d8aee1..43bac89 100644 --- a/tools/gn/ninja_rust_binary_target_writer_unittest.cc +++ b/tools/gn/ninja_rust_binary_target_writer_unittest.cc
@@ -245,3 +245,68 @@ EXPECT_EQ(expected, out_str) << expected << "\n" << out_str; } } + +TEST_F(NinjaRustBinaryTargetWriterTest, NonRustDeps) { + Err err; + TestWithScope setup; + + Target rlib(setup.settings(), Label(SourceDir("//bar/"), "mylib")); + rlib.set_output_type(Target::RUST_LIBRARY); + rlib.visibility().SetPublic(); + SourceFile barlib("//bar/lib.rs"); + rlib.sources().push_back(SourceFile("//bar/mylib.rs")); + rlib.sources().push_back(barlib); + rlib.source_types_used().Set(SourceFile::SOURCE_RS); + rlib.rust_values().set_crate_root(barlib); + rlib.rust_values().crate_name() = "mylib"; + rlib.rust_values().edition() = "2018"; + rlib.SetToolchain(setup.toolchain()); + ASSERT_TRUE(rlib.OnResolved(&err)); + + Target staticlib(setup.settings(), Label(SourceDir("//foo/"), "static")); + staticlib.set_output_type(Target::STATIC_LIBRARY); + staticlib.visibility().SetPublic(); + staticlib.sources().push_back(SourceFile("//foo/static.cpp")); + staticlib.source_types_used().Set(SourceFile::SOURCE_CPP); + staticlib.SetToolchain(setup.toolchain()); + ASSERT_TRUE(staticlib.OnResolved(&err)); + + Target target(setup.settings(), Label(SourceDir("//foo/"), "bar")); + target.set_output_type(Target::EXECUTABLE); + target.visibility().SetPublic(); + SourceFile main("//foo/main.rs"); + target.sources().push_back(SourceFile("//foo/source.rs")); + target.sources().push_back(main); + target.source_types_used().Set(SourceFile::SOURCE_RS); + target.rust_values().set_crate_root(main); + target.rust_values().crate_name() = "foo_bar"; + target.rust_values().edition() = "2018"; + target.private_deps().push_back(LabelTargetPair(&rlib)); + target.private_deps().push_back(LabelTargetPair(&staticlib)); + target.SetToolchain(setup.toolchain()); + ASSERT_TRUE(target.OnResolved(&err)); + + { + std::ostringstream out; + NinjaRustBinaryTargetWriter writer(&target, out); + writer.Run(); + + const char expected[] = + "crate_name = foo_bar\n" + "crate_type = bin\n" + "rustc_output_extension = \n" + "rustflags =\n" + "rustenv =\n" + "root_out_dir = .\n" + "target_out_dir = obj/foo\n" + "target_output_name = bar\n" + "\n" + "build obj/foo/foo_bar: rustc ../../foo/main.rs | ../../foo/source.rs " + "../../foo/main.rs obj/bar/libmylib.rlib obj/foo/libstatic.a\n" + " externs = --extern mylib=obj/bar/libmylib.rlib\n" + " rustdeps = -Ldependency=obj/bar -Lnative=obj/foo\n" + " edition = 2018\n"; + std::string out_str = out.str(); + EXPECT_EQ(expected, out_str) << expected << "\n" << out_str; + } +} \ No newline at end of file