ENH: allow duplicate commands with the same output to be reduced automatically to one command

This commit is contained in:
Bill Hoffman 2003-06-04 13:42:42 -04:00
parent 3154a6649a
commit fc0a916eee
4 changed files with 43 additions and 12 deletions

View File

@ -65,3 +65,18 @@ void cmCustomCommand::ExpandVariables(const cmMakefile &mf)
mf.ExpandVariablesInString(*i);
}
}
bool cmCustomCommand::IsEquivalent(const char* command,
const char* args)
{
if(m_Command != command)
{
return false;
}
if(m_Arguments != args)
{
return false;
}
return true;
}

View File

@ -69,6 +69,9 @@ public:
const std::vector<std::string> &GetDepends() const {return m_Depends;}
std::vector<std::string> &GetDepends() {return m_Depends;}
///! Return true if the command and args are equal to the ones here.
bool IsEquivalent(const char* command,
const char* args);
private:
std::string m_Command;
std::string m_Arguments;

View File

@ -951,7 +951,7 @@ void cmLocalVisualStudio7Generator::WriteVCProjEndGroup(std::ostream& fout)
// look for custom rules on a target and collect them together
void cmLocalVisualStudio7Generator::OutputTargetRules(std::ostream& fout,
const cmTarget &target,
const char */* libName */)
const char * /* libName */)
{
if (target.GetType() > cmTarget::UTILITY)
{

View File

@ -499,6 +499,16 @@ AddCustomCommandToOutput(const char* output,
const char *comment,
bool replace)
{
std::string expandC;
std::string combinedArgs;
unsigned int i;
for (i = 0; i < commandArgs.size(); ++i)
{
expandC = commandArgs[i].c_str();
this->ExpandVariablesInString(expandC);
combinedArgs += cmSystemTools::EscapeSpaces(expandC.c_str());
combinedArgs += " ";
}
cmSourceFile *file = 0;
std::string outName = output;
outName += ".rule";
@ -524,7 +534,18 @@ AddCustomCommandToOutput(const char* output,
file = this->GetSource(outName.c_str());
if (file && file->GetCustomCommand() && !replace)
{
cmSystemTools::Error("Attempt to add a custom rule to an output that already has a custom rule. For output: ", output);
cmCustomCommand* cc = file->GetCustomCommand();
// if the command and args are the same
// as the command already there, then silently skip
// this add command
if(cc->IsEquivalent(command, combinedArgs.c_str()))
{
return;
}
// produce error if two different commands are given to produce
// the same output
cmSystemTools::Error("Attempt to add a custom rule to an output that already"
" has a custom rule. For output: ", output);
return;
}
// create a cmSourceFile for the output
@ -538,19 +559,11 @@ AddCustomCommandToOutput(const char* output,
out->SetProperty("GENERATED","1");
// process the command
std::string expandC = command;
expandC = command;
this->ExpandVariablesInString(expandC);
std::string c = cmSystemTools::EscapeSpaces(expandC.c_str());
std::string combinedArgs;
unsigned int i;
for (i = 0; i < commandArgs.size(); ++i)
{
expandC = commandArgs[i].c_str();
this->ExpandVariablesInString(expandC);
combinedArgs += cmSystemTools::EscapeSpaces(expandC.c_str());
combinedArgs += " ";
}
std::vector<std::string> depends2(depends);
if (main_dependency && main_dependency[0] != '\0')
{