CheckCXXSourceCompiles.cmake 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # - Check if the given C++ source code compiles.
  2. # CHECK_CXX_SOURCE_COMPILES(<code> <var> [FAIL_REGEX <fail-regex>])
  3. # <code> - source code to try to compile
  4. # <var> - variable to store whether the source code compiled
  5. # <fail-regex> - fail if test output matches this regex
  6. # The following variables may be set before calling this macro to
  7. # modify the way the check is run:
  8. #
  9. # CMAKE_REQUIRED_FLAGS = string of compile command line flags
  10. # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
  11. # CMAKE_REQUIRED_INCLUDES = list of include directories
  12. # CMAKE_REQUIRED_LIBRARIES = list of libraries to link
  13. MACRO(CHECK_CXX_SOURCE_COMPILES SOURCE VAR)
  14. IF("${VAR}" MATCHES "^${VAR}$")
  15. SET(_FAIL_REGEX)
  16. SET(_key)
  17. FOREACH(arg ${ARGN})
  18. IF("${arg}" MATCHES "^(FAIL_REGEX)$")
  19. SET(_key "${arg}")
  20. ELSEIF(_key)
  21. LIST(APPEND _${_key} "${arg}")
  22. ELSE()
  23. MESSAGE(FATAL_ERROR "Unknown argument:\n ${arg}\n")
  24. ENDIF()
  25. ENDFOREACH()
  26. SET(MACRO_CHECK_FUNCTION_DEFINITIONS
  27. "-D${VAR} ${CMAKE_REQUIRED_FLAGS}")
  28. IF(CMAKE_REQUIRED_LIBRARIES)
  29. SET(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES
  30. "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
  31. ELSE(CMAKE_REQUIRED_LIBRARIES)
  32. SET(CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES)
  33. ENDIF(CMAKE_REQUIRED_LIBRARIES)
  34. IF(CMAKE_REQUIRED_INCLUDES)
  35. SET(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES
  36. "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
  37. ELSE(CMAKE_REQUIRED_INCLUDES)
  38. SET(CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES)
  39. ENDIF(CMAKE_REQUIRED_INCLUDES)
  40. FILE(WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx"
  41. "${SOURCE}\n")
  42. MESSAGE(STATUS "Performing Test ${VAR}")
  43. TRY_COMPILE(${VAR}
  44. ${CMAKE_BINARY_DIR}
  45. ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/src.cxx
  46. COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
  47. CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS}
  48. "${CHECK_CXX_SOURCE_COMPILES_ADD_LIBRARIES}"
  49. "${CHECK_CXX_SOURCE_COMPILES_ADD_INCLUDES}"
  50. OUTPUT_VARIABLE OUTPUT)
  51. FOREACH(_regex ${_FAIL_REGEX})
  52. IF("${OUTPUT}" MATCHES "${_regex}")
  53. SET(${VAR} 0)
  54. ENDIF()
  55. ENDFOREACH()
  56. IF(${VAR})
  57. SET(${VAR} 1 CACHE INTERNAL "Test ${VAR}")
  58. MESSAGE(STATUS "Performing Test ${VAR} - Success")
  59. FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
  60. "Performing C++ SOURCE FILE Test ${VAR} succeded with the following output:\n"
  61. "${OUTPUT}\n"
  62. "Source file was:\n${SOURCE}\n")
  63. ELSE(${VAR})
  64. MESSAGE(STATUS "Performing Test ${VAR} - Failed")
  65. SET(${VAR} "" CACHE INTERNAL "Test ${VAR}")
  66. FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
  67. "Performing C++ SOURCE FILE Test ${VAR} failed with the following output:\n"
  68. "${OUTPUT}\n"
  69. "Source file was:\n${SOURCE}\n")
  70. ENDIF(${VAR})
  71. ENDIF("${VAR}" MATCHES "^${VAR}$")
  72. ENDMACRO(CHECK_CXX_SOURCE_COMPILES)