Browse Source

ENH: Make per-configuration COMPILE_DEFINITIONS_<CONFIG> directory property initialized from parent.

Brad King 18 years ago
parent
commit
9d57dbd098

+ 28 - 3
Source/cmMakefile.cxx

@@ -1134,9 +1134,30 @@ void cmMakefile::InitializeFromParent()
   // define flags
   this->DefineFlags = parent->DefineFlags;
 
-  // compile definitions property
+  // compile definitions property and per-config versions
+  {
   this->SetProperty("COMPILE_DEFINITIONS",
                     parent->GetProperty("COMPILE_DEFINITIONS"));
+  std::vector<std::string> configs;
+  if(const char* configTypes =
+     this->GetDefinition("CMAKE_CONFIGURATION_TYPES"))
+    {
+    cmSystemTools::ExpandListArgument(configTypes, configs);
+    }
+  else if(const char* buildType =
+          this->GetDefinition("CMAKE_BUILD_TYPE"))
+    {
+    configs.push_back(buildType);
+    }
+  for(std::vector<std::string>::const_iterator ci = configs.begin();
+      ci != configs.end(); ++ci)
+    {
+    std::string defPropName = "COMPILE_DEFINITIONS_";
+    defPropName += cmSystemTools::UpperCase(*ci);
+    this->SetProperty(defPropName.c_str(),
+                      parent->GetProperty(defPropName.c_str()));
+    }
+  }
 
   // link libraries
   this->LinkLibraries = parent->LinkLibraries;
@@ -3046,7 +3067,9 @@ void cmMakefile::DefineProperties(cmake *cm)
      "language syntax may require escapes to specify some values).  "
      "This property may be set on a per-configuration basis using the name "
      "COMPILE_DEFINITIONS_<CONFIG> where <CONFIG> is an upper-case name "
-     "(ex. \"COMPILE_DEFINITIONS_DEBUG\").\n"
+     "(ex. \"COMPILE_DEFINITIONS_DEBUG\").  "
+     "This property will be initialized in each directory by its value "
+     "in the directory's parent.\n"
      "CMake will automatically drop some definitions that "
      "are not supported by the native build tool.  "
      "The VS6 IDE does not support definitions with values "
@@ -3063,7 +3086,9 @@ void cmMakefile::DefineProperties(cmake *cm)
   cm->DefineProperty
     ("COMPILE_DEFINITIONS_<CONFIG>", cmProperty::DIRECTORY,
      "Per-configuration preprocessor definitions in a directory.",
-     "This is the configuration-specific version of COMPILE_DEFINITIONS.");
+     "This is the configuration-specific version of COMPILE_DEFINITIONS.  "
+     "This property will be initialized in each directory by its value "
+     "in the directory's parent.\n");
 
   cm->DefineProperty
     ("EXCLUDE_FROM_ALL", cmProperty::DIRECTORY,

+ 4 - 0
Tests/Complex/CMakeLists.txt

@@ -81,6 +81,10 @@ ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
 
 ADD_DEFINITIONS(-DCMAKE_IS_FUN)
 ADD_DEFINITIONS(-DCMAKE_IS_REALLY_FUN)
+SET_PROPERTY(DIRECTORY
+  PROPERTY COMPILE_DEFINITIONS_RELEASE
+  CMAKE_IS_FUN_IN_RELEASE_MODE
+  )
 
 SET(TEST_SEP "a b c")
 SEPARATE_ARGUMENTS(TEST_SEP)

+ 5 - 1
Tests/Complex/Executable/complex.cxx

@@ -61,7 +61,11 @@ void cmPassed(const char* Message, const char* m2="")
 #endif
 
 #ifndef CMAKE_IS_REALLY_FUN
-This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+# error This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+#endif
+
+#if defined(NDEBUG) && !defined(CMAKE_IS_FUN_IN_RELEASE_MODE)
+# error Per-configuration directory-level definition not inherited.
 #endif
 
 #ifdef COMPLEX_TEST_CMAKELIB

+ 4 - 0
Tests/ComplexOneConfig/CMakeLists.txt

@@ -81,6 +81,10 @@ ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
 
 ADD_DEFINITIONS(-DCMAKE_IS_FUN)
 ADD_DEFINITIONS(-DCMAKE_IS_REALLY_FUN)
+SET_PROPERTY(DIRECTORY
+  PROPERTY COMPILE_DEFINITIONS_RELEASE
+  CMAKE_IS_FUN_IN_RELEASE_MODE
+  )
 
 SET(TEST_SEP "a b c")
 SEPARATE_ARGUMENTS(TEST_SEP)

+ 5 - 1
Tests/ComplexOneConfig/Executable/complex.cxx

@@ -61,7 +61,11 @@ void cmPassed(const char* Message, const char* m2="")
 #endif
 
 #ifndef CMAKE_IS_REALLY_FUN
-This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+# error This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+#endif
+
+#if defined(NDEBUG) && !defined(CMAKE_IS_FUN_IN_RELEASE_MODE)
+# error Per-configuration directory-level definition not inherited.
 #endif
 
 #ifdef COMPLEX_TEST_CMAKELIB

+ 4 - 0
Tests/ComplexRelativePaths/CMakeLists.txt

@@ -81,6 +81,10 @@ ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
 
 ADD_DEFINITIONS(-DCMAKE_IS_FUN)
 ADD_DEFINITIONS(-DCMAKE_IS_REALLY_FUN)
+SET_PROPERTY(DIRECTORY
+  PROPERTY COMPILE_DEFINITIONS_RELEASE
+  CMAKE_IS_FUN_IN_RELEASE_MODE
+  )
 
 SET(TEST_SEP "a b c")
 SEPARATE_ARGUMENTS(TEST_SEP)

+ 5 - 1
Tests/ComplexRelativePaths/Executable/complex.cxx

@@ -61,7 +61,11 @@ void cmPassed(const char* Message, const char* m2="")
 #endif
 
 #ifndef CMAKE_IS_REALLY_FUN
-This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+# error This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not work
+#endif
+
+#if defined(NDEBUG) && !defined(CMAKE_IS_FUN_IN_RELEASE_MODE)
+# error Per-configuration directory-level definition not inherited.
 #endif
 
 #ifdef COMPLEX_TEST_CMAKELIB