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
This commit is contained in:
Christian Tacke
2021-02-20 20:03:09 +01:00
committed by Dennis Klein
parent 2c7c46f2fd
commit cf12379afa
6 changed files with 10 additions and 6 deletions

View File

@@ -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@_DATADIR @PACKAGE_CMAKE_INSTALL_PREFIX@/@PROJECT_INSTALL_DATADIR@)
set(@PROJECT_NAME@_CMAKEMODDIR @PACKAGE_CMAKE_INSTALL_PREFIX@/@PROJECT_INSTALL_CMAKEMODDIR@) 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_REQUIRED "@CMAKE_CXX_STANDARD_REQUIRED@")
set(@PROJECT_NAME@_CXX_STANDARD @CMAKE_CXX_STANDARD@) set(@PROJECT_NAME@_CXX_STANDARD "@CMAKE_CXX_STANDARD@")
set(@PROJECT_NAME@_CXX_EXTENSIONS @CMAKE_CXX_EXTENSIONS@) set(@PROJECT_NAME@_CXX_EXTENSIONS @CMAKE_CXX_EXTENSIONS@)
set(@PROJECT_NAME@_VERSION_HOTFIX @PROJECT_VERSION_HOTFIX@) set(@PROJECT_NAME@_VERSION_HOTFIX @PROJECT_VERSION_HOTFIX@)
set(@PROJECT_NAME@_BUILD_TYPE @CMAKE_BUILD_TYPE@) set(@PROJECT_NAME@_BUILD_TYPE @CMAKE_BUILD_TYPE@)

View File

@@ -94,10 +94,7 @@ macro(set_fairmq_defaults)
endif() endif()
# Handle C++ standard level # Handle C++ standard level
set(CMAKE_CXX_STANDARD_REQUIRED ON) if(CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD VERSION_LESS PROJECT_MIN_CXX_STANDARD)
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD ${PROJECT_MIN_CXX_STANDARD})
elseif(${CMAKE_CXX_STANDARD} LESS ${PROJECT_MIN_CXX_STANDARD})
message(FATAL_ERROR "A minimum CMAKE_CXX_STANDARD of ${PROJECT_MIN_CXX_STANDARD} is required.") message(FATAL_ERROR "A minimum CMAKE_CXX_STANDARD of ${PROJECT_MIN_CXX_STANDARD} is required.")
endif() endif()
set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_EXTENSIONS OFF)

View File

@@ -47,6 +47,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK)
${TOOLS_SOURCE_FILES} ${TOOLS_SOURCE_FILES}
${TOOLS_PUBLIC_HEADER_FILES} ${TOOLS_PUBLIC_HEADER_FILES}
) )
target_compile_features(${target} PUBLIC cxx_std_17)
target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY) target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY)
# workaround https://github.com/boostorg/asio/commit/43874d5497414c67655d901e48c939ef01337edb # workaround https://github.com/boostorg/asio/commit/43874d5497414c67655d901e48c939ef01337edb
if( Boost_VERSION VERSION_LESS 1.69 if( Boost_VERSION VERSION_LESS 1.69
@@ -106,6 +107,7 @@ if(BUILD_FAIRMQ OR BUILD_SDK)
${FSM_SOURCE_FILES} ${FSM_SOURCE_FILES}
${FSM_PUBLIC_HEADER_FILES} ${FSM_PUBLIC_HEADER_FILES}
) )
target_compile_features(${target} PUBLIC cxx_std_17)
target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY) target_compile_definitions(${target} PUBLIC BOOST_ERROR_CODE_HEADER_ONLY)
target_include_directories(${target} target_include_directories(${target}
PUBLIC PUBLIC
@@ -267,6 +269,7 @@ if(BUILD_FAIRMQ)
${FAIRMQ_PUBLIC_HEADER_FILES} # for IDE integration ${FAIRMQ_PUBLIC_HEADER_FILES} # for IDE integration
${FAIRMQ_PRIVATE_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) set_target_properties(${_target} PROPERTIES LABELS coverage)
if(FAST_BUILD) if(FAST_BUILD)
set_target_properties(${_target} PROPERTIES OUTPUT_NAME FairMQ) set_target_properties(${_target} PROPERTIES OUTPUT_NAME FairMQ)
@@ -375,6 +378,7 @@ if(BUILD_FAIRMQ)
target_link_libraries(fairmq-splitter FairMQ) target_link_libraries(fairmq-splitter FairMQ)
add_executable(fairmq-shmmonitor shmem/Monitor.cxx shmem/Monitor.h shmem/runMonitor.cxx) 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) target_compile_definitions(fairmq-shmmonitor PUBLIC BOOST_ERROR_CODE_HEADER_ONLY)
if(FAIRMQ_DEBUG_MODE) if(FAIRMQ_DEBUG_MODE)
target_compile_definitions(fairmq-shmmonitor PUBLIC FAIRMQ_DEBUG_MODE) target_compile_definitions(fairmq-shmmonitor PUBLIC FAIRMQ_DEBUG_MODE)

View File

@@ -8,6 +8,7 @@
set(plugin FairMQPlugin_dds) set(plugin FairMQPlugin_dds)
add_library(${plugin} SHARED ${CMAKE_CURRENT_SOURCE_DIR}/DDS.cxx ${CMAKE_CURRENT_SOURCE_DIR}/DDS.h) 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_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}) target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(${plugin} PROPERTIES CXX_VISIBILITY_PRESET hidden) set_target_properties(${plugin} PROPERTIES CXX_VISIBILITY_PRESET hidden)

View File

@@ -13,6 +13,7 @@ add_library(${plugin} SHARED
${CMAKE_CURRENT_SOURCE_DIR}/PMIxCommands.h ${CMAKE_CURRENT_SOURCE_DIR}/PMIxCommands.h
${CMAKE_CURRENT_SOURCE_DIR}/PMIx.hpp ${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_link_libraries(${plugin} PUBLIC FairMQ PMIx::libpmix PRIVATE Commands)
target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(${plugin} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(${plugin} PROPERTIES set_target_properties(${plugin} PROPERTIES

View File

@@ -45,6 +45,7 @@ add_library(${target}
${SDK_PUBLIC_HEADER_FILES} # for IDE integration ${SDK_PUBLIC_HEADER_FILES} # for IDE integration
${SDK_PRIVATE_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) set_target_properties(${target} PROPERTIES LABELS coverage)
target_include_directories(${target} target_include_directories(${target}
PUBLIC PUBLIC