Przeglądaj źródła

CompilerId/Features: Tolerate variables named for languages

If a `CMakeLists.txt` or `CMAKE_TOOLCHAIN_FILE` sets a variable named
`C`, `CXX`, or `CUDA`, we were previously comparing each enabled
language name to the value of that variable, rather than the name
itself.  Double-quote the string to take advantage of policy `CMP0054`,
but also add "x" prefixes to support projects that do not set the
policy.

Fixes: #22125
Brad King 4 lat temu
rodzic
commit
bd16a985fc

+ 1 - 1
Modules/CMakeCompilerIdDetection.cmake

@@ -18,7 +18,7 @@ function(compiler_id_detection outvar lang)
     file(GLOB lang_files
       "${CMAKE_ROOT}/Modules/Compiler/*-DetermineCompiler.cmake")
     set(nonlang CXX)
-    if (lang STREQUAL CXX)
+    if ("x${lang}" STREQUAL "xCXX")
       set(nonlang C)
     endif()
 

+ 3 - 3
Modules/CMakeDetermineCompileFeatures.cmake

@@ -4,7 +4,7 @@
 
 function(cmake_determine_compile_features lang)
 
-  if(lang STREQUAL C AND COMMAND cmake_record_c_compile_features)
+  if("x${lang}" STREQUAL "xC" AND COMMAND cmake_record_c_compile_features)
     message(CHECK_START "Detecting ${lang} compile features")
 
     set(CMAKE_C90_COMPILE_FEATURES)
@@ -54,7 +54,7 @@ function(cmake_determine_compile_features lang)
 
     message(CHECK_PASS "done")
 
-  elseif(lang STREQUAL CXX AND COMMAND cmake_record_cxx_compile_features)
+  elseif("x${lang}" STREQUAL "xCXX" AND COMMAND cmake_record_cxx_compile_features)
     message(CHECK_START "Detecting ${lang} compile features")
 
     set(CMAKE_CXX98_COMPILE_FEATURES)
@@ -110,7 +110,7 @@ function(cmake_determine_compile_features lang)
 
     message(CHECK_PASS "done")
 
-  elseif(lang STREQUAL CUDA AND COMMAND cmake_record_cuda_compile_features)
+  elseif("x${lang}" STREQUAL "xCUDA" AND COMMAND cmake_record_cuda_compile_features)
     message(CHECK_START "Detecting ${lang} compile features")
 
     set(CMAKE_CUDA03_COMPILE_FEATURES)

+ 2 - 0
Tests/RunCMake/ToolchainFile/LangVars-toolchain.cmake

@@ -0,0 +1,2 @@
+set(C 1)
+set(CXX 1)

+ 7 - 0
Tests/RunCMake/ToolchainFile/LangVars.cmake

@@ -0,0 +1,7 @@
+foreach(test_language C CXX)
+  enable_language(${test_language})
+  if(DEFINED CMAKE_${test_language}_STANDARD_DEFAULT
+      AND NOT CMAKE_${test_language}_COMPILE_FEATURES)
+    message(FATAL_ERROR "Compile features not found for ${test_language}")
+  endif()
+endforeach()

+ 1 - 0
Tests/RunCMake/ToolchainFile/RunCMakeTest.cmake

@@ -9,6 +9,7 @@ run_cmake_toolchain(CallEnableLanguage)
 run_cmake_toolchain(CallProject)
 run_cmake_toolchain(CheckLanguage)
 run_cmake_toolchain(FlagsInit)
+run_cmake_toolchain(LangVars)
 run_cmake_toolchain(LinkFlagsInit)
 
 function(run_IncludeDirectories)