From f8f3cb8d65d3ddbd8840814df7df884a2714b88e Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 3 Feb 2017 10:08:37 -0500 Subject: VS: Fix quoting of special characters in cmake re-run check commands Fix our calls to `AddCustomCommandToOutput` for adding cmake re-run check commands to disable old-style quoting in favor of the full quoting logic. This is necessary when paths contain special characters like `&` that old-style quoting logic does not handle. This also requires us to expand the `$(SolutionPath)` placeholder explicitly because otherwise its expanded value will no longer be quoted correctly. As a side effect, this fixes the value in VS 10 and above where the placeholder may be undefined when driving the build through MSBuild without the `.sln` file. Reported-by: Steven Cook Fixes: #16585 --- Source/cmGlobalVisualStudio8Generator.cxx | 6 ++++-- Source/cmLocalVisualStudio7Generator.cxx | 6 ++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index e961a3d..8353a3f 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -298,7 +298,9 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget() commandLine.push_back("--check-stamp-list"); commandLine.push_back(stampList.c_str()); commandLine.push_back("--vs-solution-file"); - commandLine.push_back("\"$(SolutionPath)\""); + std::string const sln = std::string(lg->GetBinaryDirectory()) + "/" + + lg->GetProjectName() + ".sln"; + commandLine.push_back(sln); cmCustomCommandLines commandLines; commandLines.push_back(commandLine); @@ -310,7 +312,7 @@ bool cmGlobalVisualStudio8Generator::AddCheckTarget() std::vector no_byproducts; if (cmSourceFile* file = mf->AddCustomCommandToOutput( stamps, no_byproducts, listFiles, no_main_dependency, commandLines, - "Checking Build System", no_working_directory, true)) { + "Checking Build System", no_working_directory, true, false)) { gt->AddSource(file->GetFullPath()); } else { cmSystemTools::Error("Error adding rule for ", stamps[0].c_str()); diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index 49b057b..38dda04 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -260,9 +260,7 @@ cmSourceFile* cmLocalVisualStudio7Generator::CreateVCProjBuildRule() args += this->GetBinaryDirectory(); commandLine.push_back(args); commandLine.push_back("--check-stamp-file"); - std::string stampFilename = this->ConvertToOutputFormat( - cmSystemTools::CollapseFullPath(stampName), cmOutputConverter::SHELL); - commandLine.push_back(stampFilename.c_str()); + commandLine.push_back(stampName); std::vector const& listFiles = this->Makefile->GetListFiles(); @@ -273,7 +271,7 @@ cmSourceFile* cmLocalVisualStudio7Generator::CreateVCProjBuildRule() cmSystemTools::CollapseFullPath(stampName.c_str()); this->Makefile->AddCustomCommandToOutput( fullpathStampName.c_str(), listFiles, makefileIn.c_str(), commandLines, - comment.c_str(), no_working_directory, true); + comment.c_str(), no_working_directory, true, false); if (cmSourceFile* file = this->Makefile->GetSource(makefileIn.c_str())) { return file; } else { -- cgit v0.12