From cf12379afa12ca2b2c42ec00e614af5b03a7b759 Mon Sep 17 00:00:00 2001 From: Christian Tacke <58549698+ChristianTackeGSI@users.noreply.github.com> Date: Sat, 20 Feb 2021 20:03:09 +0100 Subject: [PATCH] cmake: Use target_compile_features() Problem at hand: dependents (like FairRoot) need to know the minimum C++ standard level that FairMQ (and its headers) requires. The first idea is to let the targets export their CXX_STANDARD value. First, this doesn't seem to work as expected. Second, target_compile_features() seems to be the better way to go. It has a much better granularity, automatically has the export feature, and thus should make dependents behave correctly. Also drop all of this enforeced CMAKE_CXX_STANDARD* setting. If it's given, check it. But that's it. See: https://gitlab.kitware.com/cmake/cmake/-/issues/18446 See: https://cmake.org/cmake/help/latest/manual/cmake-compile-features.7.html#requiring-language-standards --- cmake/FairMQConfig.cmake.in | 4 ++-- cmake/FairMQLib.cmake | 5 +---- fairmq/CMakeLists.txt | 4 ++++ fairmq/plugins/DDS/CMakeLists.txt | 1 + fairmq/plugins/PMIx/CMakeLists.txt | 1 + fairmq/sdk/CMakeLists.txt | 1 + 6 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cmake/FairMQConfig.cmake.in b/cmake/FairMQConfig.cmake.in index 474f4661..cb52c1a1 100644 --- a/cmake/FairMQConfig.cmake.in +++ b/cmake/FairMQConfig.cmake.in @@ -20,8 +20,8 @@ set(@PROJECT_NAME@_LIBDIR @PACKAGE_CMAKE_INSTALL_PREFIX@/@PROJECT_INSTALL_LIBDIR set(@PROJECT_NAME@_DATADIR @PACKAGE_CMAKE_INSTALL_PREFIX@/@PROJECT_INSTALL_DATADIR@) set(@PROJECT_NAME@_CMAKEMODDIR @PACKAGE_CMAKE_INSTALL_PREFIX@/@PROJECT_INSTALL_CMAKEMODDIR@) -set(@PROJECT_NAME@_CXX_STANDARD_REQUIRED @CMAKE_CXX_STANDARD_REQUIRED@) -set(@PROJECT_NAME@_CXX_STANDARD @CMAKE_CXX_STANDARD@) +set(@PROJECT_NAME@_CXX_STANDARD_REQUIRED "@CMAKE_CXX_STANDARD_REQUIRED@") +set(@PROJECT_NAME@_CXX_STANDARD "@CMAKE_CXX_STANDARD@") set(@PROJECT_NAME@_CXX_EXTENSIONS @CMAKE_CXX_EXTENSIONS@) set(@PROJECT_NAME@_VERSION_HOTFIX @PROJECT_VERSION_HOTFIX@) set(@PROJECT_NAME@_BUILD_TYPE @CMAKE_BUILD_TYPE@) diff --git a/cmake/FairMQLib.cmake b/cmake/FairMQLib.cmake index 2074df0e..995e8d42 100644 --- a/cmake/FairMQLib.cmake +++ b/cmake/FairMQLib.cmake @@ -94,10 +94,7 @@ macro(set_fairmq_defaults) endif() # Handle C++ standard level - set(CMAKE_CXX_STANDARD_REQUIRED ON) - if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD ${PROJECT_MIN_CXX_STANDARD}) - elseif(${CMAKE_CXX_STANDARD} LESS ${PROJECT_MIN_CXX_STANDARD}) + 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) diff --git a/fairmq/CMakeLists.txt b/fairmq/CMakeLists.txt index 5d490ad1..1f460916 100644 --- a/fairmq/CMakeLists.txt +++ b/fairmq/CMakeLists.txt @@ -47,6 +47,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK) ${TOOLS_SOURCE_FILES} ${TOOLS_PUBLIC_HEADER_FILES} ) + target_compile_features(${target} PUBLIC cxx_std_17) target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY) # workaround https://github.com/boostorg/asio/commit/43874d5497414c67655d901e48c939ef01337edb if( Boost_VERSION VERSION_LESS 1.69 @@ -106,6 +107,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK) ${FSM_SOURCE_FILES} ${FSM_PUBLIC_HEADER_FILES} ) + target_compile_features(${target} PUBLIC cxx_std_17) target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY) target_include_directories(${target} PUBLIC @@ -267,6 +269,7 @@ if(BUILD_FAIRMQ) ${FAIRMQ_PUBLIC_HEADER_FILES} # for IDE integration ${FAIRMQ_PRIVATE_HEADER_FILES} # for IDE integration ) + target_compile_features(${_target} PUBLIC cxx_std_17) set_target_properties(${_target} PROPERTIES LABELS coverage) if(FAST_BUILD) set_target_properties(${_target} PROPERTIES OUTPUT_NAME FairMQ) @@ -375,6 +378,7 @@ if(BUILD_FAIRMQ) target_link_libraries(fairmq-splitter FairMQ) add_executable(fairmq-shmmonitor shmem/Monitor.cxx shmem/Monitor.h shmem/runMonitor.cxx) + target_compile_features(fairmq-shmmonitor PUBLIC cxx_std_17) target_compile_definitions(fairmq-shmmonitor PUBLIC BOOST_ERROR_CODE_HEADER_ONLY) if(FAIRMQ_DEBUG_MODE) target_compile_definitions(fairmq-shmmonitor PUBLIC FAIRMQ_DEBUG_MODE) diff --git a/fairmq/plugins/DDS/CMakeLists.txt b/fairmq/plugins/DDS/CMakeLists.txt index 6475e7b1..04e8689b 100644 --- a/fairmq/plugins/DDS/CMakeLists.txt +++ b/fairmq/plugins/DDS/CMakeLists.txt @@ -8,6 +8,7 @@ set(plugin FairMQPlugin_dds) add_library(${plugin} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/DDS.cxx ${CMAKE_CURRENT_SOURCE_DIR}/DDS.h) +target_compile_features(${plugin} PUBLIC cxx_std_17) target_link_libraries(${plugin} PUBLIC FairMQ StateMachine DDS::dds_intercom_lib DDS::dds_protocol_lib Boost::boost PRIVATE Commands) target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) set_target_properties(${plugin} PROPERTIES CXX_VISIBILITY_PRESET hidden) diff --git a/fairmq/plugins/PMIx/CMakeLists.txt b/fairmq/plugins/PMIx/CMakeLists.txt index efd43e51..9a4682f6 100644 --- a/fairmq/plugins/PMIx/CMakeLists.txt +++ b/fairmq/plugins/PMIx/CMakeLists.txt @@ -13,6 +13,7 @@ add_library(${plugin} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/PMIxCommands.h ${CMAKE_CURRENT_SOURCE_DIR}/PMIx.hpp ) +target_compile_features(${plugin} PUBLIC cxx_std_17) target_link_libraries(${plugin} PUBLIC FairMQ PMIx::libpmix PRIVATE Commands) target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) set_target_properties(${plugin} PROPERTIES diff --git a/fairmq/sdk/CMakeLists.txt b/fairmq/sdk/CMakeLists.txt index 97393bf4..9b0e2c4f 100644 --- a/fairmq/sdk/CMakeLists.txt +++ b/fairmq/sdk/CMakeLists.txt @@ -45,6 +45,7 @@ add_library(${target} ${SDK_PUBLIC_HEADER_FILES} # for IDE integration ${SDK_PRIVATE_HEADER_FILES} # for IDE integration ) +target_compile_features(${target} PUBLIC cxx_std_17) set_target_properties(${target} PROPERTIES LABELS coverage) target_include_directories(${target} PUBLIC