Escape solibs in case the output name contains a space character.

Bug: chromium:1197495
Change-Id: I464c1a507294ced04c6274149d33b3b9615801e4
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/11500
Reviewed-by: Dirk Pranke <dpranke@google.com>
Commit-Queue: Dirk Pranke <dpranke@google.com>
diff --git a/src/gn/ninja_c_binary_target_writer.cc b/src/gn/ninja_c_binary_target_writer.cc
index ddff182..b52475f 100644
--- a/src/gn/ninja_c_binary_target_writer.cc
+++ b/src/gn/ninja_c_binary_target_writer.cc
@@ -861,7 +861,10 @@
     return;
 
   out_ << "  " << label << " =";
-  path_output_.WriteFiles(out_, libs);
+  PathOutput output(path_output_.current_dir(),
+                    settings_->build_settings()->root_path_utf8(),
+                    ESCAPE_NINJA_COMMAND);
+  output.WriteFiles(out_, libs);
   out_ << std::endl;
 }
 
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc
index 35d9841..ef40173 100644
--- a/src/gn/ninja_c_binary_target_writer_unittest.cc
+++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -1920,3 +1920,59 @@
     EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
   }
 }
+
+TEST_F(NinjaCBinaryTargetWriterTest, SolibsEscaping) {
+  Err err;
+  TestWithScope setup;
+
+  Toolchain toolchain_with_toc(
+      setup.settings(), Label(SourceDir("//toolchain_with_toc/"), "with_toc"));
+  TestWithScope::SetupToolchain(&toolchain_with_toc, true);
+
+  // Create a shared library with a space in the output name.
+  Target shared_lib(setup.settings(),
+                    Label(SourceDir("//rocket"), "space_cadet"));
+  shared_lib.set_output_type(Target::SHARED_LIBRARY);
+  shared_lib.set_output_name("Space Cadet");
+  shared_lib.set_output_prefix_override("");
+  shared_lib.SetToolchain(&toolchain_with_toc);
+  shared_lib.visibility().SetPublic();
+  ASSERT_TRUE(shared_lib.OnResolved(&err));
+
+  // Set up an executable to depend on it.
+  Target target(setup.settings(), Label(SourceDir("//launchpad"), "main"));
+  target.sources().push_back(SourceFile("//launchpad/main.cc"));
+  target.set_output_type(Target::EXECUTABLE);
+  target.private_deps().push_back(LabelTargetPair(&shared_lib));
+  target.SetToolchain(&toolchain_with_toc);
+  ASSERT_TRUE(target.OnResolved(&err));
+
+  std::ostringstream out;
+  NinjaCBinaryTargetWriter writer(&target, out);
+  writer.Run();
+
+  const char expected[] = R"(defines =
+include_dirs =
+root_out_dir = .
+target_out_dir = obj/launchpad
+target_output_name = main
+
+build obj/launchpad/main.main.o: cxx ../../launchpad/main.cc
+
+build ./main: link obj/launchpad/main.main.o | ./Space$ Cadet.so.TOC
+  ldflags =
+  libs =
+  frameworks =
+  swiftmodules =
+  output_extension = 
+  output_dir = 
+)"
+#if defined(OS_WIN)
+  "  solibs = \"./Space$ Cadet.so\"\n";
+#else
+  "  solibs = ./Space\\$ Cadet.so\n";
+#endif
+
+  std::string out_str = out.str();
+  EXPECT_EQ(expected, out_str) << expected << "\n" << out_str;
+}