From fd9ae944872561bf4c8beaa8e9cf7b16f5acc482 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Fri, 30 Jan 2026 14:30:59 +0100 Subject: [PATCH 1/5] Feat: configure project to test without modules --- Makefile | 12 ++++++++++-- cmake/cxx-modules-rules.cmake | 8 ++++++-- examples/CMakeLists.txt | 4 ---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 3e13a1ca..4ddad84f 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ endif # TODO: beman.execution.examples.modules # FIXME: beman.execution.execution-module.test beman.execution.stop-token-module.test -default: test +default: release all: $(SANITIZERS) @@ -113,6 +113,9 @@ doc: # $(SANITIZERS): # $(MAKE) SANITIZER=$@ +# ========================================================== +# NOTE: cmake configure to only test without modules! CK +# ========================================================== build: cmake -G Ninja -S $(SOURCEDIR) -B $(BUILD) $(TOOLCHAIN) $(SYSROOT) \ -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \ @@ -120,7 +123,8 @@ build: -D CMAKE_CXX_STANDARD=23 \ -D CMAKE_CXX_EXTENSIONS=ON \ -D CMAKE_CXX_STANDARD_REQUIRED=ON \ - -D CMAKE_CXX_SCAN_FOR_MODULES=ON \ + -D CMAKE_CXX_SCAN_FOR_MODULES=OFF \ + -D BEMAN_USE_MODULES=OFF \ -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_CXX_COMPILER=$(CXX) cmake --build $(BUILD) @@ -136,11 +140,13 @@ install: test CMakeUserPresets.json:: cmake/CMakeUserPresets.json ln -s $< $@ +# ========================================================== release: CMakeUserPresets.json cmake --preset $@ --log-level=TRACE # XXX --fresh ln -fs $(BUILDROOT)/$@/compile_commands.json . cmake --workflow --preset $@ +# ========================================================== debug: CMakeUserPresets.json cmake --preset $@ --log-level=TRACE # XXX --fresh ln -fs $(BUILDROOT)build/$@/compile_commands.json . @@ -170,9 +176,11 @@ clang-tidy: $(BUILD)/compile_commands.json codespell: pre-commit run $@ +# ========================================================== format: pre-commit autoupdate pre-commit run --all +# ========================================================== cmake-format: pre-commit run gersemi diff --git a/cmake/cxx-modules-rules.cmake b/cmake/cxx-modules-rules.cmake index 71519fe0..498131d1 100644 --- a/cmake/cxx-modules-rules.cmake +++ b/cmake/cxx-modules-rules.cmake @@ -113,20 +113,24 @@ if(BEMAN_USE_STD_MODULE) "Build with import std; is possible and used!" ${CMAKE_CXX_MODULE_STD} ) - message(STATUS "BEMAN_HAS_IMPORT_STD=${BEMAN_HAS_IMPORT_STD}") message(STATUS "CMAKE_CXX_MODULE_STD=${CMAKE_CXX_MODULE_STD}") else() set(CMAKE_CXX_MODULE_STD OFF) message(WARNING "CMAKE_CXX_MODULE_STD=${CMAKE_CXX_MODULE_STD}") endif() + message(STATUS "BEMAN_HAS_IMPORT_STD=${BEMAN_HAS_IMPORT_STD}") endif() -message(STATUS "CMAKE_CXX_SCAN_FOR_MODULES=${CMAKE_CXX_SCAN_FOR_MODULES}") if(CMAKE_CXX_STANDARD GREATER_EQUAL 20) option(BEMAN_USE_MODULES "Build CXX_MODULES" ${CMAKE_CXX_SCAN_FOR_MODULES}) endif() message(STATUS "BEMAN_USE_MODULES=${BEMAN_USE_MODULES}") +if(NOT BEMAN_USE_MODULES) + set(CMAKE_CXX_SCAN_FOR_MODULES OFF) +endif() +message(STATUS "CMAKE_CXX_SCAN_FOR_MODULES=${CMAKE_CXX_SCAN_FOR_MODULES}") + # ------------------------------------------------------------------------------ # Avoid creating CMAKE_..._OUTPUT_DIRECTORY as cache variables, they should not # be under the control of the developer. They should be controlled by the diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index aadb6ccc..bd47dc4c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -12,10 +12,6 @@ project(beman_execution.example LANGUAGES CXX) if(PROJECT_IS_TOP_LEVEL) include(../cmake/cxx-modules-rules.cmake) - if(NOT DEFINED BEMAN_USE_MODULES) - set(CMAKE_CXX_SCAN_FOR_MODULES OFF) - endif() - find_package(beman_execution 0.1.0 EXACT REQUIRED) enable_testing() From 3bb4ba91edb8ea4778b91c28f5786d4377f5acf1 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Fri, 30 Jan 2026 22:44:24 +0100 Subject: [PATCH 2/5] Use beman-install-library-config.cmake --- CMakeLists.txt | 64 ++++---- cmake/beman-install-library-config.cmake | 194 +++++++++++++++++++++++ cmake/beman_execution-config.cmake.in | 7 + examples/CMakeLists.txt | 4 +- src/beman/execution/CMakeLists.txt | 80 +++++----- tests/beman/execution/CMakeLists.txt | 9 +- 6 files changed, 278 insertions(+), 80 deletions(-) create mode 100644 cmake/beman-install-library-config.cmake create mode 100644 cmake/beman_execution-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c947b12..8948ecc0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,11 @@ include(cxx-modules-rules) set(TARGET_NAME beman_execution_headers) # used in src, and docs set(TARGET_NAMESPACE beman) # NOTE: only still used in docs? set(TARGET_PREFIX ${PROJECT_NAME}) # NOTE: only still used in docs? -set(TARGET_PACKAGE_NAME ${PROJECT_NAME}-config) -set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-config-targets) + +# XXX set(TARGET_PACKAGE_NAME ${PROJECT_NAME}-config) +# XXX set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-config-targets) + +set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-targets) #=============================================================================== if(BEMAN_USE_MODULES) @@ -28,7 +31,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(beman_execution STATIC) - add_library(beman::beman_execution ALIAS beman_execution) + add_library(beman::execution ALIAS beman_execution) target_compile_features( beman_execution PUBLIC cxx_std_${CMAKE_CXX_STANDARD} @@ -72,13 +75,13 @@ option( ) option( - BEMAN_EXECUTION_ENABLE_INSTALL + BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE "Install the project components. Values: { ON, OFF }." ${PROJECT_IS_TOP_LEVEL} ) -include(GNUInstallDirs) -set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) +# include(GNUInstallDirs) +# set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) add_subdirectory(src/beman/execution) @@ -93,34 +96,33 @@ if(BEMAN_EXECUTION_BUILD_EXAMPLES) add_subdirectory(docs/code) endif() -if(NOT BEMAN_EXECUTION_ENABLE_INSTALL OR CMAKE_SKIP_INSTALL_RULES) +if(NOT BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE OR CMAKE_SKIP_INSTALL_RULES) return() endif() -include(infra/cmake/beman-install-library-config.cmake) -# FIXME: install TARGETS target beman.execution is exported but not all of its interface file sets are installed -# TODO: beman_install_library(beman_execution beman_execution_headers) - -include(CMakePackageConfigHelpers) - -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake - VERSION ${CMAKE_PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion -) - -configure_package_config_file( - "cmake/Config.cmake.in" - ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake - INSTALL_DESTINATION ${INSTALL_CONFIGDIR} -) - -install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake - DESTINATION ${INSTALL_CONFIGDIR} -) +include(./cmake/beman-install-library-config.cmake) +beman_install_library(beman_execution headers) + +# include(CMakePackageConfigHelpers) +# +# write_basic_package_version_file( +# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake +# VERSION ${CMAKE_PROJECT_VERSION} +# COMPATIBILITY AnyNewerVersion +# ) +# +# configure_package_config_file( +# "cmake/Config.cmake.in" +# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake +# INSTALL_DESTINATION ${INSTALL_CONFIGDIR} +# ) +# +# install( +# FILES +# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake +# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake +# DESTINATION ${INSTALL_CONFIGDIR} +# ) set(CPACK_GENERATOR TGZ) include(CPack) diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake new file mode 100644 index 00000000..45cff2b5 --- /dev/null +++ b/cmake/beman-install-library-config.cmake @@ -0,0 +1,194 @@ +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +include_guard(GLOBAL) + +# This file defines the function `beman_install_library` which is used to +# install a library target and its headers, along with optional CMake +# configuration files. +# +# The function is designed to be reusable across different Beman libraries. + +function(beman_install_library name interface) + # Usage + # ----- + # + # beman_install_library(NAME INTERFACE) + # + # Brief + # ----- + # + # This function installs the specified library target and its headers. + # It also handles the installation of the CMake configuration files if needed. + # + # CMake variables + # --------------- + # + # Note that configuration of the installation is generally controlled by CMake + # cache variables so that they can be controlled by the user or tool running the + # `cmake` command. Neither `CMakeLists.txt` nor `*.cmake` files should set these + # variables directly. + # + # - BEMAN_INSTALL_CONFIG_FILE_PACKAGES: + # List of packages that require config file installation. + # If the package name is in this list, it will install the config file. + # + # - _INSTALL_CONFIG_FILE_PACKAGE: + # Boolean to control config file installation for the specific library. + # The prefix `` is the uppercased name of the library with dots + # replaced by underscores. + # + if(NOT TARGET "${name}") + message(FATAL_ERROR "Target '${name}' does not exist.") + endif() + + # if(NOT ARGN STREQUAL "") + # message( + # FATAL_ERROR + # "beman_install_library does not accept extra arguments: ${ARGN}" + # ) + # endif() + + # XXX Given foo.bar, the component name is bar + # string(REPLACE "." ";" name_parts "${name}") + # XXX fail if the name doesn't look like foo.bar + # list(LENGTH name_parts name_parts_length) + # if(NOT name_parts_length EQUAL 2) + # message( + # FATAL_ERROR + # "beman_install_library expects a name of the form 'beman.', got '${name}'" + # ) + # endif() + + string(REPLACE "beman_" "" name_parts "${name}") + set(component_name ${name_parts}) + + set(target_name "${name}") + set(install_component_name "${name}") + set(export_name "${name}") + set(package_name "${name}") + # XXX list(GET name_parts -1 component_name) + message( + VERBOSE + "beman-install-library: COMPONENT ${component_name} for TARGET '${name}'" + ) + set(target_list "${target_name}") + + if(interface AND TARGET "${target_name}_${interface}") + set_target_properties( + "${target_name}_${interface}" + PROPERTIES EXPORT_NAME "${component_name}_${interface}" + ) + message( + VERBOSE + "beman-install-library: COMPONENT ${component_name}_${interface} for TARGET '${name}_${interface}'" + ) + list(APPEND target_list "${target_name}_${interface}") + endif() + + include(GNUInstallDirs) + + install( + TARGETS ${target_list} + COMPONENT "${install_component_name}" + EXPORT "${export_name}" + FILE_SET HEADERS + FILE_SET CXX_MODULES + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}/modules + ) + + set_target_properties( + "${target_name}" + PROPERTIES EXPORT_NAME "${component_name}" + ) + + # Determine the prefix for project-specific variables + string(TOUPPER "${name}" project_prefix) + # XXX string(REPLACE "." "_" project_prefix "${project_prefix}") + + option( + ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE + "Enable creating and installing a CMake config-file package. Default: ON. Values: { ON, OFF }." + ON + ) + + # By default, install the config package + set(install_config_package ON) + + # Turn OFF installation of config package by default if, + # in order of precedence: + # 1. The specific package variable is set to OFF + # 2. The package name is not in the list of packages to install config files + if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + if( + NOT "${install_component_name}" + IN_LIST + BEMAN_INSTALL_CONFIG_FILE_PACKAGES + ) + set(install_config_package OFF) + endif() + endif() + if(DEFINED ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE) + set(install_config_package + ${${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE} + ) + endif() + + if(install_config_package) + message( + VERBOSE + "beman-install-library: Installing a config package for '${name}'" + ) + + include(CMakePackageConfigHelpers) + + find_file( + config_file_template + NAMES "${package_name}-config.cmake.in" + PATHS "${PROJECT_SOURCE_DIR}/cmake" + NO_DEFAULT_PATH + NO_CACHE + REQUIRED + ) + set(config_package_file + "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config.cmake" + ) + set(package_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}") + configure_package_config_file( + "${config_file_template}" + "${config_package_file}" + INSTALL_DESTINATION "${package_install_dir}" + PATH_VARS PROJECT_NAME PROJECT_VERSION + ) + + set(config_version_file + "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config-version.cmake" + ) + write_basic_package_version_file( + "${config_version_file}" + VERSION "${PROJECT_VERSION}" + COMPATIBILITY ExactVersion + ) + + install( + FILES "${config_package_file}" "${config_version_file}" + DESTINATION "${package_install_dir}" + COMPONENT "${install_component_name}" + ) + + # NOTE: must be same value as ${TARGETS_EXPORT_NAME}.cmake! CK + set(config_targets_file "${package_name}-targets.cmake") + install( + EXPORT "${export_name}" + DESTINATION "${package_install_dir}" + NAMESPACE beman:: + FILE "${config_targets_file}" + CXX_MODULES_DIRECTORY + cxx-modules + COMPONENT "${install_component_name}" + ) + else() + message( + WARNING + "beman-install-library: Not installing a config package for '${name}'" + ) + endif() +endfunction() diff --git a/cmake/beman_execution-config.cmake.in b/cmake/beman_execution-config.cmake.in new file mode 100644 index 00000000..40463a38 --- /dev/null +++ b/cmake/beman_execution-config.cmake.in @@ -0,0 +1,7 @@ +# cmake/Config.cmake.in -*-makefile-*- +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@TARGET_LIBRARY@") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index bd47dc4c..7320f75c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -44,11 +44,11 @@ foreach(EXAMPLE ${EXAMPLES}) add_executable(${EXAMPLE_TARGET}) target_sources(${EXAMPLE_TARGET} PRIVATE ${EXAMPLE}.cpp) if(BEMAN_USE_MODULES) - target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::beman_execution) + target_link_libraries(${EXAMPLE_TARGET} PRIVATE beman::execution) else() target_link_libraries( ${EXAMPLE_TARGET} - PRIVATE beman::beman_execution_headers + PRIVATE beman::execution_headers ) endif() add_test(NAME ${EXAMPLE_TARGET} COMMAND ${EXAMPLE_TARGET}) diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index b0653ea6..02c0a3f6 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -3,16 +3,14 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # gersemi: on -if(NOT TARGET ${TARGET_NAME}) - add_library(${TARGET_NAME} INTERFACE) -endif() +add_library(${TARGET_NAME} INTERFACE) add_library(beman::${TARGET_NAME} ALIAS ${TARGET_NAME}) target_sources( ${TARGET_NAME} PUBLIC - FILE_SET ${TARGET_NAME}_public_headers - TYPE HEADERS + FILE_SET # ${TARGET_NAME}_public_headers TYPE + HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES ${PROJECT_SOURCE_DIR}/include/beman/execution/execution.hpp @@ -20,11 +18,11 @@ target_sources( ${PROJECT_SOURCE_DIR}/include/beman/execution/stop_token.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution26/execution.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution26/stop_token.hpp - PUBLIC - FILE_SET ${TARGET_NAME}_detail_headers - TYPE HEADERS - BASE_DIRS ${PROJECT_SOURCE_DIR}/include - FILES + # PUBLIC + # FILE_SET ${TARGET_NAME}_detail_headers + # TYPE HEADERS + # BASE_DIRS ${PROJECT_SOURCE_DIR}/include + # FILES ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/affine_on.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/allocator_aware_move.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/almost_scheduler.hpp @@ -210,37 +208,37 @@ if(BEMAN_USE_MODULES) list(APPEND TARGET_LIST beman_execution) endif() -get_property( - DETAIL_HEADER_FILES - TARGET ${TARGET_NAME} - PROPERTY HEADER_SET_${TARGET_NAME}_detail_headers -) -source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) +# get_property( +# DETAIL_HEADER_FILES +# TARGET ${TARGET_NAME} +# PROPERTY HEADER_SET_${TARGET_NAME}_detail_headers +# ) +# source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) set_target_properties(${TARGET_NAME} PROPERTIES VERIFY_INTERFACE_HEADER_SETS ON) -if(NOT BEMAN_EXECUTION_ENABLE_INSTALL OR CMAKE_SKIP_INSTALL_RULES) - return() -endif() - -install( - TARGETS ${TARGET_LIST} - EXPORT ${TARGETS_EXPORT_NAME} - ARCHIVE DESTINATION lib/$ - FILE_SET HEADERS - FILE_SET ${TARGET_NAME}_public_headers - FILE_SET ${TARGET_NAME}_detail_headers - FILE_SET CXX_MODULES DESTINATION ${INSTALL_CONFIGDIR}/module - # There's currently no convention for this location - CXX_MODULES_BMI - DESTINATION ${INSTALL_CONFIGDIR}/bmi-${CMAKE_CXX_COMPILER_ID}_$ -) - -install( - EXPORT ${TARGETS_EXPORT_NAME} - FILE ${TARGETS_EXPORT_NAME}.cmake - DESTINATION "${INSTALL_CONFIGDIR}" - NAMESPACE beman:: - CXX_MODULES_DIRECTORY - . -) +# if(NOT BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE OR CMAKE_SKIP_INSTALL_RULES) +# return() +# endif() +# +# install( +# TARGETS ${TARGET_LIST} +# EXPORT ${TARGETS_EXPORT_NAME} +# ARCHIVE DESTINATION lib/$ +# FILE_SET HEADERS +# FILE_SET ${TARGET_NAME}_public_headers +# FILE_SET ${TARGET_NAME}_detail_headers +# FILE_SET CXX_MODULES DESTINATION ${INSTALL_CONFIGDIR}/module +# # There's currently no convention for this location +# CXX_MODULES_BMI +# DESTINATION ${INSTALL_CONFIGDIR}/bmi-${CMAKE_CXX_COMPILER_ID}_$ +# ) +# +# install( +# EXPORT ${TARGETS_EXPORT_NAME} +# FILE ${TARGETS_EXPORT_NAME}.cmake +# DESTINATION "${INSTALL_CONFIGDIR}" +# NAMESPACE beman:: +# CXX_MODULES_DIRECTORY +# . +# ) diff --git a/tests/beman/execution/CMakeLists.txt b/tests/beman/execution/CMakeLists.txt index 53d5f332..ec73465a 100644 --- a/tests/beman/execution/CMakeLists.txt +++ b/tests/beman/execution/CMakeLists.txt @@ -114,17 +114,14 @@ foreach(test ${execution_tests}) set(TEST_EXE ${PROJECT_NAME}.${test}) add_executable(${TEST_EXE} ${test}.cpp) if(BEMAN_USE_MODULES) - target_link_libraries(${TEST_EXE} PRIVATE beman::beman_execution) + target_link_libraries(${TEST_EXE} PRIVATE beman::execution) else() - target_link_libraries( - ${TEST_EXE} - PRIVATE beman::beman_execution_headers - ) + target_link_libraries(${TEST_EXE} PRIVATE beman::execution_headers) endif() add_test(NAME ${TEST_EXE} COMMAND $) endforeach() -if(BEMAN_EXECUTION_ENABLE_INSTALL AND NOT CMAKE_SKIP_INSTALL_RULES) +if(BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE AND NOT CMAKE_SKIP_INSTALL_RULES) # test if the targets are usable from the install directory add_test( NAME install-to-stagedir From c5cb050472fced2f6ce3cb1f8d4bd8481473735b Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Sat, 31 Jan 2026 14:44:35 +0100 Subject: [PATCH 3/5] Fix installation without cxx_modules --- CMakeLists.txt | 4 +-- cmake/beman-install-library-config.cmake | 36 +++++++++++++++--------- src/beman/execution/CMakeLists.txt | 2 +- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8948ecc0..18c92b52 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,14 +5,14 @@ cmake_minimum_required(VERSION 3.30...4.2) -include(cmake/prelude.cmake) +include(./cmake/prelude.cmake) #=================================================== project(beman_execution VERSION 0.1.0 LANGUAGES CXX) #=================================================== # Modules opt in only on compilers that support it: msvc, g++-15 and clang-20+ -include(cxx-modules-rules) +include(./cmake/cxx-modules-rules.cmake) set(TARGET_NAME beman_execution_headers) # used in src, and docs set(TARGET_NAMESPACE beman) # NOTE: only still used in docs? diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 45cff2b5..5ab36b72 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -36,9 +36,9 @@ function(beman_install_library name interface) # The prefix `` is the uppercased name of the library with dots # replaced by underscores. # - if(NOT TARGET "${name}") - message(FATAL_ERROR "Target '${name}' does not exist.") - endif() + # if(NOT TARGET "${name}") + # message(FATAL_ERROR "Target '${name}' does not exist.") + # endif() # if(NOT ARGN STREQUAL "") # message( @@ -62,15 +62,28 @@ function(beman_install_library name interface) set(component_name ${name_parts}) set(target_name "${name}") - set(install_component_name "${name}") + + # COMPONENT + # Specify an installation component name with which the install rule is associated, + # such as Runtime or Development. + set(install_component_name "${name}") # TODO(CK): this is not common name! + set(export_name "${name}") set(package_name "${name}") # XXX list(GET name_parts -1 component_name) - message( - VERBOSE - "beman-install-library: COMPONENT ${component_name} for TARGET '${name}'" - ) - set(target_list "${target_name}") + + set(target_list) + if(TARGET "${target_name}") + set_target_properties( + "${target_name}" + PROPERTIES EXPORT_NAME "${component_name}" + ) + message( + VERBOSE + "beman-install-library: COMPONENT ${component_name} for TARGET '${target_name}'" + ) + list(APPEND target_list "${target_name}") + endif() if(interface AND TARGET "${target_name}_${interface}") set_target_properties( @@ -95,11 +108,6 @@ function(beman_install_library name interface) DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}/modules ) - set_target_properties( - "${target_name}" - PROPERTIES EXPORT_NAME "${component_name}" - ) - # Determine the prefix for project-specific variables string(TOUPPER "${name}" project_prefix) # XXX string(REPLACE "." "_" project_prefix "${project_prefix}") diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index 02c0a3f6..11c86154 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -4,7 +4,7 @@ # gersemi: on add_library(${TARGET_NAME} INTERFACE) -add_library(beman::${TARGET_NAME} ALIAS ${TARGET_NAME}) +add_library(beman::execution_headers ALIAS ${TARGET_NAME}) target_sources( ${TARGET_NAME} From 1606eaa865a9c7f9d9acd08d0a16b7d89cff144c Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Sat, 31 Jan 2026 17:15:26 +0100 Subject: [PATCH 4/5] Add support for CMAKE_SKIP_INSTALL_RULES --- Makefile | 4 +- cmake/beman-install-library-config.cmake | 60 +++++++++++++++++++++--- cmake/presets/CMakeGenericPresets.json | 1 + src/beman/execution/CMakeLists.txt | 6 +-- 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 4ddad84f..768395d0 100644 --- a/Makefile +++ b/Makefile @@ -119,14 +119,14 @@ doc: build: cmake -G Ninja -S $(SOURCEDIR) -B $(BUILD) $(TOOLCHAIN) $(SYSROOT) \ -D CMAKE_EXPORT_COMPILE_COMMANDS=ON \ - -D CMAKE_SKIP_INSTALL_RULES=OFF \ + -D CMAKE_SKIP_INSTALL_RULES=ON \ -D CMAKE_CXX_STANDARD=23 \ -D CMAKE_CXX_EXTENSIONS=ON \ -D CMAKE_CXX_STANDARD_REQUIRED=ON \ -D CMAKE_CXX_SCAN_FOR_MODULES=OFF \ -D BEMAN_USE_MODULES=OFF \ -D CMAKE_BUILD_TYPE=Release \ - -D CMAKE_CXX_COMPILER=$(CXX) + -D CMAKE_CXX_COMPILER=$(CXX) --log-level=VERBOSE cmake --build $(BUILD) # XXX --fresh -D CMAKE_CXX_FLAGS="$(CXX_FLAGS) $(SAN_FLAGS)" diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index 5ab36b72..a280a22d 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -72,6 +72,10 @@ function(beman_install_library name interface) set(package_name "${name}") # XXX list(GET name_parts -1 component_name) + include(GNUInstallDirs) + + set(package_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}") + set(target_list) if(TARGET "${target_name}") set_target_properties( @@ -83,6 +87,24 @@ function(beman_install_library name interface) "beman-install-library: COMPONENT ${component_name} for TARGET '${target_name}'" ) list(APPEND target_list "${target_name}") + + get_target_property( + INTERFACE_CXX_MODULE_SETS + ${target_name} + INTERFACE_CXX_MODULE_SETS + ) + if(INTERFACE_CXX_MODULE_SETS) + message( + VERBOSE + "beman-install-library: '${target_name}' has INTERFACE_CXX_MODULE_SETS=${INTERFACE_CXX_MODULE_SETS}" + ) + set(__INSTALL_CXX_MODULES + FILE_SET + ${INTERFACE_CXX_MODULE_SETS} + DESTINATION + ${package_install_dir}/modules + ) + endif() endif() if(interface AND TARGET "${target_name}_${interface}") @@ -92,21 +114,48 @@ function(beman_install_library name interface) ) message( VERBOSE - "beman-install-library: COMPONENT ${component_name}_${interface} for TARGET '${name}_${interface}'" + "beman-install-library: COMPONENT ${component_name} for TARGET '${name}_${interface}'" ) list(APPEND target_list "${target_name}_${interface}") + + get_target_property( + INTERFACE_HEADER_SETS + ${target_name}_${interface} + INTERFACE_HEADER_SETS + ) + if(INTERFACE_HEADER_SETS) + message( + VERBOSE + "beman-install-library: '${target_name}_${interface}' has INTERFACE_HEADER_SETS=${INTERFACE_HEADER_SETS}" + ) + set(__INSTALL_HEADER_SETS FILE_SET ${INTERFACE_HEADER_SETS}) + endif() endif() - include(GNUInstallDirs) + if(CMAKE_SKIP_INSTALL_RULES) + message( + DEBUG + "beman-install-library: not installing targets '${target_list}' due to CMAKE_SKIP_INSTALL_RULES" + ) + return() + endif() + # ============================================================ install( TARGETS ${target_list} COMPONENT "${install_component_name}" EXPORT "${export_name}" FILE_SET HEADERS - FILE_SET CXX_MODULES - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}/modules + ${__INSTALL_HEADER_SETS} + # FILE_SET CXX_MODULES + # DESTINATION ${package_install_dir}/modules + ${__INSTALL_CXX_MODULES} + # There's currently no convention for this location + CXX_MODULES_BMI + DESTINATION + ${package_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ ) + # ============================================================ # Determine the prefix for project-specific variables string(TOUPPER "${name}" project_prefix) @@ -143,7 +192,7 @@ function(beman_install_library name interface) if(install_config_package) message( VERBOSE - "beman-install-library: Installing a config package for '${name}'" + "beman-install-library: Export cmake config to ${package_install_dir} for '${name}'" ) include(CMakePackageConfigHelpers) @@ -159,7 +208,6 @@ function(beman_install_library name interface) set(config_package_file "${CMAKE_CURRENT_BINARY_DIR}/${package_name}-config.cmake" ) - set(package_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${package_name}") configure_package_config_file( "${config_file_template}" "${config_package_file}" diff --git a/cmake/presets/CMakeGenericPresets.json b/cmake/presets/CMakeGenericPresets.json index d222b74b..df2d2045 100644 --- a/cmake/presets/CMakeGenericPresets.json +++ b/cmake/presets/CMakeGenericPresets.json @@ -17,6 +17,7 @@ "CMAKE_CXX_SCAN_FOR_MODULES": true, "CMAKE_CXX_STANDARD_REQUIRED": true, "CMAKE_EXPORT_COMPILE_COMMANDS": true, + "CMAKE_INSTALL_MESSAGE": "LAZY", "CMAKE_SKIP_TEST_ALL_DEPENDENCY": false }, "warnings": { diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index 11c86154..d3836303 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -9,7 +9,7 @@ add_library(beman::execution_headers ALIAS ${TARGET_NAME}) target_sources( ${TARGET_NAME} PUBLIC - FILE_SET # ${TARGET_NAME}_public_headers TYPE + FILE_SET # public_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES @@ -19,7 +19,7 @@ target_sources( ${PROJECT_SOURCE_DIR}/include/beman/execution26/execution.hpp ${PROJECT_SOURCE_DIR}/include/beman/execution26/stop_token.hpp # PUBLIC - # FILE_SET ${TARGET_NAME}_detail_headers + # FILE_SET detail_headers # TYPE HEADERS # BASE_DIRS ${PROJECT_SOURCE_DIR}/include # FILES @@ -211,7 +211,7 @@ endif() # get_property( # DETAIL_HEADER_FILES # TARGET ${TARGET_NAME} -# PROPERTY HEADER_SET_${TARGET_NAME}_detail_headers +# PROPERTY HEADER_SET_detail_headers # ) # source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) From d5a0dd0f208cd74169526f779f79983ebc2aa078 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Sat, 31 Jan 2026 21:40:50 +0100 Subject: [PATCH 5/5] The final cleanup --- CMakeLists.txt | 74 +++++-------------- cmake/beman-install-library-config.cmake | 33 +++++---- ...ake.in => beman.execution-config.cmake.in} | 0 cmake/beman_execution-config.cmake.in | 7 -- examples/CMakeLists.txt | 3 +- src/beman/execution/CMakeLists.txt | 40 ++-------- 6 files changed, 41 insertions(+), 116 deletions(-) rename cmake/{Config.cmake.in => beman.execution-config.cmake.in} (100%) delete mode 100644 cmake/beman_execution-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 18c92b52..095c67d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,20 +8,16 @@ cmake_minimum_required(VERSION 3.30...4.2) include(./cmake/prelude.cmake) #=================================================== -project(beman_execution VERSION 0.1.0 LANGUAGES CXX) +project(beman.execution VERSION 0.2.0 LANGUAGES CXX) #=================================================== # Modules opt in only on compilers that support it: msvc, g++-15 and clang-20+ include(./cmake/cxx-modules-rules.cmake) -set(TARGET_NAME beman_execution_headers) # used in src, and docs -set(TARGET_NAMESPACE beman) # NOTE: only still used in docs? -set(TARGET_PREFIX ${PROJECT_NAME}) # NOTE: only still used in docs? - -# XXX set(TARGET_PACKAGE_NAME ${PROJECT_NAME}-config) -# XXX set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-config-targets) - -set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-targets) +set(TARGET_NAME beman.execution_headers) # used in src, and docs +set(TARGET_NAMESPACE beman) # TODO(CK): still used in docs, is this really needed? +set(TARGET_PREFIX ${PROJECT_NAME}) # NOTE: used in src, and docs? +set(TARGETS_EXPORT_NAME ${PROJECT_NAME}-targets) # NOTE: must be set, is important for installation! CK #=============================================================================== if(BEMAN_USE_MODULES) @@ -30,33 +26,33 @@ 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(beman_execution STATIC) - add_library(beman::execution ALIAS beman_execution) + add_library(beman.execution STATIC) + add_library(beman::execution ALIAS beman.execution) target_compile_features( - beman_execution + beman.execution PUBLIC cxx_std_${CMAKE_CXX_STANDARD} ) include(GenerateExportHeader) generate_export_header( - beman_execution - BASE_NAME beman_execution + beman.execution + BASE_NAME beman.execution EXPORT_FILE_NAME beman/execution/modules_export.hpp ) target_sources( - beman_execution + beman.execution PUBLIC FILE_SET HEADERS BASE_DIRS include ${CMAKE_CURRENT_BINARY_DIR} FILES ${CMAKE_CURRENT_BINARY_DIR}/beman/execution/modules_export.hpp ) - # FIXME: target_compile_definitions(beman_execution PUBLIC BEMAN_HAS_MODULES) + # FIXME: target_compile_definitions(beman.execution PUBLIC BEMAN_HAS_MODULES) endif() if(BEMAN_USE_MODULES AND CMAKE_CXX_MODULE_STD) - target_compile_definitions(beman_execution PUBLIC BEMAN_HAS_IMPORT_STD) + target_compile_definitions(beman.execution PUBLIC BEMAN_HAS_IMPORT_STD) else() message(WARNING "Missing support for CMAKE_CXX_MODULE_STD!") endif() @@ -74,17 +70,12 @@ option( ${PROJECT_IS_TOP_LEVEL} ) -option( - BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE - "Install the project components. Values: { ON, OFF }." - ${PROJECT_IS_TOP_LEVEL} -) - -# include(GNUInstallDirs) -# set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}) - add_subdirectory(src/beman/execution) +# NOTE: this must be done before tests! CK +include(./cmake/beman-install-library-config.cmake) +beman_install_library(${TARGET_PREFIX} headers) + if(BEMAN_EXECUTION_ENABLE_TESTING) enable_testing() @@ -95,34 +86,3 @@ if(BEMAN_EXECUTION_BUILD_EXAMPLES) add_subdirectory(examples) add_subdirectory(docs/code) endif() - -if(NOT BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE OR CMAKE_SKIP_INSTALL_RULES) - return() -endif() - -include(./cmake/beman-install-library-config.cmake) -beman_install_library(beman_execution headers) - -# include(CMakePackageConfigHelpers) -# -# write_basic_package_version_file( -# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake -# VERSION ${CMAKE_PROJECT_VERSION} -# COMPATIBILITY AnyNewerVersion -# ) -# -# configure_package_config_file( -# "cmake/Config.cmake.in" -# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake -# INSTALL_DESTINATION ${INSTALL_CONFIGDIR} -# ) -# -# install( -# FILES -# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}.cmake -# ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_PACKAGE_NAME}-version.cmake -# DESTINATION ${INSTALL_CONFIGDIR} -# ) - -set(CPACK_GENERATOR TGZ) -include(CPack) diff --git a/cmake/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake index a280a22d..4ad27ff2 100644 --- a/cmake/beman-install-library-config.cmake +++ b/cmake/beman-install-library-config.cmake @@ -36,6 +36,7 @@ function(beman_install_library name interface) # The prefix `` is the uppercased name of the library with dots # replaced by underscores. # + # if(NOT TARGET "${name}") # message(FATAL_ERROR "Target '${name}' does not exist.") # endif() @@ -47,19 +48,16 @@ function(beman_install_library name interface) # ) # endif() - # XXX Given foo.bar, the component name is bar - # string(REPLACE "." ";" name_parts "${name}") - # XXX fail if the name doesn't look like foo.bar - # list(LENGTH name_parts name_parts_length) - # if(NOT name_parts_length EQUAL 2) - # message( - # FATAL_ERROR - # "beman_install_library expects a name of the form 'beman.', got '${name}'" - # ) - # endif() - - string(REPLACE "beman_" "" name_parts "${name}") - set(component_name ${name_parts}) + # Given foo.bar, the component name is bar + string(REPLACE "." ";" name_parts "${name}") + # fail if the name doesn't look like foo.bar + list(LENGTH name_parts name_parts_length) + if(NOT name_parts_length EQUAL 2) + message( + FATAL_ERROR + "beman_install_library expects a name of the form 'beman.', got '${name}'" + ) + endif() set(target_name "${name}") @@ -70,7 +68,7 @@ function(beman_install_library name interface) set(export_name "${name}") set(package_name "${name}") - # XXX list(GET name_parts -1 component_name) + list(GET name_parts -1 component_name) include(GNUInstallDirs) @@ -134,7 +132,7 @@ function(beman_install_library name interface) if(CMAKE_SKIP_INSTALL_RULES) message( - DEBUG + WARNING "beman-install-library: not installing targets '${target_list}' due to CMAKE_SKIP_INSTALL_RULES" ) return() @@ -159,7 +157,7 @@ function(beman_install_library name interface) # Determine the prefix for project-specific variables string(TOUPPER "${name}" project_prefix) - # XXX string(REPLACE "." "_" project_prefix "${project_prefix}") + string(REPLACE "." "_" project_prefix "${project_prefix}") option( ${project_prefix}_INSTALL_CONFIG_FILE_PACKAGE @@ -248,3 +246,6 @@ function(beman_install_library name interface) ) endif() endfunction() + +set(CPACK_GENERATOR TGZ) +include(CPack) diff --git a/cmake/Config.cmake.in b/cmake/beman.execution-config.cmake.in similarity index 100% rename from cmake/Config.cmake.in rename to cmake/beman.execution-config.cmake.in diff --git a/cmake/beman_execution-config.cmake.in b/cmake/beman_execution-config.cmake.in deleted file mode 100644 index 40463a38..00000000 --- a/cmake/beman_execution-config.cmake.in +++ /dev/null @@ -1,7 +0,0 @@ -# cmake/Config.cmake.in -*-makefile-*- -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -@PACKAGE_INIT@ - -include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") -check_required_components("@TARGET_LIBRARY@") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7320f75c..71ffabca 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -12,7 +12,7 @@ project(beman_execution.example LANGUAGES CXX) if(PROJECT_IS_TOP_LEVEL) include(../cmake/cxx-modules-rules.cmake) - find_package(beman_execution 0.1.0 EXACT REQUIRED) + find_package(beman.execution 0.2.0 EXACT REQUIRED) enable_testing() endif() @@ -35,7 +35,6 @@ set(EXAMPLES ) if(BEMAN_USE_MODULES) - # FIXME: not yet! list(APPEND EXAMPLES modules) # modules.cpp endif() diff --git a/src/beman/execution/CMakeLists.txt b/src/beman/execution/CMakeLists.txt index d3836303..10774bac 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -9,8 +9,8 @@ add_library(beman::execution_headers ALIAS ${TARGET_NAME}) target_sources( ${TARGET_NAME} PUBLIC - FILE_SET # public_headers TYPE - HEADERS + FILE_SET public_headers + TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES ${PROJECT_SOURCE_DIR}/include/beman/execution/execution.hpp @@ -193,19 +193,17 @@ target_sources( ${PROJECT_SOURCE_DIR}/include/beman/execution/detail/write_env.hpp ) -set(TARGET_LIST ${TARGET_NAME}) - if(BEMAN_USE_MODULES) target_sources( - beman_execution - PRIVATE execution.cpp + ${TARGET_PREFIX} + PRIVATE + execution.cpp # TODO(CK): check if really needed! PUBLIC FILE_SET CXX_MODULES BASE_DIRS ${PROJECT_SOURCE_DIR}/src/beman/execution FILES ${PROJECT_SOURCE_DIR}/src/beman/execution/execution.cppm ) - target_link_libraries(beman_execution PUBLIC ${TARGET_NAME}) - list(APPEND TARGET_LIST beman_execution) + target_link_libraries(${TARGET_PREFIX} PUBLIC ${TARGET_NAME}) endif() # get_property( @@ -216,29 +214,3 @@ endif() # source_group("Header Files\\detail" FILES ${DETAIL_HEADER_FILES}) set_target_properties(${TARGET_NAME} PROPERTIES VERIFY_INTERFACE_HEADER_SETS ON) - -# if(NOT BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE OR CMAKE_SKIP_INSTALL_RULES) -# return() -# endif() -# -# install( -# TARGETS ${TARGET_LIST} -# EXPORT ${TARGETS_EXPORT_NAME} -# ARCHIVE DESTINATION lib/$ -# FILE_SET HEADERS -# FILE_SET ${TARGET_NAME}_public_headers -# FILE_SET ${TARGET_NAME}_detail_headers -# FILE_SET CXX_MODULES DESTINATION ${INSTALL_CONFIGDIR}/module -# # There's currently no convention for this location -# CXX_MODULES_BMI -# DESTINATION ${INSTALL_CONFIGDIR}/bmi-${CMAKE_CXX_COMPILER_ID}_$ -# ) -# -# install( -# EXPORT ${TARGETS_EXPORT_NAME} -# FILE ${TARGETS_EXPORT_NAME}.cmake -# DESTINATION "${INSTALL_CONFIGDIR}" -# NAMESPACE beman:: -# CXX_MODULES_DIRECTORY -# . -# )