CheckLanguage.cmake 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #[=======================================================================[.rst:
  4. CheckLanguage
  5. -------------
  6. Check if a language can be enabled
  7. Usage:
  8. ::
  9. check_language(<lang>)
  10. where ``<lang>`` is a language that may be passed to :command:`enable_language`
  11. such as ``Fortran``. If :variable:`CMAKE_<LANG>_COMPILER` is already defined
  12. the check does nothing. Otherwise it tries enabling the language in a
  13. test project. The result is cached in :variable:`CMAKE_<LANG>_COMPILER`
  14. as the compiler that was found, or ``NOTFOUND`` if the language cannot be
  15. enabled. For CUDA which can have an explicit host compiler, the cache
  16. :variable:`CMAKE_CUDA_HOST_COMPILER` variable will be set if it was required
  17. for compilation (and cleared if it was not).
  18. Example:
  19. ::
  20. check_language(Fortran)
  21. if(CMAKE_Fortran_COMPILER)
  22. enable_language(Fortran)
  23. else()
  24. message(STATUS "No Fortran support")
  25. endif()
  26. #]=======================================================================]
  27. include_guard(GLOBAL)
  28. cmake_policy(PUSH)
  29. cmake_policy(SET CMP0126 NEW)
  30. macro(check_language lang)
  31. if(NOT DEFINED CMAKE_${lang}_COMPILER)
  32. set(_desc "Looking for a ${lang} compiler")
  33. message(CHECK_START "${_desc}")
  34. file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
  35. set(extra_compiler_variables)
  36. if(${lang} STREQUAL CUDA AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
  37. set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
  38. endif()
  39. set(_cl_content
  40. "cmake_minimum_required(VERSION ${CMAKE_VERSION})
  41. project(Check${lang} ${lang})
  42. file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
  43. \"set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\\n\"
  44. \"${extra_compiler_variables}\\n\"
  45. )"
  46. )
  47. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt"
  48. "${_cl_content}")
  49. if(CMAKE_GENERATOR_INSTANCE)
  50. set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}")
  51. else()
  52. set(_D_CMAKE_GENERATOR_INSTANCE "")
  53. endif()
  54. if(CMAKE_GENERATOR MATCHES "^(Xcode$|Green Hills MULTI$|Visual Studio)")
  55. set(_D_CMAKE_MAKE_PROGRAM "")
  56. else()
  57. set(_D_CMAKE_MAKE_PROGRAM "-DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM}")
  58. endif()
  59. if(CMAKE_TOOLCHAIN_FILE)
  60. set(_D_CMAKE_TOOLCHAIN_FILE "-DCMAKE_TOOLCHAIN_FILE:FILEPATH=${CMAKE_TOOLCHAIN_FILE}")
  61. else()
  62. set(_D_CMAKE_TOOLCHAIN_FILE "")
  63. endif()
  64. execute_process(
  65. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}
  66. COMMAND ${CMAKE_COMMAND} . -G ${CMAKE_GENERATOR}
  67. -A "${CMAKE_GENERATOR_PLATFORM}"
  68. -T "${CMAKE_GENERATOR_TOOLSET}"
  69. ${_D_CMAKE_GENERATOR_INSTANCE}
  70. ${_D_CMAKE_MAKE_PROGRAM}
  71. ${_D_CMAKE_TOOLCHAIN_FILE}
  72. OUTPUT_VARIABLE _cl_output
  73. ERROR_VARIABLE _cl_output
  74. RESULT_VARIABLE _cl_result
  75. )
  76. include(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/result.cmake OPTIONAL)
  77. if(CMAKE_${lang}_COMPILER AND "${_cl_result}" STREQUAL "0")
  78. message(CONFIGURE_LOG
  79. "${_desc} passed with the following output:\n"
  80. "${_cl_output}\n")
  81. set(_CHECK_COMPILER_STATUS CHECK_PASS)
  82. else()
  83. set(CMAKE_${lang}_COMPILER NOTFOUND)
  84. set(_CHECK_COMPILER_STATUS CHECK_FAIL)
  85. message(CONFIGURE_LOG
  86. "${_desc} failed with the following output:\n"
  87. "${_cl_output}\n")
  88. endif()
  89. message(${_CHECK_COMPILER_STATUS} "${CMAKE_${lang}_COMPILER}")
  90. set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER}" CACHE FILEPATH "${lang} compiler")
  91. mark_as_advanced(CMAKE_${lang}_COMPILER)
  92. if(CMAKE_${lang}_HOST_COMPILER)
  93. message(STATUS "Looking for a ${lang} host compiler - ${CMAKE_${lang}_HOST_COMPILER}")
  94. set(CMAKE_${lang}_HOST_COMPILER "${CMAKE_${lang}_HOST_COMPILER}" CACHE FILEPATH "${lang} host compiler")
  95. mark_as_advanced(CMAKE_${lang}_HOST_COMPILER)
  96. endif()
  97. endif()
  98. endmacro()
  99. cmake_policy(POP)