Merge topic 'vs10-custom-working-directory-issue-11938'
234bae7 VS10: Fix exit code of custom commands with setlocal/endlocal (#11938) b98fdd5 VS: Use setlocal/endlocal only in VS 10 custom commands 06fcbc4 VS10: Fix working directory of consecutive custom commands (#11938)
This commit is contained in:
commit
8997dc935c
@ -119,7 +119,7 @@ void cmLocalVisualStudio10Generator
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string cmLocalVisualStudio10Generator::CheckForErrorLine()
|
const char* cmLocalVisualStudio10Generator::ReportErrorLabel() const
|
||||||
{
|
{
|
||||||
return "if errorlevel 1 goto :VCEnd";
|
return ":VCEnd";
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,8 @@ public:
|
|||||||
const char* path);
|
const char* path);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual std::string CheckForErrorLine();
|
virtual const char* ReportErrorLabel() const;
|
||||||
|
virtual bool CustomCommandUseLocal() const { return true; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
@ -154,15 +154,15 @@ void cmLocalVisualStudioGenerator::ComputeObjectNameRequirements
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string cmLocalVisualStudioGenerator::CheckForErrorLine()
|
const char* cmLocalVisualStudioGenerator::ReportErrorLabel() const
|
||||||
{
|
{
|
||||||
return "if errorlevel 1 goto :VCReportError";
|
return ":VCReportError";
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string cmLocalVisualStudioGenerator::GetCheckForErrorLine()
|
const char* cmLocalVisualStudioGenerator::GetReportErrorLabel() const
|
||||||
{
|
{
|
||||||
return this->CheckForErrorLine();
|
return this->ReportErrorLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -172,6 +172,7 @@ cmLocalVisualStudioGenerator
|
|||||||
const char* configName,
|
const char* configName,
|
||||||
const char* newline_text)
|
const char* newline_text)
|
||||||
{
|
{
|
||||||
|
bool useLocal = this->CustomCommandUseLocal();
|
||||||
const cmCustomCommandLines& commandLines = cc.GetCommandLines();
|
const cmCustomCommandLines& commandLines = cc.GetCommandLines();
|
||||||
const char* workingDirectory = cc.GetWorkingDirectory();
|
const char* workingDirectory = cc.GetWorkingDirectory();
|
||||||
cmCustomCommandGenerator ccg(cc, configName, this->Makefile);
|
cmCustomCommandGenerator ccg(cc, configName, this->Makefile);
|
||||||
@ -180,8 +181,29 @@ cmLocalVisualStudioGenerator
|
|||||||
// Avoid leading or trailing newlines.
|
// Avoid leading or trailing newlines.
|
||||||
const char* newline = "";
|
const char* newline = "";
|
||||||
|
|
||||||
|
// Line to check for error between commands.
|
||||||
|
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.
|
// Store the script in a string.
|
||||||
std::string script;
|
std::string script;
|
||||||
|
|
||||||
|
// Open a local context.
|
||||||
|
if(useLocal)
|
||||||
|
{
|
||||||
|
script += newline;
|
||||||
|
newline = newline_text;
|
||||||
|
script += "setlocal";
|
||||||
|
}
|
||||||
|
|
||||||
if(workingDirectory)
|
if(workingDirectory)
|
||||||
{
|
{
|
||||||
// Change the working directory.
|
// Change the working directory.
|
||||||
@ -189,6 +211,7 @@ cmLocalVisualStudioGenerator
|
|||||||
newline = newline_text;
|
newline = newline_text;
|
||||||
script += "cd ";
|
script += "cd ";
|
||||||
script += this->Convert(workingDirectory, FULL, SHELL);
|
script += this->Convert(workingDirectory, FULL, SHELL);
|
||||||
|
script += check_error;
|
||||||
|
|
||||||
// Change the working drive.
|
// Change the working drive.
|
||||||
if(workingDirectory[0] && workingDirectory[1] == ':')
|
if(workingDirectory[0] && workingDirectory[1] == ':')
|
||||||
@ -197,8 +220,10 @@ cmLocalVisualStudioGenerator
|
|||||||
newline = newline_text;
|
newline = newline_text;
|
||||||
script += workingDirectory[0];
|
script += workingDirectory[0];
|
||||||
script += workingDirectory[1];
|
script += workingDirectory[1];
|
||||||
|
script += check_error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for visual studio IDE add extra stuff to the PATH
|
// for visual studio IDE add extra stuff to the PATH
|
||||||
// if CMAKE_MSVCIDE_RUN_PATH is set.
|
// if CMAKE_MSVCIDE_RUN_PATH is set.
|
||||||
if(this->Makefile->GetDefinition("MSVC_IDE"))
|
if(this->Makefile->GetDefinition("MSVC_IDE"))
|
||||||
@ -214,6 +239,7 @@ cmLocalVisualStudioGenerator
|
|||||||
script += ";%PATH%";
|
script += ";%PATH%";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write each command on a single line.
|
// Write each command on a single line.
|
||||||
for(unsigned int c = 0; c < ccg.GetNumberOfCommands(); ++c)
|
for(unsigned int c = 0; c < ccg.GetNumberOfCommands(); ++c)
|
||||||
{
|
{
|
||||||
@ -230,9 +256,25 @@ cmLocalVisualStudioGenerator
|
|||||||
// If there was an error, jump to the VCReportError label,
|
// If there was an error, jump to the VCReportError label,
|
||||||
// skipping the run of any subsequent commands in this
|
// skipping the run of any subsequent commands in this
|
||||||
// sequence.
|
// sequence.
|
||||||
//
|
script += check_error;
|
||||||
script += newline_text;
|
}
|
||||||
script += this->GetCheckForErrorLine();
|
|
||||||
|
// Close the local context.
|
||||||
|
if(useLocal)
|
||||||
|
{
|
||||||
|
script += newline;
|
||||||
|
script += ":cmEnd";
|
||||||
|
script += newline;
|
||||||
|
script += "endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone";
|
||||||
|
script += newline;
|
||||||
|
script += ":cmErrorLevel";
|
||||||
|
script += newline;
|
||||||
|
script += "exit /b %1";
|
||||||
|
script += newline;
|
||||||
|
script += ":cmDone";
|
||||||
|
script += newline;
|
||||||
|
script += "if %errorlevel% neq 0 goto ";
|
||||||
|
script += this->GetReportErrorLabel();
|
||||||
}
|
}
|
||||||
|
|
||||||
return script;
|
return script;
|
||||||
|
@ -37,13 +37,13 @@ public:
|
|||||||
const char* configName,
|
const char* configName,
|
||||||
const char* newline = "\n");
|
const char* newline = "\n");
|
||||||
|
|
||||||
/** Line of batch file text that skips to the end after
|
/** Label to which to jump in a batch file after a failed step in a
|
||||||
* a failed step in a sequence of custom commands.
|
sequence of custom commands. */
|
||||||
*/
|
const char* GetReportErrorLabel() const;
|
||||||
std::string GetCheckForErrorLine();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual std::string CheckForErrorLine();
|
virtual const char* ReportErrorLabel() const;
|
||||||
|
virtual bool CustomCommandUseLocal() const { return false; }
|
||||||
|
|
||||||
/** Construct a custom command to make exe import lib dir. */
|
/** Construct a custom command to make exe import lib dir. */
|
||||||
cmsys::auto_ptr<cmCustomCommand>
|
cmsys::auto_ptr<cmCustomCommand>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user