From b8e524ecd326f3ae97b3701d3e7c40f932d132c5 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 16 Feb 2026 16:30:49 +0100 Subject: [PATCH 1/4] Add component install filter --- CMakeLists.txt | 26 +++++++---- cmake/README.md | 3 +- cmake/beman-install-library.cmake | 71 +++++++++++++++++++++--------- src/beman/execution/CMakeLists.txt | 2 +- 4 files changed, 70 insertions(+), 32 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 66a27354..bd7c3345 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,13 +21,15 @@ set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-targets) # NOTE: must be set, is importa #=============================================================================== if(BEMAN_USE_MODULES) + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + set(CMAKE_CXX_SCAN_FOR_MODULES ON) set(CMAKE_CXX_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN ON) # CMake requires the language standard to be specified as compile feature # when a target provides C++23 modules and the target will be installed - add_library(${TARGET_PREFIX} STATIC) + add_library(${TARGET_PREFIX}) add_library(beman::execution ALIAS ${TARGET_PREFIX}) target_compile_features( ${TARGET_PREFIX} @@ -48,17 +50,24 @@ if(BEMAN_USE_MODULES) FILES ${CMAKE_CURRENT_BINARY_DIR}/beman/execution/modules_export.hpp ) - # NOTE: only partly supported for examples! - # FIXME: target_compile_definitions(${TARGET_PREFIX} PUBLIC BEMAN_HAS_MODULES) + target_compile_definitions(${TARGET_PREFIX} PUBLIC BEMAN_HAS_MODULES) + set_target_properties( + ${TARGET_PREFIX} + PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + DLL_NAME_WITH_SOVERSION TRUE + ) - # XXX find_package(Threads REQUIRED) - # XXX target_link_libraries(${TARGET_PREFIX} PUBLIC Threads::Threads) + find_package(Threads REQUIRED) + target_link_libraries(${TARGET_PREFIX} PUBLIC Threads::Threads) else() set(CMAKE_CXX_SCAN_FOR_MODULES OFF) endif() -if(BEMAN_USE_MODULES AND CMAKE_CXX_MODULE_STD) +if(BEMAN_USE_MODULES AND BEMAN_HAS_IMPORT_STD) target_compile_definitions(${TARGET_PREFIX} PUBLIC BEMAN_HAS_IMPORT_STD) + set_target_properties(${TARGET_PREFIX} PROPERTIES CXX_MODULE_STD ON) elseif(BEMAN_USE_MODULES) message(WARNING "Missing or disabled support for CMAKE_CXX_MODULE_STD!") endif() @@ -82,9 +91,8 @@ add_subdirectory(src/beman/execution) # NOTE: this must be done before tests! CK include(./cmake/beman-install-library.cmake) beman_install_library(${TARGET_PREFIX} TARGETS ${TARGET_NAME} ${TARGET_PREFIX} - # FIXME: DEPENDENCIES [===[beman.inplace_vector 1.0.0]===] [===[beman.scope 0.0.1 EXACT]===] fmt - # TODO(CK): XXX OR XXX DEPENDENCIES "beman.inplace_vector 1.0.0;beman.scope 0.0.1 EXACT" - # XXX DEPENDENCIES Threads + # TODO: DEPENDENCIES [===[beman.inplace_vector 1.0.0]===] [===[beman.scope 0.0.1 EXACT]===] fmt + DEPENDENCIES Threads ) #=============================================================================== diff --git a/cmake/README.md b/cmake/README.md index dc1ecc79..533e7abe 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -71,8 +71,9 @@ endif() BEMAN_USE_STD_MODULE:BOOL=ON # -> "Check if 'import std;' is possible with the toolchain?" -if(BEMAN_USE_MODULES AND CMAKE_CXX_MODULE_STD) +if(BEMAN_USE_MODULES AND BEMAN_HAS_IMPORT_STD) target_compile_definitions(beman.execution PUBLIC BEMAN_HAS_IMPORT_STD) + set_target_properties(beman.execution PROPERTIES CXX_MODULE_STD ON) endif() ``` diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 01c9128a..002baaf0 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -21,6 +21,7 @@ include(GNUInstallDirs) # [NAMESPACE ] # [EXPORT_NAME ] # [DESTINATION ] +# [VERSION_SUFFIX] # ) # # Arguments: @@ -51,6 +52,9 @@ include(GNUInstallDirs) # The install destination for CXX_MODULES. # Defaults to ${CMAKE_INSTALL_LIBDIR}/cmake/${name}/modules. # +# VERSION_SUFFIX (optional) +# option to enable the versioning of install destinations +# # Brief # ----- # @@ -84,7 +88,7 @@ function(beman_install_library name) # ---------------------------- # Argument parsing # ---------------------------- - set(options) + set(options VERSION_SUFFIX) set(oneValueArgs NAMESPACE EXPORT_NAME DESTINATION) set(multiValueArgs TARGETS DEPENDENCIES) @@ -111,9 +115,16 @@ function(beman_install_library name) return() endif() - set(_config_install_dir - "${CMAKE_INSTALL_LIBDIR}/cmake/${name}-${PROJECT_VERSION}" - ) + # gersemi: off + # NOTE: If one of this variables is not set, the default DESTINATION is used! CK + if(BEMAN_VERSION_SUFFIX) + set(_version_suffix "-${PROJECT_VERSION}") + set(_include_install_dir DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/beman${_version_suffix}) + # set(_lib_install_dir DESTINATION ${CMAKE_INSTALL_LIBDIR}/beman${_version_suffix}) + # set(_bin_install_dir DESTINATION ${CMAKE_INSTALL_BINDIR}/beman${_version_suffix}) + endif() + set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}${_version_suffix}") + # gersemi: on # ---------------------------- # Defaults @@ -131,6 +142,10 @@ function(beman_install_library name) endif() string(REPLACE "beman." "" install_component_name "${name}") + message( + VERBOSE + "beman-install-library(${name}): COMPONENT '${install_component_name}'" + ) # -------------------------------------------------- # Install each target with all of its file sets @@ -161,7 +176,7 @@ function(beman_install_library name) ) message( VERBOSE - "beman_install_library(${name}): COMPONENT ${component_name} for TARGET '${_tgt}'" + "beman_install_library(${name}): EXPORT_NAME ${component_name} for TARGET '${_tgt}'" ) # Get the list of interface header sets, exact one expected! @@ -181,9 +196,9 @@ function(beman_install_library name) APPEND _install_header_set_args FILE_SET "${_install_header_set}" - DESTINATION - "${CMAKE_INSTALL_INCLUDEDIR}/beman-${PROJECT_VERSION}" - # TODO(CK) COMPONENT "${_install_headers_component}" + ${_include_install_dir} + COMPONENT + "${install_component_name}_Development" ) endforeach() else() @@ -199,27 +214,41 @@ function(beman_install_library name) ) install( TARGETS "${_tgt}" - COMPONENT "${install_component_name}" EXPORT ${BEMAN_EXPORT_NAME} ARCHIVE - DESTINATION ${CMAKE_INSTALL_LIBDIR}/beman-${PROJECT_VERSION} - LIBRARY # DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME # DESTINATION ${CMAKE_INSTALL_BINDIR} - ${_install_header_set_args} # DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} - FILE_SET ${_module_sets} DESTINATION "${BEMAN_DESTINATION}" + ${_lib_install_dir} + COMPONENT "${install_component_name}_Development" + LIBRARY + ${_lib_install_dir} + COMPONENT "${install_component_name}_Runtime" + NAMELINK_COMPONENT "${install_component_name}_Development" + RUNTIME + ${_bin_install_dir} + COMPONENT "${install_component_name}_Runtime" + ${_install_header_set_args} + FILE_SET ${_module_sets} + DESTINATION "${BEMAN_DESTINATION}" + COMPONENT "${install_component_name}_Development" # NOTE: There's currently no convention for this location! CK CXX_MODULES_BMI # TODO(CK): DESTINATION ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ + COMPONENT "${install_component_name}_Development" ) else() install( TARGETS "${_tgt}" - COMPONENT "${install_component_name}" EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE # DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY # DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME # DESTINATION ${CMAKE_INSTALL_BINDIR} - ${_install_header_set_args} # DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + ARCHIVE + ${_lib_install_dir} + COMPONENT "${install_component_name}_Development" + LIBRARY + ${_lib_install_dir} + COMPONENT "${install_component_name}_Runtime" + NAMELINK_COMPONENT "${install_component_name}_Development" + RUNTIME + ${_bin_install_dir} + COMPONENT "${install_component_name}_Runtime" + ${_install_header_set_args} ) endif() endforeach() @@ -233,7 +262,7 @@ function(beman_install_library name) NAMESPACE ${BEMAN_NAMESPACE} CXX_MODULES_DIRECTORY cxx-modules DESTINATION ${_config_install_dir} - COMPONENT "${install_component_name}" + COMPONENT "${install_component_name}_Development" ) # gersemi: on @@ -304,7 +333,7 @@ function(beman_install_library name) "${CMAKE_CURRENT_BINARY_DIR}/${name}-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/${name}-config-version.cmake" DESTINATION ${_config_install_dir} - COMPONENT "${install_component_name}" + COMPONENT "${install_component_name}_Development" ) else() message( diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index 0779a224..10250d53 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -372,7 +372,7 @@ if(BEMAN_USE_MODULES) with_awaitable_senders.cppm write_env.cppm ) - target_compile_definitions(beman.execution PUBLIC BEMAN_HAS_MODULES) + target_compile_definitions(${TARGET_PREFIX} PUBLIC BEMAN_HAS_MODULES) target_link_libraries(${TARGET_PREFIX} PUBLIC ${TARGET_NAME}) endif() From ec98938509e3d71f5955db8c861fe76ccc9249df Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 16 Feb 2026 17:12:25 +0100 Subject: [PATCH 2/4] Set BEMAN_USE_STD_MODULE=true and test shared libs too --- .github/workflows/ci_tests.yml | 5 +++-- CMakePresets.json | 1 + cmake/beman-install-library.cmake | 4 ++++ cmake/presets/CMakeGenericPresets.json | 1 + 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 6fc52516..b20fcfa0 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -68,7 +68,7 @@ jobs: { "stdlibs": ["libc++"], "tests": [ "Debug.Default", "Release.Default", "Release.MaxSan", - "Debug.Dynamic" + "Debug.Dynamic", "Release.Dynamic" ] } ] @@ -96,7 +96,8 @@ jobs: { "cxxversions": ["c++23"], "tests": [ { "stdlibs": ["stl"], - "tests": ["Debug.Default", "Release.Default", "Release.MaxSan"] + "tests": ["Debug.Default", "Release.Default", "Release.MaxSan, + "Debug.Dynamic", "Release.Dynamic" } ] } diff --git a/CMakePresets.json b/CMakePresets.json index eccfd3f6..d8b99511 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -8,6 +8,7 @@ "binaryDir": "${sourceDir}/build/${presetName}", "cacheVariables": { "BEMAN_USE_MODULES": true, + "BEMAN_USE_STD_MODULE": true, "CMAKE_CXX_STANDARD": "23", "CMAKE_CXX_EXTENSIONS": true, "CMAKE_CXX_STANDARD_REQUIRED": true, diff --git a/cmake/beman-install-library.cmake b/cmake/beman-install-library.cmake index 002baaf0..ccea5d39 100644 --- a/cmake/beman-install-library.cmake +++ b/cmake/beman-install-library.cmake @@ -116,6 +116,10 @@ function(beman_install_library name) endif() # gersemi: off + set(_version_suffix) + set(_include_install_dir) + set(_lib_install_dir) + set(_bin_install_dir) # NOTE: If one of this variables is not set, the default DESTINATION is used! CK if(BEMAN_VERSION_SUFFIX) set(_version_suffix "-${PROJECT_VERSION}") diff --git a/cmake/presets/CMakeGenericPresets.json b/cmake/presets/CMakeGenericPresets.json index e86aea1e..645c009e 100644 --- a/cmake/presets/CMakeGenericPresets.json +++ b/cmake/presets/CMakeGenericPresets.json @@ -13,6 +13,7 @@ "value": "${sourceDir}/stagedir" }, "BEMAN_USE_MODULES": true, + "BEMAN_USE_STD_MODULE": true, "CMAKE_CXX_STANDARD": "23", "CMAKE_CXX_EXTENSIONS": true, "CMAKE_CXX_STANDARD_REQUIRED": true, From 7e98983b6d490cf32e8ca7d24e2d52e76dfdb32f Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 16 Feb 2026 20:43:32 +0100 Subject: [PATCH 3/4] Disable BEMAN_USE_STD_MODULE for llvm Quickfix for win32 dll linker error: set WINDOWS_EXPORT_ALL_SYMBOLS=true --- .github/workflows/ci_tests.yml | 9 +++++---- CMakeLists.txt | 9 +++++++++ CMakePresets.json | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index b20fcfa0..20548831 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -40,9 +40,9 @@ jobs: "tests": [ { "stdlibs": ["libstdc++"], "tests": [ - "Debug.Default", "Release.Default", - "Release.MaxSan", "Debug.Werror", - "Debug.Dynamic", "Debug.Coverage" + "Debug.Default", "Release.Default", "Release.MaxSan", + "Debug.Coverage", "Debug.Werror", + "Debug.Dynamic", "Release.Dynamic" ] } ] @@ -96,8 +96,9 @@ jobs: { "cxxversions": ["c++23"], "tests": [ { "stdlibs": ["stl"], - "tests": ["Debug.Default", "Release.Default", "Release.MaxSan, + "tests": ["Debug.Default", "Release.Default", "Release.MaxSan", "Debug.Dynamic", "Release.Dynamic" + ] } ] } diff --git a/CMakeLists.txt b/CMakeLists.txt index bd7c3345..fa31809c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,6 +36,7 @@ if(BEMAN_USE_MODULES) PUBLIC cxx_std_${CMAKE_CXX_STANDARD} ) + # TODO(CK): the export header should be used! include(GenerateExportHeader) generate_export_header( ${TARGET_PREFIX} @@ -59,6 +60,14 @@ if(BEMAN_USE_MODULES) DLL_NAME_WITH_SOVERSION TRUE ) + # FIXME: Quickfix only to prevent linker problems on windows? CK + if(WIN32 AND BEMAN_EXEMPLAR_BUILD_SHARED) + set_target_properties( + ${TARGET_PREFIX} + PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON + ) + endif() + find_package(Threads REQUIRED) target_link_libraries(${TARGET_PREFIX} PUBLIC Threads::Threads) else() diff --git a/CMakePresets.json b/CMakePresets.json index d8b99511..a82d6c6f 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -73,6 +73,7 @@ "_debug-base" ], "cacheVariables": { + "BEMAN_USE_STD_MODULE": false, "CMAKE_TOOLCHAIN_FILE": "infra/cmake/llvm-libc++-toolchain.cmake" }, "environment": { @@ -88,6 +89,7 @@ "_release-base" ], "cacheVariables": { + "BEMAN_USE_STD_MODULE": false, "CMAKE_TOOLCHAIN_FILE": "infra/cmake/llvm-libc++-toolchain.cmake" }, "environment": { From 26b21e512e83269e1b90ac581757d10b982deb3b Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Tue, 17 Feb 2026 11:14:33 +0100 Subject: [PATCH 4/4] Quickfix: build only a STATIC lib for now again --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa31809c..30e0a432 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ if(BEMAN_USE_MODULES) # CMake requires the language standard to be specified as compile feature # when a target provides C++23 modules and the target will be installed - add_library(${TARGET_PREFIX}) + add_library(${TARGET_PREFIX} STATIC) # FIXME: only static yet! CK add_library(beman::execution ALIAS ${TARGET_PREFIX}) target_compile_features( ${TARGET_PREFIX} @@ -60,8 +60,8 @@ if(BEMAN_USE_MODULES) DLL_NAME_WITH_SOVERSION TRUE ) - # FIXME: Quickfix only to prevent linker problems on windows? CK - if(WIN32 AND BEMAN_EXEMPLAR_BUILD_SHARED) + # FIXME: Quickfix only to prevent linker problems on windows dll? CK + if(WIN32 AND BUILD_SHARED_LIBS) set_target_properties( ${TARGET_PREFIX} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON