From add7068f21cfcc6782c661a3d6ee39dc9372d98b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ho=C5=99e=C5=88ovsk=C3=BD?= Date: Mon, 16 Dec 2019 22:33:56 +0100 Subject: [PATCH] Fixup installation --- CMakeLists.txt | 288 +++++++++++++++++---------------------------- src/CMakeLists.txt | 58 +++++++++ 2 files changed, 165 insertions(+), 181 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9053a33f..09ce2d70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,11 @@ endif() 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_INSTALL_DOCS "Install documentation alongside library" ON) +option(CATCH_INSTALL_EXTRAS "Install extras alongside library" ON) + + +set(CATCH_CMAKE_CONFIG_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/Catch2") # Catch2's build breaks if done in-tree. You probably should not build @@ -58,8 +63,6 @@ endif() #option(CATCH_USE_VALGRIND "Perform SelfTests with Valgrind" 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_EXTRAS "Install extras alongside library" ON) # #set_property(GLOBAL PROPERTY USE_FOLDERS ON) # @@ -67,185 +70,108 @@ endif() # 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_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 -# $ -# $ -#) -# -#if (ANDROID) -# target_link_libraries(Catch2 INTERFACE log) -#endif() -# -## 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 redefining `CMAKE_SIZEOF_VOID_P` to an -# # empty string. Note that just undefining the variable could be -# # insufficient in cases where the variable was already in CMake cache -# set(CATCH2_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) -# set(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 -# "extras/ParseAndAddCatchTests.cmake" -# "extras/Catch.cmake" -# "extras/CatchAddTests.cmake" -# DESTINATION -# ${CATCH_CMAKE_CONFIG_DESTINATION} -# ) -# -# # Install debugger helpers -# install( -# FILES -# "extras/gdbinit" -# "extras/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) +# 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) + + configure_package_config_file( + ${CMAKE_CURRENT_LIST_DIR}/CMake/Catch2Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/Catch2Config.cmake + INSTALL_DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + + ## TODO: Catch2 main target? + ## Install some cpp file as well? + + # 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 redefining `CMAKE_SIZEOF_VOID_P` to an + # empty string. Note that just undefining the variable could be + # insufficient in cases where the variable was already in CMake cache + set(CATCH2_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) + set(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( + 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 + "extras/ParseAndAddCatchTests.cmake" + "extras/Catch.cmake" + "extras/CatchAddTests.cmake" + DESTINATION + ${CATCH_CMAKE_CONFIG_DESTINATION} + ) + + # Install debugger helpers + install( + FILES + "extras/gdbinit" + "extras/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) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index eeef8f31..89f089cc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,6 +29,7 @@ set(BENCHMARK_SOURCES SOURCE_GROUP("benchmark" FILES ${BENCHMARK_HEADERS} ${BENCHMARK_SOURCES}) set(INTERNAL_HEADERS + ${SOURCES_DIR}/catch.hpp ${SOURCES_DIR}/catch_approx.h ${SOURCES_DIR}/catch_assertionhandler.h ${SOURCES_DIR}/catch_assertioninfo.h @@ -224,12 +225,69 @@ add_library(Catch2 STATIC ${BENCHMARK_SOURCES} ) +# provide a namespaced alias for clients to 'link' against if catch is included as a sub-project +add_library(Catch2::Catch2 ALIAS Catch2) +if (ANDROID) + target_link_libraries(Catch2 INTERFACE log) +endif() + + target_include_directories(Catch2 PUBLIC $ $ ) +# depend on bunch of C++11 and C++14 features to have C++14 enabled by default +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_variable_templates + cxx_variadic_macros +) + +if (NOT_SUBPROJECT) + # 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} + ) + # This installs the headers + install(DIRECTORY ${SOURCES_DIR} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} FILES_MATCHING PATTERN "*.h*") + # TODO: Also install the helper main +endif() + # Some tests require a full recompilation of Catch2 lib with different # compilation flags. They can link against this target to recompile all # the sources into the binary.