diff --git a/Source/cmCustomCommand.cxx b/Source/cmCustomCommand.cxx index 5facc4ca7..fffa51dfb 100644 --- a/Source/cmCustomCommand.cxx +++ b/Source/cmCustomCommand.cxx @@ -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; +} diff --git a/Source/cmCustomCommand.h b/Source/cmCustomCommand.h index 79206ac1d..62b47fa9e 100644 --- a/Source/cmCustomCommand.h +++ b/Source/cmCustomCommand.h @@ -69,6 +69,9 @@ public: const std::vector &GetDepends() const {return m_Depends;} std::vector &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; diff --git a/Source/cmLocalVisualStudio7Generator.cxx b/Source/cmLocalVisualStudio7Generator.cxx index a3fcd7b94..5e4b5cd37 100644 --- a/Source/cmLocalVisualStudio7Generator.cxx +++ b/Source/cmLocalVisualStudio7Generator.cxx @@ -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) { diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 8c8d251de..5678178f2 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -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 depends2(depends); if (main_dependency && main_dependency[0] != '\0') {