فهرست منبع

VS: Use setlocal/endlocal only in VS 10 custom commands

The setlocal/endlocal and errorlevel pattern added by commit 06fcbc47
(VS10: Fix working directory of consecutive custom commands, 2011-04-08)
does not work well in VS 7.1.  Restore the original behavior for VS
versions that do not need the new behavior.
Brad King 14 سال پیش
والد
کامیت
b98fdd5284
3فایلهای تغییر یافته به همراه39 افزوده شده و 13 حذف شده
  1. 1 0
      Source/cmLocalVisualStudio10Generator.h
  2. 37 13
      Source/cmLocalVisualStudioGenerator.cxx
  3. 1 0
      Source/cmLocalVisualStudioGenerator.h

+ 1 - 0
Source/cmLocalVisualStudio10Generator.h

@@ -39,6 +39,7 @@ public:
 
 protected:
   virtual const char* ReportErrorLabel() const;
+  virtual bool CustomCommandUseLocal() const { return true; }
 
 private:
 };

+ 37 - 13
Source/cmLocalVisualStudioGenerator.cxx

@@ -170,29 +170,47 @@ std::string
 cmLocalVisualStudioGenerator
 ::ConstructScript(cmCustomCommand const& cc,
                   const char* configName,
-                  const char* newline)
+                  const char* newline_text)
 {
+  bool useLocal = this->CustomCommandUseLocal();
   const cmCustomCommandLines& commandLines = cc.GetCommandLines();
   const char* workingDirectory = cc.GetWorkingDirectory();
   cmCustomCommandGenerator ccg(cc, configName, this->Makefile);
   RelativeRoot relativeRoot = workingDirectory? NONE : START_OUTPUT;
 
+  // Avoid leading or trailing newlines.
+  const char* newline = "";
+
   // Line to check for error between commands.
-  std::string check_error = newline;
-  check_error += "if %errorlevel% neq 0 goto :cmEnd";
+  std::string check_error = newline_text;
+  if(useLocal)
+    {
+    check_error += "if %errorlevel% neq 0 goto :cmEnd";
+    }
+  else
+    {
+    check_error += "if errorlevel 1 goto ";
+    check_error += this->GetReportErrorLabel();
+    }
 
   // Store the script in a string.
   std::string script;
 
   // Open a local context.
-  script += "set errlev=";
-  script += newline;
-  script += "setlocal";
+  if(useLocal)
+    {
+    script += newline;
+    newline = newline_text;
+    script += "set errlev=";
+    script += newline;
+    script += "setlocal";
+    }
 
   if(workingDirectory)
     {
     // Change the working directory.
     script += newline;
+    newline = newline_text;
     script += "cd ";
     script += this->Convert(workingDirectory, FULL, SHELL);
     script += check_error;
@@ -201,6 +219,7 @@ cmLocalVisualStudioGenerator
     if(workingDirectory[0] && workingDirectory[1] == ':')
       {
       script += newline;
+      newline = newline_text;
       script += workingDirectory[0];
       script += workingDirectory[1];
       script += check_error;
@@ -216,6 +235,7 @@ cmLocalVisualStudioGenerator
     if(extraPath)
       {
       script += newline;
+      newline = newline_text;
       script += "set PATH=";
       script += extraPath;
       script += ";%PATH%";
@@ -227,6 +247,7 @@ cmLocalVisualStudioGenerator
     {
     // Start a new line.
     script += newline;
+    newline = newline_text;
 
     // Add this command line.
     std::string cmd = ccg.GetCommand(c);
@@ -241,13 +262,16 @@ cmLocalVisualStudioGenerator
     }
 
   // Close the local context.
-  script += newline;
-  script += ":cmEnd";
-  script += newline;
-  script += "endlocal & set errlev=%errorlevel%";
-  script += newline;
-  script += "if %errlev% neq 0 goto ";
-  script += this->GetReportErrorLabel();
+  if(useLocal)
+    {
+    script += newline;
+    script += ":cmEnd";
+    script += newline;
+    script += "endlocal & set errlev=%errorlevel%";
+    script += newline;
+    script += "if %errlev% neq 0 goto ";
+    script += this->GetReportErrorLabel();
+    }
 
   return script;
 }

+ 1 - 0
Source/cmLocalVisualStudioGenerator.h

@@ -43,6 +43,7 @@ public:
 
 protected:
   virtual const char* ReportErrorLabel() const;
+  virtual bool CustomCommandUseLocal() const { return false; }
 
   /** Construct a custom command to make exe import lib dir.  */
   cmsys::auto_ptr<cmCustomCommand>