RunCMakeTest.cmake 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. include(RunCMake)
  2. run_cmake(NotAFeature)
  3. run_cmake(NotAFeatureGenex)
  4. run_cmake(NotAFeatureTransitive)
  5. run_cmake(NotAFeature_OriginDebug)
  6. run_cmake(NotAFeature_OriginDebugGenex)
  7. run_cmake(NotAFeature_OriginDebugTransitive)
  8. run_cmake(NotAFeature_OriginDebugCommand)
  9. run_cmake(compiler_introspection)
  10. include("${RunCMake_BINARY_DIR}/compiler_introspection-build/info.cmake")
  11. if (NOT C_FEATURES)
  12. run_cmake(NoSupportedCFeatures)
  13. run_cmake(NoSupportedCFeaturesGenex)
  14. endif()
  15. if (NOT CXX_FEATURES)
  16. run_cmake(NoSupportedCxxFeatures)
  17. run_cmake(NoSupportedCxxFeaturesGenex)
  18. elseif (cxx_std_98 IN_LIST CXX_FEATURES AND cxx_std_11 IN_LIST CXX_FEATURES)
  19. if(CXX_STANDARD_DEFAULT EQUAL 98)
  20. run_cmake(LinkImplementationFeatureCycle)
  21. endif()
  22. run_cmake(LinkImplementationFeatureCycleSolved)
  23. if (cxx_final IN_LIST CXX_FEATURES)
  24. set(RunCMake_TEST_OPTIONS "-DHAVE_FINAL=1")
  25. endif()
  26. run_cmake(NonValidTarget1)
  27. run_cmake(NonValidTarget2)
  28. unset(RunCMake_TEST_OPTIONS)
  29. endif()
  30. configure_file("${RunCMake_SOURCE_DIR}/CMakeLists.txt" "${RunCMake_BINARY_DIR}/CMakeLists.txt" COPYONLY)
  31. file(READ "${RunCMake_SOURCE_DIR}/CMP0128Common.cmake" cmp0128_common)
  32. function(test_build)
  33. set(test ${name}-${lang})
  34. file(READ "${RunCMake_SOURCE_DIR}/${name}.cmake" cmake)
  35. file(CONFIGURE OUTPUT "${RunCMake_BINARY_DIR}/${test}.cmake" CONTENT "${cmake}${cmp0128_common}" @ONLY)
  36. if(EXISTS "${RunCMake_SOURCE_DIR}/${name}-build-check.cmake")
  37. configure_file("${RunCMake_SOURCE_DIR}/${name}-build-check.cmake" "${RunCMake_BINARY_DIR}/${test}-build-check.cmake" @ONLY)
  38. endif()
  39. if(EXISTS "${RunCMake_SOURCE_DIR}/${name}-stderr.txt")
  40. configure_file("${RunCMake_SOURCE_DIR}/${name}-stderr.txt" "${RunCMake_BINARY_DIR}/${test}-stderr.txt" @ONLY)
  41. endif()
  42. set(RunCMake_SOURCE_DIR "${RunCMake_BINARY_DIR}")
  43. set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/${test}-build")
  44. run_cmake(${test})
  45. set(RunCMake_TEST_NO_CLEAN 1)
  46. set(RunCMake_TEST_OUTPUT_MERGE 1)
  47. run_cmake_command(${test}-build ${CMAKE_COMMAND} --build . ${ARGN})
  48. endfunction()
  49. # Mangle flags such as they're in verbose build output.
  50. macro(mangle_flags variable)
  51. set(result "${${variable}}")
  52. if(RunCMake_GENERATOR MATCHES "Visual Studio" AND MSVC_TOOLSET_VERSION GREATER_EQUAL 141)
  53. string(REPLACE "-" "/" result "${result}")
  54. elseif(RunCMake_GENERATOR STREQUAL "Xcode" AND XCODE_VERSION VERSION_LESS 15.3 AND CMAKE_XCODE_BUILD_SYSTEM GREATER_EQUAL 12)
  55. string(REPLACE "=" [[\\=]] result "${result}")
  56. endif()
  57. string(REPLACE ";" " " result "${result}")
  58. list(APPEND flags "${result}")
  59. endmacro()
  60. function(test_cmp0128_old_same_standard)
  61. set(flag "${${lang}${${lang}_STANDARD_DEFAULT}_EXT_FLAG}")
  62. if(NOT flag)
  63. return()
  64. endif()
  65. mangle_flags(flag)
  66. set(name CMP0128OldSameStandard)
  67. test_build(--verbose)
  68. endfunction()
  69. function(test_cmp0128_new_extensions_opposite)
  70. if(extensions_opposite)
  71. set(flag_ext "_EXT")
  72. endif()
  73. set(flag "${${lang}${${lang}_STANDARD_DEFAULT}${flag_ext}_FLAG}")
  74. if(NOT flag)
  75. return()
  76. endif()
  77. mangle_flags(flag)
  78. # Make sure we enable/disable extensions when:
  79. # 1. LANG_STANDARD is unset.
  80. set(name CMP0128NewExtensionsStandardUnset)
  81. set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0128=NEW)
  82. test_build(--verbose)
  83. # 2. LANG_STANDARD matches CMAKE_LANG_STANDARD_DEFAULT.
  84. set(name CMP0128NewExtensionsStandardDefault)
  85. test_build(--verbose)
  86. endfunction()
  87. function(test_cmp0128_new_no_unnecessary_flag)
  88. set(standard_flag "${${lang}${${lang}_STANDARD_DEFAULT}_FLAG}")
  89. set(extension_flag "${${lang}${${lang}_STANDARD_DEFAULT}_EXT_FLAG}")
  90. if(NOT standard_flag AND NOT extension_flag)
  91. return()
  92. endif()
  93. mangle_flags(standard_flag)
  94. mangle_flags(extension_flag)
  95. set(name CMP0128NewNoUnnecessaryFlag)
  96. set(RunCMake_TEST_OPTIONS -DCMAKE_POLICY_DEFAULT_CMP0128=NEW)
  97. test_build(--verbose)
  98. endfunction()
  99. function(test_cmp0128_warn_match)
  100. set(name CMP0128WarnMatch)
  101. test_build()
  102. endfunction()
  103. function(test_cmp0128_warn_unset)
  104. # For compilers that had CMAKE_<LANG>_EXTENSION_COMPILE_OPTION (only IAR)
  105. # there is no behavioral change and thus no warning.
  106. if(NOT "${${lang}_EXT_FLAG}" STREQUAL "")
  107. return()
  108. endif()
  109. if(extensions_opposite)
  110. set(opposite "enabled")
  111. else()
  112. set(opposite "disabled")
  113. endif()
  114. set(name CMP0128WarnUnset)
  115. test_build()
  116. endfunction()
  117. function(test_lang lang ext)
  118. if(CMake_NO_${lang}_STANDARD)
  119. return()
  120. endif()
  121. set(extensions_default "${${lang}_EXTENSIONS_DEFAULT}")
  122. set(standard_default "${${lang}_STANDARD_DEFAULT}")
  123. if(extensions_default)
  124. set(extensions_opposite OFF)
  125. else()
  126. set(extensions_opposite ON)
  127. endif()
  128. test_cmp0128_new_extensions_opposite()
  129. test_cmp0128_new_no_unnecessary_flag()
  130. test_cmp0128_old_same_standard()
  131. test_cmp0128_warn_match()
  132. test_cmp0128_warn_unset()
  133. endfunction()
  134. if(C_STANDARD_DEFAULT)
  135. test_lang(C c)
  136. endif()
  137. if(CXX_STANDARD_DEFAULT)
  138. run_cmake(NotAStandard)
  139. foreach(standard 98 11)
  140. if (CXX${standard}_FLAG STREQUAL NOTFOUND)
  141. run_cmake(RequireCXX${standard})
  142. run_cmake(RequireCXX${standard}Variable)
  143. endif()
  144. if (CXX${standard}_EXT_FLAG STREQUAL NOTFOUND)
  145. run_cmake(RequireCXX${standard}Ext)
  146. run_cmake(RequireCXX${standard}ExtVariable)
  147. endif()
  148. endforeach()
  149. test_lang(CXX cpp)
  150. endif()