123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- cmake_minimum_required(VERSION 3.5)
- list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
- ##################################################
- # C++ standard version selection
- ##################################################
- function(constexpr_if_std std_flag var)
- try_compile(
- worked
- ${CMAKE_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/constexpr_if.cpp
- COMPILE_DEFINITIONS ${std_flag} -DCHECK_CONSTEXPR_IF=1
- )
- set(${var} ${worked} PARENT_SCOPE)
- endfunction ()
- function(try_std_flag std_flag)
- try_compile(
- std_supported
- ${CMAKE_BINARY_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/cmake/constexpr_if.cpp
- COMPILE_DEFINITIONS ${std_flag} -DCHECK_CONSTEXPR_IF=0
- )
- if (std_supported)
- message("-- Checking compiler flag ${std_flag} -- success")
- set(std_flag ${std_flag} PARENT_SCOPE)
- constexpr_if_std(${std_flag} have_constexpr_if)
- if (have_constexpr_if)
- set(constexpr_if_define -DBOOST_NO_CONSTEXPR_IF=0 PARENT_SCOPE)
- message("-- Checking constexpr if support -- success")
- else ()
- set(constexpr_if_define -DBOOST_NO_CONSTEXPR_IF=1 PARENT_SCOPE)
- message("-- Checking constexpr if support -- failed to compile")
- endif ()
- else ()
- message("-- Checking compiler flag ${std_flag} -- failed to compile")
- endif ()
- endfunction ()
- try_std_flag(-std=c++17)
- if (NOT std_flag)
- try_std_flag(-std=c++1z)
- elseif (NOT std_flag)
- try_std_flag(-std=c++14)
- elseif (NOT std_flag)
- try_std_flag(/std:c++14)
- elseif (NOT std_flag)
- message(FATAL_ERROR "Only c++14 or later will work")
- endif ()
- ##################################################
- # Sanitizers
- ##################################################
- set(USE_ASAN false CACHE BOOL "Set to true to enable -fsanitize=address when building tests.")
- set(USE_UBSAN false CACHE BOOL "Set to true to enable -fsanitize=undefined when building tests.")
- if (USE_ASAN AND USE_UBSAN)
- message(FATAL_ERROR "USE_ASAN and USE_UBSAN must not be enabled at the same time")
- elseif (USE_ASAN)
- set(compile_flags -fsanitize=address)
- set(link_flags -fsanitize=address)
- message("-- Using -fsanitize=address")
- elseif (USE_UBSAN)
- set(compile_flags -fsanitize=undefined)
- set(link_flags -fsanitize=undefined)
- message("-- Using -fsanitize=undefined")
- endif()
- ##################################################
- # Code coverage
- ##################################################
- if (UNIX)
- set(BUILD_COVERAGE false CACHE BOOL "Set to true to enable code coverage when building tests. Only Linux and Mac are supported.")
- if (BUILD_COVERAGE)
- message("-- Building for code coverage; disabling any sanitizers")
- if (APPLE)
- set(compile_flags -fprofile-arcs -ftest-coverage)
- set(CMAKE_BUILD_TYPE RelWithDebInfo)
- set(link_flags --coverage)
- else ()
- set(compile_flags --coverage)
- set(CMAKE_BUILD_TYPE RelWithDebInfo)
- set(link_flags --coverage)
- endif ()
- endif ()
- endif ()
- ##################################################
- # Clang+Linux support
- ##################################################
- set(clang_on_linux false)
- if (CMAKE_CXX_COMPILER_ID STREQUAL Clang)
- add_definitions(${std_flag} -stdlib=libc++ -g -Wall)
- if (CMAKE_SYSTEM_NAME STREQUAL Linux)
- set(clang_on_linux true)
- endif ()
- elseif (CMAKE_CXX_COMPILER_ID STREQUAL GNU)
- add_definitions(${std_flag} -g -Wall)
- endif ()
- ##################################################
- # Dependencies
- ##################################################
- include(dependencies)
- ##################################################
- # yap library
- ##################################################
- add_library(yap INTERFACE)
- target_include_directories(yap INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include)
- target_link_libraries(yap INTERFACE boost)
- target_compile_definitions(yap INTERFACE ${constexpr_if_define} BOOST_ALL_NO_LIB=1)
- if (link_flags)
- target_link_libraries(yap INTERFACE ${link_flags})
- target_compile_options(yap INTERFACE ${compile_flags})
- endif ()
- add_subdirectory(test)
- add_subdirectory(example)
- add_subdirectory(perf)
- add_subdirectory(doc) # Doesn't build docs, just the snippets files.
|