Merge topic 'fix-COMPILE_DEFINITIONS-config'
1703b00
Test evaluation of per-config COMPILE_DEFINITIONS (#14037)a6286e9
Fix the evaluation of per-config COMPILE_DEFINITIONS (#14037)
This commit is contained in:
commit
0261bdfc1d
|
@ -621,7 +621,7 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
|
||||||
->GetGeneratorTarget(target);
|
->GetGeneratorTarget(target);
|
||||||
|
|
||||||
// the compilerdefines for this target
|
// the compilerdefines for this target
|
||||||
std::string cdefs = target->GetCompileDefinitions();
|
std::string cdefs = target->GetCompileDefinitions(buildType);
|
||||||
|
|
||||||
if(!cdefs.empty())
|
if(!cdefs.empty())
|
||||||
{
|
{
|
||||||
|
@ -640,10 +640,8 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout,
|
||||||
std::set<std::string> uniqIncludeDirs;
|
std::set<std::string> uniqIncludeDirs;
|
||||||
|
|
||||||
std::vector<std::string> includes;
|
std::vector<std::string> includes;
|
||||||
const char *config = target->GetMakefile()
|
|
||||||
->GetDefinition("CMAKE_BUILD_TYPE");
|
|
||||||
target->GetMakefile()->GetLocalGenerator()->
|
target->GetMakefile()->GetLocalGenerator()->
|
||||||
GetIncludeDirectories(includes, gtgt, "C", config);
|
GetIncludeDirectories(includes, gtgt, "C", buildType);
|
||||||
for(std::vector<std::string>::const_iterator dirIt=includes.begin();
|
for(std::vector<std::string>::const_iterator dirIt=includes.begin();
|
||||||
dirIt != includes.end();
|
dirIt != includes.end();
|
||||||
++dirIt)
|
++dirIt)
|
||||||
|
|
|
@ -488,12 +488,11 @@ ComputeDefines(cmSourceFile *source, cmLocalGenerator* lg, cmTarget *target,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add preprocessor definitions for this target and configuration.
|
// Add preprocessor definitions for this target and configuration.
|
||||||
lg->AppendDefines(defines, target->GetCompileDefinitions());
|
lg->AppendDefines(defines, target->GetCompileDefinitions(config));
|
||||||
lg->AppendDefines(defines, source->GetProperty("COMPILE_DEFINITIONS"));
|
lg->AppendDefines(defines, source->GetProperty("COMPILE_DEFINITIONS"));
|
||||||
{
|
{
|
||||||
std::string defPropName = "COMPILE_DEFINITIONS_";
|
std::string defPropName = "COMPILE_DEFINITIONS_";
|
||||||
defPropName += cmSystemTools::UpperCase(config);
|
defPropName += cmSystemTools::UpperCase(config);
|
||||||
lg->AppendDefines(defines, target->GetCompileDefinitions(config));
|
|
||||||
lg->AppendDefines(defines, source->GetProperty(defPropName.c_str()));
|
lg->AppendDefines(defines, source->GetProperty(defPropName.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1709,12 +1709,8 @@ void cmGlobalXCodeGenerator::CreateBuildSettings(cmTarget& target,
|
||||||
this->AppendDefines(ppDefs, exportMacro);
|
this->AppendDefines(ppDefs, exportMacro);
|
||||||
}
|
}
|
||||||
cmGeneratorTarget *gtgt = this->GetGeneratorTarget(&target);
|
cmGeneratorTarget *gtgt = this->GetGeneratorTarget(&target);
|
||||||
this->AppendDefines(ppDefs, target.GetCompileDefinitions().c_str());
|
this->AppendDefines(ppDefs,
|
||||||
if(configName)
|
target.GetCompileDefinitions(configName).c_str());
|
||||||
{
|
|
||||||
this->AppendDefines(ppDefs,
|
|
||||||
target.GetCompileDefinitions(configName).c_str());
|
|
||||||
}
|
|
||||||
buildSettings->AddAttribute
|
buildSettings->AddAttribute
|
||||||
("GCC_PREPROCESSOR_DEFINITIONS", ppDefs.CreateList());
|
("GCC_PREPROCESSOR_DEFINITIONS", ppDefs.CreateList());
|
||||||
|
|
||||||
|
|
|
@ -1962,7 +1962,6 @@ void cmLocalUnixMakefileGenerator3
|
||||||
|
|
||||||
// Build a list of preprocessor definitions for the target.
|
// Build a list of preprocessor definitions for the target.
|
||||||
std::set<std::string> defines;
|
std::set<std::string> defines;
|
||||||
this->AppendDefines(defines, target.GetCompileDefinitions());
|
|
||||||
this->AppendDefines(defines, target.GetCompileDefinitions(
|
this->AppendDefines(defines, target.GetCompileDefinitions(
|
||||||
this->ConfigurationName.c_str()));
|
this->ConfigurationName.c_str()));
|
||||||
if(!defines.empty())
|
if(!defines.empty())
|
||||||
|
|
|
@ -1702,7 +1702,7 @@ void cmLocalVisualStudio6Generator
|
||||||
|
|
||||||
this->AppendDefines(
|
this->AppendDefines(
|
||||||
definesSet,
|
definesSet,
|
||||||
target.GetCompileDefinitions());
|
target.GetCompileDefinitions(0));
|
||||||
this->AppendDefines(
|
this->AppendDefines(
|
||||||
debugDefinesSet,
|
debugDefinesSet,
|
||||||
target.GetCompileDefinitions("DEBUG"));
|
target.GetCompileDefinitions("DEBUG"));
|
||||||
|
|
|
@ -745,7 +745,6 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout,
|
||||||
targetOptions.ParseFinish();
|
targetOptions.ParseFinish();
|
||||||
cmGeneratorTarget* gt =
|
cmGeneratorTarget* gt =
|
||||||
this->GlobalGenerator->GetGeneratorTarget(&target);
|
this->GlobalGenerator->GetGeneratorTarget(&target);
|
||||||
targetOptions.AddDefines(target.GetCompileDefinitions().c_str());
|
|
||||||
targetOptions.AddDefines(target.GetCompileDefinitions(configName).c_str());
|
targetOptions.AddDefines(target.GetCompileDefinitions(configName).c_str());
|
||||||
targetOptions.SetVerboseMakefile(
|
targetOptions.SetVerboseMakefile(
|
||||||
this->Makefile->IsOn("CMAKE_VERBOSE_MAKEFILE"));
|
this->Makefile->IsOn("CMAKE_VERBOSE_MAKEFILE"));
|
||||||
|
|
|
@ -302,9 +302,6 @@ std::string cmMakefileTargetGenerator::GetDefines(const std::string &l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add preprocessor definitions for this target and configuration.
|
// Add preprocessor definitions for this target and configuration.
|
||||||
this->LocalGenerator->AppendDefines
|
|
||||||
(defines, this->Target->GetCompileDefinitions());
|
|
||||||
|
|
||||||
this->LocalGenerator->AppendDefines
|
this->LocalGenerator->AppendDefines
|
||||||
(defines, this->Target->GetCompileDefinitions(
|
(defines, this->Target->GetCompileDefinitions(
|
||||||
this->LocalGenerator->ConfigurationName.c_str()));
|
this->LocalGenerator->ConfigurationName.c_str()));
|
||||||
|
|
|
@ -228,16 +228,13 @@ ComputeDefines(cmSourceFile *source, const std::string& language)
|
||||||
// Add preprocessor definitions for this target and configuration.
|
// Add preprocessor definitions for this target and configuration.
|
||||||
this->LocalGenerator->AppendDefines
|
this->LocalGenerator->AppendDefines
|
||||||
(defines,
|
(defines,
|
||||||
this->Target->GetCompileDefinitions());
|
this->Target->GetCompileDefinitions(this->GetConfigName()));
|
||||||
this->LocalGenerator->AppendDefines
|
this->LocalGenerator->AppendDefines
|
||||||
(defines,
|
(defines,
|
||||||
source->GetProperty("COMPILE_DEFINITIONS"));
|
source->GetProperty("COMPILE_DEFINITIONS"));
|
||||||
{
|
{
|
||||||
std::string defPropName = "COMPILE_DEFINITIONS_";
|
std::string defPropName = "COMPILE_DEFINITIONS_";
|
||||||
defPropName += cmSystemTools::UpperCase(this->GetConfigName());
|
defPropName += cmSystemTools::UpperCase(this->GetConfigName());
|
||||||
this->LocalGenerator->AppendDefines
|
|
||||||
(defines,
|
|
||||||
this->Target->GetCompileDefinitions(this->GetConfigName()));
|
|
||||||
this->LocalGenerator->AppendDefines
|
this->LocalGenerator->AppendDefines
|
||||||
(defines,
|
(defines,
|
||||||
source->GetProperty(defPropName.c_str()));
|
source->GetProperty(defPropName.c_str()));
|
||||||
|
|
|
@ -250,7 +250,7 @@ void cmQtAutomoc::SetupAutomocTarget(cmTarget* target)
|
||||||
std::string _moc_compile_defs;
|
std::string _moc_compile_defs;
|
||||||
if (tmp)
|
if (tmp)
|
||||||
{
|
{
|
||||||
_moc_compile_defs = target->GetCompileDefinitions();
|
_moc_compile_defs = target->GetCompileDefinitions(0);
|
||||||
}
|
}
|
||||||
tmp = makefile->GetProperty("COMPILE_DEFINITIONS");
|
tmp = makefile->GetProperty("COMPILE_DEFINITIONS");
|
||||||
if (tmp)
|
if (tmp)
|
||||||
|
|
|
@ -2942,29 +2942,33 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
std::string cmTarget::GetCompileDefinitions(const char *config)
|
std::string cmTarget::GetCompileDefinitions(const char *config)
|
||||||
{
|
{
|
||||||
std::string defPropName = "COMPILE_DEFINITIONS";
|
const char *configProp = 0;
|
||||||
if (config)
|
if (config)
|
||||||
{
|
{
|
||||||
defPropName += "_" + cmSystemTools::UpperCase(config);
|
std::string configPropName;
|
||||||
|
configPropName = "COMPILE_DEFINITIONS_" + cmSystemTools::UpperCase(config);
|
||||||
|
configProp = this->GetProperty(configPropName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *prop = this->GetProperty(defPropName.c_str());
|
const char *noconfigProp = this->GetProperty("COMPILE_DEFINITIONS");
|
||||||
cmListFileBacktrace lfbt;
|
cmListFileBacktrace lfbt;
|
||||||
cmGeneratorExpressionDAGChecker dagChecker(lfbt,
|
cmGeneratorExpressionDAGChecker dagChecker(lfbt,
|
||||||
this->GetName(),
|
this->GetName(),
|
||||||
defPropName, 0, 0);
|
"COMPILE_DEFINITIONS", 0, 0);
|
||||||
|
|
||||||
std::string result;
|
std::string defsString = (noconfigProp ? noconfigProp : "");
|
||||||
if (prop)
|
if (configProp && noconfigProp)
|
||||||
{
|
{
|
||||||
cmGeneratorExpression ge(lfbt);
|
defsString += ";";
|
||||||
|
|
||||||
result = ge.Parse(prop)->Evaluate(this->Makefile,
|
|
||||||
config,
|
|
||||||
false,
|
|
||||||
this,
|
|
||||||
&dagChecker);
|
|
||||||
}
|
}
|
||||||
|
defsString += (configProp ? configProp : "");
|
||||||
|
|
||||||
|
cmGeneratorExpression ge(lfbt);
|
||||||
|
std::string result = ge.Parse(defsString.c_str())->Evaluate(this->Makefile,
|
||||||
|
config,
|
||||||
|
false,
|
||||||
|
this,
|
||||||
|
&dagChecker);
|
||||||
|
|
||||||
std::vector<std::string> libs;
|
std::vector<std::string> libs;
|
||||||
this->GetDirectLinkLibraries(config, libs, this);
|
this->GetDirectLinkLibraries(config, libs, this);
|
||||||
|
|
|
@ -430,7 +430,7 @@ public:
|
||||||
If no macro should be defined null is returned. */
|
If no macro should be defined null is returned. */
|
||||||
const char* GetExportMacro();
|
const char* GetExportMacro();
|
||||||
|
|
||||||
std::string GetCompileDefinitions(const char *config = 0);
|
std::string GetCompileDefinitions(const char *config);
|
||||||
|
|
||||||
// Compute the set of languages compiled by the target. This is
|
// Compute the set of languages compiled by the target. This is
|
||||||
// computed every time it is called because the languages can change
|
// computed every time it is called because the languages can change
|
||||||
|
|
|
@ -1220,8 +1220,6 @@ bool cmVisualStudio10TargetGenerator::ComputeClOptions(
|
||||||
clOptions.AddFlag("PrecompiledHeader", "NotUsing");
|
clOptions.AddFlag("PrecompiledHeader", "NotUsing");
|
||||||
clOptions.Parse(flags.c_str());
|
clOptions.Parse(flags.c_str());
|
||||||
clOptions.Parse(defineFlags.c_str());
|
clOptions.Parse(defineFlags.c_str());
|
||||||
clOptions.AddDefines(
|
|
||||||
this->Target->GetCompileDefinitions().c_str());
|
|
||||||
clOptions.AddDefines(this->Target->GetCompileDefinitions(
|
clOptions.AddDefines(this->Target->GetCompileDefinitions(
|
||||||
configName.c_str()).c_str());
|
configName.c_str()).c_str());
|
||||||
clOptions.SetVerboseMakefile(
|
clOptions.SetVerboseMakefile(
|
||||||
|
|
|
@ -7,10 +7,19 @@ if ("${CMAKE_GENERATOR}" STREQUAL "Visual Studio 6")
|
||||||
add_definitions(-DNO_SPACES_IN_DEFINE_VALUES)
|
add_definitions(-DNO_SPACES_IN_DEFINE_VALUES)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Use compile flags to tell executables which config is built
|
||||||
|
# without depending on the compile definitions functionality.
|
||||||
|
foreach(c DEBUG RELEASE RELWITHDEBINFO MINSIZEREL)
|
||||||
|
set(CMAKE_C_FLAGS_${c} "${CMAKE_C_FLAGS_${c}} -DTEST_CONFIG_${c}")
|
||||||
|
set(CMAKE_CXX_FLAGS_${c} "${CMAKE_CXX_FLAGS_${c}} -DTEST_CONFIG_${c}")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
|
||||||
|
"BUILD_CONFIG_NAME=\"$<CONFIGURATION>\""
|
||||||
|
)
|
||||||
|
|
||||||
add_subdirectory(add_definitions_command)
|
add_subdirectory(add_definitions_command)
|
||||||
add_subdirectory(target_prop)
|
add_subdirectory(target_prop)
|
||||||
add_subdirectory(add_definitions_command_with_target_prop)
|
add_subdirectory(add_definitions_command_with_target_prop)
|
||||||
|
|
||||||
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummyexecutable.cpp" "int main(int, char **) { return 0; }\n")
|
add_executable(CompileDefinitions runtest.c)
|
||||||
|
|
||||||
add_executable(CompileDefinitions "${CMAKE_CURRENT_BINARY_DIR}/dummyexecutable.cpp")
|
|
||||||
|
|
|
@ -3,5 +3,6 @@ project(add_definitions_command)
|
||||||
|
|
||||||
add_definitions(-DCMAKE_IS_FUN -DCMAKE_IS=Fun -DCMAKE_IS_="Fun" -DCMAKE_IS_REALLY="Very Fun")
|
add_definitions(-DCMAKE_IS_FUN -DCMAKE_IS=Fun -DCMAKE_IS_="Fun" -DCMAKE_IS_REALLY="Very Fun")
|
||||||
add_definitions(-DCMAKE_IS_="Fun" -DCMAKE_IS_REALLY="Very Fun" -DCMAKE_IS_FUN -DCMAKE_IS=Fun)
|
add_definitions(-DCMAKE_IS_="Fun" -DCMAKE_IS_REALLY="Very Fun" -DCMAKE_IS_FUN -DCMAKE_IS=Fun)
|
||||||
|
add_definitions(-DBUILD_IS_DEBUG=$<CONFIG:Debug> -DBUILD_IS_NOT_DEBUG=$<NOT:$<CONFIG:Debug>>)
|
||||||
|
|
||||||
add_executable(add_definitions_command_executable ../compiletest.cpp)
|
add_executable(add_definitions_command_executable ../compiletest.cpp)
|
||||||
|
|
|
@ -12,3 +12,6 @@ set_property(TARGET add_definitions_command_with_target_prop_executable APPEND P
|
||||||
add_definitions(-DCMAKE_IS_FUN)
|
add_definitions(-DCMAKE_IS_FUN)
|
||||||
|
|
||||||
set_property(TARGET add_definitions_command_with_target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS CMAKE_IS=Fun CMAKE_IS_="Fun")
|
set_property(TARGET add_definitions_command_with_target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS CMAKE_IS=Fun CMAKE_IS_="Fun")
|
||||||
|
|
||||||
|
add_definitions(-DBUILD_IS_DEBUG=$<CONFIG:Debug>)
|
||||||
|
set_property(TARGET add_definitions_command_with_target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS BUILD_IS_NOT_DEBUG=$<NOT:$<CONFIG:Debug>>)
|
||||||
|
|
|
@ -45,6 +45,30 @@ enum {
|
||||||
// TEST_GENERATOR_EXPRESSIONS
|
// TEST_GENERATOR_EXPRESSIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef BUILD_IS_DEBUG
|
||||||
|
# error "BUILD_IS_DEBUG not defined!"
|
||||||
|
#endif
|
||||||
|
#ifndef BUILD_IS_NOT_DEBUG
|
||||||
|
# error "BUILD_IS_NOT_DEBUG not defined!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Check per-config definitions.
|
||||||
|
#ifdef TEST_CONFIG_DEBUG
|
||||||
|
# if !BUILD_IS_DEBUG
|
||||||
|
# error "BUILD_IS_DEBUG false with TEST_CONFIG_DEBUG!"
|
||||||
|
# endif
|
||||||
|
# if BUILD_IS_NOT_DEBUG
|
||||||
|
# error "BUILD_IS_NOT_DEBUG true with TEST_CONFIG_DEBUG!"
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# if BUILD_IS_DEBUG
|
||||||
|
# error "BUILD_IS_DEBUG true without TEST_CONFIG_DEBUG!"
|
||||||
|
# endif
|
||||||
|
# if !BUILD_IS_NOT_DEBUG
|
||||||
|
# error "BUILD_IS_NOT_DEBUG false without TEST_CONFIG_DEBUG!"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#ifndef BUILD_CONFIG_NAME
|
||||||
|
# error "BUILD_CONFIG_NAME not defined!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char build_config_name[] = BUILD_CONFIG_NAME;
|
||||||
|
char* c;
|
||||||
|
for(c = build_config_name; *c; ++c)
|
||||||
|
{
|
||||||
|
*c = (char)tolower((int)*c);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "build_config_name=\"%s\"\n", build_config_name);
|
||||||
|
#ifdef TEST_CONFIG_DEBUG
|
||||||
|
if(strcmp(build_config_name, "debug") != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "build_config_name is not \"debug\"\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TEST_CONFIG_RELEASE
|
||||||
|
if(strcmp(build_config_name, "release") != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "build_config_name is not \"release\"\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TEST_CONFIG_MINSIZEREL
|
||||||
|
if(strcmp(build_config_name, "minsizerel") != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "build_config_name is not \"minsizerel\"\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TEST_CONFIG_RELWITHDEBINFO
|
||||||
|
if(strcmp(build_config_name, "relwithdebinfo") != 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "build_config_name is not \"relwithdebinfo\"\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -14,3 +14,8 @@ set_property(TARGET target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS
|
||||||
"$<0:GE_NOT_DEFINED>"
|
"$<0:GE_NOT_DEFINED>"
|
||||||
"$<1:ARGUMENT;LIST>"
|
"$<1:ARGUMENT;LIST>"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set_property(TARGET target_prop_executable APPEND PROPERTY COMPILE_DEFINITIONS
|
||||||
|
BUILD_IS_DEBUG=$<CONFIG:Debug>
|
||||||
|
BUILD_IS_NOT_DEBUG=$<NOT:$<CONFIG:Debug>>
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue