CMakeCompilerIdDetection.cmake 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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(_readFile file)
  4. include(${file})
  5. get_filename_component(name ${file} NAME_WE)
  6. string(REGEX REPLACE "-.*" "" CompilerId ${name})
  7. set(_compiler_id_version_compute_${CompilerId} ${_compiler_id_version_compute} PARENT_SCOPE)
  8. set(_compiler_id_simulate_${CompilerId} ${_compiler_id_simulate} PARENT_SCOPE)
  9. set(_compiler_id_pp_test_${CompilerId} ${_compiler_id_pp_test} PARENT_SCOPE)
  10. endfunction()
  11. function(compiler_id_detection outvar lang)
  12. if (NOT "x${lang}" STREQUAL "xFortran" AND NOT "x${lang}" STREQUAL "xCSharp"
  13. AND NOT "x${lang}" STREQUAL "xISPC")
  14. file(GLOB lang_files
  15. "${CMAKE_ROOT}/Modules/Compiler/*-DetermineCompiler.cmake")
  16. set(nonlang CXX)
  17. if ("x${lang}" STREQUAL "xCXX")
  18. set(nonlang C)
  19. endif()
  20. file(GLOB nonlang_files
  21. "${CMAKE_ROOT}/Modules/Compiler/*-${nonlang}-DetermineCompiler.cmake")
  22. list(REMOVE_ITEM lang_files ${nonlang_files})
  23. endif()
  24. set(files ${lang_files})
  25. if (files)
  26. foreach(file ${files})
  27. _readFile(${file})
  28. endforeach()
  29. set(options ID_STRING VERSION_STRINGS ID_DEFINE PLATFORM_DEFAULT_COMPILER)
  30. set(oneValueArgs PREFIX)
  31. cmake_parse_arguments(CID "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  32. if (CID_UNPARSED_ARGUMENTS)
  33. message(FATAL_ERROR "Unrecognized arguments: \"${CID_UNPARSED_ARGUMENTS}\"")
  34. endif()
  35. # Order is relevant here. For example, compilers which pretend to be
  36. # GCC must appear before the actual GCC.
  37. if ("x${lang}" STREQUAL "xCXX")
  38. list(APPEND ordered_compilers
  39. Comeau
  40. )
  41. endif()
  42. list(APPEND ordered_compilers
  43. Intel
  44. IntelLLVM
  45. PathScale
  46. Embarcadero
  47. Borland
  48. Watcom
  49. OpenWatcom
  50. SunPro
  51. HP
  52. Compaq
  53. zOS
  54. IBMClang
  55. XLClang
  56. XL
  57. VisualAge
  58. NVHPC
  59. PGI
  60. CrayClang
  61. Cray
  62. TI
  63. FujitsuClang
  64. Fujitsu
  65. GHS
  66. Tasking
  67. OrangeC
  68. )
  69. if ("x${lang}" STREQUAL "xC")
  70. list(APPEND ordered_compilers
  71. TinyCC
  72. Bruce
  73. )
  74. endif()
  75. list(APPEND ordered_compilers
  76. SCO
  77. ARMCC
  78. AppleClang
  79. ARMClang
  80. )
  81. list(APPEND ordered_compilers
  82. Clang
  83. LCC
  84. GNU
  85. MSVC
  86. ADSP
  87. IAR
  88. )
  89. if ("x${lang}" STREQUAL "xC")
  90. list(APPEND ordered_compilers
  91. SDCC
  92. )
  93. endif()
  94. if("x${lang}" STREQUAL "xCUDA")
  95. set(ordered_compilers NVIDIA Clang)
  96. endif()
  97. if("x${lang}" STREQUAL "xHIP")
  98. set(ordered_compilers NVIDIA Clang)
  99. endif()
  100. if(CID_ID_DEFINE)
  101. foreach(Id ${ordered_compilers})
  102. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_${Id} 0\n")
  103. endforeach()
  104. # Hard-code definitions for compilers that are no longer supported.
  105. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_MIPSpro 0\n")
  106. endif()
  107. set(pp_if "#if")
  108. if (CID_VERSION_STRINGS)
  109. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n/* Version number components: V=Version, R=Revision, P=Patch
  110. Version date components: YYYY=Year, MM=Month, DD=Day */\n")
  111. endif()
  112. foreach(Id ${ordered_compilers})
  113. if (NOT _compiler_id_pp_test_${Id})
  114. message(FATAL_ERROR "No preprocessor test for \"${Id}\"")
  115. endif()
  116. set(id_content "${pp_if} ${_compiler_id_pp_test_${Id}}\n")
  117. if (CID_ID_STRING)
  118. set(PREFIX ${CID_PREFIX})
  119. string(CONFIGURE "${_compiler_id_simulate_${Id}}" SIMULATE_BLOCK @ONLY)
  120. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_ID \"${Id}\"${SIMULATE_BLOCK}")
  121. endif()
  122. if (CID_ID_DEFINE)
  123. string(APPEND id_content "# undef ${CID_PREFIX}COMPILER_IS_${Id}\n")
  124. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_IS_${Id} 1\n")
  125. endif()
  126. if (CID_VERSION_STRINGS)
  127. set(PREFIX ${CID_PREFIX})
  128. set(MACRO_DEC DEC)
  129. set(MACRO_HEX HEX)
  130. string(CONFIGURE "${_compiler_id_version_compute_${Id}}" VERSION_BLOCK @ONLY)
  131. string(APPEND id_content "${VERSION_BLOCK}\n")
  132. endif()
  133. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${id_content}")
  134. set(pp_if "#elif")
  135. endforeach()
  136. if (CID_PLATFORM_DEFAULT_COMPILER)
  137. set(platform_compiler_detection "
  138. /* These compilers are either not known or too old to define an
  139. identification macro. Try to identify the platform and guess that
  140. it is the native compiler. */
  141. #elif defined(__hpux) || defined(__hpua)
  142. # define ${CID_PREFIX}COMPILER_ID \"HP\"
  143. #else /* unknown compiler */
  144. # define ${CID_PREFIX}COMPILER_ID \"\"")
  145. endif()
  146. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${platform_compiler_detection}\n#endif")
  147. endif()
  148. set(${outvar} ${CMAKE_${lang}_COMPILER_ID_CONTENT} PARENT_SCOPE)
  149. endfunction()