diff --git a/Modules/CMakeDetermineCompilerSupport.cmake b/Modules/CMakeDetermineCompilerSupport.cmake index 512a1c4155..d11a494825 100644 --- a/Modules/CMakeDetermineCompilerSupport.cmake +++ b/Modules/CMakeDetermineCompilerSupport.cmake @@ -5,6 +5,27 @@ function(cmake_determine_compiler_support lang) if("x${lang}" STREQUAL "xC" AND COMMAND cmake_record_c_compile_features) + set(compile_feature_vars + CMAKE_C_COMPILE_FEATURES + CMAKE_C90_COMPILE_FEATURES + CMAKE_C99_COMPILE_FEATURES + CMAKE_C11_COMPILE_FEATURES + CMAKE_C17_COMPILE_FEATURES + CMAKE_C23_COMPILE_FEATURES + ) + set(all_defined 1) + set(any_non_empty 0) + foreach (var IN LISTS compile_feature_vars) + if (NOT DEFINED "${var}") + set(all_defined 0) + elseif (${var}) + set(any_non_empty 1) + endif () + endforeach () + if (all_defined AND any_non_empty) + return () + endif () + message(CHECK_START "Detecting ${lang} compile features") set(CMAKE_C90_COMPILE_FEATURES) @@ -55,55 +76,81 @@ function(cmake_determine_compiler_support lang) message(CHECK_PASS "done") elseif("x${lang}" STREQUAL "xCXX" AND COMMAND cmake_record_cxx_compile_features) - message(CHECK_START "Detecting ${lang} compile features") + set(compile_feature_vars + CMAKE_CXX_COMPILE_FEATURES + CMAKE_CXX98_COMPILE_FEATURES + CMAKE_CXX11_COMPILE_FEATURES + CMAKE_CXX14_COMPILE_FEATURES + CMAKE_CXX17_COMPILE_FEATURES + CMAKE_CXX20_COMPILE_FEATURES + CMAKE_CXX23_COMPILE_FEATURES + CMAKE_CXX26_COMPILE_FEATURES + ) + set(all_defined 1) + set(any_non_empty 0) + foreach (var IN LISTS compile_feature_vars) + if (NOT DEFINED "${var}") + set(all_defined 0) + elseif (${var}) + set(any_non_empty 1) + endif () + endforeach () + set(need_feature_detection 1) + if (all_defined AND any_non_empty) + set(need_feature_detection 0) + endif () - set(CMAKE_CXX98_COMPILE_FEATURES) - set(CMAKE_CXX11_COMPILE_FEATURES) - set(CMAKE_CXX14_COMPILE_FEATURES) - set(CMAKE_CXX17_COMPILE_FEATURES) - set(CMAKE_CXX20_COMPILE_FEATURES) - set(CMAKE_CXX23_COMPILE_FEATURES) - set(CMAKE_CXX26_COMPILE_FEATURES) + if (need_feature_detection) + message(CHECK_START "Detecting ${lang} compile features") - include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") + set(CMAKE_CXX98_COMPILE_FEATURES) + set(CMAKE_CXX11_COMPILE_FEATURES) + set(CMAKE_CXX14_COMPILE_FEATURES) + set(CMAKE_CXX17_COMPILE_FEATURES) + set(CMAKE_CXX20_COMPILE_FEATURES) + set(CMAKE_CXX23_COMPILE_FEATURES) + set(CMAKE_CXX26_COMPILE_FEATURES) - cmake_record_cxx_compile_features() + include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake") - if(NOT _result EQUAL 0) - message(CHECK_FAIL "failed") - return() - endif() + cmake_record_cxx_compile_features() - if (CMAKE_CXX23_COMPILE_FEATURES AND CMAKE_CXX26_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX26_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES}) - endif() - if (CMAKE_CXX20_COMPILE_FEATURES AND CMAKE_CXX23_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES}) - endif() - if (CMAKE_CXX17_COMPILE_FEATURES AND CMAKE_CXX20_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES}) - endif() - if (CMAKE_CXX14_COMPILE_FEATURES AND CMAKE_CXX17_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES}) - endif() - if (CMAKE_CXX11_COMPILE_FEATURES AND CMAKE_CXX14_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES}) - endif() - if (CMAKE_CXX98_COMPILE_FEATURES AND CMAKE_CXX11_COMPILE_FEATURES) - list(REMOVE_ITEM CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES}) - endif() + if(NOT _result EQUAL 0) + message(CHECK_FAIL "failed") + return() + endif() - if(NOT CMAKE_CXX_COMPILE_FEATURES) - set(CMAKE_CXX_COMPILE_FEATURES - ${CMAKE_CXX98_COMPILE_FEATURES} - ${CMAKE_CXX11_COMPILE_FEATURES} - ${CMAKE_CXX14_COMPILE_FEATURES} - ${CMAKE_CXX17_COMPILE_FEATURES} - ${CMAKE_CXX20_COMPILE_FEATURES} - ${CMAKE_CXX23_COMPILE_FEATURES} - ${CMAKE_CXX26_COMPILE_FEATURES} - ) - endif() + if (CMAKE_CXX23_COMPILE_FEATURES AND CMAKE_CXX26_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX26_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES}) + endif() + if (CMAKE_CXX20_COMPILE_FEATURES AND CMAKE_CXX23_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES}) + endif() + if (CMAKE_CXX17_COMPILE_FEATURES AND CMAKE_CXX20_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES}) + endif() + if (CMAKE_CXX14_COMPILE_FEATURES AND CMAKE_CXX17_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES}) + endif() + if (CMAKE_CXX11_COMPILE_FEATURES AND CMAKE_CXX14_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES}) + endif() + if (CMAKE_CXX98_COMPILE_FEATURES AND CMAKE_CXX11_COMPILE_FEATURES) + list(REMOVE_ITEM CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES}) + endif() + + if(NOT CMAKE_CXX_COMPILE_FEATURES) + set(CMAKE_CXX_COMPILE_FEATURES + ${CMAKE_CXX98_COMPILE_FEATURES} + ${CMAKE_CXX11_COMPILE_FEATURES} + ${CMAKE_CXX14_COMPILE_FEATURES} + ${CMAKE_CXX17_COMPILE_FEATURES} + ${CMAKE_CXX20_COMPILE_FEATURES} + ${CMAKE_CXX23_COMPILE_FEATURES} + ${CMAKE_CXX26_COMPILE_FEATURES} + ) + endif() + endif () # Find the module metadata for import std set(CMAKE_CXX_COMPILER_IMPORT_STD "") @@ -121,16 +168,18 @@ function(cmake_determine_compiler_support lang) set(CMAKE_CXX_STDLIB_MODULES_JSON ${CMAKE_CXX_STDLIB_MODULES_JSON} PARENT_SCOPE) set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "${CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE}" PARENT_SCOPE) - set(CMAKE_CXX_COMPILE_FEATURES ${CMAKE_CXX_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX98_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES} PARENT_SCOPE) - set(CMAKE_CXX26_COMPILE_FEATURES ${CMAKE_CXX26_COMPILE_FEATURES} PARENT_SCOPE) + if (need_feature_detection) + set(CMAKE_CXX_COMPILE_FEATURES ${CMAKE_CXX_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX98_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES} PARENT_SCOPE) + set(CMAKE_CXX26_COMPILE_FEATURES ${CMAKE_CXX26_COMPILE_FEATURES} PARENT_SCOPE) - message(CHECK_PASS "done") + message(CHECK_PASS "done") + endif () elseif("x${lang}" STREQUAL "xCUDA" AND COMMAND cmake_record_cuda_compile_features) message(CHECK_START "Detecting ${lang} compile features")