Skip to content

Commit f185bcb

Browse files
github-actions[bot]skyzh
authored andcommitted
bump libfmt
Signed-off-by: Alex Chi <[email protected]>
1 parent 7d9f398 commit f185bcb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+7603
-12167
lines changed

third_party/fmt/CMakeLists.txt

Lines changed: 98 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cmake_minimum_required(VERSION 3.1...3.18)
1+
cmake_minimum_required(VERSION 3.8...3.26)
22

33
# Fallback for using newer policies on CMake <3.12.
44
if(${CMAKE_VERSION} VERSION_LESS 3.12)
@@ -24,15 +24,86 @@ function(join result_var)
2424
set(${result_var} "${result}" PARENT_SCOPE)
2525
endfunction()
2626

27+
# DEPRECATED! Should be merged into add_module_library.
2728
function(enable_module target)
2829
if (MSVC)
2930
set(BMI ${CMAKE_CURRENT_BINARY_DIR}/${target}.ifc)
3031
target_compile_options(${target}
3132
PRIVATE /interface /ifcOutput ${BMI}
3233
INTERFACE /reference fmt=${BMI})
34+
set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI})
35+
set_source_files_properties(${BMI} PROPERTIES GENERATED ON)
3336
endif ()
34-
set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI})
35-
set_source_files_properties(${BMI} PROPERTIES GENERATED ON)
37+
endfunction()
38+
39+
# Adds a library compiled with C++20 module support.
40+
# `enabled` is a CMake variables that specifies if modules are enabled.
41+
# If modules are disabled `add_module_library` falls back to creating a
42+
# non-modular library.
43+
#
44+
# Usage:
45+
# add_module_library(<name> [sources...] FALLBACK [sources...] [IF enabled])
46+
function(add_module_library name)
47+
cmake_parse_arguments(AML "" "IF" "FALLBACK" ${ARGN})
48+
set(sources ${AML_UNPARSED_ARGUMENTS})
49+
50+
add_library(${name})
51+
set_target_properties(${name} PROPERTIES LINKER_LANGUAGE CXX)
52+
53+
if (NOT ${${AML_IF}})
54+
# Create a non-modular library.
55+
target_sources(${name} PRIVATE ${AML_FALLBACK})
56+
return()
57+
endif ()
58+
59+
# Modules require C++20.
60+
target_compile_features(${name} PUBLIC cxx_std_20)
61+
if (CMAKE_COMPILER_IS_GNUCXX)
62+
target_compile_options(${name} PUBLIC -fmodules-ts)
63+
endif ()
64+
65+
# `std` is affected by CMake options and may be higher than C++20.
66+
get_target_property(std ${name} CXX_STANDARD)
67+
68+
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
69+
set(pcms)
70+
foreach (src ${sources})
71+
get_filename_component(pcm ${src} NAME_WE)
72+
set(pcm ${pcm}.pcm)
73+
74+
# Propagate -fmodule-file=*.pcm to targets that link with this library.
75+
target_compile_options(
76+
${name} PUBLIC -fmodule-file=${CMAKE_CURRENT_BINARY_DIR}/${pcm})
77+
78+
# Use an absolute path to prevent target_link_libraries prepending -l
79+
# to it.
80+
set(pcms ${pcms} ${CMAKE_CURRENT_BINARY_DIR}/${pcm})
81+
add_custom_command(
82+
OUTPUT ${pcm}
83+
COMMAND ${CMAKE_CXX_COMPILER}
84+
-std=c++${std} -x c++-module --precompile -c
85+
-o ${pcm} ${CMAKE_CURRENT_SOURCE_DIR}/${src}
86+
"-I$<JOIN:$<TARGET_PROPERTY:${name},INCLUDE_DIRECTORIES>,;-I>"
87+
# Required by the -I generator expression above.
88+
COMMAND_EXPAND_LISTS
89+
DEPENDS ${src})
90+
endforeach ()
91+
92+
# Add .pcm files as sources to make sure they are built before the library.
93+
set(sources)
94+
foreach (pcm ${pcms})
95+
get_filename_component(pcm_we ${pcm} NAME_WE)
96+
set(obj ${pcm_we}.o)
97+
# Use an absolute path to prevent target_link_libraries prepending -l.
98+
set(sources ${sources} ${pcm} ${CMAKE_CURRENT_BINARY_DIR}/${obj})
99+
add_custom_command(
100+
OUTPUT ${obj}
101+
COMMAND ${CMAKE_CXX_COMPILER} $<TARGET_PROPERTY:${name},COMPILE_OPTIONS>
102+
-c -o ${obj} ${pcm}
103+
DEPENDS ${pcm})
104+
endforeach ()
105+
endif ()
106+
target_sources(${name} PRIVATE ${sources})
36107
endfunction()
37108

38109
include(CMakeParseArguments)
@@ -75,24 +146,14 @@ option(FMT_WERROR "Halt the compilation with an error on compiler warnings."
75146

76147
# Options that control generation of various targets.
77148
option(FMT_DOC "Generate the doc target." ${FMT_MASTER_PROJECT})
78-
option(FMT_INSTALL "Generate the install target." ${FMT_MASTER_PROJECT})
149+
option(FMT_INSTALL "Generate the install target." ON)
79150
option(FMT_TEST "Generate the test target." ${FMT_MASTER_PROJECT})
80151
option(FMT_FUZZ "Generate the fuzz target." OFF)
81152
option(FMT_CUDA_TEST "Generate the cuda-test target." OFF)
82153
option(FMT_OS "Include core requiring OS (Windows/Posix) " ON)
83154
option(FMT_MODULE "Build a module instead of a traditional library." OFF)
84155
option(FMT_SYSTEM_HEADERS "Expose headers with marking them as system." OFF)
85156

86-
set(FMT_CAN_MODULE OFF)
87-
if (CMAKE_CXX_STANDARD GREATER 17 AND
88-
# msvc 16.10-pre4
89-
MSVC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.29.30035)
90-
set(FMT_CAN_MODULE OFF)
91-
endif ()
92-
if (NOT FMT_CAN_MODULE)
93-
set(FMT_MODULE OFF)
94-
message(STATUS "Module support is disabled.")
95-
endif ()
96157
if (FMT_TEST AND FMT_MODULE)
97158
# The tests require {fmt} to be compiled as traditional library
98159
message(STATUS "Testing is incompatible with build mode 'module'.")
@@ -101,6 +162,10 @@ set(FMT_SYSTEM_HEADERS_ATTRIBUTE "")
101162
if (FMT_SYSTEM_HEADERS)
102163
set(FMT_SYSTEM_HEADERS_ATTRIBUTE SYSTEM)
103164
endif ()
165+
if(CMAKE_SYSTEM_NAME STREQUAL "MSDOS")
166+
set(FMT_TEST OFF)
167+
message(STATUS "MSDOS is incompatible with gtest")
168+
endif()
104169

105170
# Get version from core.h
106171
file(READ include/fmt/core.h core_h)
@@ -118,23 +183,15 @@ message(STATUS "Version: ${FMT_VERSION}")
118183
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
119184

120185
if (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
121-
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
186+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
122187
endif ()
123188

124189
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
125190
"${CMAKE_CURRENT_SOURCE_DIR}/support/cmake")
126191

127-
include(cxx14)
192+
include(CheckCXXCompilerFlag)
128193
include(JoinPaths)
129194

130-
list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_variadic_templates" index)
131-
if (${index} GREATER -1)
132-
# Use cxx_variadic_templates instead of more appropriate cxx_std_11 for
133-
# compatibility with older CMake versions.
134-
set(FMT_REQUIRED_FEATURES cxx_variadic_templates)
135-
endif ()
136-
message(STATUS "Required features: ${FMT_REQUIRED_FEATURES}")
137-
138195
if (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)
139196
set_verbose(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING
140197
"Preset for the export of private symbols")
@@ -220,28 +277,31 @@ endfunction()
220277
add_headers(FMT_HEADERS args.h chrono.h color.h compile.h core.h format.h
221278
format-inl.h os.h ostream.h printf.h ranges.h std.h
222279
xchar.h)
223-
if (FMT_MODULE)
224-
set(FMT_SOURCES src/fmt.cc)
225-
elseif (FMT_OS)
226-
set(FMT_SOURCES src/format.cc src/os.cc)
227-
else()
228-
set(FMT_SOURCES src/format.cc)
280+
set(FMT_SOURCES src/format.cc)
281+
if (FMT_OS)
282+
set(FMT_SOURCES ${FMT_SOURCES} src/os.cc)
229283
endif ()
230284

231-
add_library(fmt ${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst)
285+
add_module_library(fmt src/fmt.cc FALLBACK
286+
${FMT_SOURCES} ${FMT_HEADERS} README.rst ChangeLog.rst
287+
IF FMT_MODULE)
232288
add_library(fmt::fmt ALIAS fmt)
289+
if (FMT_MODULE)
290+
enable_module(fmt)
291+
endif ()
233292

234293
if (FMT_WERROR)
235294
target_compile_options(fmt PRIVATE ${WERROR_FLAG})
236295
endif ()
237296
if (FMT_PEDANTIC)
238297
target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS})
239298
endif ()
240-
if (FMT_MODULE)
241-
enable_module(fmt)
242-
endif ()
243299

244-
target_compile_features(fmt INTERFACE ${FMT_REQUIRED_FEATURES})
300+
if (cxx_std_11 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
301+
target_compile_features(fmt PUBLIC cxx_std_11)
302+
else ()
303+
message(WARNING "Feature cxx_std_11 is unknown for the CXX compiler")
304+
endif ()
245305

246306
target_include_directories(fmt ${FMT_SYSTEM_HEADERS_ATTRIBUTE} PUBLIC
247307
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
@@ -262,13 +322,7 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug")
262322
endif ()
263323

264324
if (BUILD_SHARED_LIBS)
265-
if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS" AND
266-
NOT EMSCRIPTEN)
267-
# Fix rpmlint warning:
268-
# unused-direct-shlib-dependency /usr/lib/libformat.so.1.1.0 /lib/libm.so.6.
269-
target_link_libraries(fmt -Wl,--as-needed)
270-
endif ()
271-
target_compile_definitions(fmt PRIVATE FMT_EXPORT INTERFACE FMT_SHARED)
325+
target_compile_definitions(fmt PRIVATE FMT_LIB_EXPORT INTERFACE FMT_SHARED)
272326
endif ()
273327
if (FMT_SAFE_DURATION_CAST)
274328
target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST)
@@ -278,7 +332,7 @@ add_library(fmt-header-only INTERFACE)
278332
add_library(fmt::fmt-header-only ALIAS fmt-header-only)
279333

280334
target_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1)
281-
target_compile_features(fmt-header-only INTERFACE ${FMT_REQUIRED_FEATURES})
335+
target_compile_features(fmt-header-only INTERFACE cxx_std_11)
282336

283337
target_include_directories(fmt-header-only ${FMT_SYSTEM_HEADERS_ATTRIBUTE} INTERFACE
284338
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
@@ -300,7 +354,7 @@ if (FMT_INSTALL)
300354
"Installation directory for libraries, a relative path that "
301355
"will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.")
302356

303-
set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE PATH
357+
set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE STRING
304358
"Installation directory for pkgconfig (.pc) files, a relative "
305359
"path that will be joined with ${CMAKE_INSTALL_PREFIX} or an "
306360
"absolute path.")
@@ -330,7 +384,6 @@ if (FMT_INSTALL)
330384
LIBRARY DESTINATION ${FMT_LIB_DIR}
331385
ARCHIVE DESTINATION ${FMT_LIB_DIR}
332386
PUBLIC_HEADER DESTINATION "${FMT_INC_DIR}/fmt"
333-
FRAMEWORK DESTINATION "."
334387
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
335388

336389
# Use a namespace because CMake provides better diagnostics for namespaced
@@ -345,8 +398,6 @@ if (FMT_INSTALL)
345398
install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}
346399
NAMESPACE fmt::)
347400

348-
install(FILES $<TARGET_PDB_FILE:${INSTALL_TARGETS}>
349-
DESTINATION ${FMT_LIB_DIR} OPTIONAL)
350401
install(FILES "${pkgconfig}" DESTINATION "${FMT_PKGCONFIG_DIR}")
351402
endif ()
352403

0 commit comments

Comments
 (0)