| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- include(RunCMake)
- run_cmake(NotAFeature)
- run_cmake(NotAFeatureGenex)
- run_cmake(NotAFeatureTransitive)
- run_cmake(NotAFeature_OriginDebug)
- run_cmake(NotAFeature_OriginDebugGenex)
- run_cmake(NotAFeature_OriginDebugTransitive)
- run_cmake(NotAFeature_OriginDebugCommand)
- run_cmake(compiler_introspection)
- include("${RunCMake_BINARY_DIR}/compiler_introspection-build/info.cmake")
- if (NOT C_FEATURES)
- run_cmake(NoSupportedCFeatures)
- run_cmake(NoSupportedCFeaturesGenex)
- endif()
- if (NOT CXX_FEATURES)
- run_cmake(NoSupportedCxxFeatures)
- run_cmake(NoSupportedCxxFeaturesGenex)
- elseif (cxx_std_98 IN_LIST CXX_FEATURES AND cxx_std_11 IN_LIST CXX_FEATURES)
- if(CXX_STANDARD_DEFAULT EQUAL 98)
- run_cmake(LinkImplementationFeatureCycle)
- endif()
- run_cmake(LinkImplementationFeatureCycleSolved)
- if (cxx_final IN_LIST CXX_FEATURES)
- set(RunCMake_TEST_OPTIONS "-DHAVE_FINAL=1")
- endif()
- run_cmake(NonValidTarget1)
- run_cmake(NonValidTarget2)
- unset(RunCMake_TEST_OPTIONS)
- endif()
- configure_file("${RunCMake_SOURCE_DIR}/CMakeLists.txt" "${RunCMake_BINARY_DIR}/CMakeLists.txt" COPYONLY)
- file(READ "${RunCMake_SOURCE_DIR}/CMP0128Common.cmake" cmp0128_common)
- function(test_build)
- set(test ${name}-${lang})
- file(READ "${RunCMake_SOURCE_DIR}/${name}.cmake" cmake)
- file(CONFIGURE OUTPUT "${RunCMake_BINARY_DIR}/${test}.cmake" CONTENT "${cmake}${cmp0128_common}" @ONLY)
- if(EXISTS "${RunCMake_SOURCE_DIR}/${name}-build-check.cmake")
- configure_file("${RunCMake_SOURCE_DIR}/${name}-build-check.cmake" "${RunCMake_BINARY_DIR}/${test}-build-check.cmake" @ONLY)
- endif()
- if(EXISTS "${RunCMake_SOURCE_DIR}/${name}-stderr.txt")
- configure_file("${RunCMake_SOURCE_DIR}/${name}-stderr.txt" "${RunCMake_BINARY_DIR}/${test}-stderr.txt" @ONLY)
- endif()
- set(RunCMake_SOURCE_DIR "${RunCMake_BINARY_DIR}")
- set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test}-build")
- run_cmake(${test})
- set(RunCMake_TEST_NO_CLEAN 1)
- set(RunCMake_TEST_OUTPUT_MERGE 1)
- run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . ${ARGN})
- endfunction()
- # Mangle flags such as they're in verbose build output.
- macro(mangle_flags variable)
- set(result "${${variable}}")
- if(RunCMake_GENERATOR MATCHES "Visual Studio" AND MSVC_TOOLSET_VERSION GREATER_EQUAL 141)
- string(REPLACE "-" "/" result "${result}")
- elseif(RunCMake_GENERATOR STREQUAL "Xcode" AND XCODE_VERSION VERSION_LESS 15.3 AND CMAKE_XCODE_BUILD_SYSTEM GREATER_EQUAL 12)
- string(REPLACE "=" [[\\=]] result "${result}")
- endif()
- string(REPLACE ";" " " result "${result}")
- list(APPEND flags "${result}")
- endmacro()
- function(test_cmp0128_old_same_standard)
- set(flag "${${lang}${${lang}_STANDARD_DEFAULT}_EXT_FLAG}")
- if(NOT flag)
- return()
- endif()
- mangle_flags(flag)
- set(name CMP0128OldSameStandard)
- test_build(--verbose)
- endfunction()
- function(test_cmp0128_new_extensions_opposite)
- if(extensions_opposite)
- set(flag_ext "_EXT")
- endif()
- set(flag "${${lang}${${lang}_STANDARD_DEFAULT}${flag_ext}_FLAG}")
- if(NOT flag)
- return()
- endif()
- mangle_flags(flag)
- # Make sure we enable/disable extensions when:
- # 1. LANG_STANDARD is unset.
- set(name CMP0128NewExtensionsStandardUnset)
- set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0128=NEW)
- test_build(--verbose)
- # 2. LANG_STANDARD matches CMAKE_LANG_STANDARD_DEFAULT.
- set(name CMP0128NewExtensionsStandardDefault)
- test_build(--verbose)
- endfunction()
- function(test_cmp0128_new_no_unnecessary_flag)
- set(standard_flag "${${lang}${${lang}_STANDARD_DEFAULT}_FLAG}")
- set(extension_flag "${${lang}${${lang}_STANDARD_DEFAULT}_EXT_FLAG}")
- if(NOT standard_flag AND NOT extension_flag)
- return()
- endif()
- mangle_flags(standard_flag)
- mangle_flags(extension_flag)
- set(name CMP0128NewNoUnnecessaryFlag)
- set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0128=NEW)
- test_build(--verbose)
- endfunction()
- function(test_cmp0128_warn_match)
- set(name CMP0128WarnMatch)
- test_build()
- endfunction()
- function(test_cmp0128_warn_unset)
- # For compilers that had CMAKE_<LANG>_EXTENSION_COMPILE_OPTION (only IAR)
- # there is no behavioral change and thus no warning.
- if(NOT "${${lang}_EXT_FLAG}" STREQUAL "")
- return()
- endif()
- if(extensions_opposite)
- set(opposite "enabled")
- else()
- set(opposite "disabled")
- endif()
- set(name CMP0128WarnUnset)
- test_build()
- endfunction()
- function(test_lang lang ext)
- if(CMake_NO_${lang}_STANDARD)
- return()
- endif()
- set(extensions_default "${${lang}_EXTENSIONS_DEFAULT}")
- set(standard_default "${${lang}_STANDARD_DEFAULT}")
- if(extensions_default)
- set(extensions_opposite OFF)
- else()
- set(extensions_opposite ON)
- endif()
- test_cmp0128_new_extensions_opposite()
- test_cmp0128_new_no_unnecessary_flag()
- test_cmp0128_old_same_standard()
- test_cmp0128_warn_match()
- test_cmp0128_warn_unset()
- endfunction()
- if(C_STANDARD_DEFAULT)
- test_lang(C c)
- endif()
- if(CXX_STANDARD_DEFAULT)
- run_cmake(NotAStandard)
- foreach(standard 98 11)
- if (CXX${standard}_FLAG STREQUAL NOTFOUND)
- run_cmake(RequireCXX${standard})
- run_cmake(RequireCXX${standard}Variable)
- endif()
- if (CXX${standard}_EXT_FLAG STREQUAL NOTFOUND)
- run_cmake(RequireCXX${standard}Ext)
- run_cmake(RequireCXX${standard}ExtVariable)
- endif()
- endforeach()
- test_lang(CXX cpp)
- endif()
|