From cab5c2375e76d36e4a54ae0ad7ac2ff73f4a90d4 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 24 Aug 2026 21:30:36 +0200 Subject: [PATCH 1/3] Feat: Add support to install FILE_SET too Do only what is possible with old CMake versions --- include/BoostInstall.cmake | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/include/BoostInstall.cmake b/include/BoostInstall.cmake index ca0997c..fcae1c3 100644 --- a/include/BoostInstall.cmake +++ b/include/BoostInstall.cmake @@ -3,7 +3,7 @@ # Distributed under the Boost Software License, Version 1.0. # See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt -if(NOT CMAKE_VERSION VERSION_LESS 3.10) +if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.10) include_guard() endif() @@ -337,6 +337,24 @@ function(boost_install_target) string(APPEND CONFIG_INSTALL_DIR "-static") endif() + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) + get_target_property(INTERFACE_CXX_MODULE_SETS ${LIB} INTERFACE_CXX_MODULE_SETS) + if(INTERFACE_CXX_MODULE_SETS) + boost_message(DEBUG "boost_install_target: '${__TARGET}' has INTERFACE_CXX_MODULE_SETS=${INTERFACE_CXX_MODULE_SETS}") + set(__INSTALL_CXX_MODULES FILE_SET ${INTERFACE_CXX_MODULE_SETS} DESTINATION ${CONFIG_INSTALL_DIR}) + set(__INSTALL_CXX_MODULES_BMI CXX_MODULES_BMI DESTINATION ${CONFIG_INSTALL_DIR}/bmi-${CMAKE_CXX_COMPILER_ID}_$) + set(__EXPORT_CXX_MODULES_DIRECTORY CXX_MODULES_DIRECTORY .) + endif() + endif() + + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.23) + get_target_property(INTERFACE_HEADER_SETS ${LIB} INTERFACE_HEADER_SETS) + if(INTERFACE_HEADER_SETS) + boost_message(DEBUG "boost_install_target: '${__TARGET}' has INTERFACE_HEADER_SETS=${INTERFACE_HEADER_SETS}") + set(__INSTALL_HEADER_SETS FILE_SET ${INTERFACE_HEADER_SETS}) + endif() + endif() + install(TARGETS ${LIB} EXPORT ${LIB}-targets # explicit destination specification required for 3.13, 3.14 no longer needs it RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" @@ -344,8 +362,17 @@ function(boost_install_target) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + # NOTE: explicit needed if used starting with cmake v3.28 + # XXX FILE_SET CXX_MODULES DESTINATION ${CONFIG_INSTALL_DIR} + ${__INSTALL_CXX_MODULES} + # Any module files from C++ modules from PUBLIC sources in a file set of type CXX_MODULES will be installed to the given DESTINATION. + # TODO(CK) ${__INSTALL_CXX_MODULES_BMI} + # NOTE: explicit needed if used starting with cmake v3.23 + # XXX FILE_SET HEADERS + ${__INSTALL_HEADER_SETS} ) + # TODO(CK): what is this for? export(TARGETS ${LIB} NAMESPACE Boost:: FILE export/${LIB}-targets.cmake) if(MSVC) @@ -353,7 +380,7 @@ function(boost_install_target) install(FILES $ DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL) endif() - if(TYPE STREQUAL "STATIC_LIBRARY" AND NOT CMAKE_VERSION VERSION_LESS 3.15) + if(TYPE STREQUAL "STATIC_LIBRARY" AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.15) install(FILES "$/$$.pdb" DESTINATION ${CMAKE_INSTALL_LIBDIR} OPTIONAL) endif() endif() @@ -362,7 +389,9 @@ function(boost_install_target) __boost_install_update_sources(${LIB} ${__EXTRA_DIRECTORY} ${__EXTRA_INSTALL_DIRECTORY}) endif() - install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake) + install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake + # TODO(CK) ${__EXPORT_CXX_MODULES_DIRECTORY} + ) set_target_properties(${LIB} PROPERTIES _boost_is_installed ON) @@ -491,7 +520,7 @@ function(boost_install_target) # Header-only libraries are architecture-independent - if(NOT CMAKE_VERSION VERSION_LESS 3.14) + if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.14) write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY SameMajorVersion ARCH_INDEPENDENT) From a39c41b75c56c59946361ed5c7ef799650514937 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 24 Aug 2026 21:43:41 +0200 Subject: [PATCH 2/3] Install CXX_MODULES to versioned data dir --- include/BoostInstall.cmake | 16 +++++++++------- include/BoostRoot.cmake | 3 +++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/include/BoostInstall.cmake b/include/BoostInstall.cmake index fcae1c3..9440581 100644 --- a/include/BoostInstall.cmake +++ b/include/BoostInstall.cmake @@ -337,21 +337,22 @@ function(boost_install_target) string(APPEND CONFIG_INSTALL_DIR "-static") endif() + set(__INSTALL_CXX_MODULES) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) get_target_property(INTERFACE_CXX_MODULE_SETS ${LIB} INTERFACE_CXX_MODULE_SETS) if(INTERFACE_CXX_MODULE_SETS) boost_message(DEBUG "boost_install_target: '${__TARGET}' has INTERFACE_CXX_MODULE_SETS=${INTERFACE_CXX_MODULE_SETS}") - set(__INSTALL_CXX_MODULES FILE_SET ${INTERFACE_CXX_MODULE_SETS} DESTINATION ${CONFIG_INSTALL_DIR}) - set(__INSTALL_CXX_MODULES_BMI CXX_MODULES_BMI DESTINATION ${CONFIG_INSTALL_DIR}/bmi-${CMAKE_CXX_COMPILER_ID}_$) - set(__EXPORT_CXX_MODULES_DIRECTORY CXX_MODULES_DIRECTORY .) + set(extrainstalldir "${CMAKE_INSTALL_DATADIR}/boost-${__VERSION}/${LIB}") + set(__INSTALL_CXX_MODULES FILE_SET ${INTERFACE_CXX_MODULE_SETS} DESTINATION ${extrainstalldir}) endif() endif() + set(__INSTALL_HEADER_SETS) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.23) get_target_property(INTERFACE_HEADER_SETS ${LIB} INTERFACE_HEADER_SETS) if(INTERFACE_HEADER_SETS) boost_message(DEBUG "boost_install_target: '${__TARGET}' has INTERFACE_HEADER_SETS=${INTERFACE_HEADER_SETS}") - set(__INSTALL_HEADER_SETS FILE_SET ${INTERFACE_HEADER_SETS}) + set(__INSTALL_HEADER_SETS FILE_SET ${INTERFACE_HEADER_SETS} DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/boost-${__VERSION}") endif() endif() @@ -362,8 +363,8 @@ function(boost_install_target) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - # NOTE: explicit needed if used starting with cmake v3.28 - # XXX FILE_SET CXX_MODULES DESTINATION ${CONFIG_INSTALL_DIR} + # explicit needed if used starting with cmake v3.28 + # XXX FILE_SET CXX_MODULES DESTINATION "${CMAKE_INSTALL_DATADIR}" ${__INSTALL_CXX_MODULES} # Any module files from C++ modules from PUBLIC sources in a file set of type CXX_MODULES will be installed to the given DESTINATION. # TODO(CK) ${__INSTALL_CXX_MODULES_BMI} @@ -390,7 +391,7 @@ function(boost_install_target) endif() install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake - # TODO(CK) ${__EXPORT_CXX_MODULES_DIRECTORY} + CXX_MODULES_DIRECTORY . ) set_target_properties(${LIB} PROPERTIES _boost_is_installed ON) @@ -618,6 +619,7 @@ function(boost_install) endif() + set(extrainstalldir) if(__EXTRA_DIRECTORY AND NOT BOOST_SKIP_INSTALL_RULES AND NOT CMAKE_SKIP_INSTALL_RULES) # Extract the library name from the path, one component up from the extra directory diff --git a/include/BoostRoot.cmake b/include/BoostRoot.cmake index 25bcbc4..11ee251 100644 --- a/include/BoostRoot.cmake +++ b/include/BoostRoot.cmake @@ -303,6 +303,9 @@ macro(__boost_add_header_only lib) endmacro() +# C++20 modules +option(BOOST_USE_MODULES "Build Boost as a collection of C++20 modules (unstable)" OFF) + # file(GLOB __boost_libraries RELATIVE "${BOOST_SUPERPROJECT_SOURCE_DIR}/libs" "${BOOST_SUPERPROJECT_SOURCE_DIR}/libs/*/CMakeLists.txt" "${BOOST_SUPERPROJECT_SOURCE_DIR}/libs/numeric/*/CMakeLists.txt") From f025fb9384ef81c59dc0da80353af3ffc8fe9cb5 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Tue, 25 Aug 2026 15:06:48 +0200 Subject: [PATCH 3/3] Cleanup comments --- include/BoostInstall.cmake | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/include/BoostInstall.cmake b/include/BoostInstall.cmake index 9440581..d5ba171 100644 --- a/include/BoostInstall.cmake +++ b/include/BoostInstall.cmake @@ -338,12 +338,14 @@ function(boost_install_target) endif() set(__INSTALL_CXX_MODULES) + set(__EXPORT_CXX_MODULES_CONFIG_FILES) if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.28) get_target_property(INTERFACE_CXX_MODULE_SETS ${LIB} INTERFACE_CXX_MODULE_SETS) if(INTERFACE_CXX_MODULE_SETS) boost_message(DEBUG "boost_install_target: '${__TARGET}' has INTERFACE_CXX_MODULE_SETS=${INTERFACE_CXX_MODULE_SETS}") set(extrainstalldir "${CMAKE_INSTALL_DATADIR}/boost-${__VERSION}/${LIB}") set(__INSTALL_CXX_MODULES FILE_SET ${INTERFACE_CXX_MODULE_SETS} DESTINATION ${extrainstalldir}) + set(__EXPORT_CXX_MODULES_CONFIG_FILES CXX_MODULES_DIRECTORY .) endif() endif() @@ -363,13 +365,13 @@ function(boost_install_target) ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" PRIVATE_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" - # explicit needed if used starting with cmake v3.28 - # XXX FILE_SET CXX_MODULES DESTINATION "${CMAKE_INSTALL_DATADIR}" + # NOTE: explicit needed if used starting with cmake v3.28! + # optional install: FILE_SET CXX_MODULES DESTINATION "${CMAKE_INSTALL_DATADIR}" ${__INSTALL_CXX_MODULES} - # Any module files from C++ modules from PUBLIC sources in a file set of type CXX_MODULES will be installed to the given DESTINATION. - # TODO(CK) ${__INSTALL_CXX_MODULES_BMI} - # NOTE: explicit needed if used starting with cmake v3.23 - # XXX FILE_SET HEADERS + # NOTE: explicit needed if used starting with cmake v3.23! + # Any module files from C++ modules from PUBLIC sources in a file set + # of type CXX_MODULES will be installed to the given DESTINATION. + # optional install: FILE_SET HEADERS ${__INSTALL_HEADER_SETS} ) @@ -391,7 +393,9 @@ function(boost_install_target) endif() install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake - CXX_MODULES_DIRECTORY . + # NOTE: explicit needed if used starting with cmake v3.28! + # optional install config packages for: FILE_SET CXX_MODULES + ${__EXPORT_CXX_MODULES_CONFIG_FILES} ) set_target_properties(${LIB} PROPERTIES _boost_is_installed ON)