mirror of
https://github.com/catchorg/Catch2.git
synced 2024-12-23 11:43:29 +01:00
c7653811a6
@ThijsWithaar is responsible for giving me the idea, but his PR had couple of things that meant it was simpler to rewrite it than to fix and merge it. Supersedes and closes #1599
220 lines
5.8 KiB
CMake
220 lines
5.8 KiB
CMake
cmake_minimum_required(VERSION 3.5)
|
|
|
|
# detect if Catch is being bundled,
|
|
# disable testsuite in that case
|
|
if(NOT DEFINED PROJECT_NAME)
|
|
set(NOT_SUBPROJECT ON)
|
|
endif()
|
|
|
|
project(Catch2 LANGUAGES CXX VERSION 2.7.1)
|
|
|
|
# Provide path for scripts
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
|
|
|
|
include(GNUInstallDirs)
|
|
include(CMakePackageConfigHelpers)
|
|
include(CTest)
|
|
|
|
option(CATCH_USE_VALGRIND "Perform SelfTests with Valgrind" OFF)
|
|
option(CATCH_BUILD_TESTING "Build SelfTest project" ON)
|
|
option(CATCH_BUILD_EXAMPLES "Build documentation examples" OFF)
|
|
option(CATCH_BUILD_EXTRA_TESTS "Build extra tests" OFF)
|
|
option(CATCH_ENABLE_COVERAGE "Generate coverage for codecov.io" OFF)
|
|
option(CATCH_ENABLE_WERROR "Enable all warnings as errors" ON)
|
|
option(CATCH_INSTALL_DOCS "Install documentation alongside library" ON)
|
|
option(CATCH_INSTALL_HELPERS "Install contrib alongside library" ON)
|
|
|
|
|
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|
|
|
# define some folders
|
|
set(CATCH_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
set(SELF_TEST_DIR ${CATCH_DIR}/projects/SelfTest)
|
|
set(BENCHMARK_DIR ${CATCH_DIR}/projects/Benchmark)
|
|
set(HEADER_DIR ${CATCH_DIR}/include)
|
|
|
|
if(USE_WMAIN)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ENTRY:wmainCRTStartup")
|
|
endif()
|
|
|
|
if (BUILD_TESTING AND CATCH_BUILD_TESTING AND NOT_SUBPROJECT)
|
|
find_package(PythonInterp)
|
|
if (NOT PYTHONINTERP_FOUND)
|
|
message(FATAL_ERROR "Python not found, but required for tests")
|
|
endif()
|
|
add_subdirectory(projects)
|
|
endif()
|
|
|
|
if(CATCH_BUILD_EXAMPLES)
|
|
add_subdirectory(examples)
|
|
endif()
|
|
|
|
if(CATCH_BUILD_EXTRA_TESTS)
|
|
add_subdirectory(projects/ExtraTests)
|
|
endif()
|
|
|
|
# add catch as a 'linkable' target
|
|
add_library(Catch2 INTERFACE)
|
|
|
|
|
|
|
|
# depend on some obvious c++11 features so the dependency is transitively added dependents
|
|
target_compile_features(Catch2
|
|
INTERFACE
|
|
cxx_alignas
|
|
cxx_alignof
|
|
cxx_attributes
|
|
cxx_auto_type
|
|
cxx_constexpr
|
|
cxx_defaulted_functions
|
|
cxx_deleted_functions
|
|
cxx_final
|
|
cxx_lambdas
|
|
cxx_noexcept
|
|
cxx_override
|
|
cxx_range_for
|
|
cxx_rvalue_references
|
|
cxx_static_assert
|
|
cxx_strong_enums
|
|
cxx_trailing_return_types
|
|
cxx_unicode_literals
|
|
cxx_user_literals
|
|
cxx_variadic_macros
|
|
)
|
|
|
|
target_include_directories(Catch2
|
|
INTERFACE
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/single_include>
|
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
)
|
|
|
|
# provide a namespaced alias for clients to 'link' against if catch is included as a sub-project
|
|
add_library(Catch2::Catch2 ALIAS Catch2)
|
|
|
|
# Only perform the installation steps when Catch is not being used as
|
|
# a subproject via `add_subdirectory`, or the destinations will break,
|
|
# see https://github.com/catchorg/Catch2/issues/1373
|
|
if (NOT_SUBPROJECT)
|
|
set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2")
|
|
|
|
configure_package_config_file(
|
|
${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake
|
|
INSTALL_DESTINATION
|
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
|
)
|
|
|
|
|
|
# create and install an export set for catch target as Catch2::Catch
|
|
install(
|
|
TARGETS
|
|
Catch2
|
|
EXPORT
|
|
Catch2Targets
|
|
DESTINATION
|
|
${CMAKE_INSTALL_LIBDIR}
|
|
)
|
|
|
|
|
|
install(
|
|
EXPORT
|
|
Catch2Targets
|
|
NAMESPACE
|
|
Catch2::
|
|
DESTINATION
|
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
|
)
|
|
|
|
# By default, FooConfigVersion is tied to architecture that it was
|
|
# generated on. Because Catch2 is header-only, it is arch-independent
|
|
# and thus Catch2ConfigVersion should not be tied to the architecture
|
|
# it was generated on.
|
|
#
|
|
# CMake does not provide a direct customization point for this in
|
|
# `write_basic_package_version_file`, but it can be accomplished
|
|
# indirectly by temporarily undefining `CMAKE_SIZEOF_VOID_P`.
|
|
set(CATCH2_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
|
|
unset(CMAKE_SIZEOF_VOID_P)
|
|
write_basic_package_version_file(
|
|
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
|
COMPATIBILITY
|
|
SameMajorVersion
|
|
)
|
|
set(CMAKE_SIZEOF_VOID_P ${CATCH2_CMAKE_SIZEOF_VOID_P})
|
|
|
|
install(
|
|
DIRECTORY
|
|
"single_include/"
|
|
DESTINATION
|
|
"${CMAKE_INSTALL_INCLUDEDIR}"
|
|
)
|
|
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/Catch2ConfigVersion.cmake"
|
|
DESTINATION
|
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
|
)
|
|
|
|
# Install documentation
|
|
if(CATCH_INSTALL_DOCS)
|
|
install(
|
|
DIRECTORY
|
|
docs/
|
|
DESTINATION
|
|
"${CMAKE_INSTALL_DOCDIR}"
|
|
)
|
|
endif()
|
|
|
|
if(CATCH_INSTALL_HELPERS)
|
|
# Install CMake scripts
|
|
install(
|
|
FILES
|
|
"contrib/ParseAndAddCatchTests.cmake"
|
|
"contrib/Catch.cmake"
|
|
"contrib/CatchAddTests.cmake"
|
|
DESTINATION
|
|
${CATCH_CMAKE_CONFIG_DESTINATION}
|
|
)
|
|
|
|
# Install debugger helpers
|
|
install(
|
|
FILES
|
|
"contrib/gdbinit"
|
|
"contrib/lldbinit"
|
|
DESTINATION
|
|
${CMAKE_INSTALL_DATAROOTDIR}/Catch2
|
|
)
|
|
endif()
|
|
|
|
## Provide some pkg-config integration
|
|
set(PKGCONFIG_INSTALL_DIR
|
|
"${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig"
|
|
CACHE PATH "Path where catch2.pc is installed"
|
|
)
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/CMake/catch2.pc.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/catch2.pc
|
|
@ONLY
|
|
)
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/catch2.pc"
|
|
DESTINATION
|
|
${PKGCONFIG_INSTALL_DIR}
|
|
)
|
|
|
|
# CPack/CMake started taking the package version from project version 3.12
|
|
# So we need to set the version manually for older CMake versions
|
|
if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
|
|
set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})
|
|
endif()
|
|
|
|
set(CPACK_PACKAGE_CONTACT "https://github.com/catchorg/Catch2/")
|
|
|
|
|
|
include( CPack )
|
|
|
|
endif(NOT_SUBPROJECT)
|