Do not add native dependencies to the library search path

By adding the path to all native dependencies to the library search
path we create collisions if any GN native target has a name that
matches a library specified in `libs`. This creates linking failures
if the wrong library is chosen by the linker.

To add a native library to the search path, for use in #[link], the
`target_out_dir` of the target should be explicitly added to
`lib_dirs`.

Bug: 370
Change-Id: If280641063a5edf3c548e553b350f8bfcc76611c
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/17300
Reviewed-by: Dana Jansens <danakj@google.com>
Reviewed-by: David Turner <digit@google.com>
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: danakj <danakj@chromium.org>
diff --git a/src/gn/ninja_rust_binary_target_writer.cc b/src/gn/ninja_rust_binary_target_writer.cc
index 879e70d..a566dec 100644
--- a/src/gn/ninja_rust_binary_target_writer.cc
+++ b/src/gn/ninja_rust_binary_target_writer.cc
@@ -357,20 +357,6 @@
     path_output_.WriteDir(out_, dir, PathOutput::DIR_NO_LAST_SLASH);
   }
 
-  UniqueVector<SourceDir> nonrustdep_dirs;
-
-  // Non-Rust native dependencies. A dependency from Rust implies the ability
-  // to specify it in #[link], and GN will ensure that rustc can find it by
-  // adding it to the native library search paths.
-  for (const auto& nonrustdep : nonrustdeps) {
-    nonrustdep_dirs.push_back(
-        nonrustdep.AsSourceFile(settings_->build_settings()).GetDir());
-  }
-  for (const auto& nonrustdep_dir : nonrustdep_dirs) {
-    out_ << " -Lnative=";
-    path_output_.WriteDir(out_, nonrustdep_dir, PathOutput::DIR_NO_LAST_SLASH);
-  }
-
   // If rustc will invoke a linker, then pass linker arguments to include those
   // non-Rust native dependencies in the linking step.
 
diff --git a/src/gn/ninja_rust_binary_target_writer_unittest.cc b/src/gn/ninja_rust_binary_target_writer_unittest.cc
index 8ef944f..921580c 100644
--- a/src/gn/ninja_rust_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_rust_binary_target_writer_unittest.cc
@@ -828,9 +828,8 @@
         "  source_file_part = main.rs\n"
         "  source_name_part = main\n"
         "  externs = --extern mylib=obj/bar/libmylib.rlib\n"
-        "  rustdeps = -Ldependency=obj/bar "
-        "-Lnative=obj/baz -Lnative=obj/foo -Lnative=. "
-        "-Clink-arg=-Bdynamic -Clink-arg=obj/baz/sourceset.csourceset.o "
+        "  rustdeps = -Ldependency=obj/bar -Clink-arg=-Bdynamic "
+        "-Clink-arg=obj/baz/sourceset.csourceset.o "
         "-Clink-arg=obj/foo/libstatic.a -Clink-arg=./libshared.so "
         "-Clink-arg=./libshared_with_toc.so\n"
         "  ldflags =\n"
@@ -873,8 +872,7 @@
         "  source_file_part = main.rs\n"
         "  source_name_part = main\n"
         "  externs =\n"
-        "  rustdeps = -Lnative=obj/foo -Clink-arg=-Bdynamic "
-        "-Clink-arg=obj/foo/libstatic.a\n"
+        "  rustdeps = -Clink-arg=-Bdynamic -Clink-arg=obj/foo/libstatic.a\n"
         "  ldflags =\n"
         "  sources = ../../foo/source.rs ../../foo/main.rs\n";
     std::string out_str = out.str();
@@ -916,7 +914,7 @@
         "  source_file_part = lib.rs\n"
         "  source_name_part = lib\n"
         "  externs =\n"
-        "  rustdeps = -Lnative=obj/foo -Clink-arg=-Balternative-dynamic "
+        "  rustdeps = -Clink-arg=-Balternative-dynamic "
         "-Clink-arg=obj/foo/libstatic.a\n"
         "  ldflags =\n"
         "  sources = ../../baz/lib.rs\n";
@@ -1102,9 +1100,7 @@
       "  rustdeps = -Ldependency=obj/pub_in_staticlib "
       "-Ldependency=obj/priv_in_staticlib -Ldependency=obj/dylib "
       "-Ldependency=obj/pub_in_dylib -Ldependency=obj/priv_in_dylib "
-      "-Lnative=obj/pub_sset_in_staticlib "
-      "-Lnative=obj/priv_sset_in_staticlib "
-      "-Lnative=obj/staticlib -Clink-arg=-Bdynamic "
+      "-Clink-arg=-Bdynamic "
       "-Clink-arg=obj/pub_sset_in_staticlib/pub_sset_in_staticlib.lib.o "
       "-Clink-arg=obj/priv_sset_in_staticlib/priv_sset_in_staticlib.lib.o "
       "-Clink-arg=obj/staticlib/libstaticlib.a\n"
@@ -1322,8 +1318,8 @@
         "  source_file_part = input.rs\n"
         "  source_name_part = input\n"
         "  externs = --extern publiccrate=obj/bar/libpubliclib.rlib\n"
-        "  rustdeps = -Ldependency=obj/bar -Lnative=obj/clib "
-        "-Clink-arg=-Bdynamic -Clink-arg=obj/clib/libstatic.a "
+        "  rustdeps = -Ldependency=obj/bar -Clink-arg=-Bdynamic "
+        "-Clink-arg=obj/clib/libstatic.a "
         "-Lnative=../../baz -Lframework=../../fwdir -Clink-arg=../../dir1/ar.a "
         "-lquux\n"
         "  ldflags =\n"
@@ -1740,8 +1736,7 @@
         "  source_file_part = main.rs\n"
         "  source_name_part = main\n"
         "  externs =\n"
-        "  rustdeps = -Lnative=obj/bar -Clink-arg=-Bdynamic "
-        "-Clink-arg=obj/bar/libmylib.so\n"
+        "  rustdeps = -Clink-arg=-Bdynamic -Clink-arg=obj/bar/libmylib.so\n"
         "  ldflags =\n"
         "  sources = ../../foo/source.rs ../../foo/main.rs\n";
     std::string out_str = out.str();
@@ -1818,7 +1813,7 @@
         "  source_file_part = main.rs\n"
         "  source_name_part = main\n"
         "  externs = --extern mylib=obj/bar/libmylib.rlib\n"
-        "  rustdeps = -Ldependency=obj/bar -Lnative=. -Clink-arg=-Bdynamic "
+        "  rustdeps = -Ldependency=obj/bar -Clink-arg=-Bdynamic "
         "-Clink-arg=./libshared.so -Clink-arg=./libimplicit.so\n"
         "  ldflags =\n"
         "  sources = ../../foo/main.rs\n";
@@ -1906,7 +1901,7 @@
         "  externs = --extern "
         "behind_sourceset_public=obj/public/libbehind_sourceset_public.rlib\n"
         "  rustdeps = -Ldependency=obj/public -Ldependency=obj/private "
-        "-Lnative=obj/sset -Clink-arg=-Bdynamic "
+        "-Clink-arg=-Bdynamic "
         "-Clink-arg=obj/sset/bar.input1.o\n"
         "  ldflags =\n"
         "  sources = ../../linked/exe.rs\n";