From f68b46ff5df2d71721b45d2790f3f48e68359ffd Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Tue, 24 Feb 2026 18:49:15 +0100 Subject: [PATCH] Use header only lib for fmt-c Use FILE_SET HEADERS with modules --- CMakeLists.txt | 58 ++++++++++++++++++++++++++++++++------------- test/CMakeLists.txt | 9 +++---- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d407d5cd..f7d2c9fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ endfunction() # DEPRECATED! Should be merged into add_module_library. function(enable_module target) if (MSVC) - if(NOT CMAKE_GENERATOR STREQUAL "Ninja") + if (NOT CMAKE_GENERATOR STREQUAL "Ninja") set(BMI_DIR "${CMAKE_CURRENT_BINARY_DIR}") file(TO_NATIVE_PATH "${BMI_DIR}/${target}.ifc" BMI) target_compile_options(${target} @@ -38,7 +38,7 @@ function(enable_module target) INTERFACE /reference fmt=${BMI}) set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI}) set_source_files_properties(${BMI} PROPERTIES GENERATED ON) - endif() + endif () endif () endfunction() @@ -76,10 +76,10 @@ function(add_module_library name) target_compile_options(${name} PUBLIC -fmodules-ts) if (CMAKE_VERSION VERSION_GREATER_EQUAL 4.3) option(FMT_IMPORT_STD "Enable use of import std;" OFF) - endif() + endif () endif () - if(FMT_USE_CMAKE_MODULES AND FMT_IMPORT_STD) + if (FMT_USE_CMAKE_MODULES AND FMT_IMPORT_STD) # ------------------------------------------------------------------------- # Tell CMake that we explicitly want `import std`. # This will initialize the property on all targets declared after this to 1 @@ -88,20 +88,20 @@ function(add_module_library name) STATUS "CMAKE_CXX_COMPILER_IMPORT_STD=${CMAKE_CXX_COMPILER_IMPORT_STD}" ) - if(${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) + if (${CMAKE_CXX_STANDARD} IN_LIST CMAKE_CXX_COMPILER_IMPORT_STD) message(STATUS "Use FMT_IMPORT_STD=${FMT_IMPORT_STD}") - target_compile_definitions(${name} PUBLIC FMT_IMPORT_STD) + target_compile_definitions(${name} PUBLIC FMT_IMPORT_STD FMT_USE_FCNTL=0) message(STATUS "Use CXX_MODULE_STD=ON") set_target_properties(${name} PROPERTIES CXX_MODULE_STD ON) - else() + else () message(WARNING "CXX_MODULE_STD=OFF") - endif() - endif() + endif () + endif () if (FMT_USE_CMAKE_MODULES) target_sources(${name} PUBLIC FILE_SET fmt TYPE CXX_MODULES FILES ${sources}) - else() + else () # `std` is affected by CMake options and may be higher than C++20. get_target_property(std ${name} CXX_STANDARD) @@ -144,7 +144,7 @@ function(add_module_library name) endforeach () endif () target_sources(${name} PRIVATE ${sources}) - endif() + endif () endfunction() include(CMakeParseArguments) @@ -198,7 +198,7 @@ option(FMT_UNICODE "Enable Unicode support." ON) if (FMT_TEST AND FMT_MODULE) # The tests require {fmt} to be compiled as traditional library - message(WARNING "Testing is incompatible with build mode 'module'.") + message(STATUS "Testing is incompatible with build mode 'module'.") endif () set(FMT_SYSTEM_HEADERS_ATTRIBUTE "") if (FMT_SYSTEM_HEADERS) @@ -335,7 +335,7 @@ if (FMT_MODULE) enable_module(fmt) elseif (FMT_OS) target_sources(fmt PRIVATE src/os.cc) -else() +else () target_compile_definitions(fmt PRIVATE FMT_OS=0) endif () @@ -388,6 +388,31 @@ endif () add_library(fmt-header-only INTERFACE) add_library(fmt::fmt-header-only ALIAS fmt-header-only) +if (FMT_USE_CMAKE_MODULES) + target_sources( + fmt-header-only + PUBLIC + FILE_SET HEADERS + BASE_DIRS include + FILES + include/fmt/ostream.h + include/fmt/format-inl.h + include/fmt/ranges.h + include/fmt/xchar.h + include/fmt/core.h + include/fmt/chrono.h + include/fmt/os.h + include/fmt/color.h + include/fmt/args.h + include/fmt/printf.h + include/fmt/compile.h + include/fmt/format.h + include/fmt/fmt-c.h + include/fmt/std.h + include/fmt/base.h +) +endif () + if (NOT MSVC) # Unicode is always supported on compilers other than MSVC. elseif (FMT_UNICODE) @@ -400,6 +425,7 @@ endif () target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1) target_compile_features(fmt-header-only INTERFACE cxx_std_11) +set_target_properties(fmt-header-only PROPERTIES VERIFY_INTERFACE_HEADER_SETS ${PROJECT_IS_TOP_LEVEL}) target_include_directories(fmt-header-only ${FMT_SYSTEM_HEADERS_ATTRIBUTE} BEFORE INTERFACE @@ -411,7 +437,7 @@ target_compile_features(fmt-c INTERFACE c_std_11) if (MSVC) target_compile_options(fmt-c PUBLIC /Zc:preprocessor) endif () -target_link_libraries(fmt-c PUBLIC fmt::fmt) +target_link_libraries(fmt-c PUBLIC fmt::fmt-header-only) add_library(fmt::fmt-c ALIAS fmt-c) # Install targets. @@ -457,8 +483,8 @@ if (FMT_INSTALL) set(INSTALL_FILE_SET) if (FMT_USE_CMAKE_MODULES) - set(INSTALL_FILE_SET FILE_SET fmt DESTINATION "${FMT_INC_DIR}/fmt") - endif() + set(INSTALL_FILE_SET FILE_SET fmt DESTINATION "${FMT_INC_DIR}/fmt" FILE_SET HEADERS) + endif () # Install the library and headers. install(TARGETS ${INSTALL_TARGETS} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index a086082b..84936600 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,8 @@ +if (FMT_MODULE) + message(WARNING "Testing is incompatible with build mode 'module'.") + return () +endif () + add_subdirectory(gtest) set(TEST_MAIN_SRC test-main.cc gtest-extra.cc gtest-extra.h util.cc) @@ -41,10 +46,6 @@ function(add_fmt_test name) add_test(NAME ${name} COMMAND ${name}) endfunction() -if (FMT_MODULE) - return () -endif () - add_fmt_test(args-test) add_fmt_test(base-test) add_fmt_test(assert-test)