ソースを参照

ENH: Save command that macro overwrites

Andy Cedilnik 20 年 前
コミット
24a5c0a72e
3 ファイル変更24 行追加0 行削除
  1. 9 0
      Source/cmMacroCommand.cxx
  2. 14 0
      Source/cmake.cxx
  3. 1 0
      Source/cmake.h

+ 9 - 0
Source/cmMacroCommand.cxx

@@ -16,6 +16,8 @@
 =========================================================================*/
 #include "cmMacroCommand.h"
 
+#include "cmake.h"
+
 // define the class for macro commands
 class cmMacroHelperCommand : public cmCommand
 {
@@ -37,6 +39,11 @@ public:
     return newC;
   }
   
+  /**
+   * This determines if the command is invoked when in script mode.
+   */
+  virtual bool IsScriptable() { return true; }
+
   /**
    * This is called when the command is first encountered in
    * the CMakeLists.txt file.
@@ -265,6 +272,8 @@ IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf)
       cmMacroHelperCommand *f = new cmMacroHelperCommand();
       f->m_Args = this->m_Args;
       f->m_Functions = this->m_Functions;
+      std::string newName = "_" + this->m_Args[0];
+      mf.GetCMakeInstance()->RenameCommand(this->m_Args[0].c_str(), newName.c_str());
       mf.AddCommand(f);
       
       // remove the function blocker now that the macro is defined

+ 14 - 0
Source/cmake.cxx

@@ -173,6 +173,20 @@ cmCommand *cmake::GetCommand(const char *name)
   return rm;
 }
 
+void cmake::RenameCommand(const char*oldName, const char* newName)
+{
+  // if the command already exists, free the old one
+  RegisteredCommandsMap::iterator pos = m_Commands.find(oldName);
+  if ( pos == m_Commands.end() )
+    {
+    return;
+    }
+
+  m_Commands.insert(RegisteredCommandsMap::value_type(newName, pos->second));
+  pos = m_Commands.find(oldName);
+  m_Commands.erase(pos);
+}
+
 void cmake::AddCommand(cmCommand* wg)
 {
   std::string name = wg->GetName();

+ 1 - 0
Source/cmake.h

@@ -192,6 +192,7 @@ class cmake
    * Add a command to this cmake instance
    */
   void AddCommand(cmCommand* );
+  void RenameCommand(const char* oldName, const char* newName);
 
   /**
    * Get a command by its name