Sfoglia il codice sorgente

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 <[email protected]>
Fixes: #16585
Brad King 8 anni fa
parent
commit
f8f3cb8d65

+ 4 - 2
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<std::string> 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());

+ 2 - 4
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<std::string> 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 {