CheckLanguage.cmake 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. #
  7. # Check if a language can be enabled
  8. #
  9. # Usage:
  10. #
  11. # ::
  12. #
  13. # check_language(<lang>)
  14. #
  15. # where <lang> is a language that may be passed to enable_language()
  16. # such as "Fortran". If CMAKE_<lang>_COMPILER is already defined the
  17. # check does nothing. Otherwise it tries enabling the language in a
  18. # test project. The result is cached in CMAKE_<lang>_COMPILER as the
  19. # compiler that was found, or NOTFOUND if the language cannot be
  20. # enabled.
  21. #
  22. # Example:
  23. #
  24. # ::
  25. #
  26. # check_language(Fortran)
  27. # if(CMAKE_Fortran_COMPILER)
  28. # enable_language(Fortran)
  29. # else()
  30. # message(STATUS "No Fortran support")
  31. # endif()
  32. include_guard(GLOBAL)
  33. macro(check_language lang)
  34. if(NOT DEFINED CMAKE_${lang}_COMPILER)
  35. set(_desc "Looking for a ${lang} compiler")
  36. message(STATUS ${_desc})
  37. file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
  38. file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt"
  39. "cmake_minimum_required(VERSION ${CMAKE_VERSION})
  40. project(Check${lang} ${lang})
  41. file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
  42. \"set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\\n\"
  43. )
  44. ")
  45. if(CMAKE_GENERATOR_INSTANCE)
  46. set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}")
  47. else()
  48. set(_D_CMAKE_GENERATOR_INSTANCE "")
  49. endif()
  50. execute_process(
  51. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}
  52. COMMAND ${CMAKE_COMMAND} . -G ${CMAKE_GENERATOR}
  53. -A "${CMAKE_GENERATOR_PLATFORM}"
  54. -T "${CMAKE_GENERATOR_TOOLSET}"
  55. ${_D_CMAKE_GENERATOR_INSTANCE}
  56. OUTPUT_VARIABLE output
  57. ERROR_VARIABLE output
  58. RESULT_VARIABLE result
  59. )
  60. include(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/result.cmake OPTIONAL)
  61. if(CMAKE_${lang}_COMPILER AND "${result}" STREQUAL "0")
  62. file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  63. "${_desc} passed with the following output:\n"
  64. "${output}\n")
  65. else()
  66. set(CMAKE_${lang}_COMPILER NOTFOUND)
  67. file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  68. "${_desc} failed with the following output:\n"
  69. "${output}\n")
  70. endif()
  71. message(STATUS "${_desc} - ${CMAKE_${lang}_COMPILER}")
  72. set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER}" CACHE FILEPATH "${lang} compiler")
  73. mark_as_advanced(CMAKE_${lang}_COMPILER)
  74. endif()
  75. endmacro()