CMakeDetermineCompileFeatures.cmake 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. function(cmake_determine_compile_features lang)
  4. if("x${lang}" STREQUAL "xC" AND COMMAND cmake_record_c_compile_features)
  5. message(CHECK_START "Detecting ${lang} compile features")
  6. set(CMAKE_C90_COMPILE_FEATURES)
  7. set(CMAKE_C99_COMPILE_FEATURES)
  8. set(CMAKE_C11_COMPILE_FEATURES)
  9. set(CMAKE_C17_COMPILE_FEATURES)
  10. set(CMAKE_C23_COMPILE_FEATURES)
  11. include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake")
  12. cmake_record_c_compile_features()
  13. if(NOT _result EQUAL 0)
  14. message(CHECK_FAIL "failed")
  15. return()
  16. endif()
  17. if (CMAKE_C17_COMPILE_FEATURES AND CMAKE_C23_COMPILE_FEATURES)
  18. list(REMOVE_ITEM CMAKE_C23_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES})
  19. endif()
  20. if (CMAKE_C11_COMPILE_FEATURES AND CMAKE_C17_COMPILE_FEATURES)
  21. list(REMOVE_ITEM CMAKE_C17_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES})
  22. endif()
  23. if (CMAKE_C99_COMPILE_FEATURES AND CMAKE_C11_COMPILE_FEATURES)
  24. list(REMOVE_ITEM CMAKE_C11_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES})
  25. endif()
  26. if (CMAKE_C90_COMPILE_FEATURES AND CMAKE_C99_COMPILE_FEATURES)
  27. list(REMOVE_ITEM CMAKE_C99_COMPILE_FEATURES ${CMAKE_C90_COMPILE_FEATURES})
  28. endif()
  29. if(NOT CMAKE_C_COMPILE_FEATURES)
  30. set(CMAKE_C_COMPILE_FEATURES
  31. ${CMAKE_C90_COMPILE_FEATURES}
  32. ${CMAKE_C99_COMPILE_FEATURES}
  33. ${CMAKE_C11_COMPILE_FEATURES}
  34. ${CMAKE_C17_COMPILE_FEATURES}
  35. ${CMAKE_C23_COMPILE_FEATURES}
  36. )
  37. endif()
  38. set(CMAKE_C_COMPILE_FEATURES ${CMAKE_C_COMPILE_FEATURES} PARENT_SCOPE)
  39. set(CMAKE_C90_COMPILE_FEATURES ${CMAKE_C90_COMPILE_FEATURES} PARENT_SCOPE)
  40. set(CMAKE_C99_COMPILE_FEATURES ${CMAKE_C99_COMPILE_FEATURES} PARENT_SCOPE)
  41. set(CMAKE_C11_COMPILE_FEATURES ${CMAKE_C11_COMPILE_FEATURES} PARENT_SCOPE)
  42. set(CMAKE_C17_COMPILE_FEATURES ${CMAKE_C17_COMPILE_FEATURES} PARENT_SCOPE)
  43. set(CMAKE_C23_COMPILE_FEATURES ${CMAKE_C23_COMPILE_FEATURES} PARENT_SCOPE)
  44. message(CHECK_PASS "done")
  45. elseif("x${lang}" STREQUAL "xCXX" AND COMMAND cmake_record_cxx_compile_features)
  46. message(CHECK_START "Detecting ${lang} compile features")
  47. set(CMAKE_CXX98_COMPILE_FEATURES)
  48. set(CMAKE_CXX11_COMPILE_FEATURES)
  49. set(CMAKE_CXX14_COMPILE_FEATURES)
  50. set(CMAKE_CXX17_COMPILE_FEATURES)
  51. set(CMAKE_CXX20_COMPILE_FEATURES)
  52. set(CMAKE_CXX23_COMPILE_FEATURES)
  53. include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake")
  54. cmake_record_cxx_compile_features()
  55. if(NOT _result EQUAL 0)
  56. message(CHECK_FAIL "failed")
  57. return()
  58. endif()
  59. if (CMAKE_CXX20_COMPILE_FEATURES AND CMAKE_CXX23_COMPILE_FEATURES)
  60. list(REMOVE_ITEM CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES})
  61. endif()
  62. if (CMAKE_CXX17_COMPILE_FEATURES AND CMAKE_CXX20_COMPILE_FEATURES)
  63. list(REMOVE_ITEM CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES})
  64. endif()
  65. if (CMAKE_CXX14_COMPILE_FEATURES AND CMAKE_CXX17_COMPILE_FEATURES)
  66. list(REMOVE_ITEM CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES})
  67. endif()
  68. if (CMAKE_CXX11_COMPILE_FEATURES AND CMAKE_CXX14_COMPILE_FEATURES)
  69. list(REMOVE_ITEM CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES})
  70. endif()
  71. if (CMAKE_CXX98_COMPILE_FEATURES AND CMAKE_CXX11_COMPILE_FEATURES)
  72. list(REMOVE_ITEM CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES})
  73. endif()
  74. if(NOT CMAKE_CXX_COMPILE_FEATURES)
  75. set(CMAKE_CXX_COMPILE_FEATURES
  76. ${CMAKE_CXX98_COMPILE_FEATURES}
  77. ${CMAKE_CXX11_COMPILE_FEATURES}
  78. ${CMAKE_CXX14_COMPILE_FEATURES}
  79. ${CMAKE_CXX17_COMPILE_FEATURES}
  80. ${CMAKE_CXX20_COMPILE_FEATURES}
  81. ${CMAKE_CXX23_COMPILE_FEATURES}
  82. )
  83. endif()
  84. set(CMAKE_CXX_COMPILE_FEATURES ${CMAKE_CXX_COMPILE_FEATURES} PARENT_SCOPE)
  85. set(CMAKE_CXX98_COMPILE_FEATURES ${CMAKE_CXX98_COMPILE_FEATURES} PARENT_SCOPE)
  86. set(CMAKE_CXX11_COMPILE_FEATURES ${CMAKE_CXX11_COMPILE_FEATURES} PARENT_SCOPE)
  87. set(CMAKE_CXX14_COMPILE_FEATURES ${CMAKE_CXX14_COMPILE_FEATURES} PARENT_SCOPE)
  88. set(CMAKE_CXX17_COMPILE_FEATURES ${CMAKE_CXX17_COMPILE_FEATURES} PARENT_SCOPE)
  89. set(CMAKE_CXX20_COMPILE_FEATURES ${CMAKE_CXX20_COMPILE_FEATURES} PARENT_SCOPE)
  90. set(CMAKE_CXX23_COMPILE_FEATURES ${CMAKE_CXX23_COMPILE_FEATURES} PARENT_SCOPE)
  91. message(CHECK_PASS "done")
  92. elseif("x${lang}" STREQUAL "xCUDA" AND COMMAND cmake_record_cuda_compile_features)
  93. message(CHECK_START "Detecting ${lang} compile features")
  94. set(CMAKE_CUDA03_COMPILE_FEATURES)
  95. set(CMAKE_CUDA11_COMPILE_FEATURES)
  96. set(CMAKE_CUDA14_COMPILE_FEATURES)
  97. set(CMAKE_CUDA17_COMPILE_FEATURES)
  98. set(CMAKE_CUDA20_COMPILE_FEATURES)
  99. set(CMAKE_CUDA23_COMPILE_FEATURES)
  100. include("${CMAKE_ROOT}/Modules/Internal/FeatureTesting.cmake")
  101. cmake_record_cuda_compile_features()
  102. if(NOT _result EQUAL 0)
  103. message(CHECK_FAIL "failed")
  104. return()
  105. endif()
  106. if (CMAKE_CUDA20_COMPILE_FEATURES AND CMAKE_CUDA23_COMPILE_FEATURES)
  107. list(REMOVE_ITEM CMAKE_CUDA23_COMPILE_FEATURES ${CMAKE_CUDA20_COMPILE_FEATURES})
  108. endif()
  109. if (CMAKE_CUDA17_COMPILE_FEATURES AND CMAKE_CUDA20_COMPILE_FEATURES)
  110. list(REMOVE_ITEM CMAKE_CUDA20_COMPILE_FEATURES ${CMAKE_CUDA17_COMPILE_FEATURES})
  111. endif()
  112. if (CMAKE_CUDA14_COMPILE_FEATURES AND CMAKE_CUDA17_COMPILE_FEATURES)
  113. list(REMOVE_ITEM CMAKE_CUDA17_COMPILE_FEATURES ${CMAKE_CUDA14_COMPILE_FEATURES})
  114. endif()
  115. if (CMAKE_CUDA11_COMPILE_FEATURES AND CMAKE_CUDA14_COMPILE_FEATURES)
  116. list(REMOVE_ITEM CMAKE_CUDA14_COMPILE_FEATURES ${CMAKE_CUDA11_COMPILE_FEATURES})
  117. endif()
  118. if (CMAKE_CUDA03_COMPILE_FEATURES AND CMAKE_CUDA11_COMPILE_FEATURES)
  119. list(REMOVE_ITEM CMAKE_CUDA11_COMPILE_FEATURES ${CMAKE_CUDA03_COMPILE_FEATURES})
  120. endif()
  121. if(NOT CMAKE_CUDA_COMPILE_FEATURES)
  122. set(CMAKE_CUDA_COMPILE_FEATURES
  123. ${CMAKE_CUDA03_COMPILE_FEATURES}
  124. ${CMAKE_CUDA11_COMPILE_FEATURES}
  125. ${CMAKE_CUDA14_COMPILE_FEATURES}
  126. ${CMAKE_CUDA17_COMPILE_FEATURES}
  127. ${CMAKE_CUDA20_COMPILE_FEATURES}
  128. ${CMAKE_CUDA23_COMPILE_FEATURES}
  129. )
  130. endif()
  131. set(CMAKE_CUDA_COMPILE_FEATURES ${CMAKE_CUDA_COMPILE_FEATURES} PARENT_SCOPE)
  132. set(CMAKE_CUDA03_COMPILE_FEATURES ${CMAKE_CUDA03_COMPILE_FEATURES} PARENT_SCOPE)
  133. set(CMAKE_CUDA11_COMPILE_FEATURES ${CMAKE_CUDA11_COMPILE_FEATURES} PARENT_SCOPE)
  134. set(CMAKE_CUDA14_COMPILE_FEATURES ${CMAKE_CUDA14_COMPILE_FEATURES} PARENT_SCOPE)
  135. set(CMAKE_CUDA17_COMPILE_FEATURES ${CMAKE_CUDA17_COMPILE_FEATURES} PARENT_SCOPE)
  136. set(CMAKE_CUDA20_COMPILE_FEATURES ${CMAKE_CUDA20_COMPILE_FEATURES} PARENT_SCOPE)
  137. set(CMAKE_CUDA23_COMPILE_FEATURES ${CMAKE_CUDA23_COMPILE_FEATURES} PARENT_SCOPE)
  138. message(CHECK_PASS "done")
  139. endif()
  140. endfunction()