From 9d57dbd098d91123eeec76eef502dcb5c4ba5c89 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 17 Jan 2008 20:34:10 -0500 Subject: [PATCH] ENH: Make per-configuration COMPILE_DEFINITIONS_ directory property initialized from parent. --- Source/cmMakefile.cxx | 31 +++++++++++++++++-- Tests/Complex/CMakeLists.txt | 4 +++ Tests/Complex/Executable/complex.cxx | 6 +++- Tests/ComplexOneConfig/CMakeLists.txt | 4 +++ Tests/ComplexOneConfig/Executable/complex.cxx | 6 +++- Tests/ComplexRelativePaths/CMakeLists.txt | 4 +++ .../Executable/complex.cxx | 6 +++- 7 files changed, 55 insertions(+), 6 deletions(-) diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 62872d0db..5d2464f64 100644 --- a/Source/cmMakefile.cxx +++ b/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 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::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_ where 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_", 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, diff --git a/Tests/Complex/CMakeLists.txt b/Tests/Complex/CMakeLists.txt index d273ac8de..5c67094da 100644 --- a/Tests/Complex/CMakeLists.txt +++ b/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) diff --git a/Tests/Complex/Executable/complex.cxx b/Tests/Complex/Executable/complex.cxx index 8eaa66109..bf07a37c3 100644 --- a/Tests/Complex/Executable/complex.cxx +++ b/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 diff --git a/Tests/ComplexOneConfig/CMakeLists.txt b/Tests/ComplexOneConfig/CMakeLists.txt index d273ac8de..5c67094da 100644 --- a/Tests/ComplexOneConfig/CMakeLists.txt +++ b/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) diff --git a/Tests/ComplexOneConfig/Executable/complex.cxx b/Tests/ComplexOneConfig/Executable/complex.cxx index 8eaa66109..bf07a37c3 100644 --- a/Tests/ComplexOneConfig/Executable/complex.cxx +++ b/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 diff --git a/Tests/ComplexRelativePaths/CMakeLists.txt b/Tests/ComplexRelativePaths/CMakeLists.txt index d273ac8de..5c67094da 100644 --- a/Tests/ComplexRelativePaths/CMakeLists.txt +++ b/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) diff --git a/Tests/ComplexRelativePaths/Executable/complex.cxx b/Tests/ComplexRelativePaths/Executable/complex.cxx index 8eaa66109..bf07a37c3 100644 --- a/Tests/ComplexRelativePaths/Executable/complex.cxx +++ b/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