diff --git a/CMakeLists.txt b/CMakeLists.txt index ed72b6a0..58de2a65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -108,7 +108,7 @@ add_subdirectory(src/beman/execution) #=============================================================================== # NOTE: this must be done before tests! CK -include(./cmake/beman-install-library.cmake) +include(infra/cmake/beman-install-library.cmake) beman_install_library(${BEMAN_EXECUTION_TARGET_PREFIX} TARGETS ${BEMAN_EXECUTION_TARGET_NAME} ${BEMAN_EXECUTION_TARGET_PREFIX} DEPENDENCIES Threads ) diff --git a/CMakePresets.json b/CMakePresets.json index 933a44c7..c4fcfd51 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -74,7 +74,7 @@ "_debug-base" ], "cacheVariables": { - "BEMAN_USE_STD_MODULE": false, + "BEMAN_USE_STD_MODULE": true, "CMAKE_TOOLCHAIN_FILE": "infra/cmake/llvm-libc++-toolchain.cmake" }, "environment": { diff --git a/cmake/prelude.cmake b/cmake/prelude.cmake index c7eb3a51..c0394e2a 100644 --- a/cmake/prelude.cmake +++ b/cmake/prelude.cmake @@ -17,33 +17,42 @@ endif() list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}) +# gersemi: off # --------------------------------------------------------------------------- # The CMAKE_EXPERIMENTAL_CXX_IMPORT_STD is not longer needed except for OSX # --------------------------------------------------------------------------- -if(NOT BEMAN_USE_STD_MODULE OR CMAKE_VERSION VERSION_GREATER_EQUAL 4.3) +if(NOT BEMAN_USE_STD_MODULE OR CMAKE_VERSION VERSION_GREATER_EQUAL 4.4) if(NOT APPLE) return() endif() endif() # --------------------------------------------------------------------------- -# gersemi: off # --------------------------------------------------------------------------- # check if import std; is supported by CMAKE_CXX_COMPILER # --------------------------------------------------------------------------- -if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.2 AND CMAKE_VERSION VERSION_LESS 4.3) +if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.2 AND CMAKE_VERSION VERSION_LESS 4.4) if(PROJECT_NAME) message( WARNING "This CMake file has to be included before first project() command call!" ) endif() +endif() +# --------------------------------------------------------------------------- +# check if import std; is supported by CMAKE_CXX_COMPILER +# --------------------------------------------------------------------------- +if(CMAKE_VERSION VERSION_GREATER_EQUAL 4.3 AND CMAKE_VERSION VERSION_LESS 4.4) + set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "451f2fe2-a8a2-47c3-bc32-94786d8fc91b") +elseif(CMAKE_VERSION VERSION_GREATER_EQUAL 4.2 AND CMAKE_VERSION VERSION_LESS 4.3) set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444") endif() # gersemi: on +# --------------------------------------------------------------------------- # TODO(CK): Do we need this HACK still for linux too? +# --------------------------------------------------------------------------- if(NOT APPLE) return() endif() diff --git a/etc/ci-clang-toolchain.cmake b/etc/ci-clang-toolchain.cmake deleted file mode 100755 index 8158594c..00000000 --- a/etc/ci-clang-toolchain.cmake +++ /dev/null @@ -1,44 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang++) - -set(CMAKE_CXX_FLAGS - "-std=c++20 \ - -Wall -Wextra \ - -stdlib=libc++ -fexperimental-library" - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/clang-16-toolchain.cmake b/etc/clang-16-toolchain.cmake deleted file mode 100755 index 7f268808..00000000 --- a/etc/clang-16-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-16) -set(CMAKE_CXX_COMPILER clang++-16) - -include("${CMAKE_CURRENT_LIST_DIR}/clang-flags.cmake") diff --git a/etc/clang-17-toolchain.cmake b/etc/clang-17-toolchain.cmake deleted file mode 100755 index 5e266b60..00000000 --- a/etc/clang-17-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-17) -set(CMAKE_CXX_COMPILER clang++-17) - -include("${CMAKE_CURRENT_LIST_DIR}/clang-flags.cmake") diff --git a/etc/clang-18-toolchain.cmake b/etc/clang-18-toolchain.cmake deleted file mode 100755 index 7aabeded..00000000 --- a/etc/clang-18-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-18) -set(CMAKE_CXX_COMPILER clang++-18) - -include("${CMAKE_CURRENT_LIST_DIR}/clang-flags.cmake") diff --git a/etc/clang-19-toolchain.cmake b/etc/clang-19-toolchain.cmake deleted file mode 100755 index 48f6e07a..00000000 --- a/etc/clang-19-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-19) -set(CMAKE_CXX_COMPILER clang++-19) - -include("${CMAKE_CURRENT_LIST_DIR}/clang-flags.cmake") diff --git a/etc/clang-flags.cmake b/etc/clang-flags.cmake deleted file mode 100644 index abef953b..00000000 --- a/etc/clang-flags.cmake +++ /dev/null @@ -1,41 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_CXX_STANDARD 23) - -set(CMAKE_CXX_FLAGS - "-stdlib=libc++ -Wall -Wextra" - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/clang-toolchain.cmake b/etc/clang-toolchain.cmake deleted file mode 100755 index 7d02a79a..00000000 --- a/etc/clang-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang) -set(CMAKE_CXX_COMPILER clang++) - -include("${CMAKE_CURRENT_LIST_DIR}/clang-flags.cmake") diff --git a/etc/gcc-11-toolchain.cmake b/etc/gcc-11-toolchain.cmake deleted file mode 100755 index d45db1e4..00000000 --- a/etc/gcc-11-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -include("${CMAKE_CURRENT_LIST_DIR}/gcc-flags.cmake") - -set(CMAKE_C_COMPILER gcc-11) -set(CMAKE_CXX_COMPILER g++-11) diff --git a/etc/gcc-12-toolchain.cmake b/etc/gcc-12-toolchain.cmake deleted file mode 100755 index 5e332219..00000000 --- a/etc/gcc-12-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -include("${CMAKE_CURRENT_LIST_DIR}/gcc-flags.cmake") - -set(CMAKE_C_COMPILER gcc-12) -set(CMAKE_CXX_COMPILER g++-12) diff --git a/etc/gcc-13-toolchain.cmake b/etc/gcc-13-toolchain.cmake deleted file mode 100755 index 4d174705..00000000 --- a/etc/gcc-13-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -include("${CMAKE_CURRENT_LIST_DIR}/gcc-flags.cmake") - -set(CMAKE_C_COMPILER gcc-13) -set(CMAKE_CXX_COMPILER g++-13) diff --git a/etc/gcc-14-toolchain.cmake b/etc/gcc-14-toolchain.cmake deleted file mode 100755 index f9692866..00000000 --- a/etc/gcc-14-toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -include("${CMAKE_CURRENT_LIST_DIR}/gcc-flags.cmake") - -set(CMAKE_C_COMPILER gcc-14) -set(CMAKE_CXX_COMPILER g++-14) diff --git a/etc/gcc-flags.cmake b/etc/gcc-flags.cmake deleted file mode 100644 index dbf06019..00000000 --- a/etc/gcc-flags.cmake +++ /dev/null @@ -1,36 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_CXX_STANDARD 23) - -set(CMAKE_CXX_FLAGS "-std=c++23 -Wall -Wextra" CACHE STRING "CXX_FLAGS" FORCE) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=undefined" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/gcc-toolchain.cmake b/etc/gcc-toolchain.cmake deleted file mode 100755 index 960bbf28..00000000 --- a/etc/gcc-toolchain.cmake +++ /dev/null @@ -1,43 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER gcc) -set(CMAKE_CXX_COMPILER g++) - -set(CMAKE_CXX_FLAGS - "-std=c++20 \ - -Wall -Wextra" - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address,undefined,leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/llvm-16-toolchain.cmake b/etc/llvm-16-toolchain.cmake deleted file mode 100755 index 317eb15f..00000000 --- a/etc/llvm-16-toolchain.cmake +++ /dev/null @@ -1,44 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-16) -set(CMAKE_CXX_COMPILER clang++-16) - -set(CMAKE_CXX_FLAGS - "-std=c++20 \ - -Wall -Wextra \ - -stdlib=libc++ -fexperimental-library" - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/llvm-master-toolchain.cmake b/etc/llvm-master-toolchain.cmake deleted file mode 100644 index 2dc4c86c..00000000 --- a/etc/llvm-master-toolchain.cmake +++ /dev/null @@ -1,51 +0,0 @@ -set(LLVM_ROOT "$ENV{LLVM_ROOT}" CACHE PATH "Path to LLVM installation") - -set(CMAKE_C_COMPILER ${LLVM_ROOT}/bin/clang) -set(CMAKE_CXX_COMPILER ${LLVM_ROOT}/bin/clang++) - -set(CMAKE_CXX_FLAGS - "-std=c++2a \ - -Wall -Wextra \ - -stdlib=libc++" - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_EXE_LINKER_FLAGS - "-Wl,-rpath,${LLVM_ROOT}/lib" - CACHE STRING - "CMAKE_EXE_LINKER_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/llvm-toolchain.cmake b/etc/llvm-toolchain.cmake deleted file mode 100755 index b0cbfbd9..00000000 --- a/etc/llvm-toolchain.cmake +++ /dev/null @@ -1,44 +0,0 @@ -include_guard(GLOBAL) - -set(CMAKE_C_COMPILER clang-14) -set(CMAKE_CXX_COMPILER clang++-14) - -set(CMAKE_CXX_FLAGS - "-std=c++20 \ - -Wall -Wextra \ - -stdlib=libstdc++ " - CACHE STRING - "CXX_FLAGS" - FORCE -) - -set(CMAKE_CXX_FLAGS_DEBUG - "-O0 -fno-inline -g3" - CACHE STRING - "C++ DEBUG Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELEASE - "-Ofast -g0 -DNDEBUG" - CACHE STRING - "C++ Release Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "-O3 -g -DNDEBUG" - CACHE STRING - "C++ RelWithDebInfo Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_TSAN - "-O3 -g -DNDEBUG -fsanitize=thread" - CACHE STRING - "C++ TSAN Flags" - FORCE -) -set(CMAKE_CXX_FLAGS_ASAN - "-O3 -g -DNDEBUG -fsanitize=address -fsanitize=undefined -fsanitize=leak" - CACHE STRING - "C++ ASAN Flags" - FORCE -) diff --git a/etc/toolchain.cmake b/etc/toolchain.cmake deleted file mode 100644 index 046d3323..00000000 --- a/etc/toolchain.cmake +++ /dev/null @@ -1,6 +0,0 @@ -include_guard(GLOBAL) - -include("${CMAKE_CURRENT_LIST_DIR}/gcc-flags.cmake") - -set(CMAKE_C_COMPILER cc) -set(CMAKE_CXX_COMPILER c++) diff --git a/infra/.beman_submodule b/infra/.beman_submodule index 48400b4a..28a06000 100644 --- a/infra/.beman_submodule +++ b/infra/.beman_submodule @@ -1,3 +1,3 @@ [beman_submodule] remote=https://github.com/bemanproject/infra.git -commit_hash=322f31d5af0e4c17878ddaba9d3fa6bcca31a7df +commit_hash=63cb577f6484f13ce3349de49ad5ce27e20bf1da diff --git a/cmake/Config.cmake.in b/infra/cmake/Config.cmake.in similarity index 86% rename from cmake/Config.cmake.in rename to infra/cmake/Config.cmake.in index 4369fb05..81adf800 100644 --- a/cmake/Config.cmake.in +++ b/infra/cmake/Config.cmake.in @@ -1,4 +1,4 @@ -# cmake/Config.cmake.in -*-cmake-*- +# cmake/Config.cmake.in -*-makefile-*- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception include(CMakeFindDependencyMacro) diff --git a/infra/cmake/beman-install-library-config.cmake b/infra/cmake/beman-install-library-config.cmake deleted file mode 100644 index c40959dd..00000000 --- a/infra/cmake/beman-install-library-config.cmake +++ /dev/null @@ -1,169 +0,0 @@ -# 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) - # Usage - # ----- - # - # beman_install_library(NAME) - # - # 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() - - # 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}") - set(install_component_name "${name}") - set(export_name "${name}") - set(package_name "${name}") - list(GET name_parts -1 component_name) - - install( - TARGETS "${target_name}" - COMPONENT "${install_component_name}" - EXPORT "${export_name}" - FILE_SET HEADERS - ) - - set_target_properties( - "${target_name}" - PROPERTIES EXPORT_NAME "${component_name}" - ) - - include(GNUInstallDirs) - - # Determine the prefix for project-specific variables - string(TOUPPER "${name}" project_prefix) - 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( - DEBUG - "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}" - ) - - set(config_targets_file "${package_name}-targets.cmake") - install( - EXPORT "${export_name}" - DESTINATION "${package_install_dir}" - NAMESPACE beman:: - FILE "${config_targets_file}" - COMPONENT "${install_component_name}" - ) - else() - message( - DEBUG - "beman-install-library: Not installing a config package for '${name}'" - ) - endif() -endfunction() diff --git a/cmake/beman-install-library.cmake b/infra/cmake/beman-install-library.cmake similarity index 82% rename from cmake/beman-install-library.cmake rename to infra/cmake/beman-install-library.cmake index ccea5d39..8a6c5a1a 100644 --- a/cmake/beman-install-library.cmake +++ b/infra/cmake/beman-install-library.cmake @@ -1,7 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -cmake_minimum_required(VERSION 3.30) - include_guard(GLOBAL) include(CMakePackageConfigHelpers) @@ -21,7 +19,6 @@ include(GNUInstallDirs) # [NAMESPACE ] # [EXPORT_NAME ] # [DESTINATION ] -# [VERSION_SUFFIX] # ) # # Arguments: @@ -52,9 +49,6 @@ 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 # ----- # @@ -88,7 +82,6 @@ function(beman_install_library name) # ---------------------------- # Argument parsing # ---------------------------- - set(options VERSION_SUFFIX) set(oneValueArgs NAMESPACE EXPORT_NAME DESTINATION) set(multiValueArgs TARGETS DEPENDENCIES) @@ -115,20 +108,7 @@ function(beman_install_library name) return() 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}") - 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 + set(_config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${name}") # ---------------------------- # Defaults @@ -197,10 +177,10 @@ function(beman_install_library name) ) foreach(_install_header_set IN LISTS _available_header_sets) list( - APPEND _install_header_set_args + APPEND + _install_header_set_args FILE_SET "${_install_header_set}" - ${_include_install_dir} COMPONENT "${install_component_name}_Development" ) @@ -219,39 +199,30 @@ function(beman_install_library name) install( TARGETS "${_tgt}" EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE - ${_lib_install_dir} - COMPONENT "${install_component_name}_Development" + ARCHIVE 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" + RUNTIME 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" + DESTINATION + ${_config_install_dir}/bmi-${CMAKE_CXX_COMPILER_ID}_$ + COMPONENT "${install_component_name}_Development" ) else() install( TARGETS "${_tgt}" EXPORT ${BEMAN_EXPORT_NAME} - ARCHIVE - ${_lib_install_dir} - COMPONENT "${install_component_name}_Development" + ARCHIVE 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" + RUNTIME COMPONENT "${install_component_name}_Runtime" ${_install_header_set_args} ) endif() @@ -272,6 +243,11 @@ function(beman_install_library name) # ---------------------------------------- # Config file installation logic + # + # Precedence (highest to lowest): + # 1. Per-package variable _INSTALL_CONFIG_FILE_PACKAGE + # 2. Allow-list BEMAN_INSTALL_CONFIG_FILE_PACKAGES (if defined) + # 3. Default: ON # ---------------------------------------- string(TOUPPER "${name}" _pkg_upper) string(REPLACE "." "_" _pkg_prefix "${_pkg_upper}") @@ -284,30 +260,26 @@ function(beman_install_library name) set(_pkg_var "${_pkg_prefix}_INSTALL_CONFIG_FILE_PACKAGE") - if(NOT DEFINED ${_pkg_var}) - set(${_pkg_var} - OFF - CACHE BOOL - "Install CMake package config files for ${name}" - ) - endif() + # Default: install config files + set(_install_config ON) - set(_install_config OFF) - - if(${_pkg_var}) - set(_install_config ON) - elseif(BEMAN_INSTALL_CONFIG_FILE_PACKAGES) - list(FIND BEMAN_INSTALL_CONFIG_FILE_PACKAGES "${name}" _idx) - if(NOT _idx EQUAL -1) - set(_install_config ON) + # If the allow-list is defined, only install for packages in the list + if(DEFINED BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + if(NOT "${name}" IN_LIST BEMAN_INSTALL_CONFIG_FILE_PACKAGES) + set(_install_config OFF) endif() endif() + # Per-package override takes highest precedence + if(DEFINED ${_pkg_var}) + set(_install_config ${${_pkg_var}}) + endif() + # ---------------------------------------- # expand dependencies # ---------------------------------------- set(_beman_find_deps "") - foreach(dep IN ITEMS ${BEMAN_DEPENDENCIES}) + foreach(dep IN LISTS BEMAN_DEPENDENCIES) message( VERBOSE "beman-install-library(${name}): Add find_dependency(${dep})" diff --git a/tests/beman/execution/CMakeLists.txt b/tests/beman/execution/CMakeLists.txt index f950efd7..ca30e35f 100644 --- a/tests/beman/execution/CMakeLists.txt +++ b/tests/beman/execution/CMakeLists.txt @@ -159,5 +159,6 @@ if(BEMAN_EXECUTION_INSTALL_CONFIG_FILE_PACKAGE AND NOT CMAKE_SKIP_INSTALL_RULES) "-D CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" "-D CMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}" "-D CMAKE_PREFIX_PATH=${CMAKE_BINARY_DIR}/stagedir" + "-D CMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" ) endif()