Don't allow ./ before target name. Do not put a leading "./" on any ninja target paths when writing MSVS project files. Ninja.exe -tclean breaks on such paths. BUG=chromium:791295 Change-Id: I5c427ddc41e1e18122022aa85cf6c1f0ff62fbfc Reviewed-on: https://gn-review.googlesource.com/2580 Commit-Queue: Dirk Pranke <dpranke@chromium.org> Reviewed-by: Dirk Pranke <dpranke@chromium.org>
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc index 856d548..c4fd906 100644 --- a/tools/gn/visual_studio_writer.cc +++ b/tools/gn/visual_studio_writer.cc
@@ -904,5 +904,8 @@ DCHECK(!target->dependency_output_file().value().empty()); ninja_path_output_.WriteFile(ninja_target_out, target->dependency_output_file()); - return ninja_target_out.str(); + std::string s = ninja_target_out.str(); + if (s.compare(0, 2, "./") == 0) + s = s.substr(2); + return s; }
diff --git a/tools/gn/visual_studio_writer.h b/tools/gn/visual_studio_writer.h index d9bb883..3193646 100644 --- a/tools/gn/visual_studio_writer.h +++ b/tools/gn/visual_studio_writer.h
@@ -53,6 +53,7 @@ FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, ResolveSolutionFolders); FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, ResolveSolutionFolders_AbsPath); + FRIEND_TEST_ALL_PREFIXES(VisualStudioWriterTest, NoDotSlash); // Solution project or folder. struct SolutionEntry {
diff --git a/tools/gn/visual_studio_writer_unittest.cc b/tools/gn/visual_studio_writer_unittest.cc index 0fe736d..165bbb4 100644 --- a/tools/gn/visual_studio_writer_unittest.cc +++ b/tools/gn/visual_studio_writer_unittest.cc
@@ -163,3 +163,38 @@ ASSERT_EQ(writer.folders_[0].get(), writer.projects_[2]->parent_folder); ASSERT_EQ(writer.folders_[1].get(), writer.projects_[3]->parent_folder); } + +TEST_F(VisualStudioWriterTest, NoDotSlash) { + VisualStudioWriter writer(setup_.build_settings(), "Win32", + VisualStudioWriter::Version::Vs2015, + "10.0.17134.0"); + + std::string path = MakeTestPath("blah.vcxproj"); + writer.projects_.push_back( + std::make_unique<VisualStudioWriter::SolutionProject>( + "base", path, MakeGuid(path, "project"), MakeTestPath("/foo"), + "Win32")); + + std::unique_ptr<Tool> tool = std::make_unique<Tool>(); + tool->set_outputs(SubstitutionList::MakeForTest( + "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", "")); + + Toolchain toolchain(setup_.settings(), Label(SourceDir("//tc/"), "tc")); + toolchain.SetTool(Toolchain::TYPE_ALINK, std::move(tool)); + + Target target(setup_.settings(), Label(SourceDir("//baz/"), "baz")); + target.set_output_type(Target::STATIC_LIBRARY); + target.SetToolchain(&toolchain); + + Err err; + ASSERT_TRUE(target.OnResolved(&err)); + + VisualStudioWriter::SourceFileCompileTypePairs source_types; + + std::stringstream file_contents; + writer.WriteProjectFileContents(file_contents, *writer.projects_.back(), + &target, "", &source_types, &err); + + // Should find args of a ninja clean command, with no ./ before the file name. + ASSERT_NE(file_contents.str().find("-tclean baz"), std::string::npos); +}