diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index 7d999a124..fca2f7e32 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -1018,12 +1018,21 @@ void cmMakefile::AddDefineFlag(const char* flag) return; } + // Update the string used for the old DEFINITIONS property. + this->AddDefineFlag(flag, this->DefineFlagsOrig); + // If this is really a definition, update COMPILE_DEFINITIONS. if(this->ParseDefineFlag(flag, false)) { return; } + // Add this flag that does not look like a definition. + this->AddDefineFlag(flag, this->DefineFlags); +} + +void cmMakefile::AddDefineFlag(const char* flag, std::string& dflags) +{ // remove any \n\r std::string ret = flag; std::string::size_type pos = 0; @@ -1039,8 +1048,8 @@ void cmMakefile::AddDefineFlag(const char* flag) pos++; } - this->DefineFlags += " "; - this->DefineFlags += ret; + dflags += " "; + dflags += ret; } @@ -1053,22 +1062,33 @@ void cmMakefile::RemoveDefineFlag(const char* flag) return; } + // Update the string used for the old DEFINITIONS property. + this->RemoveDefineFlag(flag, len, this->DefineFlagsOrig); + // If this is really a definition, update COMPILE_DEFINITIONS. if(this->ParseDefineFlag(flag, true)) { return; } + // Remove this flag that does not look like a definition. + this->RemoveDefineFlag(flag, len, this->DefineFlags); +} + +void cmMakefile::RemoveDefineFlag(const char* flag, + std::string::size_type len, + std::string& dflags) +{ // Remove all instances of the flag that are surrounded by // whitespace or the beginning/end of the string. - for(std::string::size_type lpos = this->DefineFlags.find(flag, 0); - lpos != std::string::npos; lpos = this->DefineFlags.find(flag, lpos)) + for(std::string::size_type lpos = dflags.find(flag, 0); + lpos != std::string::npos; lpos = dflags.find(flag, lpos)) { std::string::size_type rpos = lpos + len; - if((lpos <= 0 || isspace(this->DefineFlags[lpos-1])) && - (rpos >= this->DefineFlags.size() || isspace(this->DefineFlags[rpos]))) + if((lpos <= 0 || isspace(dflags[lpos-1])) && + (rpos >= dflags.size() || isspace(dflags[rpos]))) { - this->DefineFlags.erase(lpos, len); + dflags.erase(lpos, len); } else { @@ -2957,20 +2977,7 @@ const char *cmMakefile::GetProperty(const char* prop, } else if (!strcmp("DEFINITIONS",prop)) { - if(const char* cdefs = this->GetProperty("COMPILE_DEFINITIONS")) - { - // Expand the list. - std::vector defs; - cmSystemTools::ExpandListArgument(cdefs, defs); - for(std::vector::iterator i = defs.begin(); - i != defs.end(); ++i) - { - output += "-D"; - output += *i; - output += " "; - } - } - output += this->GetDefineFlags(); + output += this->DefineFlagsOrig; return output.c_str(); } else if (!strcmp("INCLUDE_DIRECTORIES",prop) ) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 4f54f7134..780b2fe07 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -829,6 +829,11 @@ protected: std::vector HeaderFileExtensions; std::string DefineFlags; + // Track the value of the computed DEFINITIONS property. + void AddDefineFlag(const char*, std::string&); + void RemoveDefineFlag(const char*, std::string::size_type, std::string&); + std::string DefineFlagsOrig; + #if defined(CMAKE_BUILD_WITH_CMAKE) std::vector SourceGroups; #endif