Escape spaces in "libs" The motivation is being able to add ".../DIA SDK/diaguids.lib" to libs. Change-Id: I81f0e1c135782f21995b9cd47105bd9cd47e4edf Reviewed-on: https://gn-review.googlesource.com/c/gn/+/12200 Commit-Queue: Nico Weber <thakis@chromium.org> Reviewed-by: Brett Wilson <brettw@chromium.org>
diff --git a/src/gn/ninja_binary_target_writer.cc b/src/gn/ninja_binary_target_writer.cc index a5dcd66..b26171a 100644 --- a/src/gn/ninja_binary_target_writer.cc +++ b/src/gn/ninja_binary_target_writer.cc
@@ -357,6 +357,11 @@ void NinjaBinaryTargetWriter::WriteLibs(std::ostream& out, const Tool* tool) { // Libraries that have been recursively pushed through the dependency tree. + // Since we're passing these on the command line to the linker and not + // to Ninja, we need to do shell escaping. + PathOutput lib_path_output( + path_output_.current_dir(), settings_->build_settings()->root_path_utf8(), + ESCAPE_NINJA_COMMAND); EscapeOptions lib_escape_opts; lib_escape_opts.mode = ESCAPE_NINJA_COMMAND; const UniqueVector<LibFile>& all_libs = target_->all_libs(); @@ -365,7 +370,7 @@ const std::string& lib_value = lib_file.value(); if (lib_file.is_source_file()) { out << " " << tool->linker_arg(); - path_output_.WriteFile(out, lib_file.source_file()); + lib_path_output.WriteFile(out, lib_file.source_file()); } else { out << " " << tool->lib_switch(); EscapeStringToStream(out, lib_value, lib_escape_opts);
diff --git a/src/gn/ninja_c_binary_target_writer_unittest.cc b/src/gn/ninja_c_binary_target_writer_unittest.cc index ef40173..61bc517 100644 --- a/src/gn/ninja_c_binary_target_writer_unittest.cc +++ b/src/gn/ninja_c_binary_target_writer_unittest.cc
@@ -490,6 +490,7 @@ Target target(setup.settings(), Label(SourceDir("//foo/"), "shlib")); target.set_output_type(Target::SHARED_LIBRARY); target.config_values().libs().push_back(LibFile(SourceFile("//foo/lib1.a"))); + target.config_values().libs().push_back(LibFile(SourceFile("//sysroot/DIA SDK/diaguids.lib"))); target.config_values().libs().push_back(LibFile("foo")); target.config_values().lib_dirs().push_back(SourceDir("//foo/bar/")); target.SetToolchain(setup.toolchain()); @@ -507,9 +508,13 @@ "target_output_name = libshlib\n" "\n" "\n" - "build ./libshlib.so: solink | ../../foo/lib1.a\n" + "build ./libshlib.so: solink | ../../foo/lib1.a ../../sysroot/DIA$ SDK/diaguids.lib\n" " ldflags = -L../../foo/bar\n" - " libs = ../../foo/lib1.a -lfoo\n" +#ifdef _WIN32 + " libs = ../../foo/lib1.a \"../../sysroot/DIA$ SDK/diaguids.lib\" -lfoo\n" +#else + " libs = ../../foo/lib1.a ../../sysroot/DIA\\$ SDK/diaguids.lib -lfoo\n" +#endif " frameworks =\n" " swiftmodules =\n" " output_extension = .so\n"