From 7f280306468f5d88458ee92283f4cf52cc252a15 Mon Sep 17 00:00:00 2001 From: Dennis Klein Date: Fri, 28 May 2021 08:13:34 +0200 Subject: [PATCH] CMake: Refactor into topic-based modules --- CMakeLists.txt | 229 +---------- cmake/FairCMakeModules.cmake | 19 + cmake/FairMQBuildOption.cmake | 50 +++ ....cmake => FairMQBundlePackageHelper.cmake} | 54 ++- cmake/FairMQDependencies.cmake | 141 +++++++ cmake/FairMQLib.cmake | 386 ------------------ cmake/FairMQPackage.cmake | 71 ++++ cmake/FairMQProjectSettings.cmake | 134 ++++++ cmake/FairMQSummary.cmake | 111 +++++ cmake/GitHelper.cmake | 65 +++ 10 files changed, 653 insertions(+), 607 deletions(-) create mode 100644 cmake/FairCMakeModules.cmake create mode 100644 cmake/FairMQBuildOption.cmake rename cmake/{BundlePackages.cmake => FairMQBundlePackageHelper.cmake} (70%) create mode 100644 cmake/FairMQDependencies.cmake delete mode 100644 cmake/FairMQLib.cmake create mode 100644 cmake/FairMQPackage.cmake create mode 100644 cmake/FairMQProjectSettings.cmake create mode 100644 cmake/FairMQSummary.cmake create mode 100644 cmake/GitHelper.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index b2f99fe2..a558da27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,44 +1,28 @@ ################################################################################ -# Copyright (C) 2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # # # # This software is distributed under the terms of the # # GNU Lesser General Public Licence (LGPL) version 3, # # copied verbatim in the file "LICENSE" # ################################################################################ + +# Project ###################################################################### cmake_minimum_required(VERSION 3.15 FATAL_ERROR) cmake_policy(VERSION 3.15...3.20) -# Project ###################################################################### set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) -include(FairMQLib) - +include(GitHelper) get_git_version() project(FairMQ VERSION ${PROJECT_VERSION} LANGUAGES CXX) - -include(CTest) -include(BundlePackages) - -set(PROJECT_FairCMakeModules_VERSION 0.2) -find_package(FairCMakeModules ${PROJECT_FairCMakeModules_VERSION} QUIET) -if(NOT FairCMakeModules_FOUND) - build_bundled(FairCMakeModules extern/FairCMakeModules) - find_package(FairCMakeModules REQUIRED) -endif() - -include(FairFindPackage2) -include(FairFormattedOutput) -include(FairSummary) - -message(STATUS "${BWhite}${PROJECT_NAME}${CR} ${PROJECT_GIT_VERSION} from ${PROJECT_DATE}") - -set_fairmq_defaults() - +include(FairMQProjectSettings) ################################################################################ # Build options ################################################################ +include(FairMQBuildOption) + fairmq_build_option(BUILD_FAIRMQ "Build FairMQ library and devices." DEFAULT ON) fairmq_build_option(BUILD_TESTING "Build tests." @@ -65,96 +49,7 @@ fairmq_build_option(FAIRMQ_DEBUG_MODE "Compile in debug mode (may decrease per # Dependencies ################################################################# -if(BUILD_FAIRMQ OR BUILD_SDK) - set(THREADS_PREFER_PTHREAD_FLAG TRUE) - find_package2(PUBLIC Threads REQUIRED) - set(Threads_PREFIX "") -endif() - -if(BUILD_OFI_TRANSPORT) - find_package2(PRIVATE asiofi REQUIRED - VERSION 0.3.1 - ) - find_package2(PRIVATE OFI REQUIRED) -endif() - -if(BUILD_SDK_COMMANDS) - find_package2(PRIVATE Flatbuffers REQUIRED) -endif() - -if(BUILD_DDS_PLUGIN OR BUILD_SDK) - find_package2(PRIVATE DDS REQUIRED - VERSION 3.5.3 - ) - set(DDS_Boost_COMPONENTS system log log_setup regex filesystem thread) - set(DDS_Boost_VERSION 1.67) -endif() - -if(BUILD_PMIX_PLUGIN) - find_package2(PRIVATE PMIx REQUIRED - VERSION 2.1.4 - ) -endif() - -if(BUILD_FAIRMQ OR BUILD_SDK) - find_package2(PUBLIC FairLogger REQUIRED - VERSION 1.6.0 - ) - - if(NOT DEFINED Boost_NO_BOOST_CMAKE AND CMAKE_VERSION VERSION_LESS 3.15) - # Since Boost 1.70 a CMake package is shipped by default. Unfortunately, it has a number - # of problems that are only fixed in Boost 1.71 or CMake 3.15. By default we skip the - # BoostConfig lookup. This can be overridden on the command line via -DBoost_NO_BOOST_CMAKE=OFF - set(Boost_NO_BOOST_CMAKE ON) - endif() - find_package2(PUBLIC Boost REQUIRED - VERSION 1.66 - COMPONENTS container program_options filesystem date_time regex - ) - - # Normalize Boost version - if(CMAKE_VERSION VERSION_LESS 3.15) - set(Boost_VERSION "${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}") - endif() -endif() - -if(BUILD_SDK) - find_package2(BUNDLED asio - VERSION 1.18.1 - ) - if(NOT asio_FOUND) - build_bundled(asio extern/asio) - find_package2(PRIVATE asio REQUIRED) - endif() -endif() - -if(BUILD_FAIRMQ) - find_package2(PRIVATE ZeroMQ REQUIRED - VERSION 4.1.4 - ) - if(NOT PicoSHA2_FOUND AND NOT PicoSHA2_BUNDLED) - set(PicoSHA2_VERSION "1.0.0") - build_bundled(PicoSHA2 extern/PicoSHA2) - endif() - find_package2(BUNDLED PicoSHA2 REQUIRED) -endif() - -if(BUILD_TESTING) - if(NOT GTest_FOUND AND NOT GTest_BUNDLED AND NOT USE_EXTERNAL_GTEST) - set(GTest_VERSION "Apr 28 2021 @f5e592d8") - build_bundled(GTest extern/googletest) - endif() - find_package2(BUNDLED GTest REQUIRED) -endif() - -if(BUILD_DOCS) - find_package2(PRIVATE Doxygen REQUIRED - VERSION 1.8.8 - COMPONENTS dot - ) -endif() - -find_package2_implicit_dependencies() +include(FairMQDependencies) ################################################################################ @@ -227,115 +122,25 @@ if(BUILD_DOCS) endif() if(BUILD_SDK) if(asio_BUNDLED) - add_library(bundled_asio_headers INTERFACE) - target_include_directories(bundled_asio_headers INTERFACE - $ - $ - ) - install(TARGETS bundled_asio_headers EXPORT ${PROJECT_EXPORT_SET}) - install(DIRECTORY "${asio_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/asio" - DESTINATION ${PROJECT_INSTALL_INCDIR}/bundled - ) - install(FILES "${asio_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/asio.hpp" - DESTINATION ${PROJECT_INSTALL_INCDIR}/bundled - ) + install_bundled(asio) endif() endif() +include(FairMQPackage) install_cmake_package() ################################################################################ # Summary ###################################################################### +include(FairMQSummary) + +message(STATUS "${BWhite}${PROJECT_NAME}${CR} ${PROJECT_GIT_VERSION} from ${PROJECT_DATE}") fair_summary_global_cxx_flags_standard() fair_summary_build_types() -set_package_infos() fair_summary_package_dependencies() -message(STATUS " ") -message(STATUS " ${Cyan}COMPONENT BUILT? INFO${CR}") -if(BUILD_FAIRMQ) - set(fairmq_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_FAIRMQ=OFF${CR})") -else() - set(fairmq_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_FAIRMQ=ON${CR})") -endif() -message(STATUS " ${BWhite}fairmq${CR} ${fairmq_summary}") -if(BUILD_TESTING) - set(tests_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_TESTING=OFF${CR})") -else() - set(tests_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_TESTING=ON${CR})") -endif() -message(STATUS " ${BWhite}tests${CR} ${tests_summary}") -if(BUILD_OFI_TRANSPORT) - set(ofi_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_OFI_TRANSPORT=OFF${CR})") -else() - set(ofi_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_OFI_TRANSPORT=ON${CR})") -endif() -message(STATUS " ${BWhite}ofi_transport${CR} ${ofi_summary}") -if(BUILD_DDS_PLUGIN) - set(dds_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_DDS_PLUGIN=OFF${CR})") -else() - set(dds_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_DDS_PLUGIN=ON${CR})") -endif() -message(STATUS " ${BWhite}dds_plugin${CR} ${dds_summary}") -if(BUILD_PMIX_PLUGIN) - set(pmix_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_PMIX_PLUGIN=OFF${CR})") -else() - set(pmix_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_PMIX_PLUGIN=ON${CR})") -endif() -message(STATUS " ${BWhite}pmix_plugin${CR} ${pmix_summary}") -if(BUILD_EXAMPLES) - set(examples_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_EXAMPLES=OFF${CR})") -else() - set(examples_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_EXAMPLES=ON${CR})") -endif() -message(STATUS " ${BWhite}examples${CR} ${examples_summary}") -if(BUILD_DOCS) - set(docs_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_DOCS=OFF${CR})") -else() - set(docs_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_DOCS=ON${CR})") -endif() -message(STATUS " ${BWhite}docs${CR} ${docs_summary}") -if(BUILD_SDK) - set(sdk_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_SDK=OFF${CR})") -else() - set(sdk_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_SDK=ON${CR})") -endif() -message(STATUS " ${BWhite}sdk${CR} ${sdk_summary}") -if(BUILD_SDK_COMMANDS) - set(sdk_commands_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_SDK_COMMANDS=OFF${CR})") -else() - set(sdk_commands_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_SDK_COMMANDS=ON${CR})") -endif() -message(STATUS " ${BWhite}sdk_commands${CR} ${sdk_commands_summary}") -message(STATUS " ") -if(RUN_STATIC_ANALYSIS) - list(LENGTH PROJECT_STATIC_ANALYSERS size) - unset(analyser_list) - set(count 0) - foreach(analyser IN LISTS PROJECT_STATIC_ANALYSERS) - if(${analyser}_FOUND) - set(${analyser}_status "${analyser} ${BGreen}YES${CR}") - else() - set(${analyser}_status "${analyser} ${BRed}NO${CR}") - endif() - math(EXPR count "${count} + 1") - string(APPEND analyser_list "${${analyser}_status}") - if(count LESS size) - string(APPEND analyser_list "${BWhite},${CR} ") - endif() - endforeach() - set(static_ana_summary "${BWhite}(${CR}${analyser_list}${BWhite})${CR} (disable with ${BMagenta}-DRUN_STATIC_ANALYSIS=OFF${CR})") -else() - set(static_ana_summary "${BRed}OFF${CR} (default, enable with ${BMagenta}-DRUN_STATIC_ANALYSIS=ON${CR})") -endif() -message(STATUS " ${Cyan}INSTALL PREFIX${CR} ${BGreen}${CMAKE_INSTALL_PREFIX}${CR} (change with ${BMagenta}-DCMAKE_INSTALL_PREFIX=...${CR})") -message(STATUS " ") -message(STATUS " ${Cyan}RUN STATIC ANALYSIS ${static_ana_summary}") -message(STATUS " ") -if(FAIRMQ_DEBUG_MODE) - message(STATUS " ${Cyan}DEBUG MODE${CR} ${BGreen}${FAIRMQ_DEBUG_MODE}${CR} (disable with ${BMagenta}-DFAIRMQ_DEBUG_MODE=OFF${CR})") -else() - message(STATUS " ${Cyan}DEBUG MODE${CR} ${BRed}${FAIRMQ_DEBUG_MODE}${CR} (enable with ${BMagenta}-DFAIRMQ_DEBUG_MODE=ON${CR})") -endif() +fairmq_summary_components() +fairmq_summary_static_analysis() +fairmq_summary_install_prefix() +fairmq_summary_debug_mode() message(STATUS " ") ################################################################################ diff --git a/cmake/FairCMakeModules.cmake b/cmake/FairCMakeModules.cmake new file mode 100644 index 00000000..1939e49b --- /dev/null +++ b/cmake/FairCMakeModules.cmake @@ -0,0 +1,19 @@ +################################################################################ +# Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(FairMQBundlePackageHelper) + +set(PROJECT_FairCMakeModules_VERSION 0.2) +find_package(FairCMakeModules ${PROJECT_FairCMakeModules_VERSION} QUIET) + +if(NOT FairCMakeModules_FOUND AND NOT FairCMakeModules_BUNDLED) + build_bundled(FairCMakeModules extern/FairCMakeModules) + find_package(FairCMakeModules REQUIRED) +endif() diff --git a/cmake/FairMQBuildOption.cmake b/cmake/FairMQBuildOption.cmake new file mode 100644 index 00000000..bd86ec8b --- /dev/null +++ b/cmake/FairMQBuildOption.cmake @@ -0,0 +1,50 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(CMakeDependentOption) + +macro(fairmq_build_option option description) + cmake_parse_arguments(ARGS "" "DEFAULT" "REQUIRES" ${ARGN}) + + if(ARGS_DEFAULT) + set(__default__ ON) + else() + set(__default__ OFF) + endif() + + if(ARGS_REQUIRES) + set(__requires__ ${ARGS_REQUIRES}) + foreach(d ${__requires__}) + string(REGEX REPLACE " +" ";" __requires_condition__ "${d}") + if(${__requires_condition__}) + else() + if(${option}) + message(FATAL_ERROR "Cannot enable build option ${option}, depending option is not set: ${__requires_condition__}") + endif() + endif() + endforeach() + else() + set(__requires__) + endif() + + if(__requires__) + cmake_dependent_option(${option} ${description} ${__default__} "${__requires__}" OFF) + else() + option(${option} ${description} ${__default__}) + endif() + + set(__default__) + set(__requires__) + set(__requires_condition__) + set(ARGS_DEFAULT) + set(ARGS_REQUIRES) + set(option) + set(description) +endmacro() diff --git a/cmake/BundlePackages.cmake b/cmake/FairMQBundlePackageHelper.cmake similarity index 70% rename from cmake/BundlePackages.cmake rename to cmake/FairMQBundlePackageHelper.cmake index 8ea31227..1f61b825 100644 --- a/cmake/BundlePackages.cmake +++ b/cmake/FairMQBundlePackageHelper.cmake @@ -1,5 +1,5 @@ ################################################################################ -# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # # # # This software is distributed under the terms of the # # GNU Lesser General Public Licence (LGPL) version 3, # @@ -8,14 +8,14 @@ include_guard(GLOBAL) -function(join VALUES GLUE OUTPUT) - string(REGEX REPLACE "([^\\]|^);" "\\1${GLUE}" _TMP_STR "${VALUES}") - string(REGEX REPLACE "[\\](.)" "\\1" _TMP_STR "${_TMP_STR}") #fixes escaping - set(${OUTPUT} "${_TMP_STR}" PARENT_SCOPE) -endfunction() +if(NOT DEFINED ${GIT_EXECUTABLE}) + find_program(GIT_EXECUTABLE NAMES git) +endif() + +# TODO Deduplicate code macro(exec cmd) - join("${ARGN}" " " args) + list(JOIN ARGN " " args) file(APPEND ${${package}_BUILD_LOGFILE} ">>> ${cmd} ${args}\n") execute_process(COMMAND ${cmd} ${ARGN} @@ -32,7 +32,7 @@ macro(exec cmd) endmacro() macro(exec_source cmd) - join("${ARGN}" " " args) + list(JOIN ARGN " " args) file(APPEND ${${package}_BUILD_LOGFILE} ">>> ${cmd} ${args}\n") execute_process(COMMAND ${cmd} ${ARGN} @@ -57,7 +57,7 @@ function(build_bundled package bundle) set(${package}_BUILD_LOGFILE ${${package}_BINARY_DIR}/build.log) file(REMOVE ${${package}_BUILD_LOGFILE}) - if(Git_FOUND) + if(GIT_EXECUTABLE) exec_source(${GIT_EXECUTABLE} submodule update --init -- ${${package}_SOURCE_DIR}) endif() @@ -100,3 +100,39 @@ function(build_bundled package bundle) message(STATUS "Building bundled ${package} - done") endfunction() + +# TODO Eventually retire supporting PUBLIC bundled packages. +macro(install_bundled package) + if(${package} STREQUAL asio) + add_library(bundled_asio_headers INTERFACE) + target_include_directories(bundled_asio_headers INTERFACE + $ + $ + ) + install(TARGETS bundled_asio_headers EXPORT ${PROJECT_EXPORT_SET}) + install(DIRECTORY "${asio_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/asio" + DESTINATION ${PROJECT_INSTALL_INCDIR}/bundled + ) + install(FILES "${asio_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}/asio.hpp" + DESTINATION ${PROJECT_INSTALL_INCDIR}/bundled + ) + endif() +endmacro() + +# TODO Eventually retire supporting PUBLIC bundled packages. +function(fairmq_generate_bundled_packages) + if(asio_BUNDLED) + set(BUNDLED_PACKAGES "\ +####### Expanded from @BUNDLED_PACKAGES@ by configure_package_config_file() ######### + +if(\"\${CMAKE_MAJOR_VERSION}.\${CMAKE_MINOR_VERSION}\" VERSION_LESS 3.11) + message(FATAL_ERROR \"CMake >= 3.11 required\") +endif() +set_target_properties(${PROJECT_NAME}::bundled_asio_headers PROPERTIES IMPORTED_GLOBAL TRUE) +add_library(asio::asio ALIAS ${PROJECT_NAME}::bundled_asio_headers) +set(asio_VERSION ${asio_VERSION}) + +") + endif() +set(BUNDLED_PACKAGES ${BUNDLED_PACKAGES} PARENT_SCOPE) +endfunction() diff --git a/cmake/FairMQDependencies.cmake b/cmake/FairMQDependencies.cmake new file mode 100644 index 00000000..6c25cf00 --- /dev/null +++ b/cmake/FairMQDependencies.cmake @@ -0,0 +1,141 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(FairCMakeModules) +include(FairFindPackage2) +include(FairMQBundlePackageHelper) + +if(BUILD_FAIRMQ OR BUILD_SDK) + set(THREADS_PREFER_PTHREAD_FLAG TRUE) + find_package2(PUBLIC Threads REQUIRED) + set(Threads_PREFIX "") +endif() + +if(BUILD_OFI_TRANSPORT) + find_package2(PRIVATE asiofi REQUIRED VERSION 0.3.1) + find_package2(PRIVATE OFI REQUIRED) +endif() + +if(BUILD_SDK_COMMANDS) + find_package2(PRIVATE Flatbuffers REQUIRED) +endif() + +if(BUILD_DDS_PLUGIN OR BUILD_SDK) + find_package2(PRIVATE DDS REQUIRED VERSION 3.5.3) + set(DDS_Boost_COMPONENTS system log log_setup regex filesystem thread) + set(DDS_Boost_VERSION 1.67) +endif() + +if(BUILD_PMIX_PLUGIN) + find_package2(PRIVATE PMIx REQUIRED VERSION 2.1.4) +endif() + +if(BUILD_FAIRMQ OR BUILD_SDK) + find_package2(PUBLIC FairLogger REQUIRED VERSION 1.6.0) + find_package2(PUBLIC Boost REQUIRED VERSION 1.66 + COMPONENTS container program_options filesystem date_time regex + ) +endif() + +if(BUILD_SDK) + set(__asio_version 1.18.1) + find_package2(BUNDLED asio VERSION ${__asio_version}) + if(NOT asio_FOUND AND NOT asio_BUNDLED) + build_bundled(asio extern/asio) + find_package2(BUNDLED asio REQUIRED VERSION ${__asio_version}) + endif() + unset(__asio_version) +endif() + +if(BUILD_FAIRMQ) + find_package2(PRIVATE ZeroMQ REQUIRED VERSION 4.1.4) + if(NOT PicoSHA2_BUNDLED) + build_bundled(PicoSHA2 extern/PicoSHA2) + endif() + find_package2(BUNDLED PicoSHA2 REQUIRED) + set(PicoSHA2_VERSION "1.0.0") +endif() + +if(BUILD_TESTING) + if(NOT GTest_FOUND AND NOT GTest_BUNDLED AND NOT USE_EXTERNAL_GTEST) + build_bundled(GTest extern/googletest) + endif() + find_package2(BUNDLED GTest REQUIRED) + if(GTest_BUNDLED) + set(GTest_VERSION "Apr 28 2021 @f5e592d8") + endif() +endif() + +if(BUILD_DOCS) + find_package2(PRIVATE Doxygen REQUIRED VERSION 1.8.8 + COMPONENTS dot + ) +endif() + +find_package2_implicit_dependencies() # Always call last after latest find_package2 + +if(PROJECT_PACKAGE_DEPENDENCIES) + foreach(dep IN LISTS PROJECT_PACKAGE_DEPENDENCIES) + string(TOUPPER ${dep} dep_upper) + if(${dep}_BUNDLED) + set(${dep}_PREFIX "") + elseif(${dep} STREQUAL FairLogger) + if(NOT FairLogger_PREFIX AND FairLogger_ROOT) + set(FairLogger_PREFIX ${FairLogger_ROOT}) + endif() + elseif(${dep} STREQUAL asiofi) + if(NOT asiofi_PREFIX AND asiofi_ROOT) + set(asiofi_PREFIX ${asiofi_ROOT}) + endif() + elseif(${dep} STREQUAL DDS) + set(DDS_PREFIX "${DDS_INSTALL_PREFIX}") + elseif(${dep} STREQUAL Boost) + if(TARGET Boost::headers) + get_target_property(boost_include Boost::headers INTERFACE_INCLUDE_DIRECTORIES) + else() + get_target_property(boost_include Boost::boost INTERFACE_INCLUDE_DIRECTORIES) + endif() + get_filename_component(Boost_PREFIX ${boost_include}/.. ABSOLUTE) + unset(boost_include) + elseif(${dep} STREQUAL Doxygen) + get_target_property(doxygen_bin Doxygen::doxygen INTERFACE_LOCATION) + get_filename_component(Doxygen_PREFIX ${doxygen_bin} DIRECTORY) + get_filename_component(Doxygen_PREFIX ${Doxygen_PREFIX}/.. ABSOLUTE) + unset(doxygen_bin) + elseif(${dep} STREQUAL Flatbuffers) + if(TARGET flatbuffers::flatbuffers) + get_target_property(flatbuffers_include flatbuffers::flatbuffers INTERFACE_INCLUDE_DIRECTORIES) + else() + get_target_property(flatbuffers_include flatbuffers::flatbuffers_shared INTERFACE_INCLUDE_DIRECTORIES) + endif() + get_filename_component(Flatbuffers_PREFIX ${flatbuffers_include}/.. ABSOLUTE) + unset(flatbuffers_include) + elseif(NOT ${dep}_PREFIX) + # try to guess + if(TARGET ${dep}::${dep}) + get_target_property(${dep}_include ${dep}::${dep} INTERFACE_INCLUDE_DIRECTORIES) + get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) + unset(${dep}_include) + elseif(${dep}_INCLUDE_DIR) + get_filename_component(${dep}_PREFIX ${${dep}_INCLUDE_DIR}/.. ABSOLUTE) + elseif(${dep_upper}_INCLUDE_DIR) + get_filename_component(${dep}_PREFIX ${${dep_upper}_INCLUDE_DIR}/.. ABSOLUTE) + elseif(${dep}_INCLUDE_DIRS) + list(GET ${dep}_INCLUDE_DIRS 0 ${dep}_include) + get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) + unset(${dep}_include) + elseif(${dep_upper}_INCLUDE_DIRS) + list(GET ${dep_upper}_INCLUDE_DIRS 0 ${dep}_include) + get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) + unset(${dep}_include) + endif() + endif() + endforeach() +endif() diff --git a/cmake/FairMQLib.cmake b/cmake/FairMQLib.cmake deleted file mode 100644 index 2d418b56..00000000 --- a/cmake/FairMQLib.cmake +++ /dev/null @@ -1,386 +0,0 @@ -################################################################################ -# Copyright (C) 2018 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # -# # -# This software is distributed under the terms of the # -# GNU Lesser General Public Licence (LGPL) version 3, # -# copied verbatim in the file "LICENSE" # -################################################################################ - -include_guard(GLOBAL) - -find_package(Git) -# get_git_version([DEFAULT_VERSION version] [DEFAULT_DATE date] [OUTVAR_PREFIX prefix]) -# -# Sets variables #prefix#_VERSION, #prefix#_GIT_VERSION, #prefix#_DATE, #prefix#_GIT_DATE -function(get_git_version) - cmake_parse_arguments(ARGS "" "DEFAULT_VERSION;DEFAULT_DATE;OUTVAR_PREFIX" "" ${ARGN}) - - if(NOT ARGS_OUTVAR_PREFIX) - set(ARGS_OUTVAR_PREFIX PROJECT) - endif() - - if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) - execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --dirty --match "v*" - OUTPUT_VARIABLE ${ARGS_OUTVAR_PREFIX}_GIT_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - ) - if(${ARGS_OUTVAR_PREFIX}_GIT_VERSION) - # cut first two characters "v-" - string(SUBSTRING ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION} 1 -1 ${ARGS_OUTVAR_PREFIX}_GIT_VERSION) - endif() - execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%cd - OUTPUT_VARIABLE ${ARGS_OUTVAR_PREFIX}_GIT_DATE - OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - ) - endif() - - if(NOT ${ARGS_OUTVAR_PREFIX}_GIT_VERSION) - if(ARGS_DEFAULT_VERSION) - set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION ${ARGS_DEFAULT_VERSION}) - else() - set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION 0.0.0.0) - endif() - endif() - - if(NOT ${ARGS_OUTVAR_PREFIX}_GIT_DATE) - if(ARGS_DEFAULT_DATE) - set(${ARGS_OUTVAR_PREFIX}_GIT_DATE ${ARGS_DEFAULT_DATE}) - else() - set(${ARGS_OUTVAR_PREFIX}_GIT_DATE "Thu Jan 1 00:00:00 1970 +0000") - endif() - endif() - - string(REGEX MATCH "^([^-]*)" blubb ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION}) - - # return values - set(${ARGS_OUTVAR_PREFIX}_VERSION ${CMAKE_MATCH_0} PARENT_SCOPE) - set(${ARGS_OUTVAR_PREFIX}_DATE ${${ARGS_OUTVAR_PREFIX}_GIT_DATE} PARENT_SCOPE) - set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION} PARENT_SCOPE) - set(${ARGS_OUTVAR_PREFIX}_GIT_DATE ${${ARGS_OUTVAR_PREFIX}_GIT_DATE} PARENT_SCOPE) -endfunction() - - -# Set defaults -macro(set_fairmq_defaults) - string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) - string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER) - - # Set a default build type - if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebInfo) - endif() - - set(PROJECT_MIN_CXX_STANDARD 17) - - # Handle C++ standard level - if(CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD VERSION_LESS PROJECT_MIN_CXX_STANDARD) - message(FATAL_ERROR "A minimum CMAKE_CXX_STANDARD of ${PROJECT_MIN_CXX_STANDARD} is required.") - endif() - set(CMAKE_CXX_EXTENSIONS OFF) - - if(NOT BUILD_SHARED_LIBS) - set(BUILD_SHARED_LIBS ON CACHE BOOL "Whether to build shared libraries or static archives") - endif() - - # Set -fPIC as default for all library types - if(NOT CMAKE_POSITION_INDEPENDENT_CODE) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - endif() - - # Generate compile_commands.json file (https://clang.llvm.org/docs/JSONCompilationDatabase.html) - set(CMAKE_EXPORT_COMPILE_COMMANDS ON) - - # Define CMAKE_INSTALL_*DIR family of variables - include(GNUInstallDirs) - - # Define install dirs - set(PROJECT_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR}) - set(PROJECT_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}) - set(PROJECT_INSTALL_INCDIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME_LOWER}) - set(PROJECT_INSTALL_DATADIR ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME_LOWER}) - set(PROJECT_INSTALL_CMAKEMODDIR ${PROJECT_INSTALL_DATADIR}/cmake) - - # https://cmake.org/Wiki/CMake_RPATH_handling - set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${PROJECT_INSTALL_LIBDIR}" isSystemDir) - if("${isSystemDir}" STREQUAL "-1") - if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,--enable-new-dtags") - set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} "-Wl,--enable-new-dtags") - set(CMAKE_INSTALL_RPATH "$ORIGIN/../${PROJECT_INSTALL_LIBDIR}") - elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - set(CMAKE_INSTALL_RPATH "@loader_path/../${PROJECT_INSTALL_LIBDIR}") - else() - set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${PROJECT_INSTALL_LIBDIR}") - endif() - endif() - - # Define export set, only one for now - set(PROJECT_EXPORT_SET ${PROJECT_NAME}Targets) - - # Configure build types - set(CMAKE_CONFIGURATION_TYPES "Debug" "Release" "RelWithDebInfo" "Nightly" "Profile" "Experimental" "AddressSan" "ThreadSan") - set(_warnings "-Wshadow -Wall -Wextra -Wpedantic") - set(CMAKE_CXX_FLAGS_DEBUG "-Og -g ${_warnings}") - set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g ${_warnings} -DNDEBUG") - set(CMAKE_CXX_FLAGS_NIGHTLY "-O2 -g ${_warnings}") - set(CMAKE_CXX_FLAGS_PROFILE "-g3 ${_warnings} -fno-inline -ftest-coverage -fprofile-arcs") - set(CMAKE_CXX_FLAGS_EXPERIMENTAL "-O2 -g ${_warnings} -DNDEBUG") - set(CMAKE_CXX_FLAGS_ADDRESSSAN "-O2 -g ${_warnings} -fsanitize=address -fno-omit-frame-pointer") - set(CMAKE_CXX_FLAGS_THREADSAN "-O2 -g ${_warnings} -fsanitize=thread") - unset(_warnings) - - if(CMAKE_GENERATOR STREQUAL "Ninja" AND - ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) OR - (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5))) - # Force colored warnings in Ninja's output, if the compiler has -fdiagnostics-color support. - # Rationale in https://github.com/ninja-build/ninja/issues/814 - list(APPEND CMAKE_CXX_FLAGS "-fdiagnostics-color=always") - endif() - - if(NOT PROJECT_VERSION_TWEAK) - set(PROJECT_VERSION_HOTFIX 0) - else() - set(PROJECT_VERSION_HOTFIX ${PROJECT_VERSION_TWEAK}) - endif() - - if(NOT DEFINED RUN_STATIC_ANALYSIS) - set(RUN_STATIC_ANALYSIS OFF) - endif() - - unset(PROJECT_STATIC_ANALYSERS) - if(RUN_STATIC_ANALYSIS) - set(analyser "clang-tidy") - find_program(${analyser}_FOUND "${analyser}") - if(${analyser}_FOUND) - set(CMAKE_CXX_CLANG_TIDY "${${analyser}_FOUND}") - endif() - list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") - - set(analyser "iwyu") - find_program(${analyser}_FOUND "${analyser}") - if(${analyser}_FOUND) - set(CMAKE_CXX_IWYU "${${analyser}_FOUND}") - endif() - list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") - - set(analyser "cpplint") - find_program(${analyser}_FOUND "${analyser}") - if(${analyser}_FOUND) - set(CMAKE_CXX_CPPLINT "${${analyser}_FOUND}") - endif() - list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") - endif() - - if(CMAKE_GENERATOR STREQUAL Ninja AND ENABLE_CCACHE) - find_program(CCACHE ccache) - if(CCACHE) - set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) - endif() - endif() - - if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" - AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9) - set(FAIRMQ_HAS_STD_FILESYSTEM 0) - else() - set(FAIRMQ_HAS_STD_FILESYSTEM 1) - endif() -endmacro() - -function(pad str width char out) - cmake_parse_arguments(ARGS "" "COLOR" "" ${ARGN}) - string(LENGTH ${str} length) - if(ARGS_COLOR) - math(EXPR padding "${width}-(${length}-10*${ARGS_COLOR})") - else() - math(EXPR padding "${width}-${length}") - endif() - if(padding GREATER 0) - foreach(i RANGE ${padding}) - set(str "${str}${char}") - endforeach() - endif() - set(${out} ${str} PARENT_SCOPE) -endfunction() - -function(generate_package_components) - join("${PROJECT_PACKAGE_COMPONENTS}" " " COMPS) - set(PACKAGE_COMPONENTS "\ -####### Expanded from @PACKAGE_COMPONENTS@ by configure_package_config_file() ######### - -set(${PROJECT_NAME}_PACKAGE_COMPONENTS ${COMPS}) - -") - foreach(comp IN LISTS PROJECT_PACKAGE_COMPONENTS) - string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ -set(${PROJECT_NAME}_${comp}_FOUND TRUE) -") - endforeach() - string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ - -check_required_components(${PROJECT_NAME}) -") -set(PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} PARENT_SCOPE) -endfunction() - -function(generate_bundled_packages) - if(asio_BUNDLED) - set(BUNDLED_PACKAGES "\ -####### Expanded from @BUNDLED_PACKAGES@ by configure_package_config_file() ######### - -if(\"\${CMAKE_MAJOR_VERSION}.\${CMAKE_MINOR_VERSION}\" VERSION_LESS 3.11) - message(FATAL_ERROR \"CMake >= 3.11 required\") -endif() -set_target_properties(${PROJECT_NAME}::bundled_asio_headers PROPERTIES IMPORTED_GLOBAL TRUE) -add_library(asio::asio ALIAS ${PROJECT_NAME}::bundled_asio_headers) -set(asio_VERSION ${asio_VERSION}) - -") - endif() -set(BUNDLED_PACKAGES ${BUNDLED_PACKAGES} PARENT_SCOPE) -endfunction() - -# Configure/Install CMake package -macro(install_cmake_package) - list(SORT PROJECT_PACKAGE_DEPENDENCIES) - list(SORT PROJECT_INTERFACE_PACKAGE_DEPENDENCIES) - include(CMakePackageConfigHelpers) - set(PACKAGE_INSTALL_DESTINATION - ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION} - ) - if(BUILD_FAIRMQ) - install(EXPORT ${PROJECT_EXPORT_SET} - NAMESPACE ${PROJECT_NAME}:: - DESTINATION ${PACKAGE_INSTALL_DESTINATION} - EXPORT_LINK_INTERFACE_LIBRARIES - ) - endif() - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion - ) - fair_generate_package_dependencies() # fills ${PACKAGE_DEPENDENCIES} - generate_package_components() # fills ${PACKAGE_COMPONENTS} - generate_bundled_packages() # fills ${BUNDLED_PACKAGES} - string(TOUPPER ${CMAKE_BUILD_TYPE} PROJECT_BUILD_TYPE_UPPER) - set(PROJECT_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${PROJECT_BUILD_TYPE_UPPER}}) - configure_package_config_file( - ${CMAKE_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - INSTALL_DESTINATION ${PACKAGE_INSTALL_DESTINATION} - PATH_VARS CMAKE_INSTALL_PREFIX - ) - install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - DESTINATION ${PACKAGE_INSTALL_DESTINATION} - ) -endmacro() - - - -macro(fairmq_build_option option description) - cmake_parse_arguments(ARGS "" "DEFAULT" "REQUIRES" ${ARGN}) - - if(ARGS_DEFAULT) - set(__default__ ON) - else() - set(__default__ OFF) - endif() - - if(ARGS_REQUIRES) - include(CMakeDependentOption) - set(__requires__ ${ARGS_REQUIRES}) - foreach(d ${__requires__}) - string(REGEX REPLACE " +" ";" __requires_condition__ "${d}") - if(${__requires_condition__}) - else() - if(${option}) - message(FATAL_ERROR "Cannot enable build option ${option}, depending option is not set: ${__requires_condition__}") - endif() - endif() - endforeach() - else() - set(__requires__) - endif() - - if(__requires__) - cmake_dependent_option(${option} ${description} ${__default__} "${__requires__}" OFF) - else() - option(${option} ${description} ${__default__}) - endif() - - set(__default__) - set(__requires__) - set(__requires_condition__) - set(ARGS_DEFAULT) - set(ARGS_REQUIRES) - set(option) - set(description) -endmacro() - - -macro(set_package_infos) - if(PROJECT_PACKAGE_DEPENDENCIES) - foreach(dep IN LISTS PROJECT_PACKAGE_DEPENDENCIES) - string(TOUPPER ${dep} dep_upper) - if(${dep}_BUNDLED) - set(${dep}_PREFIX "") - elseif(${dep} STREQUAL FairLogger) - if(NOT FairLogger_PREFIX AND FairLogger_ROOT) - set(FairLogger_PREFIX ${FairLogger_ROOT}) - endif() - elseif(${dep} STREQUAL asiofi) - if(NOT asiofi_PREFIX AND asiofi_ROOT) - set(asiofi_PREFIX ${asiofi_ROOT}) - endif() - elseif(${dep} STREQUAL DDS) - set(DDS_PREFIX "${DDS_INSTALL_PREFIX}") - elseif(${dep} STREQUAL Boost) - if(TARGET Boost::headers) - get_target_property(boost_include Boost::headers INTERFACE_INCLUDE_DIRECTORIES) - else() - get_target_property(boost_include Boost::boost INTERFACE_INCLUDE_DIRECTORIES) - endif() - get_filename_component(Boost_PREFIX ${boost_include}/.. ABSOLUTE) - unset(boost_include) - elseif(${dep} STREQUAL Doxygen) - get_target_property(doxygen_bin Doxygen::doxygen INTERFACE_LOCATION) - get_filename_component(Doxygen_PREFIX ${doxygen_bin} DIRECTORY) - get_filename_component(Doxygen_PREFIX ${Doxygen_PREFIX}/.. ABSOLUTE) - unset(doxygen_bin) - elseif(${dep} STREQUAL Flatbuffers) - if(TARGET flatbuffers::flatbuffers) - get_target_property(flatbuffers_include flatbuffers::flatbuffers INTERFACE_INCLUDE_DIRECTORIES) - else() - get_target_property(flatbuffers_include flatbuffers::flatbuffers_shared INTERFACE_INCLUDE_DIRECTORIES) - endif() - get_filename_component(Flatbuffers_PREFIX ${flatbuffers_include}/.. ABSOLUTE) - unset(flatbuffers_include) - elseif(NOT ${dep}_PREFIX) - # try to guess - if(TARGET ${dep}::${dep}) - get_target_property(${dep}_include ${dep}::${dep} INTERFACE_INCLUDE_DIRECTORIES) - get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) - unset(${dep}_include) - elseif(${dep}_INCLUDE_DIR) - get_filename_component(${dep}_PREFIX ${${dep}_INCLUDE_DIR}/.. ABSOLUTE) - elseif(${dep_upper}_INCLUDE_DIR) - get_filename_component(${dep}_PREFIX ${${dep_upper}_INCLUDE_DIR}/.. ABSOLUTE) - elseif(${dep}_INCLUDE_DIRS) - list(GET ${dep}_INCLUDE_DIRS 0 ${dep}_include) - get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) - unset(${dep}_include) - elseif(${dep_upper}_INCLUDE_DIRS) - list(GET ${dep_upper}_INCLUDE_DIRS 0 ${dep}_include) - get_filename_component(${dep}_PREFIX ${${dep}_include}/.. ABSOLUTE) - unset(${dep}_include) - endif() - endif() - endforeach() - endif() -endmacro() diff --git a/cmake/FairMQPackage.cmake b/cmake/FairMQPackage.cmake new file mode 100644 index 00000000..f923c97c --- /dev/null +++ b/cmake/FairMQPackage.cmake @@ -0,0 +1,71 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(FairCMakeModules) +include(FairFindPackage2) +include(FairMQBundlePackageHelper) + +function(generate_package_components) + list(JOIN PROJECT_PACKAGE_COMPONENTS} " " COMPS) + set(PACKAGE_COMPONENTS "\ +####### Expanded from @PACKAGE_COMPONENTS@ by configure_package_config_file() ######### + +set(${PROJECT_NAME}_PACKAGE_COMPONENTS ${COMPS}) + +") + foreach(comp IN LISTS PROJECT_PACKAGE_COMPONENTS) + string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ +set(${PROJECT_NAME}_${comp}_FOUND TRUE) +") + endforeach() + string(CONCAT PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} "\ + +check_required_components(${PROJECT_NAME}) +") +set(PACKAGE_COMPONENTS ${PACKAGE_COMPONENTS} PARENT_SCOPE) +endfunction() + +# Configure/Install CMake package +macro(install_cmake_package) + list(SORT PROJECT_PACKAGE_DEPENDENCIES) + list(SORT PROJECT_INTERFACE_PACKAGE_DEPENDENCIES) + include(CMakePackageConfigHelpers) + set(PACKAGE_INSTALL_DESTINATION + ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION} + ) + if(BUILD_FAIRMQ) + install(EXPORT ${PROJECT_EXPORT_SET} + NAMESPACE ${PROJECT_NAME}:: + DESTINATION ${PACKAGE_INSTALL_DESTINATION} + EXPORT_LINK_INTERFACE_LIBRARIES + ) + endif() + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion + ) + fair_generate_package_dependencies() # fills ${PACKAGE_DEPENDENCIES} + generate_package_components() # fills ${PACKAGE_COMPONENTS} + fairmq_generate_bundled_packages() # fills ${BUNDLED_PACKAGES} + string(TOUPPER ${CMAKE_BUILD_TYPE} PROJECT_BUILD_TYPE_UPPER) + set(PROJECT_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${PROJECT_BUILD_TYPE_UPPER}}) + configure_package_config_file( + ${CMAKE_SOURCE_DIR}/cmake/${PROJECT_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION ${PACKAGE_INSTALL_DESTINATION} + PATH_VARS CMAKE_INSTALL_PREFIX + ) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION ${PACKAGE_INSTALL_DESTINATION} + ) +endmacro() diff --git a/cmake/FairMQProjectSettings.cmake b/cmake/FairMQProjectSettings.cmake new file mode 100644 index 00000000..bab92741 --- /dev/null +++ b/cmake/FairMQProjectSettings.cmake @@ -0,0 +1,134 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(CTest) +include(GNUInstallDirs) + +string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER) +string(TOUPPER ${PROJECT_NAME} PROJECT_NAME_UPPER) + +# Set a default build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif() + +set(PROJECT_MIN_CXX_STANDARD 17) + +# Handle C++ standard level +if(CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD VERSION_LESS PROJECT_MIN_CXX_STANDARD) + message(FATAL_ERROR "A minimum CMAKE_CXX_STANDARD of ${PROJECT_MIN_CXX_STANDARD} is required.") +endif() +set(CMAKE_CXX_EXTENSIONS OFF) + +if(NOT BUILD_SHARED_LIBS) + set(BUILD_SHARED_LIBS ON CACHE BOOL "Whether to build shared libraries or static archives") +endif() + +# Set -fPIC as default for all library types +if(NOT CMAKE_POSITION_INDEPENDENT_CODE) + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +endif() + +# Generate compile_commands.json file (https://clang.llvm.org/docs/JSONCompilationDatabase.html) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Define install dirs +set(PROJECT_INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR}) +set(PROJECT_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}) +set(PROJECT_INSTALL_INCDIR ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME_LOWER}) +set(PROJECT_INSTALL_DATADIR ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME_LOWER}) +set(PROJECT_INSTALL_CMAKEMODDIR ${PROJECT_INSTALL_DATADIR}/cmake) + +# https://cmake.org/Wiki/CMake_RPATH_handling +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) +list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/${PROJECT_INSTALL_LIBDIR}" isSystemDir) +if("${isSystemDir}" STREQUAL "-1") + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,--enable-new-dtags") + set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} "-Wl,--enable-new-dtags") + set(CMAKE_INSTALL_RPATH "$ORIGIN/../${PROJECT_INSTALL_LIBDIR}") + elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(CMAKE_INSTALL_RPATH "@loader_path/../${PROJECT_INSTALL_LIBDIR}") + else() + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${PROJECT_INSTALL_LIBDIR}") + endif() +endif() + +# Define export set, only one for now +set(PROJECT_EXPORT_SET ${PROJECT_NAME}Targets) + +# Configure build types +set(CMAKE_CONFIGURATION_TYPES "Debug" "Release" "RelWithDebInfo" "Nightly" "Profile" "Experimental" "AddressSan" "ThreadSan") +set(_warnings "-Wshadow -Wall -Wextra -Wpedantic") +set(CMAKE_CXX_FLAGS_DEBUG "-Og -g ${_warnings}") +set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG") +set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g ${_warnings} -DNDEBUG") +set(CMAKE_CXX_FLAGS_NIGHTLY "-O2 -g ${_warnings}") +set(CMAKE_CXX_FLAGS_PROFILE "-g3 ${_warnings} -fno-inline -ftest-coverage -fprofile-arcs") +set(CMAKE_CXX_FLAGS_EXPERIMENTAL "-O2 -g ${_warnings} -DNDEBUG") +set(CMAKE_CXX_FLAGS_ADDRESSSAN "-O2 -g ${_warnings} -fsanitize=address -fno-omit-frame-pointer") +set(CMAKE_CXX_FLAGS_THREADSAN "-O2 -g ${_warnings} -fsanitize=thread") +unset(_warnings) + +if(CMAKE_GENERATOR STREQUAL "Ninja" AND + ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) OR + (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.5))) + # Force colored warnings in Ninja's output, if the compiler has -fdiagnostics-color support. + # Rationale in https://github.com/ninja-build/ninja/issues/814 + list(APPEND CMAKE_CXX_FLAGS "-fdiagnostics-color=always") +endif() + +if(NOT PROJECT_VERSION_TWEAK) + set(PROJECT_VERSION_HOTFIX 0) +else() + set(PROJECT_VERSION_HOTFIX ${PROJECT_VERSION_TWEAK}) +endif() + +if(NOT DEFINED RUN_STATIC_ANALYSIS) + set(RUN_STATIC_ANALYSIS OFF) +endif() + +unset(PROJECT_STATIC_ANALYSERS) +if(RUN_STATIC_ANALYSIS) + set(analyser "clang-tidy") + find_program(${analyser}_FOUND "${analyser}") + if(${analyser}_FOUND) + set(CMAKE_CXX_CLANG_TIDY "${${analyser}_FOUND}") + endif() + list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") + + set(analyser "iwyu") + find_program(${analyser}_FOUND "${analyser}") + if(${analyser}_FOUND) + set(CMAKE_CXX_IWYU "${${analyser}_FOUND}") + endif() + list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") + + set(analyser "cpplint") + find_program(${analyser}_FOUND "${analyser}") + if(${analyser}_FOUND) + set(CMAKE_CXX_CPPLINT "${${analyser}_FOUND}") + endif() + list(APPEND PROJECT_STATIC_ANALYSERS "${analyser}") +endif() + +if(CMAKE_GENERATOR STREQUAL Ninja AND ENABLE_CCACHE) + find_program(CCACHE ccache) + if(CCACHE) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE}) + endif() +endif() + +if( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" + AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9) + set(FAIRMQ_HAS_STD_FILESYSTEM 0) +else() + set(FAIRMQ_HAS_STD_FILESYSTEM 1) +endif() diff --git a/cmake/FairMQSummary.cmake b/cmake/FairMQSummary.cmake new file mode 100644 index 00000000..28facd8b --- /dev/null +++ b/cmake/FairMQSummary.cmake @@ -0,0 +1,111 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +include(FairCMakeModules) +include(FairFormattedOutput) +include(FairSummary) + +macro(fairmq_summary_components) + message(STATUS " ") + message(STATUS " ${Cyan}COMPONENT BUILT? INFO${CR}") + if(BUILD_FAIRMQ) + set(fairmq_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_FAIRMQ=OFF${CR})") + else() + set(fairmq_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_FAIRMQ=ON${CR})") + endif() + message(STATUS " ${BWhite}fairmq${CR} ${fairmq_summary}") + if(BUILD_TESTING) + set(tests_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_TESTING=OFF${CR})") + else() + set(tests_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_TESTING=ON${CR})") + endif() + message(STATUS " ${BWhite}tests${CR} ${tests_summary}") + if(BUILD_OFI_TRANSPORT) + set(ofi_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_OFI_TRANSPORT=OFF${CR})") + else() + set(ofi_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_OFI_TRANSPORT=ON${CR})") + endif() + message(STATUS " ${BWhite}ofi_transport${CR} ${ofi_summary}") + if(BUILD_DDS_PLUGIN) + set(dds_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_DDS_PLUGIN=OFF${CR})") + else() + set(dds_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_DDS_PLUGIN=ON${CR})") + endif() + message(STATUS " ${BWhite}dds_plugin${CR} ${dds_summary}") + if(BUILD_PMIX_PLUGIN) + set(pmix_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_PMIX_PLUGIN=OFF${CR})") + else() + set(pmix_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_PMIX_PLUGIN=ON${CR})") + endif() + message(STATUS " ${BWhite}pmix_plugin${CR} ${pmix_summary}") + if(BUILD_EXAMPLES) + set(examples_summary "${BGreen}YES${CR} (default, disable with ${BMagenta}-DBUILD_EXAMPLES=OFF${CR})") + else() + set(examples_summary "${BRed} NO${CR} (enable with ${BMagenta}-DBUILD_EXAMPLES=ON${CR})") + endif() + message(STATUS " ${BWhite}examples${CR} ${examples_summary}") + if(BUILD_DOCS) + set(docs_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_DOCS=OFF${CR})") + else() + set(docs_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_DOCS=ON${CR})") + endif() + message(STATUS " ${BWhite}docs${CR} ${docs_summary}") + if(BUILD_SDK) + set(sdk_summary "${BGreen}YES${CR} EXPERIMENTAL (disable with ${BMagenta}-DBUILD_SDK=OFF${CR})") + else() + set(sdk_summary "${BRed} NO${CR} EXPERIMENTAL (default, enable with ${BMagenta}-DBUILD_SDK=ON${CR})") + endif() + message(STATUS " ${BWhite}sdk${CR} ${sdk_summary}") + if(BUILD_SDK_COMMANDS) + set(sdk_commands_summary "${BGreen}YES${CR} (disable with ${BMagenta}-DBUILD_SDK_COMMANDS=OFF${CR})") + else() + set(sdk_commands_summary "${BRed} NO${CR} (default, enable with ${BMagenta}-DBUILD_SDK_COMMANDS=ON${CR})") + endif() + message(STATUS " ${BWhite}sdk_commands${CR} ${sdk_commands_summary}") +endmacro() + +macro(fairmq_summary_static_analysis) + message(STATUS " ") + if(RUN_STATIC_ANALYSIS) + list(LENGTH PROJECT_STATIC_ANALYSERS size) + unset(analyser_list) + set(count 0) + foreach(analyser IN LISTS PROJECT_STATIC_ANALYSERS) + if(${analyser}_FOUND) + set(${analyser}_status "${analyser} ${BGreen}YES${CR}") + else() + set(${analyser}_status "${analyser} ${BRed}NO${CR}") + endif() + math(EXPR count "${count} + 1") + string(APPEND analyser_list "${${analyser}_status}") + if(count LESS size) + string(APPEND analyser_list "${BWhite},${CR} ") + endif() + endforeach() + set(static_ana_summary "${BWhite}(${CR}${analyser_list}${BWhite})${CR} (disable with ${BMagenta}-DRUN_STATIC_ANALYSIS=OFF${CR})") + else() + set(static_ana_summary "${BRed}OFF${CR} (default, enable with ${BMagenta}-DRUN_STATIC_ANALYSIS=ON${CR})") + endif() + message(STATUS " ${Cyan}RUN STATIC ANALYSIS ${static_ana_summary}") +endmacro() + +macro(fairmq_summary_install_prefix) + message(STATUS " ") + message(STATUS " ${Cyan}INSTALL PREFIX${CR} ${BGreen}${CMAKE_INSTALL_PREFIX}${CR} (change with ${BMagenta}-DCMAKE_INSTALL_PREFIX=...${CR})") +endmacro() + +macro(fairmq_summary_debug_mode) + message(STATUS " ") + if(FAIRMQ_DEBUG_MODE) + message(STATUS " ${Cyan}DEBUG MODE${CR} ${BGreen}${FAIRMQ_DEBUG_MODE}${CR} (disable with ${BMagenta}-DFAIRMQ_DEBUG_MODE=OFF${CR})") + else() + message(STATUS " ${Cyan}DEBUG MODE${CR} ${BRed}${FAIRMQ_DEBUG_MODE}${CR} (enable with ${BMagenta}-DFAIRMQ_DEBUG_MODE=ON${CR})") + endif() +endmacro() diff --git a/cmake/GitHelper.cmake b/cmake/GitHelper.cmake new file mode 100644 index 00000000..4beedb7e --- /dev/null +++ b/cmake/GitHelper.cmake @@ -0,0 +1,65 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +include_guard(GLOBAL) + +if(NOT DEFINED ${GIT_EXECUTABLE}) + find_program(GIT_EXECUTABLE NAMES git) +endif() + +# get_git_version([DEFAULT_VERSION version] [DEFAULT_DATE date] [OUTVAR_PREFIX prefix]) +# +# Sets variables #prefix#_VERSION, #prefix#_GIT_VERSION, #prefix#_DATE, #prefix#_GIT_DATE +function(get_git_version) + cmake_parse_arguments(ARGS "" "DEFAULT_VERSION;DEFAULT_DATE;OUTVAR_PREFIX" "" ${ARGN}) + + if(NOT ARGS_OUTVAR_PREFIX) + set(ARGS_OUTVAR_PREFIX PROJECT) + endif() + + if(GIT_EXECUTABLE AND EXISTS ${CMAKE_SOURCE_DIR}/.git) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --dirty --match "v*" + OUTPUT_VARIABLE ${ARGS_OUTVAR_PREFIX}_GIT_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + if(${ARGS_OUTVAR_PREFIX}_GIT_VERSION) + # cut first two characters "v-" + string(SUBSTRING ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION} 1 -1 ${ARGS_OUTVAR_PREFIX}_GIT_VERSION) + endif() + execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format=%cd + OUTPUT_VARIABLE ${ARGS_OUTVAR_PREFIX}_GIT_DATE + OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + ) + endif() + + if(NOT ${ARGS_OUTVAR_PREFIX}_GIT_VERSION) + if(ARGS_DEFAULT_VERSION) + set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION ${ARGS_DEFAULT_VERSION}) + else() + set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION 0.0.0.0) + endif() + endif() + + if(NOT ${ARGS_OUTVAR_PREFIX}_GIT_DATE) + if(ARGS_DEFAULT_DATE) + set(${ARGS_OUTVAR_PREFIX}_GIT_DATE ${ARGS_DEFAULT_DATE}) + else() + set(${ARGS_OUTVAR_PREFIX}_GIT_DATE "Thu Jan 1 00:00:00 1970 +0000") + endif() + endif() + + string(REGEX MATCH "^([^-]*)" blubb ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION}) + + # return values + set(${ARGS_OUTVAR_PREFIX}_VERSION ${CMAKE_MATCH_0} PARENT_SCOPE) + set(${ARGS_OUTVAR_PREFIX}_DATE ${${ARGS_OUTVAR_PREFIX}_GIT_DATE} PARENT_SCOPE) + set(${ARGS_OUTVAR_PREFIX}_GIT_VERSION ${${ARGS_OUTVAR_PREFIX}_GIT_VERSION} PARENT_SCOPE) + set(${ARGS_OUTVAR_PREFIX}_GIT_DATE ${${ARGS_OUTVAR_PREFIX}_GIT_DATE} PARENT_SCOPE) +endfunction()