diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c947b12..095c67d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,20 +5,19 @@ 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) +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(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? -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) +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) @@ -27,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::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() @@ -71,17 +70,12 @@ option( ${PROJECT_IS_TOP_LEVEL} ) -option( - BEMAN_EXECUTION_ENABLE_INSTALL - "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() @@ -92,35 +86,3 @@ if(BEMAN_EXECUTION_BUILD_EXAMPLES) add_subdirectory(examples) add_subdirectory(docs/code) endif() - -if(NOT BEMAN_EXECUTION_ENABLE_INSTALL 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} -) - -set(CPACK_GENERATOR TGZ) -include(CPack) diff --git a/Makefile b/Makefile index 3e13a1ca..768395d0 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,16 +113,20 @@ 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 \ - -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=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)" @@ -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/beman-install-library-config.cmake b/cmake/beman-install-library-config.cmake new file mode 100644 index 00000000..4ad27ff2 --- /dev/null +++ b/cmake/beman-install-library-config.cmake @@ -0,0 +1,251 @@ +# 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() + + # 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}") + + # 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}") + 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( + "${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}") + + 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}") + set_target_properties( + "${target_name}_${interface}" + PROPERTIES EXPORT_NAME "${component_name}_${interface}" + ) + message( + VERBOSE + "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() + + if(CMAKE_SKIP_INSTALL_RULES) + message( + WARNING + "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 + ${__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) + 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: Export cmake config to ${package_install_dir} 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" + ) + 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() + +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/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/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/examples/CMakeLists.txt b/examples/CMakeLists.txt index aadb6ccc..71ffabca 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -12,11 +12,7 @@ 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) + find_package(beman.execution 0.2.0 EXACT REQUIRED) enable_testing() endif() @@ -39,7 +35,6 @@ set(EXAMPLES ) if(BEMAN_USE_MODULES) - # FIXME: not yet! list(APPEND EXAMPLES modules) # modules.cpp endif() @@ -48,11 +43,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..10774bac 100644 --- a/src/beman/execution/CMakeLists.txt +++ b/src/beman/execution/CMakeLists.txt @@ -3,15 +3,13 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception # gersemi: on -if(NOT TARGET ${TARGET_NAME}) - add_library(${TARGET_NAME} INTERFACE) -endif() -add_library(beman::${TARGET_NAME} ALIAS ${TARGET_NAME}) +add_library(${TARGET_NAME} INTERFACE) +add_library(beman::execution_headers ALIAS ${TARGET_NAME}) target_sources( ${TARGET_NAME} PUBLIC - FILE_SET ${TARGET_NAME}_public_headers + FILE_SET public_headers TYPE HEADERS BASE_DIRS ${PROJECT_SOURCE_DIR}/include FILES @@ -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 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 @@ -195,52 +193,24 @@ 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( - 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_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 - . -) 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