ENH: Enable CMAKE_<lang>_DEFINE_FLAG for COMPILE_DEFINITIONS property implementation.

This commit is contained in:
Brad King 2008-01-17 10:00:19 -05:00
parent 81af53e3c0
commit 18b9e7db6c
5 changed files with 55 additions and 43 deletions

View File

@ -1 +1 @@
set(CMAKE_DEFINE_FLAG_Fortran "-WF,-D") set(CMAKE_Fortran_DEFINE_FLAG "-WF,-D")

View File

@ -1202,8 +1202,9 @@ const char* cmLocalGenerator::GetIncludeFlags(const char* lang)
void cmLocalGenerator::FixDefineFlags(std::string& flags, void cmLocalGenerator::FixDefineFlags(std::string& flags,
const char* lang) const char* lang)
{ {
std::string defineFlagVar = "CMAKE_DEFINE_FLAG_"; std::string defineFlagVar = "CMAKE_";
defineFlagVar += lang; defineFlagVar += lang;
defineFlagVar += "_DEFINE_FLAG";
std::string defineFlag = std::string defineFlag =
this->Makefile->GetSafeDefinition(defineFlagVar.c_str()); this->Makefile->GetSafeDefinition(defineFlagVar.c_str());
if(defineFlag.size() == 0) if(defineFlag.size() == 0)
@ -2219,7 +2220,8 @@ void cmLocalGenerator::AppendFlags(std::string& flags,
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void cmLocalGenerator::AppendDefines(std::string& defines, void cmLocalGenerator::AppendDefines(std::string& defines,
const char* defines_list) const char* defines_list,
const char* lang)
{ {
// Short-circuit if there are no definitions. // Short-circuit if there are no definitions.
if(!defines_list) if(!defines_list)
@ -2237,14 +2239,22 @@ void cmLocalGenerator::AppendDefines(std::string& defines,
return; return;
} }
// Separate from previous definitions with a space. // Lookup the define flag for the current language.
if(!defines.empty()) std::string dflag = "-D";
if(lang)
{ {
defines += " "; std::string defineFlagVar = "CMAKE_";
defineFlagVar += lang;
defineFlagVar += "_DEFINE_FLAG";
const char* df = this->Makefile->GetDefinition(defineFlagVar.c_str());
if(df && *df)
{
dflag = df;
}
} }
// Add each definition to the command line with appropriate escapes. // Add each definition to the command line with appropriate escapes.
const char* dsep = "-D"; const char* dsep = defines.empty()? "" : " ";
for(std::vector<std::string>::const_iterator di = defines_vec.begin(); for(std::vector<std::string>::const_iterator di = defines_vec.begin();
di != defines_vec.end(); ++di) di != defines_vec.end(); ++di)
{ {
@ -2254,10 +2264,12 @@ void cmLocalGenerator::AppendDefines(std::string& defines,
continue; continue;
} }
// Append the -D // Separate from previous definitions.
defines += dsep; defines += dsep;
dsep = " ";
// Append the definition with proper escaping. // Append the definition with proper escaping.
defines += dflag;
if(this->WatcomWMake) if(this->WatcomWMake)
{ {
// The Watcom compiler does its own command line parsing instead // The Watcom compiler does its own command line parsing instead
@ -2284,7 +2296,6 @@ void cmLocalGenerator::AppendDefines(std::string& defines,
// Make the definition appear properly on the command line. // Make the definition appear properly on the command line.
defines += this->EscapeForShell(di->c_str(), true); defines += this->EscapeForShell(di->c_str(), true);
} }
dsep = " -D";
} }
} }

View File

@ -143,7 +143,8 @@ public:
* Encode a list of preprocessor definitions for the compiler * Encode a list of preprocessor definitions for the compiler
* command line. * command line.
*/ */
void AppendDefines(std::string& defines, const char* defines_list); void AppendDefines(std::string& defines, const char* defines_list,
const char* lang);
/** Translate a dependency as given in CMake code to the name to /** Translate a dependency as given in CMake code to the name to
appear in a generated build file. If the given name is that of appear in a generated build file. If the given name is that of

View File

@ -413,29 +413,6 @@ void cmLocalVisualStudio6Generator
compileFlags += cflags; compileFlags += cflags;
} }
// Add per-source and per-configuration preprocessor definitions.
std::map<cmStdString, cmStdString> cdmap;
this->AppendDefines(compileFlags,
(*sf)->GetProperty("COMPILE_DEFINITIONS"));
if(const char* cdefs = (*sf)->GetProperty("COMPILE_DEFINITIONS_DEBUG"))
{
this->AppendDefines(cdmap["DEBUG"], cdefs);
}
if(const char* cdefs = (*sf)->GetProperty("COMPILE_DEFINITIONS_RELEASE"))
{
this->AppendDefines(cdmap["RELEASE"], cdefs);
}
if(const char* cdefs =
(*sf)->GetProperty("COMPILE_DEFINITIONS_MINSIZEREL"))
{
this->AppendDefines(cdmap["MINSIZEREL"], cdefs);
}
if(const char* cdefs =
(*sf)->GetProperty("COMPILE_DEFINITIONS_RELWITHDEBINFO"))
{
this->AppendDefines(cdmap["RELWITHDEBINFO"], cdefs);
}
const char* lang = this->GetSourceFileLanguage(*(*sf)); const char* lang = this->GetSourceFileLanguage(*(*sf));
if(lang) if(lang)
{ {
@ -443,7 +420,7 @@ void cmLocalVisualStudio6Generator
{ {
// force a C++ file type // force a C++ file type
compileFlags += " /TP "; compileFlags += " /TP ";
} }
else if(strcmp(lang, "C") == 0) else if(strcmp(lang, "C") == 0)
{ {
// force to c file type // force to c file type
@ -451,6 +428,29 @@ void cmLocalVisualStudio6Generator
} }
} }
// Add per-source and per-configuration preprocessor definitions.
std::map<cmStdString, cmStdString> cdmap;
this->AppendDefines(compileFlags,
(*sf)->GetProperty("COMPILE_DEFINITIONS"), lang);
if(const char* cdefs = (*sf)->GetProperty("COMPILE_DEFINITIONS_DEBUG"))
{
this->AppendDefines(cdmap["DEBUG"], cdefs, lang);
}
if(const char* cdefs = (*sf)->GetProperty("COMPILE_DEFINITIONS_RELEASE"))
{
this->AppendDefines(cdmap["RELEASE"], cdefs, lang);
}
if(const char* cdefs =
(*sf)->GetProperty("COMPILE_DEFINITIONS_MINSIZEREL"))
{
this->AppendDefines(cdmap["MINSIZEREL"], cdefs, lang);
}
if(const char* cdefs =
(*sf)->GetProperty("COMPILE_DEFINITIONS_RELWITHDEBINFO"))
{
this->AppendDefines(cdmap["RELWITHDEBINFO"], cdefs, lang);
}
bool excludedFromBuild = bool excludedFromBuild =
(lang && (*sf)->GetPropertyAsBool("HEADER_FILE_ONLY")); (lang && (*sf)->GetPropertyAsBool("HEADER_FILE_ONLY"));
@ -1503,17 +1503,17 @@ void cmLocalVisualStudio6Generator
} }
// Add per-target and per-configuration preprocessor definitions. // Add per-target and per-configuration preprocessor definitions.
this->AppendDefines(flags, target.GetProperty("COMPILE_DEFINITIONS")); this->AppendDefines(flags, target.GetProperty("COMPILE_DEFINITIONS"), 0);
this->AppendDefines(flagsDebug, this->AppendDefines(flagsDebug,
target.GetProperty("COMPILE_DEFINITIONS_DEBUG")); target.GetProperty("COMPILE_DEFINITIONS_DEBUG"), 0);
this->AppendDefines(flagsRelease, this->AppendDefines(flagsRelease,
target.GetProperty("COMPILE_DEFINITIONS_RELEASE")); target.GetProperty("COMPILE_DEFINITIONS_RELEASE"), 0);
this->AppendDefines this->AppendDefines
(flagsMinSize, (flagsMinSize,
target.GetProperty("COMPILE_DEFINITIONS_MINSIZEREL")); target.GetProperty("COMPILE_DEFINITIONS_MINSIZEREL"), 0);
this->AppendDefines this->AppendDefines
(flagsDebugRel, (flagsDebugRel,
target.GetProperty("COMPILE_DEFINITIONS_RELWITHDEBINFO")); target.GetProperty("COMPILE_DEFINITIONS_RELWITHDEBINFO"), 0);
// The template files have CXX FLAGS in them, that need to be replaced. // The template files have CXX FLAGS in them, that need to be replaced.
// There are not separate CXX and C template files, so we use the same // There are not separate CXX and C template files, so we use the same

View File

@ -267,12 +267,12 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags()
// Add preprocessor definitions for this target and configuration. // Add preprocessor definitions for this target and configuration.
this->LocalGenerator->AppendDefines this->LocalGenerator->AppendDefines
(defines, this->Target->GetProperty("COMPILE_DEFINITIONS")); (defines, this->Target->GetProperty("COMPILE_DEFINITIONS"), lang);
std::string defPropName = "COMPILE_DEFINITIONS_"; std::string defPropName = "COMPILE_DEFINITIONS_";
defPropName += defPropName +=
cmSystemTools::UpperCase(this->LocalGenerator->ConfigurationName); cmSystemTools::UpperCase(this->LocalGenerator->ConfigurationName);
this->LocalGenerator->AppendDefines this->LocalGenerator->AppendDefines
(defines, this->Target->GetProperty(defPropName.c_str())); (defines, this->Target->GetProperty(defPropName.c_str()), lang);
// Add language-specific flags. // Add language-specific flags.
this->LocalGenerator this->LocalGenerator
@ -456,7 +456,7 @@ cmMakefileTargetGenerator
// Add source-sepcific preprocessor definitions. // Add source-sepcific preprocessor definitions.
if(const char* compile_defs = source.GetProperty("COMPILE_DEFINITIONS")) if(const char* compile_defs = source.GetProperty("COMPILE_DEFINITIONS"))
{ {
this->LocalGenerator->AppendDefines(defines, compile_defs); this->LocalGenerator->AppendDefines(defines, compile_defs, lang);
*this->FlagFileStream << "# Custom defines: " *this->FlagFileStream << "# Custom defines: "
<< relativeObj << "_DEFINES = " << relativeObj << "_DEFINES = "
<< compile_defs << "\n" << compile_defs << "\n"
@ -469,7 +469,7 @@ cmMakefileTargetGenerator
if(const char* config_compile_defs = if(const char* config_compile_defs =
source.GetProperty(defPropName.c_str())) source.GetProperty(defPropName.c_str()))
{ {
this->LocalGenerator->AppendDefines(defines, config_compile_defs); this->LocalGenerator->AppendDefines(defines, config_compile_defs, lang);
*this->FlagFileStream *this->FlagFileStream
<< "# Custom defines: " << "# Custom defines: "
<< relativeObj << "_DEFINES_" << configUpper << relativeObj << "_DEFINES_" << configUpper