Browse Source

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

Bill Hoffman 22 years ago
parent
commit
fc0a916eee

+ 15 - 0
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;
+}

+ 3 - 0
Source/cmCustomCommand.h

@@ -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;

+ 1 - 1
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)
     {

+ 24 - 11
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<std::string> depends2(depends);
   if (main_dependency && main_dependency[0] != '\0')
     {