Factor out common custom command generator
The Makefile, VS, and Xcode generators previously duplicated some custom command line generation code. Factor this out into a separate class cmCustomCommandGenerator shared by all generators.
This commit is contained in:
parent
6fe5b3db0b
commit
542b517449
|
@ -131,6 +131,8 @@ SET(SRCS
|
|||
cmComputeTargetDepends.cxx
|
||||
cmCustomCommand.cxx
|
||||
cmCustomCommand.h
|
||||
cmCustomCommandGenerator.cxx
|
||||
cmCustomCommandGenerator.h
|
||||
cmDefinitions.cxx
|
||||
cmDefinitions.h
|
||||
cmDepends.cxx
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
/*============================================================================
|
||||
CMake - Cross Platform Makefile Generator
|
||||
Copyright 2000-2010 Kitware, Inc., Insight Software Consortium
|
||||
|
||||
Distributed under the OSI-approved BSD License (the "License");
|
||||
see accompanying file Copyright.txt for details.
|
||||
|
||||
This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the License for more information.
|
||||
============================================================================*/
|
||||
#include "cmCustomCommandGenerator.h"
|
||||
|
||||
#include "cmMakefile.h"
|
||||
#include "cmCustomCommand.h"
|
||||
#include "cmLocalGenerator.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
cmCustomCommandGenerator::cmCustomCommandGenerator(
|
||||
cmCustomCommand const& cc, const char* config, cmMakefile* mf):
|
||||
CC(cc), Config(config), Makefile(mf), LG(mf->GetLocalGenerator()),
|
||||
OldStyle(cc.GetEscapeOldStyle()), MakeVars(cc.GetEscapeAllowMakeVars())
|
||||
{
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
unsigned int cmCustomCommandGenerator::GetNumberOfCommands() const
|
||||
{
|
||||
return static_cast<unsigned int>(this->CC.GetCommandLines().size());
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
std::string cmCustomCommandGenerator::GetCommand(unsigned int c) const
|
||||
{
|
||||
std::string const& argv0 = this->CC.GetCommandLines()[c][0];
|
||||
return this->LG->GetRealLocation(argv0.c_str(), this->Config);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
void
|
||||
cmCustomCommandGenerator
|
||||
::AppendArguments(unsigned int c, std::string& cmd) const
|
||||
{
|
||||
cmCustomCommandLine const& commandLine = this->CC.GetCommandLines()[c];
|
||||
for(unsigned int j=1;j < commandLine.size(); ++j)
|
||||
{
|
||||
std::string const& arg = commandLine[j];
|
||||
cmd += " ";
|
||||
if(this->OldStyle)
|
||||
{
|
||||
cmd += this->LG->EscapeForShellOldStyle(arg.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd += this->LG->EscapeForShell(arg.c_str(), this->MakeVars);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/*============================================================================
|
||||
CMake - Cross Platform Makefile Generator
|
||||
Copyright 2000-2010 Kitware, Inc., Insight Software Consortium
|
||||
|
||||
Distributed under the OSI-approved BSD License (the "License");
|
||||
see accompanying file Copyright.txt for details.
|
||||
|
||||
This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the License for more information.
|
||||
============================================================================*/
|
||||
#ifndef cmCustomCommandGenerator_h
|
||||
#define cmCustomCommandGenerator_h
|
||||
|
||||
#include "cmStandardIncludes.h"
|
||||
|
||||
class cmCustomCommand;
|
||||
class cmMakefile;
|
||||
class cmLocalGenerator;
|
||||
|
||||
class cmCustomCommandGenerator
|
||||
{
|
||||
cmCustomCommand const& CC;
|
||||
const char* Config;
|
||||
cmMakefile* Makefile;
|
||||
cmLocalGenerator* LG;
|
||||
bool OldStyle;
|
||||
bool MakeVars;
|
||||
public:
|
||||
cmCustomCommandGenerator(cmCustomCommand const& cc, const char* config,
|
||||
cmMakefile* mf);
|
||||
unsigned int GetNumberOfCommands() const;
|
||||
std::string GetCommand(unsigned int c) const;
|
||||
void AppendArguments(unsigned int c, std::string& cmd) const;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -18,6 +18,7 @@
|
|||
#include "cmGeneratedFileStream.h"
|
||||
#include "cmComputeLinkInformation.h"
|
||||
#include "cmSourceFile.h"
|
||||
#include "cmCustomCommandGenerator.h"
|
||||
|
||||
#include <cmsys/auto_ptr.hxx>
|
||||
|
||||
|
@ -1314,8 +1315,7 @@ void cmGlobalXCodeGenerator
|
|||
cmCustomCommand const& cc = *i;
|
||||
if(!cc.GetCommandLines().empty())
|
||||
{
|
||||
bool escapeOldStyle = cc.GetEscapeOldStyle();
|
||||
bool escapeAllowMakeVars = cc.GetEscapeAllowMakeVars();
|
||||
cmCustomCommandGenerator ccg(cc, configName, this->CurrentMakefile);
|
||||
makefileStream << "\n";
|
||||
const std::vector<std::string>& outputs = cc.GetOutputs();
|
||||
if(!outputs.empty())
|
||||
|
@ -1348,20 +1348,15 @@ void cmGlobalXCodeGenerator
|
|||
{
|
||||
std::string echo_cmd = "echo ";
|
||||
echo_cmd += (this->CurrentLocalGenerator->
|
||||
EscapeForShell(comment, escapeAllowMakeVars));
|
||||
EscapeForShell(comment, cc.GetEscapeAllowMakeVars()));
|
||||
makefileStream << "\t" << echo_cmd.c_str() << "\n";
|
||||
}
|
||||
|
||||
// Add each command line to the set of commands.
|
||||
for(cmCustomCommandLines::const_iterator cl =
|
||||
cc.GetCommandLines().begin();
|
||||
cl != cc.GetCommandLines().end(); ++cl)
|
||||
for(unsigned int c = 0; c < ccg.GetNumberOfCommands(); ++c)
|
||||
{
|
||||
// Build the command line in a single string.
|
||||
const cmCustomCommandLine& commandLine = *cl;
|
||||
std::string cmd2 = this->CurrentLocalGenerator
|
||||
->GetRealLocation(commandLine[0].c_str(), configName);
|
||||
|
||||
std::string cmd2 = ccg.GetCommand(c);
|
||||
cmSystemTools::ReplaceString(cmd2, "/./", "/");
|
||||
cmd2 = this->ConvertToRelativeForMake(cmd2.c_str());
|
||||
std::string cmd;
|
||||
|
@ -1372,21 +1367,7 @@ void cmGlobalXCodeGenerator
|
|||
cmd += " && ";
|
||||
}
|
||||
cmd += cmd2;
|
||||
for(unsigned int j=1; j < commandLine.size(); ++j)
|
||||
{
|
||||
cmd += " ";
|
||||
if(escapeOldStyle)
|
||||
{
|
||||
cmd += (this->CurrentLocalGenerator
|
||||
->EscapeForShellOldStyle(commandLine[j].c_str()));
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd += (this->CurrentLocalGenerator->
|
||||
EscapeForShell(commandLine[j].c_str(),
|
||||
escapeAllowMakeVars));
|
||||
}
|
||||
}
|
||||
ccg.AppendArguments(c, cmd);
|
||||
makefileStream << "\t" << cmd.c_str() << "\n";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "cmake.h"
|
||||
#include "cmVersion.h"
|
||||
#include "cmFileTimeComparison.h"
|
||||
#include "cmCustomCommandGenerator.h"
|
||||
|
||||
// Include dependency scanners for supported languages. Only the
|
||||
// C/C++ scanner is needed for bootstrapping CMake.
|
||||
|
@ -961,18 +962,15 @@ cmLocalUnixMakefileGenerator3
|
|||
{
|
||||
*content << dir;
|
||||
}
|
||||
bool escapeOldStyle = cc.GetEscapeOldStyle();
|
||||
bool escapeAllowMakeVars = cc.GetEscapeAllowMakeVars();
|
||||
cmCustomCommandGenerator ccg(cc, this->ConfigurationName.c_str(),
|
||||
this->Makefile);
|
||||
|
||||
// Add each command line to the set of commands.
|
||||
std::vector<std::string> commands1;
|
||||
for(cmCustomCommandLines::const_iterator cl = cc.GetCommandLines().begin();
|
||||
cl != cc.GetCommandLines().end(); ++cl)
|
||||
for(unsigned int c = 0; c < ccg.GetNumberOfCommands(); ++c)
|
||||
{
|
||||
// Build the command line in a single string.
|
||||
const cmCustomCommandLine& commandLine = *cl;
|
||||
std::string cmd = GetRealLocation(commandLine[0].c_str(),
|
||||
this->ConfigurationName.c_str());
|
||||
std::string cmd = ccg.GetCommand(c);
|
||||
if (cmd.size())
|
||||
{
|
||||
// Use "call " before any invocations of .bat or .cmd files
|
||||
|
@ -1025,19 +1023,8 @@ cmLocalUnixMakefileGenerator3
|
|||
std::string launcher =
|
||||
this->MakeLauncher(cc, target, workingDir? NONE : START_OUTPUT);
|
||||
cmd = launcher + this->Convert(cmd.c_str(),NONE,SHELL);
|
||||
for(unsigned int j=1; j < commandLine.size(); ++j)
|
||||
{
|
||||
cmd += " ";
|
||||
if(escapeOldStyle)
|
||||
{
|
||||
cmd += this->EscapeForShellOldStyle(commandLine[j].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
cmd += this->EscapeForShell(commandLine[j].c_str(),
|
||||
escapeAllowMakeVars);
|
||||
}
|
||||
}
|
||||
|
||||
ccg.AppendArguments(c, cmd);
|
||||
if(content)
|
||||
{
|
||||
// Rule content does not include the launcher.
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "cmMakefile.h"
|
||||
#include "cmSourceFile.h"
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmCustomCommandGenerator.h"
|
||||
#include "windows.h"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
@ -157,8 +158,8 @@ cmLocalVisualStudioGenerator
|
|||
{
|
||||
const cmCustomCommandLines& commandLines = cc.GetCommandLines();
|
||||
const char* workingDirectory = cc.GetWorkingDirectory();
|
||||
bool escapeOldStyle = cc.GetEscapeOldStyle();
|
||||
bool escapeAllowMakeVars = cc.GetEscapeAllowMakeVars();
|
||||
cmCustomCommandGenerator ccg(cc, configName, this->Makefile);
|
||||
RelativeRoot relativeRoot = workingDirectory? NONE : START_OUTPUT;
|
||||
|
||||
// Avoid leading or trailing newlines.
|
||||
const char* newline = "";
|
||||
|
@ -198,40 +199,16 @@ cmLocalVisualStudioGenerator
|
|||
}
|
||||
}
|
||||
// Write each command on a single line.
|
||||
for(cmCustomCommandLines::const_iterator cl = commandLines.begin();
|
||||
cl != commandLines.end(); ++cl)
|
||||
for(unsigned int c = 0; c < ccg.GetNumberOfCommands(); ++c)
|
||||
{
|
||||
// Start a new line.
|
||||
script += newline;
|
||||
newline = newline_text;
|
||||
|
||||
// Start with the command name.
|
||||
const cmCustomCommandLine& commandLine = *cl;
|
||||
std::string commandName = this->GetRealLocation(commandLine[0].c_str(),
|
||||
configName);
|
||||
if(!workingDirectory)
|
||||
{
|
||||
script += this->Convert(commandName.c_str(),START_OUTPUT,SHELL);
|
||||
}
|
||||
else
|
||||
{
|
||||
script += this->Convert(commandName.c_str(),NONE,SHELL);
|
||||
}
|
||||
|
||||
// Add the arguments.
|
||||
for(unsigned int j=1;j < commandLine.size(); ++j)
|
||||
{
|
||||
script += " ";
|
||||
if(escapeOldStyle)
|
||||
{
|
||||
script += this->EscapeForShellOldStyle(commandLine[j].c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
script += this->EscapeForShell(commandLine[j].c_str(),
|
||||
escapeAllowMakeVars);
|
||||
}
|
||||
}
|
||||
// Add this command line.
|
||||
std::string cmd = ccg.GetCommand(c);
|
||||
script += this->Convert(cmd.c_str(), relativeRoot, SHELL);
|
||||
ccg.AppendArguments(c, script);
|
||||
|
||||
// After each custom command, check for an error result.
|
||||
// If there was an error, jump to the VCReportError label,
|
||||
|
|
Loading…
Reference in New Issue