CMakeCompilerIdDetection.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file LICENSE.rst 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. list(APPEND ordered_compilers
  38. Intel
  39. IntelLLVM
  40. PathScale
  41. Embarcadero
  42. Borland
  43. Watcom
  44. OpenWatcom
  45. SunPro
  46. HP
  47. Compaq
  48. zOS
  49. IBMClang
  50. XLClang
  51. XL
  52. VisualAge
  53. NVHPC
  54. PGI
  55. CrayClang
  56. Cray
  57. TI
  58. FujitsuClang
  59. Fujitsu
  60. GHS
  61. Tasking
  62. OrangeC
  63. )
  64. if ("x${lang}" STREQUAL "xC")
  65. list(APPEND ordered_compilers
  66. TinyCC
  67. Bruce
  68. )
  69. endif()
  70. list(APPEND ordered_compilers
  71. SCO
  72. ARMCC
  73. AppleClang
  74. ARMClang
  75. TIClang
  76. )
  77. list(APPEND ordered_compilers
  78. Clang
  79. LCC
  80. GNU
  81. MSVC
  82. ADSP
  83. IAR
  84. )
  85. if ("x${lang}" STREQUAL "xC")
  86. list(APPEND ordered_compilers
  87. SDCC
  88. )
  89. endif()
  90. if("x${lang}" STREQUAL "xCUDA")
  91. set(ordered_compilers NVIDIA Clang)
  92. endif()
  93. if("x${lang}" STREQUAL "xHIP")
  94. set(ordered_compilers NVIDIA Clang)
  95. endif()
  96. if(CID_ID_DEFINE)
  97. foreach(Id ${ordered_compilers})
  98. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_${Id} 0\n")
  99. endforeach()
  100. # Hard-code definitions for compilers that are no longer supported.
  101. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "# define ${CID_PREFIX}COMPILER_IS_MIPSpro 0\n")
  102. endif()
  103. set(pp_if "#if")
  104. if (CID_VERSION_STRINGS)
  105. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n/* Version number components: V=Version, R=Revision, P=Patch
  106. Version date components: YYYY=Year, MM=Month, DD=Day */\n")
  107. endif()
  108. foreach(Id ${ordered_compilers})
  109. if (NOT _compiler_id_pp_test_${Id})
  110. message(FATAL_ERROR "No preprocessor test for \"${Id}\"")
  111. endif()
  112. set(id_content "${pp_if} ${_compiler_id_pp_test_${Id}}\n")
  113. if (CID_ID_STRING)
  114. set(PREFIX ${CID_PREFIX})
  115. string(CONFIGURE "${_compiler_id_simulate_${Id}}" SIMULATE_BLOCK @ONLY)
  116. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_ID \"${Id}\"${SIMULATE_BLOCK}")
  117. endif()
  118. if (CID_ID_DEFINE)
  119. string(APPEND id_content "# undef ${CID_PREFIX}COMPILER_IS_${Id}\n")
  120. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_IS_${Id} 1\n")
  121. endif()
  122. if (CID_VERSION_STRINGS)
  123. set(PREFIX ${CID_PREFIX})
  124. set(MACRO_DEC DEC)
  125. set(MACRO_HEX HEX)
  126. string(CONFIGURE "${_compiler_id_version_compute_${Id}}" VERSION_BLOCK @ONLY)
  127. string(APPEND id_content "${VERSION_BLOCK}\n")
  128. endif()
  129. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${id_content}")
  130. set(pp_if "#elif")
  131. endforeach()
  132. if (CID_PLATFORM_DEFAULT_COMPILER)
  133. set(platform_compiler_detection "
  134. /* These compilers are either not known or too old to define an
  135. identification macro. Try to identify the platform and guess that
  136. it is the native compiler. */
  137. #elif defined(__hpux) || defined(__hpua)
  138. # define ${CID_PREFIX}COMPILER_ID \"HP\"
  139. #else /* unknown compiler */
  140. # define ${CID_PREFIX}COMPILER_ID \"\"")
  141. endif()
  142. string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT "\n${platform_compiler_detection}\n#endif")
  143. endif()
  144. set(${outvar} ${CMAKE_${lang}_COMPILER_ID_CONTENT} PARENT_SCOPE)
  145. endfunction()