瀏覽代碼

try_compile: Honor CMAKE_<LANG>_FLAGS_<CONFIG> changes (#16054)

In the `try_compile` source file signature we propagate the caller's
value of `CMAKE_<LANG>_FLAGS` into the test project.  Extend this to
propagate `CMAKE_<LANG>_FLAGS_<CONFIG>` 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`).
Brad King 9 年之前
父節點
當前提交
bd581a3733

+ 7 - 0
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_<LANG>_FLAGS_DEBUG`)
+  in the generated test project.  Previously only the default such flags
+  for the current toolchain were used.

+ 7 - 0
Source/cmCoreTryCompile.cxx

@@ -353,6 +353,13 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> 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))
       {

+ 17 - 0
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()

+ 1 - 0
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.

+ 3 - 0
Tests/RunCMake/try_compile/src.c

@@ -1 +1,4 @@
 int main(void) { return 0; }
+#ifdef PP_ERROR
+# error PP_ERROR is defined
+#endif