Explorar o código

ENH: separate command from its arguments in the custom command. This allows the generator on windows to change the slashes for just the command

Bill Hoffman %!s(int64=24) %!d(string=hai) anos
pai
achega
cc5c1fa6f7

+ 13 - 6
Source/cmAddCustomTargetCommand.cxx

@@ -53,25 +53,32 @@ bool cmAddCustomTargetCommand::InitialPass(std::vector<std::string>& args)
   m_Makefile->ExpandVariablesInString(args[0]);
 
   // all target option
-  std::string result;
+  std::string arguments;
   std::vector<std::string>::iterator s = args.begin();
-  ++s;
+  ++s; // move past args[0] as it is already to be used
   if (args.size() >= 3)
     {
     if (args[1] == "ALL")
       {
       all = true;
-      ++s;
+      ++s; // skip all 
       }
     }
+  std::string command;
+  if(s != args.end())
+    {
+    command = m_Makefile->ExpandVariablesInString(*s);
+    ++s;
+    }
   for (;s != args.end(); ++s)
     {
     m_Makefile->ExpandVariablesInString(*s);
-    result += cmSystemTools::EscapeSpaces(s->c_str());
-    result += " ";
+    arguments += cmSystemTools::EscapeSpaces(s->c_str());
+    arguments += " ";
     }
   m_Makefile->AddUtilityCommand(args[0].c_str(), 
-                                result.c_str(), all);
+                                command.c_str(),
+                                arguments.c_str(), all);
 
   return true;
 }

+ 4 - 0
Source/cmCustomCommand.cxx

@@ -45,10 +45,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  * The constructor
  */
 cmCustomCommand::cmCustomCommand(const char *src, const char *command,
+                                 const char* arguments,
                                  std::vector<std::string> dep,
                                  std::vector<std::string> out):
   m_Source(src),
   m_Command(command),
+  m_Arguments(arguments),
   m_Depends(dep),
   m_Outputs(out)
 {
@@ -61,6 +63,7 @@ cmCustomCommand::cmCustomCommand(const char *src, const char *command,
 cmCustomCommand::cmCustomCommand(const cmCustomCommand& r):
   m_Source(r.m_Source),
   m_Command(r.m_Command),
+  m_Arguments(r.m_Arguments),
   m_Depends(r.m_Depends),
   m_Outputs(r.m_Outputs)
 {
@@ -70,6 +73,7 @@ void cmCustomCommand::ExpandVariables(const cmMakefile &mf)
 {
   mf.ExpandVariablesInString(m_Source);
   mf.ExpandVariablesInString(m_Command);
+  mf.ExpandVariablesInString(m_Arguments);
 
   for (std::vector<std::string>::iterator i = m_Depends.begin();
        i != m_Depends.end(); ++i)

+ 11 - 3
Source/cmCustomCommand.h

@@ -53,6 +53,7 @@ class cmCustomCommand
 {
 public:
   cmCustomCommand(const char *src, const char *command,
+                  const char* arguments,
                   std::vector<std::string> dep,
                   std::vector<std::string> out);
   cmCustomCommand(const cmCustomCommand& r);
@@ -69,11 +70,17 @@ public:
   std::string GetSourceName() const {return m_Source;}
   void SetSourceName(const char *name) {m_Source = name;}
 
-  /**
-   * Return the command to execute
-   */
+  ///! Return the command to execute with arguments
+  std::string GetCommandAndArguments() const
+    {return m_Command + " " + m_Arguments;}
+  
+  ///! Return the command to execute
   std::string GetCommand() const {return m_Command;}
   void SetCommand(const char *cmd) {m_Command = cmd;}
+
+  ///! Return the commands arguments
+  std::string GetArguments() const {return m_Arguments;}
+  void SetArguments(const char *arg) {m_Arguments = arg;}
   
   /**
    * Return the vector that holds the list of dependencies
@@ -90,6 +97,7 @@ public:
 private:
   std::string m_Source;
   std::string m_Command;
+  std::string m_Arguments;
   std::vector<std::string> m_Depends;
   std::vector<std::string> m_Outputs;
 };

+ 15 - 12
Source/cmDSPWriter.cxx

@@ -152,21 +152,22 @@ void cmDSPWriter::AddDSPBuildRule(cmSourceGroup& sourceGroup)
   std::string dsprule = "${CMAKE_COMMAND} ";
   m_Makefile->ExpandVariablesInString(dsprule);
   dsprule = cmSystemTools::HandleNetworkPaths(dsprule.c_str());
-  dsprule += makefileIn;
-  dsprule += " -DSP -H\"";
-  dsprule += cmSystemTools::HandleNetworkPaths(m_Makefile->GetHomeDirectory());
-  dsprule += "\" -S\"";
-  dsprule += cmSystemTools::HandleNetworkPaths(m_Makefile->GetStartDirectory());
-  dsprule += "\" -O\"";
-  dsprule += cmSystemTools::HandleNetworkPaths(m_Makefile->GetStartOutputDirectory());
-  dsprule += "\" -B\"";
-  dsprule += cmSystemTools::HandleNetworkPaths(m_Makefile->GetHomeOutputDirectory());
-  dsprule += "\"";
-  m_Makefile->ExpandVariablesInString(dsprule);
+  std::string args = makefileIn;
+  args += " -DSP -H\"";
+  args += cmSystemTools::HandleNetworkPaths(m_Makefile->GetHomeDirectory());
+  args += "\" -S\"";
+  args += cmSystemTools::HandleNetworkPaths(m_Makefile->GetStartDirectory());
+  args += "\" -O\"";
+  args += cmSystemTools::HandleNetworkPaths(m_Makefile->GetStartOutputDirectory());
+  args += "\" -B\"";
+  args += cmSystemTools::HandleNetworkPaths(m_Makefile->GetHomeOutputDirectory());
+  args += "\"";
+  m_Makefile->ExpandVariablesInString(args);
   
   std::vector<std::string> outputs;
   outputs.push_back(dspname);
   cmCustomCommand cc(makefileIn.c_str(), dsprule.c_str(),
+                     args.c_str(),
 		     m_Makefile->GetListFiles(), 
 		     outputs);
   sourceGroup.AddCustomCommand(cc);
@@ -263,9 +264,11 @@ void cmDSPWriter::WriteDSPFile(std::ostream& fout,
             c != commands.end(); ++c)
           {
           totalCommandStr += "\n\t";
-          temp= c->first;
+          temp= c->second.m_Command;
           cmSystemTools::ConvertToWindowsSlashes(temp);
           totalCommandStr += temp;
+          totalCommandStr += " ";
+          totalCommandStr += c->second.m_Arguments;
           totalCommand.Merge(c->second);
           }      
         // Create a dummy file with the name of the source if it does

+ 2 - 1
Source/cmDSWWriter.cxx

@@ -102,7 +102,8 @@ void cmDSWWriter::WriteDSWFile(std::ostream& fout)
   allListFiles.push_back(m_Makefile);
   // add a special target that depends on ALL projects for easy build
   // of Debug only
-  m_Makefile->AddUtilityCommand("ALL_BUILD", "echo \"Build all projects\"", false);
+  m_Makefile->AddUtilityCommand("ALL_BUILD", "echo", "\"Build all projects\"",
+                                false);
   m_Makefile->FindSubDirectoryCMakeListsFiles(allListFiles);
   // For each cmMakefile, create a DSP for it, and
   // add it to this DSW file

+ 5 - 5
Source/cmMakefile.cxx

@@ -470,9 +470,7 @@ void cmMakefile::AddCustomCommand(const char* source,
   if (m_Targets.find(target) != m_Targets.end())
     {
     std::string c = cmSystemTools::EscapeSpaces(command);
-    c += " ";
-    c += commandArgs;
-    cmCustomCommand cc(source,c.c_str(),depends,outputs);
+    cmCustomCommand cc(source,c.c_str(),commandArgs,depends,outputs);
     m_Targets[target].GetCustomCommands().push_back(cc);
     std::string cacheCommand = command;
     this->ExpandVariablesInString(cacheCommand);
@@ -707,15 +705,17 @@ void cmMakefile::AddExecutable(const char *exeName,
 
 void cmMakefile::AddUtilityCommand(const char* utilityName,
                                    const char* command,
+                                   const char* arguments,
                                    bool all)
 {
   std::vector<std::string> empty;
-  this->AddUtilityCommand(utilityName,command,all,
+  this->AddUtilityCommand(utilityName,command,arguments,all,
                           empty,empty);
 }
 
 void cmMakefile::AddUtilityCommand(const char* utilityName,
                                    const char* command,
+                                   const char* arguments,
                                    bool all,
                                    const std::vector<std::string> &dep,
                                    const std::vector<std::string> &out)
@@ -723,7 +723,7 @@ void cmMakefile::AddUtilityCommand(const char* utilityName,
   cmTarget target;
   target.SetType(cmTarget::UTILITY);
   target.SetInAll(all);
-  cmCustomCommand cc(utilityName, command, dep, out);
+  cmCustomCommand cc(utilityName, command, arguments, dep, out);
   target.GetCustomCommands().push_back(cc);
   m_Targets.insert(cmTargets::value_type(utilityName,target));
 }

+ 2 - 0
Source/cmMakefile.h

@@ -167,9 +167,11 @@ public:
    */
   void AddUtilityCommand(const char* utilityName,
                          const char* command,
+                         const char* arguments,
                          bool all);
   void AddUtilityCommand(const char* utilityName,
                          const char* command,
+                         const char* arguments,
                          bool all,
                          const std::vector<std::string> &depends,
                          const std::vector<std::string> &outputs);

+ 20 - 10
Source/cmSourceGroup.cxx

@@ -94,32 +94,40 @@ void cmSourceGroup::AddSource(const char* name)
  */
 void cmSourceGroup::AddCustomCommand(const cmCustomCommand &cmd)
 {
+  std::string commandAndArgs = cmd.GetCommandAndArguments();
   BuildRules::iterator s = m_BuildRules.find(cmd.GetSourceName());
   if(s == m_BuildRules.end())
     {
     // The source was not found.  Add it with this command.
-    m_BuildRules[cmd.GetSourceName()][cmd.GetCommand()].
-      m_Depends.insert(cmd.GetDepends().begin(),cmd.GetDepends().end());
-    m_BuildRules[cmd.GetSourceName()][cmd.GetCommand()].
-      m_Outputs.insert(cmd.GetOutputs().begin(),cmd.GetOutputs().end());
+    CommandFiles& cmdFiles = m_BuildRules[cmd.GetSourceName()][commandAndArgs];
+    cmdFiles.m_Command = cmd.GetCommand();
+    cmdFiles.m_Arguments = cmd.GetArguments();
+    cmdFiles.m_Depends.insert(cmd.GetDepends().begin(),cmd.GetDepends().end());
+    cmdFiles.m_Outputs.insert(cmd.GetOutputs().begin(),cmd.GetOutputs().end());
     return;
     }
   
   // The source already exists.  See if the command exists.
   Commands& commands = s->second;
-  Commands::iterator c = commands.find(cmd.GetCommand());
+  Commands::iterator c = commands.find(commandAndArgs);
   if(c == commands.end())
     {
     // The command did not exist.  Add it.
-    commands[cmd.GetCommand()].m_Depends.insert(cmd.GetDepends().begin(), cmd.GetDepends().end());
-    commands[cmd.GetCommand()].m_Outputs.insert(cmd.GetOutputs().begin(), cmd.GetOutputs().end());
+    commands[commandAndArgs].m_Command = cmd.GetCommand();
+    commands[commandAndArgs].m_Arguments = cmd.GetArguments();
+    commands[commandAndArgs].m_Depends.insert(cmd.GetDepends().begin(),
+                                              cmd.GetDepends().end());
+    commands[commandAndArgs].m_Outputs.insert(cmd.GetOutputs().begin(),
+                                              cmd.GetOutputs().end());
     return;
     }
   
   // The command already exists for this source.  Merge the sets.
   CommandFiles& commandFiles = c->second;
-  commandFiles.m_Depends.insert(cmd.GetDepends().begin(), cmd.GetDepends().end());
-  commandFiles.m_Outputs.insert(cmd.GetOutputs().begin(), cmd.GetOutputs().end());
+  commandFiles.m_Depends.insert(cmd.GetDepends().begin(), 
+                                cmd.GetDepends().end());
+  commandFiles.m_Outputs.insert(cmd.GetOutputs().begin(),
+                                cmd.GetOutputs().end());
 }
 
 void cmSourceGroup::Print() const
@@ -132,7 +140,9 @@ void cmSourceGroup::Print() const
     for(Commands::const_iterator j = i->second.begin();
         j != i->second.end(); ++j)
       {
-      std::cout << "Command: " << j->first.c_str() << "\n";
+      std::cout << "FullCommand: " << j->first.c_str() << "\n";
+      std::cout << "Command: " << j->second.m_Command.c_str() << "\n";
+      std::cout << "Arguments: " << j->second.m_Arguments.c_str() << "\n";
       std::cout << "Command Outputs " << j->second.m_Outputs.size() << "\n";
       std::cout << "Command Depends " << j->second.m_Depends.size() << "\n";
       }

+ 2 - 0
Source/cmSourceGroup.h

@@ -67,6 +67,8 @@ public:
     
     void Merge(const CommandFiles &r);
     
+    std::string m_Command;
+    std::string m_Arguments;
     std::set<std::string> m_Outputs;
     std::set<std::string> m_Depends;
   };

+ 1 - 0
Source/cmVTKWrapJavaCommand.cxx

@@ -139,6 +139,7 @@ void cmVTKWrapJavaCommand::FinalPass()
     }
 
   m_Makefile->AddUtilityCommand((m_LibraryName+"JavaClasses").c_str(),
+                                "",
                                 "",
                                 true,
                                 alldepends,