CMakeCompilerIdDetection.cmake 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. include(${CMAKE_CURRENT_LIST_DIR}/CMakeParseArguments.cmake)
  12. function(compiler_id_detection outvar lang)
  13. if (NOT lang STREQUAL Fortran)
  14. file(GLOB lang_files
  15. "${CMAKE_ROOT}/Modules/Compiler/*-DetermineCompiler.cmake")
  16. set(nonlang CXX)
  17. if (lang STREQUAL CXX)
  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 (lang STREQUAL CXX)
  38. list(APPEND ordered_compilers
  39. Comeau
  40. )
  41. endif()
  42. list(APPEND ordered_compilers
  43. Intel
  44. PathScale
  45. Embarcadero
  46. Borland
  47. Watcom
  48. OpenWatcom
  49. SunPro
  50. HP
  51. Compaq
  52. zOS
  53. XL
  54. VisualAge
  55. PGI
  56. Cray
  57. TI
  58. Fujitsu
  59. )
  60. if (lang STREQUAL C)
  61. list(APPEND ordered_compilers
  62. TinyCC
  63. Bruce
  64. )
  65. endif()
  66. list(APPEND ordered_compilers
  67. SCO
  68. AppleClang
  69. Clang
  70. GNU
  71. MSVC
  72. ADSP
  73. IAR
  74. ARMCC
  75. )
  76. if (lang STREQUAL C)
  77. list(APPEND ordered_compilers
  78. SDCC
  79. )
  80. endif()
  81. list(APPEND ordered_compilers
  82. MIPSpro)
  83. if(CID_ID_DEFINE)
  84. foreach(Id ${ordered_compilers})
  85. set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}# define ${CID_PREFIX}COMPILER_IS_${Id} 0\n")
  86. endforeach()
  87. endif()
  88. set(pp_if "#if")
  89. if (CID_VERSION_STRINGS)
  90. set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n/* Version number components: V=Version, R=Revision, P=Patch
  91. Version date components: YYYY=Year, MM=Month, DD=Day */\n")
  92. endif()
  93. foreach(Id ${ordered_compilers})
  94. if (NOT _compiler_id_pp_test_${Id})
  95. message(FATAL_ERROR "No preprocessor test for \"${Id}\"")
  96. endif()
  97. set(id_content "${pp_if} ${_compiler_id_pp_test_${Id}}\n")
  98. if (CID_ID_STRING)
  99. set(PREFIX ${CID_PREFIX})
  100. string(CONFIGURE "${_compiler_id_simulate_${Id}}" SIMULATE_BLOCK @ONLY)
  101. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_ID \"${Id}\"${SIMULATE_BLOCK}")
  102. endif()
  103. if (CID_ID_DEFINE)
  104. string(APPEND id_content "# undef ${CID_PREFIX}COMPILER_IS_${Id}\n")
  105. string(APPEND id_content "# define ${CID_PREFIX}COMPILER_IS_${Id} 1\n")
  106. endif()
  107. if (CID_VERSION_STRINGS)
  108. set(PREFIX ${CID_PREFIX})
  109. set(MACRO_DEC DEC)
  110. set(MACRO_HEX HEX)
  111. string(CONFIGURE "${_compiler_id_version_compute_${Id}}" VERSION_BLOCK @ONLY)
  112. string(APPEND id_content "${VERSION_BLOCK}\n")
  113. endif()
  114. set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n${id_content}")
  115. set(pp_if "#elif")
  116. endforeach()
  117. if (CID_PLATFORM_DEFAULT_COMPILER)
  118. set(platform_compiler_detection "
  119. /* These compilers are either not known or too old to define an
  120. identification macro. Try to identify the platform and guess that
  121. it is the native compiler. */
  122. #elif defined(__sgi)
  123. # define ${CID_PREFIX}COMPILER_ID \"MIPSpro\"
  124. #elif defined(__hpux) || defined(__hpua)
  125. # define ${CID_PREFIX}COMPILER_ID \"HP\"
  126. #else /* unknown compiler */
  127. # define ${CID_PREFIX}COMPILER_ID \"\"")
  128. endif()
  129. set(CMAKE_${lang}_COMPILER_ID_CONTENT "${CMAKE_${lang}_COMPILER_ID_CONTENT}\n${platform_compiler_detection}\n#endif")
  130. endif()
  131. set(${outvar} ${CMAKE_${lang}_COMPILER_ID_CONTENT} PARENT_SCOPE)
  132. endfunction()