Home | History | Annotate | Download | only in cmake
      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 
     15 if(__cxx_feature_check)
     16   return()
     17 endif()
     18 set(__cxx_feature_check INCLUDED)
     19 
     20 function(cxx_feature_check FILE)
     21   string(TOLOWER ${FILE} FILE)
     22   string(TOUPPER ${FILE} VAR)
     23   string(TOUPPER "HAVE_${VAR}" FEATURE)
     24   if (DEFINED HAVE_${VAR})
     25     set(HAVE_${VAR} 1 PARENT_SCOPE)
     26     add_definitions(-DHAVE_${VAR})
     27     return()
     28   endif()
     29 
     30   if (NOT DEFINED COMPILE_${FEATURE})
     31     message(STATUS "Performing Test ${FEATURE}")
     32     if(CMAKE_CROSSCOMPILING)
     33       try_compile(COMPILE_${FEATURE}
     34               ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
     35               CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
     36               LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
     37       if(COMPILE_${FEATURE})
     38         message(WARNING
     39               "If you see build failures due to cross compilation, try setting HAVE_${VAR} to 0")
     40         set(RUN_${FEATURE} 0)
     41       else()
     42         set(RUN_${FEATURE} 1)
     43       endif()
     44     else()
     45       message(STATUS "Performing Test ${FEATURE}")
     46       try_run(RUN_${FEATURE} COMPILE_${FEATURE}
     47               ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp
     48               CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}
     49               LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES})
     50     endif()
     51   endif()
     52 
     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()
     65