CXXFeatureCheck.cmake 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # - Compile and run code to check for C++ features
  2. #
  3. # This functions compiles a source file under the `cmake` folder
  4. # and adds the corresponding `HAVE_[FILENAME]` flag to the CMake
  5. # environment
  6. #
  7. # cxx_feature_check(<FLAG> [<VARIANT>])
  8. #
  9. # - Example
  10. #
  11. # include(CXXFeatureCheck)
  12. # cxx_feature_check(STD_REGEX)
  13. # Requires CMake 2.8.12+
  14. if(__cxx_feature_check)
  15. return()
  16. endif()
  17. set(__cxx_feature_check INCLUDED)
  18. function(cxx_feature_check FILE)
  19. string(TOLOWER ${FILE} FILE)
  20. string(TOUPPER ${FILE} VAR)
  21. string(TOUPPER "HAVE_${VAR}" FEATURE)
  22. if (DEFINED HAVE_${VAR})
  23. set(HAVE_${VAR} 1 PARENT_SCOPE)
  24. add_definitions(-DHAVE_${VAR})
  25. return()
  26. endif()
  27. if (ARGC GREATER 1)
  28. message(STATUS "Enabling additional flags: ${ARGV1}")
  29. list(APPEND BENCHMARK_CXX_LINKER_FLAGS ${ARGV1})
  30. endif()
  31. if (NOT DEFINED COMPILE_${FEATURE})
  32. message(STATUS "Performing Test ${FEATURE}")
  33. if(CMAKE_CROSSCOMPILING)
  34. try_compile(COMPILE_${FEATURE}
  35. ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
  36. CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
  37. LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
  38. if(COMPILE_${FEATURE})
  39. message(WARNING
  40. "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
  41. set(RUN_${FEATURE} 0 CACHE INTERNAL "")
  42. else()
  43. set(RUN_${FEATURE} 1 CACHE INTERNAL "")
  44. endif()
  45. else()
  46. message(STATUS "Performing Test ${FEATURE}")
  47. try_run(RUN_${FEATURE} COMPILE_${FEATURE}
  48. ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
  49. CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
  50. LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
  51. endif()
  52. endif()
  53. if(RUN_${FEATURE} EQUAL 0)
  54. message(STATUS "Performing Test ${FEATURE} -- success")
  55. set(HAVE_${VAR} 1 PARENT_SCOPE)
  56. add_definitions(-DHAVE_${VAR})
  57. else()
  58. if(NOT COMPILE_${FEATURE})
  59. message(STATUS "Performing Test ${FEATURE} -- failed to compile")
  60. else()
  61. message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run")
  62. endif()
  63. endif()
  64. endfunction()