From a54c04134755fbbdc5c9344f79f0c70be3667fff Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Thu, 6 Aug 2026 21:50:43 +0200 Subject: [PATCH 1/3] Prepare import std; --- CMakeLists.txt | 10 ++--- example/CMakeLists.txt | 2 +- test/CMakeLists.txt | 2 +- test/installed_module/CMakeLists.txt | 2 +- test_installed_version.bash | 65 ++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 test_installed_version.bash diff --git a/CMakeLists.txt b/CMakeLists.txt index f455783ff..5dfc81cb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,7 +106,7 @@ if(MAGIC_ENUM_OPT_VERIFY_INTERFACE_HEADER_SETS) if(CMAKE_VERSION VERSION_LESS "3.24") message(FATAL_ERROR "MAGIC_ENUM_OPT_VERIFY_INTERFACE_HEADER_SETS requires CMake >= 3.24") endif() - set_property(TARGET ${PROJECT_NAME} PROPERTY VERIFY_INTERFACE_HEADER_SETS ON) + set_property(TARGET ${PROJECT_NAME} PROPERTY VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL}) endif() set(MAGIC_ENUM_MODULE_FMT_TARGET) @@ -164,16 +164,16 @@ function(magic_enum_make_module_library name) target_compile_features(${name} PUBLIC cxx_std_${MAGIC_ENUM_MODULE_CXX_STANDARD}) if(ARGC GREATER 1) # Optional private definitions build test variants with custom magic_enum configurations. - target_compile_definitions(${name} PRIVATE ${ARGN}) + target_compile_definitions(${name} PUBLIC ${ARGN}) endif() # Module-only definitions stay private; CMake exports them for installed module sources without propagating them to importers. if(MAGIC_ENUM_MODULE_FMT_TARGET) target_link_libraries(${name} PUBLIC ${MAGIC_ENUM_MODULE_FMT_TARGET}) if(MAGIC_ENUM_MODULE_USES_FMT_MODULE) - target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_FMT_MODULE) + target_compile_definitions(${name} PUBLIC MAGIC_ENUM_USE_FMT_MODULE) else() - target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_FMT_HEADER) + target_compile_definitions(${name} PUBLIC MAGIC_ENUM_USE_FMT_HEADER) endif() endif() @@ -192,7 +192,7 @@ function(magic_enum_make_module_library name) endif() message(STATUS "${name}: using import std") set_property(TARGET ${name} PROPERTY CXX_MODULE_STD ON) - target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_STD_MODULE) + target_compile_definitions(${name} PUBLIC MAGIC_ENUM_USE_STD_MODULE) elseif(CMAKE_VERSION VERSION_GREATER_EQUAL "3.31") set_property(TARGET ${name} PROPERTY CXX_MODULE_STD OFF) endif() diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 420880c4d..605691f5c 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -45,6 +45,6 @@ if(MAGIC_ENUM_USE_MODULES) set_target_properties(example_module_usage PROPERTIES CXX_SCAN_FOR_MODULES ON) if(MAGIC_ENUM_MODULE_IMPORT_STD) set_property(TARGET example_module_usage PROPERTY CXX_MODULE_STD ON) - target_compile_definitions(example_module_usage PRIVATE MAGIC_ENUM_TEST_IMPORT_STD) + # XXX target_compile_definitions(example_module_usage PRIVATE MAGIC_ENUM_TEST_IMPORT_STD) endif() endif() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6ac1d549a..9cfa87d13 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -116,7 +116,7 @@ function(magic_enum_make_module_test src target module_target) CXX_SCAN_FOR_MODULES ON ) if(MAGIC_ENUM_MODULE_IMPORT_STD) - target_compile_definitions(${target} PRIVATE MAGIC_ENUM_TEST_IMPORT_STD) + # XXX target_compile_definitions(${target} PRIVATE MAGIC_ENUM_TEST_IMPORT_STD) set_property(TARGET ${target} PROPERTY CXX_MODULE_STD ON) endif() add_test(NAME ${target} COMMAND ${target}) diff --git a/test/installed_module/CMakeLists.txt b/test/installed_module/CMakeLists.txt index 58bfd632b..754291ad7 100644 --- a/test/installed_module/CMakeLists.txt +++ b/test/installed_module/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.28) +cmake_minimum_required(VERSION 3.30...4.4) project(magic_enum_installed_module_test LANGUAGES CXX) diff --git a/test_installed_version.bash b/test_installed_version.bash new file mode 100644 index 000000000..778ebfd2c --- /dev/null +++ b/test_installed_version.bash @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +build_root="${repo_root}/build-installed-version" +source_build_dir="${build_root}/source" +configured_install_dir="${build_root}/configured-install" +install_dir="${build_root}/install" +consumer_prefix="${build_root}/relocated-install" +cmake_consumer_build_dir="${build_root}/cmake-consumer" +pkgconfig_consumer_build_dir="${build_root}/pkgconfig-consumer" +cxx_modules_consumer_build_dir="${build_root}/cxx_modules-consumer" + +test_installed_consumer() { + local build_dir="$1" + shift + + CMAKE_PREFIX_PATH="${consumer_prefix}" cmake -S "${repo_root}" -B "${build_dir}" \ + -G Ninja \ + -D CMAKE_BUILD_TYPE=Debug \ + "$@" + cmake --build "${build_dir}" --parallel + ctest --test-dir "${build_dir}" --output-on-failure --no-tests=error +} + +cmake --version +# XXX cmake -E remove_directory "${build_root}" + +cmake -S "${repo_root}" -B "${source_build_dir}" -G Ninja \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_CXX_STANDARD=26 \ + -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ + -D CMAKE_INSTALL_PREFIX="${configured_install_dir}" \ + -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ + -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ + -D MAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF \ + -D MAGIC_ENUM_OPT_BUILD_TESTS=OFF \ + -D MAGIC_ENUM_OPT_INSTALL=ON \ + -D MAGIC_ENUM_OPT_VERIFY_INTERFACE_HEADER_SETS=ON \ + -D MAGIC_ENUM_USE_MODULES=ON # XXX --fresh +cmake --build "${source_build_dir}" \ + --target magic_enum_verify_interface_header_sets \ + --parallel +cmake --build "${source_build_dir}" \ + --target all \ + --parallel +cmake --install "${source_build_dir}" --prefix "${install_dir}" +cmake -E copy_directory "${install_dir}" "${consumer_prefix}" + +test_installed_consumer "${cxx_modules_consumer_build_dir}" \ + -D CMAKE_CXX_STANDARD=26 \ + -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ + -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ + -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ + -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON \ + -D MAGIC_ENUM_USE_MODULES=ON \ + -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=OFF # XXX --fresh + +test_installed_consumer "${cmake_consumer_build_dir}" \ + -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON + +test_installed_consumer "${pkgconfig_consumer_build_dir}" \ + -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG=ON \ + -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON + From 75bf6ca98f433f461d93d3ff26e12f93343b83d5 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Fri, 7 Aug 2026 17:06:21 +0200 Subject: [PATCH 2/3] Only to show the problems --- test_installed_version.bash | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test_installed_version.bash b/test_installed_version.bash index 778ebfd2c..d7cbf39b1 100644 --- a/test_installed_version.bash +++ b/test_installed_version.bash @@ -28,16 +28,16 @@ cmake --version cmake -S "${repo_root}" -B "${source_build_dir}" -G Ninja \ -D CMAKE_BUILD_TYPE=Release \ - -D CMAKE_CXX_STANDARD=26 \ + -D CMAKE_CXX_STANDARD=20 \ -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ -D CMAKE_INSTALL_PREFIX="${configured_install_dir}" \ - -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ - -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ + -D MAGIC_ENUM_MODULE_IMPORT_STD=NO \ + -D MAGIC_ENUM_MODULE_WITH_FMT=YES \ -D MAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF \ -D MAGIC_ENUM_OPT_BUILD_TESTS=OFF \ -D MAGIC_ENUM_OPT_INSTALL=ON \ -D MAGIC_ENUM_OPT_VERIFY_INTERFACE_HEADER_SETS=ON \ - -D MAGIC_ENUM_USE_MODULES=ON # XXX --fresh + -D MAGIC_ENUM_USE_MODULES=YES --fresh cmake --build "${source_build_dir}" \ --target magic_enum_verify_interface_header_sets \ --parallel @@ -48,13 +48,13 @@ cmake --install "${source_build_dir}" --prefix "${install_dir}" cmake -E copy_directory "${install_dir}" "${consumer_prefix}" test_installed_consumer "${cxx_modules_consumer_build_dir}" \ - -D CMAKE_CXX_STANDARD=26 \ + -D CMAKE_CXX_STANDARD=20 \ -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ - -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ - -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ + -D MAGIC_ENUM_MODULE_IMPORT_STD=NO \ + -D MAGIC_ENUM_MODULE_WITH_FMT=YES \ -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON \ - -D MAGIC_ENUM_USE_MODULES=ON \ - -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=OFF # XXX --fresh + -D MAGIC_ENUM_USE_MODULES=NO \ + -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=YES --fresh test_installed_consumer "${cmake_consumer_build_dir}" \ -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON From 45731a26eccb4b50c0dfc7fc4e4b2209fa4b68b9 Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Fri, 7 Aug 2026 22:49:51 +0200 Subject: [PATCH 3/3] Add missing find-package-test for import std --- CMakeLists.txt | 6 ++--- module/magic_enum.cppm | 7 +++--- test/CMakeLists.txt | 39 +++++++++++++++++++++++++++++++ test_installed_version.bash | 46 +++++++++++++++++++------------------ 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5dfc81cb8..e6589e5de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -164,16 +164,16 @@ function(magic_enum_make_module_library name) target_compile_features(${name} PUBLIC cxx_std_${MAGIC_ENUM_MODULE_CXX_STANDARD}) if(ARGC GREATER 1) # Optional private definitions build test variants with custom magic_enum configurations. - target_compile_definitions(${name} PUBLIC ${ARGN}) + target_compile_definitions(${name} PRIVATE ${ARGN}) endif() # Module-only definitions stay private; CMake exports them for installed module sources without propagating them to importers. if(MAGIC_ENUM_MODULE_FMT_TARGET) target_link_libraries(${name} PUBLIC ${MAGIC_ENUM_MODULE_FMT_TARGET}) if(MAGIC_ENUM_MODULE_USES_FMT_MODULE) - target_compile_definitions(${name} PUBLIC MAGIC_ENUM_USE_FMT_MODULE) + target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_FMT_MODULE) else() - target_compile_definitions(${name} PUBLIC MAGIC_ENUM_USE_FMT_HEADER) + target_compile_definitions(${name} PRIVATE MAGIC_ENUM_USE_FMT_HEADER) endif() endif() diff --git a/module/magic_enum.cppm b/module/magic_enum.cppm index dc3cefb3c..468fb9b6d 100644 --- a/module/magic_enum.cppm +++ b/module/magic_enum.cppm @@ -1,12 +1,13 @@ module; #include -#ifdef MAGIC_ENUM_USE_FMT_HEADER -# include -#endif #ifndef MAGIC_ENUM_USE_STD_MODULE +# ifdef MAGIC_ENUM_USE_FMT_HEADER +# include +# endif + # include # include # if __has_include() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9cfa87d13..89f68af3a 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -259,3 +259,42 @@ if(MAGIC_ENUM_USE_MODULES AND MAGIC_ENUM_OPT_INSTALL AND ) set_tests_properties(installed-module-consumer PROPERTIES FIXTURES_REQUIRED magic_enum_installed_module) endif() + +if(NOT CMAKE_BUILD_TYPE STREQUAL "Release") + return() +endif() + +#====================================================================== +# NOTE: Only for Release build with enabled install rules useful! CK +#====================================================================== +if(MAGIC_ENUM_MODULE_IMPORT_STD AND MAGIC_ENUM_OPT_INSTALL AND NOT CMAKE_SKIP_INSTALL_RULES) + # test if the targets are usable from the install directory + add_test( + NAME install-to-stagedir + COMMAND + ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --prefix + ${CMAKE_CURRENT_BINARY_DIR}/stagedir --config $ + ) + add_test( + NAME find-package-test + COMMAND + ${CMAKE_CTEST_COMMAND} # --verbose + --output-on-failure -C $ # + --build-and-test "${CMAKE_SOURCE_DIR}/test/installed_module" + "${CMAKE_CURRENT_BINARY_DIR}/find-package-test" # + --build-generator ${CMAKE_GENERATOR} # + --build-makeprogram ${CMAKE_MAKE_PROGRAM} # + --build-options # + "-D MAGIC_ENUM_EXPECT_FMT=${MAGIC_ENUM_MODULE_WITH_FMT}" + "-D MAGIC_ENUM_EXPECT_FMT_MODULE=${MAGIC_ENUM_MODULE_USES_FMT_MODULE}" + "-D MAGIC_ENUM_EXPECT_IMPORT_STD=${MAGIC_ENUM_MODULE_IMPORT_STD}" + "-D CMAKE_BUILD_TYPE=$" + "-D CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" + "-D CMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}" + "-D CMAKE_CXX_MODULE_STD=${CMAKE_CXX_MODULE_STD}" + "-D CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}" + "-D CMAKE_CXX_STANDARD_REQUIRED=${CMAKE_CXX_STANDARD_REQUIRED}" + "-D CMAKE_PREFIX_PATH=${CMAKE_CURRENT_BINARY_DIR}/stagedir" + "-D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=${CMAKE_EXPERIMENTAL_CXX_IMPORT_STD}" + ) +endif() diff --git a/test_installed_version.bash b/test_installed_version.bash index d7cbf39b1..9daa9a392 100644 --- a/test_installed_version.bash +++ b/test_installed_version.bash @@ -2,7 +2,7 @@ set -euo pipefail repo_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" -build_root="${repo_root}/build-installed-version" +build_root="${repo_root}/build" source_build_dir="${build_root}/source" configured_install_dir="${build_root}/configured-install" install_dir="${build_root}/install" @@ -24,42 +24,44 @@ test_installed_consumer() { } cmake --version -# XXX cmake -E remove_directory "${build_root}" +cmake -E remove_directory "${build_root}" cmake -S "${repo_root}" -B "${source_build_dir}" -G Ninja \ -D CMAKE_BUILD_TYPE=Release \ - -D CMAKE_CXX_STANDARD=20 \ + -D CMAKE_CXX_STANDARD=23 \ -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ -D CMAKE_INSTALL_PREFIX="${configured_install_dir}" \ - -D MAGIC_ENUM_MODULE_IMPORT_STD=NO \ - -D MAGIC_ENUM_MODULE_WITH_FMT=YES \ + -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ + -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ -D MAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF \ - -D MAGIC_ENUM_OPT_BUILD_TESTS=OFF \ + -D MAGIC_ENUM_OPT_BUILD_TESTS=YES \ -D MAGIC_ENUM_OPT_INSTALL=ON \ -D MAGIC_ENUM_OPT_VERIFY_INTERFACE_HEADER_SETS=ON \ - -D MAGIC_ENUM_USE_MODULES=YES --fresh + -D MAGIC_ENUM_USE_MODULES=YES -Wdev --log-level=VERBOSE # XXX --fresh cmake --build "${source_build_dir}" \ --target magic_enum_verify_interface_header_sets \ --parallel cmake --build "${source_build_dir}" \ --target all \ --parallel -cmake --install "${source_build_dir}" --prefix "${install_dir}" -cmake -E copy_directory "${install_dir}" "${consumer_prefix}" +ctest --test-dir "${source_build_dir}" --output-on-failure --no-tests=error -test_installed_consumer "${cxx_modules_consumer_build_dir}" \ - -D CMAKE_CXX_STANDARD=20 \ - -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ - -D MAGIC_ENUM_MODULE_IMPORT_STD=NO \ - -D MAGIC_ENUM_MODULE_WITH_FMT=YES \ - -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON \ - -D MAGIC_ENUM_USE_MODULES=NO \ - -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=YES --fresh +# cmake --install "${source_build_dir}" --prefix "${install_dir}" +# cmake -E copy_directory "${install_dir}" "${consumer_prefix}" + +# test_installed_consumer "${cxx_modules_consumer_build_dir}" \ +# -D CMAKE_CXX_STANDARD=23 \ +# -D CMAKE_EXPERIMENTAL_CXX_IMPORT_STD=f35a9ac6-8463-4d38-8eec-5d6008153e7d \ +# -D MAGIC_ENUM_MODULE_IMPORT_STD=YES \ +# -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ +# -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON \ +# -D MAGIC_ENUM_USE_MODULES=YES \ +# -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=YES --fresh -test_installed_consumer "${cmake_consumer_build_dir}" \ - -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON +# test_installed_consumer "${cmake_consumer_build_dir}" \ +# -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION=ON -test_installed_consumer "${pkgconfig_consumer_build_dir}" \ - -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG=ON \ - -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON +# test_installed_consumer "${pkgconfig_consumer_build_dir}" \ +# -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG=ON \ +# -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON