From a049413bb6fb01d958779dac3f272cc88f97599e Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 24 Apr 2025 08:53:08 -0400 Subject: [PATCH 1/4] Tests: Extend CMakeOnly.CheckLanguage to cover ASM --- Tests/CMakeOnly/CheckLanguage/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt b/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt index 97c75d496f..bb4e7ae9bd 100644 --- a/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt +++ b/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt @@ -13,7 +13,7 @@ endif() unset(expect_Fortran) set(expect_NoSuchLanguage 0) -set(LANGUAGES C CXX Fortran CUDA HIP NoSuchLanguage) +set(LANGUAGES C CXX Fortran CUDA HIP ASM NoSuchLanguage) if(APPLE) list(APPEND LANGUAGES OBJC OBJCXX) endif() From 7ae8764710ad5232362ec6a99afadf238641073b Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 24 Apr 2025 08:53:51 -0400 Subject: [PATCH 2/4] Tests: Extend CMakeOnly.CheckLanguage to enable languages whose checks succeed --- Tests/CMakeOnly/CheckLanguage/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt b/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt index bb4e7ae9bd..f285cfbfb6 100644 --- a/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt +++ b/Tests/CMakeOnly/CheckLanguage/CMakeLists.txt @@ -30,4 +30,7 @@ foreach(test_lang ${LANGUAGES}) message(FATAL_ERROR "check_language(${test_lang}) should not succeed!") endif() endif() + if(CMAKE_${test_lang}_COMPILER) + enable_language(${test_lang}) + endif() endforeach() From f290240b0b52214496672114f843c40eafb81815 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 24 Apr 2025 08:48:09 -0400 Subject: [PATCH 3/4] CheckLanguage: Simplify test project generation Inspired-by: Oleg Derevenetz --- Modules/CheckLanguage.cmake | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/Modules/CheckLanguage.cmake b/Modules/CheckLanguage.cmake index fa64d051ec..e2165ad589 100644 --- a/Modules/CheckLanguage.cmake +++ b/Modules/CheckLanguage.cmake @@ -77,31 +77,21 @@ macro(check_language lang) message(CHECK_START "${_desc}") file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}) - set(extra_compiler_variables) + set(_input_variables "set(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\")\n") + + set(_output_variables "set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\n") if("${lang}" MATCHES "^(CUDA|HIP)$" AND NOT CMAKE_GENERATOR MATCHES "Visual Studio") - set(extra_compiler_variables "set(CMAKE_${lang}_HOST_COMPILER \\\"\${CMAKE_${lang}_HOST_COMPILER}\\\")") + string(APPEND _output_variables "set(CMAKE_${lang}_HOST_COMPILER \\\"\${CMAKE_${lang}_HOST_COMPILER}\\\")\n") endif() - if("${lang}" STREQUAL "HIP") - list(APPEND extra_compiler_variables "set(CMAKE_${lang}_PLATFORM \\\"\${CMAKE_${lang}_PLATFORM}\\\")") + string(APPEND _output_variables "set(CMAKE_${lang}_PLATFORM \\\"\${CMAKE_${lang}_PLATFORM}\\\")\n") endif() - list(TRANSFORM extra_compiler_variables PREPEND "\"") - list(TRANSFORM extra_compiler_variables APPEND "\\n\"") - list(JOIN extra_compiler_variables "\n " extra_compiler_variables) - - set(_cl_content - "cmake_minimum_required(VERSION ${CMAKE_VERSION}) -set(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\") -project(Check${lang} ${lang}) -file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\" - \"set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\\n\" - ${extra_compiler_variables} - )" - ) - file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt" - "${_cl_content}") + "cmake_minimum_required(VERSION ${CMAKE_VERSION}) +${_input_variables} +project(Check${lang} LANGUAGES ${lang}) +file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\" \"${_output_variables}\")") if(CMAKE_GENERATOR_INSTANCE) set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}") else() From 89df8efba47ac33fd9951d3a2dde8eb64dc1b8f5 Mon Sep 17 00:00:00 2001 From: Oleg Derevenetz Date: Wed, 23 Apr 2025 20:37:34 +0300 Subject: [PATCH 4/4] CheckLanguage: Bias compiler selection using already-enabled languages In a project that has enabled C or CXX, we bias ASM and Fortran compiler selection to match. Propagate this bias into the `check_language` test project so that if it succeeds, we will select the same compiler when enabling the tested language in the calling project. Fixes: #19350 --- Modules/CMakeDetermineCompiler.cmake | 6 +++++- Modules/CheckLanguage.cmake | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Modules/CMakeDetermineCompiler.cmake b/Modules/CMakeDetermineCompiler.cmake index 06e8bedc51..16c5554fef 100644 --- a/Modules/CMakeDetermineCompiler.cmake +++ b/Modules/CMakeDetermineCompiler.cmake @@ -4,7 +4,11 @@ macro(_cmake_find_compiler lang) # Use already-enabled languages for reference. - get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + if(DEFINED _CMAKE_CHECK_ENABLED_LANGUAGES) + set(_languages "${_CMAKE_CHECK_ENABLED_LANGUAGES}") + else() + get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + endif() list(REMOVE_ITEM _languages "${lang}") if(CMAKE_${lang}_COMPILER_INIT) diff --git a/Modules/CheckLanguage.cmake b/Modules/CheckLanguage.cmake index e2165ad589..ac61d7019c 100644 --- a/Modules/CheckLanguage.cmake +++ b/Modules/CheckLanguage.cmake @@ -78,6 +78,19 @@ macro(check_language lang) file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}) set(_input_variables "set(CMAKE_MODULE_PATH \"${CMAKE_MODULE_PATH}\")\n") + get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES) + list(REMOVE_ITEM _languages "NONE") + if(NOT _languages STREQUAL "") + string(APPEND _input_variables "set(_CMAKE_CHECK_ENABLED_LANGUAGES \"${_languages}\")\n") + foreach(l IN LISTS _languages) + string(APPEND _input_variables + "set(CMAKE_${l}_COMPILER \"${CMAKE_${l}_COMPILER}\")\n" + "set(CMAKE_${l}_COMPILER_ID \"${CMAKE_${l}_COMPILER_ID}\")\n" + "set(CMAKE_${l}_COMPILER_LOADED ${CMAKE_${l}_COMPILER_LOADED})\n" + "set(CMAKE_${l}_COMPILER_VERSION \"${CMAKE_${l}_COMPILER_VERSION}\")\n" + ) + endforeach() + endif() set(_output_variables "set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\n") if("${lang}" MATCHES "^(CUDA|HIP)$" AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")