ENH: allow duplicate commands with the same output to be reduced automatically to one command
This commit is contained in:
parent
3154a6649a
commit
fc0a916eee
@ -65,3 +65,18 @@ void cmCustomCommand::ExpandVariables(const cmMakefile &mf)
|
|||||||
mf.ExpandVariablesInString(*i);
|
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;
|
||||||
|
}
|
||||||
|
@ -69,6 +69,9 @@ public:
|
|||||||
const std::vector<std::string> &GetDepends() const {return m_Depends;}
|
const std::vector<std::string> &GetDepends() const {return m_Depends;}
|
||||||
std::vector<std::string> &GetDepends() {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:
|
private:
|
||||||
std::string m_Command;
|
std::string m_Command;
|
||||||
std::string m_Arguments;
|
std::string m_Arguments;
|
||||||
|
@ -951,7 +951,7 @@ void cmLocalVisualStudio7Generator::WriteVCProjEndGroup(std::ostream& fout)
|
|||||||
// look for custom rules on a target and collect them together
|
// look for custom rules on a target and collect them together
|
||||||
void cmLocalVisualStudio7Generator::OutputTargetRules(std::ostream& fout,
|
void cmLocalVisualStudio7Generator::OutputTargetRules(std::ostream& fout,
|
||||||
const cmTarget &target,
|
const cmTarget &target,
|
||||||
const char */* libName */)
|
const char * /* libName */)
|
||||||
{
|
{
|
||||||
if (target.GetType() > cmTarget::UTILITY)
|
if (target.GetType() > cmTarget::UTILITY)
|
||||||
{
|
{
|
||||||
|
@ -499,6 +499,16 @@ AddCustomCommandToOutput(const char* output,
|
|||||||
const char *comment,
|
const char *comment,
|
||||||
bool replace)
|
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;
|
cmSourceFile *file = 0;
|
||||||
std::string outName = output;
|
std::string outName = output;
|
||||||
outName += ".rule";
|
outName += ".rule";
|
||||||
@ -524,7 +534,18 @@ AddCustomCommandToOutput(const char* output,
|
|||||||
file = this->GetSource(outName.c_str());
|
file = this->GetSource(outName.c_str());
|
||||||
if (file && file->GetCustomCommand() && !replace)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
// create a cmSourceFile for the output
|
// create a cmSourceFile for the output
|
||||||
@ -538,19 +559,11 @@ AddCustomCommandToOutput(const char* output,
|
|||||||
out->SetProperty("GENERATED","1");
|
out->SetProperty("GENERATED","1");
|
||||||
|
|
||||||
// process the command
|
// process the command
|
||||||
std::string expandC = command;
|
expandC = command;
|
||||||
this->ExpandVariablesInString(expandC);
|
this->ExpandVariablesInString(expandC);
|
||||||
std::string c = cmSystemTools::EscapeSpaces(expandC.c_str());
|
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);
|
std::vector<std::string> depends2(depends);
|
||||||
if (main_dependency && main_dependency[0] != '\0')
|
if (main_dependency && main_dependency[0] != '\0')
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user