123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- # Copyright Louis Dionne 2013-2017
- # Distributed under the Boost Software License, Version 1.0.
- # (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
- cmake_minimum_required(VERSION 3.9)
- list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
- ##############################################################################
- # Setup CMake options
- ##############################################################################
- option(BOOST_HANA_ENABLE_CONCEPT_CHECKS "Enable concept checking in the interface methods." ON)
- option(BOOST_HANA_ENABLE_DEBUG_MODE "Enable Hana's debug mode." OFF)
- option(BOOST_HANA_ENABLE_STRING_UDL
- "Enable the GNU extension allowing the special string literal operator\
- template, which enables the _s suffix for creating compile-time strings." ON)
- option(BOOST_HANA_ENABLE_EXCEPTIONS
- "Build with exceptions enabled. Note that Hana does not make use of exceptions,\
- but this switch can be disabled when building the tests to assess that it is\
- really the case." ON)
- ##############################################################################
- # Setup project
- #
- # We parse the canonical version number located in <boost/hana/version.hpp>.
- # This is done to allow the library to be used without requiring a proper
- # installation during which the version would be written to this header.
- ##############################################################################
- foreach(level MAJOR MINOR PATCH)
- file(STRINGS include/boost/hana/version.hpp
- _define_${level}
- REGEX "#define BOOST_HANA_${level}_VERSION")
- string(REGEX MATCH "([0-9]+)" _version_${level} "${_define_${level}}")
- endforeach()
- set(Boost.Hana_VERSION_STRING "${_version_MAJOR}.${_version_MINOR}.${_version_PATCH}")
- project(Boost.Hana VERSION ${Boost.Hana_VERSION_STRING} LANGUAGES CXX)
- # Perform checks to make sure we support the current compiler
- include(CheckCxxCompilerSupport)
- ##############################################################################
- # Setup the 'hana' header-only library target, along with its install target
- # and exports.
- ##############################################################################
- include(CheckCXXCompilerFlag)
- add_library(hana INTERFACE)
- target_include_directories(hana INTERFACE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
- target_compile_features(hana INTERFACE cxx_std_14)
- # Export the `hana` library into a HanaConfig.cmake file
- install(TARGETS hana
- EXPORT HanaConfig
- INCLUDES DESTINATION include)
- install(EXPORT HanaConfig
- DESTINATION lib/cmake/hana)
- install(DIRECTORY include/boost
- DESTINATION include
- FILES_MATCHING PATTERN "*.hpp")
- # Also install an optional pkg-config file
- configure_file(cmake/hana.pc.in hana.pc @ONLY)
- install(FILES "${CMAKE_CURRENT_BINARY_DIR}/hana.pc" DESTINATION lib/pkgconfig)
- ##############################################################################
- # Function to setup common compiler flags on tests and examples
- ##############################################################################
- function(boost_hana_set_test_properties target)
- target_link_libraries(${target} PRIVATE hana)
- set_target_properties(${target} PROPERTIES CXX_EXTENSIONS NO)
- macro(setflag testname flag)
- check_cxx_compiler_flag(${flag} ${testname})
- if (${testname})
- target_compile_options(${target} PRIVATE ${flag})
- endif()
- endmacro()
- if (NOT MSVC)
- setflag(BOOST_HANA_HAS_FDIAGNOSTICS_COLOR -fdiagnostics-color)
- setflag(BOOST_HANA_HAS_FTEMPLATE_BACKTRACE_LIMIT -ftemplate-backtrace-limit=0)
- setflag(BOOST_HANA_HAS_PEDANTIC -pedantic)
- setflag(BOOST_HANA_HAS_WALL -Wall)
- setflag(BOOST_HANA_HAS_WERROR -Werror)
- setflag(BOOST_HANA_HAS_WEXTRA -Wextra)
- setflag(BOOST_HANA_HAS_WNO_SELF_ASSIGN_OVERLOADED -Wno-self-assign-overloaded)
- setflag(BOOST_HANA_HAS_WNO_UNUSED_LOCAL_TYPEDEFS -Wno-unused-local-typedefs)
- setflag(BOOST_HANA_HAS_WWRITE_STRINGS -Wwrite-strings)
- else()
- setflag(BOOST_HANA_HAS_MSVC_EHSC -EHsc)
- setflag(BOOST_HANA_HAS_MSVC_BIGOBJ -bigobj)
- setflag(BOOST_HANA_HAS_MSVC_TERNARY -Zc:ternary)
- endif()
- if (NOT BOOST_HANA_ENABLE_EXCEPTIONS)
- setflag(BOOST_HANA_HAS_FNO_EXCEPTIONS -fno-exceptions)
- endif()
- if (NOT BOOST_HANA_ENABLE_CONCEPT_CHECKS)
- target_compile_definitions(${target} PRIVATE -DBOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS)
- endif()
- if (BOOST_HANA_ENABLE_DEBUG_MODE)
- target_compile_definitions(${target} PRIVATE -DBOOST_HANA_CONFIG_ENABLE_DEBUG_MODE)
- endif()
- if (BOOST_HANA_ENABLE_STRING_UDL)
- if (NOT MSVC)
- target_compile_definitions(${target} PRIVATE -DBOOST_HANA_CONFIG_ENABLE_STRING_UDL)
- # GCC pretends to have the flag, but produces a "unrecognized command line option"
- # warning when we use it.
- if (NOT ${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
- setflag(BOOST_HANA_HAS_WNO_GNU_STRING_UDL -Wno-gnu-string-literal-operator-template)
- endif()
- endif()
- endif()
- endfunction()
- ##############################################################################
- # Look for the rest of Boost, which is an optional dependency of some tests.
- ##############################################################################
- find_package(Boost 1.64)
- if (NOT Boost_FOUND)
- message(WARNING "The rest of Boost was not found; some tests and examples will be disabled.")
- endif()
- ##############################################################################
- # Setup custom functions to ease the creation of targets
- ##############################################################################
- # boost_hana_target_name_for(<output variable> <source file> [ext])
- #
- # Return the target name associated to a source file. If the path of the
- # source file relative from the root of Hana is `path/to/source/file.ext`,
- # the target name associated to it will be `path.to.source.file`.
- #
- # The extension of the file should be specified as a last argument. If no
- # extension is specified, the `.cpp` extension is assumed.
- function(boost_hana_target_name_for out file)
- if (NOT ARGV2)
- set(_extension ".cpp")
- else()
- set(_extension "${ARGV2}")
- endif()
- file(RELATIVE_PATH _relative "${Boost.Hana_SOURCE_DIR}" "${file}")
- string(REPLACE "${_extension}" "" _name "${_relative}")
- string(REGEX REPLACE "/" "." _name "${_name}")
- set(${out} "${_name}" PARENT_SCOPE)
- endfunction()
- ##############################################################################
- # Setup the `check` target to build and then run all the tests and examples.
- ##############################################################################
- add_custom_target(hana_check
- COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
- WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
- COMMENT "Build and then run all the tests and examples."
- USES_TERMINAL)
- if (NOT TARGET check)
- add_custom_target(check DEPENDS hana_check)
- else()
- add_dependencies(check hana_check)
- endif()
- ##############################################################################
- # Setup subdirectories and testing
- ##############################################################################
- enable_testing()
- find_program(MEMORYCHECK_COMMAND valgrind)
- if (MEMORYCHECK_COMMAND)
- message(STATUS "Found Valgrind: ${MEMORYCHECK_COMMAND}")
- set(MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --error-exitcode=1")
- else()
- message("Valgrind not found")
- endif()
- include(CTest)
- add_subdirectory(benchmark)
- add_subdirectory(doc)
- add_subdirectory(example)
- add_subdirectory(test)
|