From 82ef90fcfccb1eaf53e4d15884ff3464aa9072a3 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 11 Apr 2016 10:39:04 -0400 Subject: [PATCH 1/2] cmCoreTryCompile: Factor out config lookup for re-use Store the lookup of CMAKE_TRY_COMPILE_CONFIGURATION in a local variable so we can re-use it. --- Source/cmCoreTryCompile.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index b639c15a1..bf89dcb09 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -294,6 +294,9 @@ int cmCoreTryCompile::TryCompileCode(std::vector const& argv, } } + std::string const tcConfig = + this->Makefile->GetSafeDefinition("CMAKE_TRY_COMPILE_CONFIGURATION"); + // we need to create a directory and CMakeLists file etc... // first create the directories sourceDirectory = this->BinaryDirectory.c_str(); @@ -406,8 +409,7 @@ int cmCoreTryCompile::TryCompileCode(std::vector const& argv, std::string fname = "/" + std::string(targetName) + "Targets.cmake"; cmExportTryCompileFileGenerator tcfg(gg, targets, this->Makefile); tcfg.SetExportFile((this->BinaryDirectory + fname).c_str()); - tcfg.SetConfig(this->Makefile->GetSafeDefinition( - "CMAKE_TRY_COMPILE_CONFIGURATION")); + tcfg.SetConfig(tcConfig); if(!tcfg.GenerateImportFile()) { From bd581a373373ee9807fcab35dd3e83334b73174b Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 11 Apr 2016 10:45:56 -0400 Subject: [PATCH 2/2] try_compile: Honor CMAKE__FLAGS_ changes (#16054) In the `try_compile` source file signature we propagate the caller's value of `CMAKE__FLAGS` into the test project. Extend this to propagate `CMAKE__FLAGS_` too instead of always using the default value in the test project. This will be useful, for example, to allow the MSVC runtime library to be changed (e.g. `-MDd` => `-MTd`). --- Help/release/dev/try_compile-config-flags.rst | 7 +++++++ Source/cmCoreTryCompile.cxx | 7 +++++++ Tests/RunCMake/try_compile/CompileFlags.cmake | 17 +++++++++++++++++ Tests/RunCMake/try_compile/RunCMakeTest.cmake | 1 + Tests/RunCMake/try_compile/src.c | 3 +++ 5 files changed, 35 insertions(+) create mode 100644 Help/release/dev/try_compile-config-flags.rst create mode 100644 Tests/RunCMake/try_compile/CompileFlags.cmake diff --git a/Help/release/dev/try_compile-config-flags.rst b/Help/release/dev/try_compile-config-flags.rst new file mode 100644 index 000000000..7e5e46151 --- /dev/null +++ b/Help/release/dev/try_compile-config-flags.rst @@ -0,0 +1,7 @@ +try_compile-config-flags +------------------------ + +* The :command:`try_compile` command source file signature now honors + configuration-specific flags (e.g. :variable:`CMAKE__FLAGS_DEBUG`) + in the generated test project. Previously only the default such flags + for the current toolchain were used. diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index bf89dcb09..cfd31b261 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -353,6 +353,13 @@ int cmCoreTryCompile::TryCompileCode(std::vector const& argv, cmOutputConverter::EscapeForCMake(flags?flags:"").c_str()); fprintf(fout, "set(CMAKE_%s_FLAGS \"${CMAKE_%s_FLAGS}" " ${COMPILE_DEFINITIONS}\")\n", li->c_str(), li->c_str()); + static std::string const cfgDefault = "DEBUG"; + std::string const cfg = !tcConfig.empty()? + cmSystemTools::UpperCase(tcConfig) : cfgDefault; + std::string const langFlagsCfg = "CMAKE_" + *li + "_FLAGS_" + cfg; + const char* flagsCfg = this->Makefile->GetDefinition(langFlagsCfg); + fprintf(fout, "set(%s %s)\n", langFlagsCfg.c_str(), + cmOutputConverter::EscapeForCMake(flagsCfg?flagsCfg:"").c_str()); } switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0056)) { diff --git a/Tests/RunCMake/try_compile/CompileFlags.cmake b/Tests/RunCMake/try_compile/CompileFlags.cmake new file mode 100644 index 000000000..d4dc0742f --- /dev/null +++ b/Tests/RunCMake/try_compile/CompileFlags.cmake @@ -0,0 +1,17 @@ +enable_language(C) +set(CMAKE_C_FLAGS_RELEASE "-DPP_ERROR ${CMAKE_C_FLAGS_DEBUG}") + +#----------------------------------------------------------------------------- +set(CMAKE_TRY_COMPILE_CONFIGURATION Release) +try_compile(RESULT ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/src.c + OUTPUT_VARIABLE out + ) +string(REPLACE "\n" "\n " out " ${out}") +if(RESULT) + message(FATAL_ERROR "try_compile passed but should have failed:\n${out}") +elseif(NOT "x${out}" MATCHES "PP_ERROR is defined") + message(FATAL_ERROR "try_compile did not fail with PP_ERROR:\n${out}") +else() + message(STATUS "try_compile with per-config flag worked as expected") +endif() diff --git a/Tests/RunCMake/try_compile/RunCMakeTest.cmake b/Tests/RunCMake/try_compile/RunCMakeTest.cmake index 43ce998b2..4b1d92afa 100644 --- a/Tests/RunCMake/try_compile/RunCMakeTest.cmake +++ b/Tests/RunCMake/try_compile/RunCMakeTest.cmake @@ -21,6 +21,7 @@ run_cmake(TargetTypeInvalid) run_cmake(TargetTypeStatic) run_cmake(CMP0056) +run_cmake(CompileFlags) if(RunCMake_GENERATOR MATCHES "Make|Ninja") # Use a single build tree for a few tests without cleaning. diff --git a/Tests/RunCMake/try_compile/src.c b/Tests/RunCMake/try_compile/src.c index 78f2de106..ab83eb631 100644 --- a/Tests/RunCMake/try_compile/src.c +++ b/Tests/RunCMake/try_compile/src.c @@ -1 +1,4 @@ int main(void) { return 0; } +#ifdef PP_ERROR +# error PP_ERROR is defined +#endif