Simplify build-tree export and rename INSTALL_TARGETS

Rename INSTALL_TARGETS to FMT_TARGETS since the list is now used for both
installation and the build-tree export, and move INSTALL_FILE_SET into the
FMT_INSTALL block as only install(TARGETS) uses it.

Replace the export-test static library and export-lib.cc with an INTERFACE
library, which reproduces the same CMake export dependency check (#4806).
This commit is contained in:
Victor Zverovich 2026-07-22 11:24:25 -07:00
parent bcaa44d055
commit 4e5ff510f8
3 changed files with 14 additions and 19 deletions

View File

@ -442,13 +442,10 @@ set_target_properties(fmt-c PROPERTIES PUBLIC_HEADER include/fmt/fmt-c.h)
# Install targets. # Install targets.
set(targets_export_name fmt-targets) set(targets_export_name fmt-targets)
set(INSTALL_TARGETS fmt fmt-header-only fmt-c) set(FMT_TARGETS fmt fmt-header-only fmt-c)
if (FMT_MODULE) if (FMT_MODULE)
list(APPEND INSTALL_TARGETS fmt-module) list(APPEND FMT_TARGETS fmt-module)
if (FMT_USE_CMAKE_MODULES)
set(INSTALL_FILE_SET FILE_SET fmt DESTINATION ${FMT_INC_DIR}/fmt)
endif ()
endif () endif ()
if (FMT_INSTALL) if (FMT_INSTALL)
@ -495,8 +492,11 @@ if (FMT_INSTALL)
INSTALL_DESTINATION ${FMT_CMAKE_DIR}) INSTALL_DESTINATION ${FMT_CMAKE_DIR})
# Install the library and headers. # Install the library and headers.
if (FMT_MODULE AND FMT_USE_CMAKE_MODULES)
set(INSTALL_FILE_SET FILE_SET fmt DESTINATION ${FMT_INC_DIR}/fmt)
endif ()
install( install(
TARGETS ${INSTALL_TARGETS} TARGETS ${FMT_TARGETS}
COMPONENT fmt_core COMPONENT fmt_core
EXPORT ${targets_export_name} EXPORT ${targets_export_name}
LIBRARY DESTINATION ${FMT_LIB_DIR} LIBRARY DESTINATION ${FMT_LIB_DIR}
@ -521,12 +521,12 @@ if (FMT_INSTALL)
COMPONENT fmt_core) COMPONENT fmt_core)
endif () endif ()
# Generate an export file in the build tree so that fmt can be used by # Generate a build-tree export so that targets depending on fmt can also be
# add_subdirectory() or FetchContent without being installed. Use a # exported without installing fmt, including when fmt is provided through
# namespace because CMake provides better diagnostics for namespaced # add_subdirectory() or FetchContent. Use a namespace because CMake provides
# imported targets. # better diagnostics for namespaced imported targets.
export( export(
TARGETS ${INSTALL_TARGETS} TARGETS ${FMT_TARGETS}
NAMESPACE fmt:: NAMESPACE fmt::
FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake) FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)

View File

@ -16,11 +16,9 @@ if (TARGET fmt::fmt-header-only)
target_link_libraries(header-only-test fmt::fmt-header-only) target_link_libraries(header-only-test fmt::fmt-header-only)
endif () endif ()
# Test that a target publicly depending on fmt can itself be exported even # Test that a target depending on fmt can itself be exported (#4806).
# though fmt is added via add_subdirectory and FMT_INSTALL is off (#4806). add_library(export-test INTERFACE)
add_library(export-test STATIC export-lib.cc) target_link_libraries(export-test INTERFACE fmt::fmt)
target_link_libraries(export-test PUBLIC fmt::fmt)
export( export(
TARGETS export-test TARGETS export-test
NAMESPACE test::
FILE ${CMAKE_CURRENT_BINARY_DIR}/export-test-targets.cmake) FILE ${CMAKE_CURRENT_BINARY_DIR}/export-test-targets.cmake)

View File

@ -1,3 +0,0 @@
#include "fmt/base.h"
void greet(const char* name) { fmt::print("Hello, {}!\n", name); }