diff --git a/CMakeLists.txt b/CMakeLists.txt index f455783ff..e6589e5de 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) @@ -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/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 6ac1d549a..89f68af3a 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}) @@ -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_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..9daa9a392 --- /dev/null +++ b/test_installed_version.bash @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" +build_root="${repo_root}/build" +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 +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=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=YES \ + -D MAGIC_ENUM_MODULE_WITH_FMT=NO \ + -D MAGIC_ENUM_OPT_BUILD_EXAMPLES=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 -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 +ctest --test-dir "${source_build_dir}" --output-on-failure --no-tests=error + +# 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 "${pkgconfig_consumer_build_dir}" \ +# -D MAGIC_ENUM_OPT_TEST_INSTALLED_VERSION_PKGCONFIG=ON \ +# -D PKG_CONFIG_USE_CMAKE_PREFIX_PATH=ON +