Browse Source

ENH: ADD REMOVE_DEFINITION command. Fix feature request: Bug #182 - Add opposite to ADD_DEFINITIONS

Andy Cedilnik 21 years ago
parent
commit
504d0bc3b3

+ 2 - 0
Source/cmCommands.cxx

@@ -58,6 +58,7 @@
 #include "cmMessageCommand.cxx"
 #include "cmOptionCommand.cxx"
 #include "cmProjectCommand.cxx"
+#include "cmRemoveDefinitionsCommand.cxx"
 #include "cmSeparateArgumentsCommand.cxx"
 #include "cmSetCommand.cxx"
 #include "cmSetSourceFilesPropertiesCommand.cxx"
@@ -150,6 +151,7 @@ void GetPredefinedCommands(std::list<cmCommand*>& commands)
   commands.push_back(new cmMessageCommand);
   commands.push_back(new cmOptionCommand);
   commands.push_back(new cmProjectCommand);
+  commands.push_back(new cmRemoveDefinitionsCommand);
   commands.push_back(new cmSeparateArgumentsCommand);
   commands.push_back(new cmSetCommand);
   commands.push_back(new cmSetSourceFilesPropertiesCommand);

+ 5 - 0
Source/cmMakefile.cxx

@@ -766,6 +766,11 @@ void cmMakefile::AddDefineFlag(const char* flag)
 }
 
 
+void cmMakefile::RemoveDefineFlag(const char* flag)
+{
+  cmSystemTools::ReplaceString(m_DefineFlags, flag, " ");
+}
+
 void cmMakefile::AddLinkLibrary(const char* lib, cmTarget::LinkLibraryType llt)
 {
   m_LinkLibraries.push_back(

+ 1 - 0
Source/cmMakefile.h

@@ -163,6 +163,7 @@ public:
    * Add a define flag to the build.
    */
   void AddDefineFlag(const char* definition);
+  void RemoveDefineFlag(const char* definition);
 
   /**
    * Add an executable to the build.

+ 35 - 0
Source/cmRemoveDefinitionsCommand.cxx

@@ -0,0 +1,35 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#include "cmRemoveDefinitionsCommand.h"
+
+// cmRemoveDefinitionsCommand
+bool cmRemoveDefinitionsCommand::InitialPass(std::vector<std::string> const& args)
+{
+  // it is OK to have no arguments
+  if(args.size() < 1 )
+    {
+    return true;
+    }
+
+  for(std::vector<std::string>::const_iterator i = args.begin();
+      i != args.end(); ++i)
+    {
+    m_Makefile->RemoveDefineFlag(i->c_str());
+    }
+  return true;
+}
+

+ 82 - 0
Source/cmRemoveDefinitionsCommand.h

@@ -0,0 +1,82 @@
+/*=========================================================================
+
+  Program:   CMake - Cross-Platform Makefile Generator
+  Module:    $RCSfile$
+  Language:  C++
+  Date:      $Date$
+  Version:   $Revision$
+
+  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
+  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even 
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+     PURPOSE.  See the above copyright notices for more information.
+
+=========================================================================*/
+#ifndef cmRemoveDefinitionsCommand_h
+#define cmRemoveDefinitionsCommand_h
+
+#include "cmCommand.h"
+
+/** \class cmRemoveDefinitionsCommand
+ * \brief Specify a list of compiler defines
+ *
+ * cmRemoveDefinitionsCommand specifies a list of compiler defines. These defines will
+ * be removed from the compile command.  
+ */
+class cmRemoveDefinitionsCommand : public cmCommand
+{
+public:
+  /**
+   * This is a virtual constructor for the command.
+   */
+  virtual cmCommand* Clone() 
+    {
+    return new cmRemoveDefinitionsCommand;
+    }
+
+  /**
+   * This is called when the command is first encountered in
+   * the CMakeLists.txt file.
+   */
+  virtual bool InitialPass(std::vector<std::string> const& args);
+
+  /**
+   * This determines if the command gets propagated down
+   * to makefiles located in subdirectories.
+   */
+  virtual bool IsInherited() {return true;}
+
+  /**
+   * The name of the command as specified in CMakeList.txt.
+   */
+  virtual const char* GetName() {return "REMOVE_DEFINITIONS";}
+  
+  /**
+   * Succinct documentation.
+   */
+  virtual const char* GetTerseDocumentation() 
+    {
+    return "Removes -D define flags to the command line of C and C++ compilers.";
+    }
+  
+  /**
+   * More documentation.
+   */
+  virtual const char* GetFullDocumentation()
+    {
+    return
+      "  REMOVE_DEFINITIONS(-DFOO -DBAR ...)\n"
+      "Removes flags from command line of C and C++ compilers.  "
+      "This command can be used to remove any flag from a compile line, "
+      "but the -D flag is accepted most C/C++ compilers.  "
+      "Other flags may not be as portable.";
+    }
+  
+  cmTypeMacro(cmRemoveDefinitionsCommand, cmCommand);
+};
+
+
+
+#endif