xref: /aosp_15_r20/external/fmtlib/CMakeLists.txt (revision 5c90c05cd622c0a81b57953a4d343e0e489f2e08)
1*5c90c05cSAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.8...3.28)
2*5c90c05cSAndroid Build Coastguard Worker
3*5c90c05cSAndroid Build Coastguard Worker# Fallback for using newer policies on CMake <3.12.
4*5c90c05cSAndroid Build Coastguard Workerif (${CMAKE_VERSION} VERSION_LESS 3.12)
5*5c90c05cSAndroid Build Coastguard Worker  cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
6*5c90c05cSAndroid Build Coastguard Workerendif ()
7*5c90c05cSAndroid Build Coastguard Worker
8*5c90c05cSAndroid Build Coastguard Worker# Determine if fmt is built as a subproject (using add_subdirectory)
9*5c90c05cSAndroid Build Coastguard Worker# or if it is the master project.
10*5c90c05cSAndroid Build Coastguard Workerif (NOT DEFINED FMT_MASTER_PROJECT)
11*5c90c05cSAndroid Build Coastguard Worker  set(FMT_MASTER_PROJECT OFF)
12*5c90c05cSAndroid Build Coastguard Worker  if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
13*5c90c05cSAndroid Build Coastguard Worker    set(FMT_MASTER_PROJECT ON)
14*5c90c05cSAndroid Build Coastguard Worker    message(STATUS "CMake version: ${CMAKE_VERSION}")
15*5c90c05cSAndroid Build Coastguard Worker  endif ()
16*5c90c05cSAndroid Build Coastguard Workerendif ()
17*5c90c05cSAndroid Build Coastguard Worker
18*5c90c05cSAndroid Build Coastguard Worker# Joins arguments and places the results in ${result_var}.
19*5c90c05cSAndroid Build Coastguard Workerfunction(join result_var)
20*5c90c05cSAndroid Build Coastguard Worker  set(result "")
21*5c90c05cSAndroid Build Coastguard Worker  foreach (arg ${ARGN})
22*5c90c05cSAndroid Build Coastguard Worker    set(result "${result}${arg}")
23*5c90c05cSAndroid Build Coastguard Worker  endforeach ()
24*5c90c05cSAndroid Build Coastguard Worker  set(${result_var} "${result}" PARENT_SCOPE)
25*5c90c05cSAndroid Build Coastguard Workerendfunction()
26*5c90c05cSAndroid Build Coastguard Worker
27*5c90c05cSAndroid Build Coastguard Worker# DEPRECATED! Should be merged into add_module_library.
28*5c90c05cSAndroid Build Coastguard Workerfunction(enable_module target)
29*5c90c05cSAndroid Build Coastguard Worker  if (MSVC)
30*5c90c05cSAndroid Build Coastguard Worker    set(BMI ${CMAKE_CURRENT_BINARY_DIR}/${target}.ifc)
31*5c90c05cSAndroid Build Coastguard Worker    target_compile_options(${target}
32*5c90c05cSAndroid Build Coastguard Worker      PRIVATE /interface /ifcOutput ${BMI}
33*5c90c05cSAndroid Build Coastguard Worker      INTERFACE /reference fmt=${BMI})
34*5c90c05cSAndroid Build Coastguard Worker    set_target_properties(${target} PROPERTIES ADDITIONAL_CLEAN_FILES ${BMI})
35*5c90c05cSAndroid Build Coastguard Worker    set_source_files_properties(${BMI} PROPERTIES GENERATED ON)
36*5c90c05cSAndroid Build Coastguard Worker  endif ()
37*5c90c05cSAndroid Build Coastguard Workerendfunction()
38*5c90c05cSAndroid Build Coastguard Worker
39*5c90c05cSAndroid Build Coastguard Workerset(FMT_USE_CMAKE_MODULES FALSE)
40*5c90c05cSAndroid Build Coastguard Workerif (CMAKE_VERSION VERSION_GREATER_EQUAL 3.28 AND
41*5c90c05cSAndroid Build Coastguard Worker    CMAKE_GENERATOR STREQUAL "Ninja")
42*5c90c05cSAndroid Build Coastguard Worker  set(FMT_USE_CMAKE_MODULES TRUE)
43*5c90c05cSAndroid Build Coastguard Workerendif ()
44*5c90c05cSAndroid Build Coastguard Worker
45*5c90c05cSAndroid Build Coastguard Worker# Adds a library compiled with C++20 module support.
46*5c90c05cSAndroid Build Coastguard Worker# `enabled` is a CMake variables that specifies if modules are enabled.
47*5c90c05cSAndroid Build Coastguard Worker# If modules are disabled `add_module_library` falls back to creating a
48*5c90c05cSAndroid Build Coastguard Worker# non-modular library.
49*5c90c05cSAndroid Build Coastguard Worker#
50*5c90c05cSAndroid Build Coastguard Worker# Usage:
51*5c90c05cSAndroid Build Coastguard Worker#   add_module_library(<name> [sources...] FALLBACK [sources...] [IF enabled])
52*5c90c05cSAndroid Build Coastguard Workerfunction(add_module_library name)
53*5c90c05cSAndroid Build Coastguard Worker  cmake_parse_arguments(AML "" "IF" "FALLBACK" ${ARGN})
54*5c90c05cSAndroid Build Coastguard Worker  set(sources ${AML_UNPARSED_ARGUMENTS})
55*5c90c05cSAndroid Build Coastguard Worker
56*5c90c05cSAndroid Build Coastguard Worker  add_library(${name})
57*5c90c05cSAndroid Build Coastguard Worker  set_target_properties(${name} PROPERTIES LINKER_LANGUAGE CXX)
58*5c90c05cSAndroid Build Coastguard Worker
59*5c90c05cSAndroid Build Coastguard Worker  if (NOT ${${AML_IF}})
60*5c90c05cSAndroid Build Coastguard Worker    # Create a non-modular library.
61*5c90c05cSAndroid Build Coastguard Worker    target_sources(${name} PRIVATE ${AML_FALLBACK})
62*5c90c05cSAndroid Build Coastguard Worker    set_target_properties(${name} PROPERTIES CXX_SCAN_FOR_MODULES OFF)
63*5c90c05cSAndroid Build Coastguard Worker    return()
64*5c90c05cSAndroid Build Coastguard Worker  endif ()
65*5c90c05cSAndroid Build Coastguard Worker
66*5c90c05cSAndroid Build Coastguard Worker  # Modules require C++20.
67*5c90c05cSAndroid Build Coastguard Worker  target_compile_features(${name} PUBLIC cxx_std_20)
68*5c90c05cSAndroid Build Coastguard Worker  if (CMAKE_COMPILER_IS_GNUCXX)
69*5c90c05cSAndroid Build Coastguard Worker    target_compile_options(${name} PUBLIC -fmodules-ts)
70*5c90c05cSAndroid Build Coastguard Worker  endif ()
71*5c90c05cSAndroid Build Coastguard Worker
72*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(${name} PRIVATE FMT_MODULE)
73*5c90c05cSAndroid Build Coastguard Worker
74*5c90c05cSAndroid Build Coastguard Worker  if (FMT_USE_CMAKE_MODULES)
75*5c90c05cSAndroid Build Coastguard Worker    target_sources(${name} PUBLIC FILE_SET fmt TYPE CXX_MODULES
76*5c90c05cSAndroid Build Coastguard Worker                   FILES ${sources})
77*5c90c05cSAndroid Build Coastguard Worker  else()
78*5c90c05cSAndroid Build Coastguard Worker    # `std` is affected by CMake options and may be higher than C++20.
79*5c90c05cSAndroid Build Coastguard Worker    get_target_property(std ${name} CXX_STANDARD)
80*5c90c05cSAndroid Build Coastguard Worker
81*5c90c05cSAndroid Build Coastguard Worker    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
82*5c90c05cSAndroid Build Coastguard Worker      set(pcms)
83*5c90c05cSAndroid Build Coastguard Worker      foreach (src ${sources})
84*5c90c05cSAndroid Build Coastguard Worker        get_filename_component(pcm ${src} NAME_WE)
85*5c90c05cSAndroid Build Coastguard Worker        set(pcm ${pcm}.pcm)
86*5c90c05cSAndroid Build Coastguard Worker
87*5c90c05cSAndroid Build Coastguard Worker        # Propagate -fmodule-file=*.pcm to targets that link with this library.
88*5c90c05cSAndroid Build Coastguard Worker        target_compile_options(
89*5c90c05cSAndroid Build Coastguard Worker          ${name} PUBLIC -fmodule-file=${CMAKE_CURRENT_BINARY_DIR}/${pcm})
90*5c90c05cSAndroid Build Coastguard Worker
91*5c90c05cSAndroid Build Coastguard Worker        # Use an absolute path to prevent target_link_libraries prepending -l
92*5c90c05cSAndroid Build Coastguard Worker        # to it.
93*5c90c05cSAndroid Build Coastguard Worker        set(pcms ${pcms} ${CMAKE_CURRENT_BINARY_DIR}/${pcm})
94*5c90c05cSAndroid Build Coastguard Worker        add_custom_command(
95*5c90c05cSAndroid Build Coastguard Worker          OUTPUT ${pcm}
96*5c90c05cSAndroid Build Coastguard Worker          COMMAND ${CMAKE_CXX_COMPILER}
97*5c90c05cSAndroid Build Coastguard Worker                  -std=c++${std} -x c++-module --precompile -c
98*5c90c05cSAndroid Build Coastguard Worker                  -o ${pcm} ${CMAKE_CURRENT_SOURCE_DIR}/${src}
99*5c90c05cSAndroid Build Coastguard Worker                  "-I$<JOIN:$<TARGET_PROPERTY:${name},INCLUDE_DIRECTORIES>,;-I>"
100*5c90c05cSAndroid Build Coastguard Worker          # Required by the -I generator expression above.
101*5c90c05cSAndroid Build Coastguard Worker          COMMAND_EXPAND_LISTS
102*5c90c05cSAndroid Build Coastguard Worker          DEPENDS ${src})
103*5c90c05cSAndroid Build Coastguard Worker      endforeach ()
104*5c90c05cSAndroid Build Coastguard Worker
105*5c90c05cSAndroid Build Coastguard Worker      # Add .pcm files as sources to make sure they are built before the library.
106*5c90c05cSAndroid Build Coastguard Worker      set(sources)
107*5c90c05cSAndroid Build Coastguard Worker      foreach (pcm ${pcms})
108*5c90c05cSAndroid Build Coastguard Worker        get_filename_component(pcm_we ${pcm} NAME_WE)
109*5c90c05cSAndroid Build Coastguard Worker        set(obj ${pcm_we}.o)
110*5c90c05cSAndroid Build Coastguard Worker        # Use an absolute path to prevent target_link_libraries prepending -l.
111*5c90c05cSAndroid Build Coastguard Worker        set(sources ${sources} ${pcm} ${CMAKE_CURRENT_BINARY_DIR}/${obj})
112*5c90c05cSAndroid Build Coastguard Worker        add_custom_command(
113*5c90c05cSAndroid Build Coastguard Worker          OUTPUT ${obj}
114*5c90c05cSAndroid Build Coastguard Worker          COMMAND ${CMAKE_CXX_COMPILER} $<TARGET_PROPERTY:${name},COMPILE_OPTIONS>
115*5c90c05cSAndroid Build Coastguard Worker                  -c -o ${obj} ${pcm}
116*5c90c05cSAndroid Build Coastguard Worker          DEPENDS ${pcm})
117*5c90c05cSAndroid Build Coastguard Worker      endforeach ()
118*5c90c05cSAndroid Build Coastguard Worker    endif ()
119*5c90c05cSAndroid Build Coastguard Worker    target_sources(${name} PRIVATE ${sources})
120*5c90c05cSAndroid Build Coastguard Worker  endif()
121*5c90c05cSAndroid Build Coastguard Workerendfunction()
122*5c90c05cSAndroid Build Coastguard Worker
123*5c90c05cSAndroid Build Coastguard Workerinclude(CMakeParseArguments)
124*5c90c05cSAndroid Build Coastguard Worker
125*5c90c05cSAndroid Build Coastguard Worker# Sets a cache variable with a docstring joined from multiple arguments:
126*5c90c05cSAndroid Build Coastguard Worker#   set(<variable> <value>... CACHE <type> <docstring>...)
127*5c90c05cSAndroid Build Coastguard Worker# This allows splitting a long docstring for readability.
128*5c90c05cSAndroid Build Coastguard Workerfunction(set_verbose)
129*5c90c05cSAndroid Build Coastguard Worker  # cmake_parse_arguments is broken in CMake 3.4 (cannot parse CACHE) so use
130*5c90c05cSAndroid Build Coastguard Worker  # list instead.
131*5c90c05cSAndroid Build Coastguard Worker  list(GET ARGN 0 var)
132*5c90c05cSAndroid Build Coastguard Worker  list(REMOVE_AT ARGN 0)
133*5c90c05cSAndroid Build Coastguard Worker  list(GET ARGN 0 val)
134*5c90c05cSAndroid Build Coastguard Worker  list(REMOVE_AT ARGN 0)
135*5c90c05cSAndroid Build Coastguard Worker  list(REMOVE_AT ARGN 0)
136*5c90c05cSAndroid Build Coastguard Worker  list(GET ARGN 0 type)
137*5c90c05cSAndroid Build Coastguard Worker  list(REMOVE_AT ARGN 0)
138*5c90c05cSAndroid Build Coastguard Worker  join(doc ${ARGN})
139*5c90c05cSAndroid Build Coastguard Worker  set(${var} ${val} CACHE ${type} ${doc})
140*5c90c05cSAndroid Build Coastguard Workerendfunction()
141*5c90c05cSAndroid Build Coastguard Worker
142*5c90c05cSAndroid Build Coastguard Worker# Set the default CMAKE_BUILD_TYPE to Release.
143*5c90c05cSAndroid Build Coastguard Worker# This should be done before the project command since the latter can set
144*5c90c05cSAndroid Build Coastguard Worker# CMAKE_BUILD_TYPE itself (it does so for nmake).
145*5c90c05cSAndroid Build Coastguard Workerif (FMT_MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE)
146*5c90c05cSAndroid Build Coastguard Worker  set_verbose(CMAKE_BUILD_TYPE Release CACHE STRING
147*5c90c05cSAndroid Build Coastguard Worker              "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or "
148*5c90c05cSAndroid Build Coastguard Worker              "CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel.")
149*5c90c05cSAndroid Build Coastguard Workerendif ()
150*5c90c05cSAndroid Build Coastguard Worker
151*5c90c05cSAndroid Build Coastguard Workerproject(FMT CXX)
152*5c90c05cSAndroid Build Coastguard Workerinclude(GNUInstallDirs)
153*5c90c05cSAndroid Build Coastguard Workerset_verbose(FMT_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE STRING
154*5c90c05cSAndroid Build Coastguard Worker            "Installation directory for include files, a relative path that "
155*5c90c05cSAndroid Build Coastguard Worker            "will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute path.")
156*5c90c05cSAndroid Build Coastguard Worker
157*5c90c05cSAndroid Build Coastguard Workeroption(FMT_PEDANTIC "Enable extra warnings and expensive tests." OFF)
158*5c90c05cSAndroid Build Coastguard Workeroption(FMT_WERROR "Halt the compilation with an error on compiler warnings."
159*5c90c05cSAndroid Build Coastguard Worker       OFF)
160*5c90c05cSAndroid Build Coastguard Worker
161*5c90c05cSAndroid Build Coastguard Worker# Options that control generation of various targets.
162*5c90c05cSAndroid Build Coastguard Workeroption(FMT_DOC "Generate the doc target." ${FMT_MASTER_PROJECT})
163*5c90c05cSAndroid Build Coastguard Workeroption(FMT_INSTALL "Generate the install target." ON)
164*5c90c05cSAndroid Build Coastguard Workeroption(FMT_TEST "Generate the test target." ${FMT_MASTER_PROJECT})
165*5c90c05cSAndroid Build Coastguard Workeroption(FMT_FUZZ "Generate the fuzz target." OFF)
166*5c90c05cSAndroid Build Coastguard Workeroption(FMT_CUDA_TEST "Generate the cuda-test target." OFF)
167*5c90c05cSAndroid Build Coastguard Workeroption(FMT_OS "Include OS-specific APIs." ON)
168*5c90c05cSAndroid Build Coastguard Workeroption(FMT_MODULE "Build a module instead of a traditional library." OFF)
169*5c90c05cSAndroid Build Coastguard Workeroption(FMT_SYSTEM_HEADERS "Expose headers with marking them as system." OFF)
170*5c90c05cSAndroid Build Coastguard Workeroption(FMT_UNICODE "Enable Unicode support." ON)
171*5c90c05cSAndroid Build Coastguard Worker
172*5c90c05cSAndroid Build Coastguard Workerif (FMT_TEST AND FMT_MODULE)
173*5c90c05cSAndroid Build Coastguard Worker  # The tests require {fmt} to be compiled as traditional library
174*5c90c05cSAndroid Build Coastguard Worker  message(STATUS "Testing is incompatible with build mode 'module'.")
175*5c90c05cSAndroid Build Coastguard Workerendif ()
176*5c90c05cSAndroid Build Coastguard Workerset(FMT_SYSTEM_HEADERS_ATTRIBUTE "")
177*5c90c05cSAndroid Build Coastguard Workerif (FMT_SYSTEM_HEADERS)
178*5c90c05cSAndroid Build Coastguard Worker  set(FMT_SYSTEM_HEADERS_ATTRIBUTE SYSTEM)
179*5c90c05cSAndroid Build Coastguard Workerendif ()
180*5c90c05cSAndroid Build Coastguard Workerif (CMAKE_SYSTEM_NAME STREQUAL "MSDOS")
181*5c90c05cSAndroid Build Coastguard Worker  set(FMT_TEST OFF)
182*5c90c05cSAndroid Build Coastguard Worker  message(STATUS "MSDOS is incompatible with gtest")
183*5c90c05cSAndroid Build Coastguard Workerendif ()
184*5c90c05cSAndroid Build Coastguard Worker
185*5c90c05cSAndroid Build Coastguard Worker# Get version from base.h
186*5c90c05cSAndroid Build Coastguard Workerfile(READ include/fmt/base.h base_h)
187*5c90c05cSAndroid Build Coastguard Workerif (NOT base_h MATCHES "FMT_VERSION ([0-9]+)([0-9][0-9])([0-9][0-9])")
188*5c90c05cSAndroid Build Coastguard Worker  message(FATAL_ERROR "Cannot get FMT_VERSION from base.h.")
189*5c90c05cSAndroid Build Coastguard Workerendif ()
190*5c90c05cSAndroid Build Coastguard Worker# Use math to skip leading zeros if any.
191*5c90c05cSAndroid Build Coastguard Workermath(EXPR CPACK_PACKAGE_VERSION_MAJOR ${CMAKE_MATCH_1})
192*5c90c05cSAndroid Build Coastguard Workermath(EXPR CPACK_PACKAGE_VERSION_MINOR ${CMAKE_MATCH_2})
193*5c90c05cSAndroid Build Coastguard Workermath(EXPR CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_3})
194*5c90c05cSAndroid Build Coastguard Workerjoin(FMT_VERSION ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.
195*5c90c05cSAndroid Build Coastguard Worker                 ${CPACK_PACKAGE_VERSION_PATCH})
196*5c90c05cSAndroid Build Coastguard Workermessage(STATUS "{fmt} version: ${FMT_VERSION}")
197*5c90c05cSAndroid Build Coastguard Worker
198*5c90c05cSAndroid Build Coastguard Workermessage(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
199*5c90c05cSAndroid Build Coastguard Worker
200*5c90c05cSAndroid Build Coastguard Workerif (NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY)
201*5c90c05cSAndroid Build Coastguard Worker  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)
202*5c90c05cSAndroid Build Coastguard Workerendif ()
203*5c90c05cSAndroid Build Coastguard Worker
204*5c90c05cSAndroid Build Coastguard Workerset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
205*5c90c05cSAndroid Build Coastguard Worker  "${CMAKE_CURRENT_SOURCE_DIR}/support/cmake")
206*5c90c05cSAndroid Build Coastguard Worker
207*5c90c05cSAndroid Build Coastguard Workerinclude(CheckCXXCompilerFlag)
208*5c90c05cSAndroid Build Coastguard Workerinclude(JoinPaths)
209*5c90c05cSAndroid Build Coastguard Worker
210*5c90c05cSAndroid Build Coastguard Workerif (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_CXX_VISIBILITY_PRESET)
211*5c90c05cSAndroid Build Coastguard Worker  set_verbose(CMAKE_CXX_VISIBILITY_PRESET hidden CACHE STRING
212*5c90c05cSAndroid Build Coastguard Worker              "Preset for the export of private symbols")
213*5c90c05cSAndroid Build Coastguard Worker  set_property(CACHE CMAKE_CXX_VISIBILITY_PRESET PROPERTY STRINGS
214*5c90c05cSAndroid Build Coastguard Worker               hidden default)
215*5c90c05cSAndroid Build Coastguard Workerendif ()
216*5c90c05cSAndroid Build Coastguard Worker
217*5c90c05cSAndroid Build Coastguard Workerif (FMT_MASTER_PROJECT AND NOT DEFINED CMAKE_VISIBILITY_INLINES_HIDDEN)
218*5c90c05cSAndroid Build Coastguard Worker  set_verbose(CMAKE_VISIBILITY_INLINES_HIDDEN ON CACHE BOOL
219*5c90c05cSAndroid Build Coastguard Worker              "Whether to add a compile flag to hide symbols of inline functions")
220*5c90c05cSAndroid Build Coastguard Workerendif ()
221*5c90c05cSAndroid Build Coastguard Worker
222*5c90c05cSAndroid Build Coastguard Workerif (CMAKE_CXX_COMPILER_ID MATCHES "GNU")
223*5c90c05cSAndroid Build Coastguard Worker  set(PEDANTIC_COMPILE_FLAGS -pedantic-errors -Wall -Wextra -pedantic
224*5c90c05cSAndroid Build Coastguard Worker      -Wold-style-cast -Wundef
225*5c90c05cSAndroid Build Coastguard Worker      -Wredundant-decls -Wwrite-strings -Wpointer-arith
226*5c90c05cSAndroid Build Coastguard Worker      -Wcast-qual -Wformat=2 -Wmissing-include-dirs
227*5c90c05cSAndroid Build Coastguard Worker      -Wcast-align
228*5c90c05cSAndroid Build Coastguard Worker      -Wctor-dtor-privacy -Wdisabled-optimization
229*5c90c05cSAndroid Build Coastguard Worker      -Winvalid-pch -Woverloaded-virtual
230*5c90c05cSAndroid Build Coastguard Worker      -Wconversion -Wundef
231*5c90c05cSAndroid Build Coastguard Worker      -Wno-ctor-dtor-privacy -Wno-format-nonliteral)
232*5c90c05cSAndroid Build Coastguard Worker  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
233*5c90c05cSAndroid Build Coastguard Worker      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}
234*5c90c05cSAndroid Build Coastguard Worker         -Wno-dangling-else -Wno-unused-local-typedefs)
235*5c90c05cSAndroid Build Coastguard Worker  endif ()
236*5c90c05cSAndroid Build Coastguard Worker  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
237*5c90c05cSAndroid Build Coastguard Worker      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wdouble-promotion
238*5c90c05cSAndroid Build Coastguard Worker          -Wtrampolines -Wzero-as-null-pointer-constant -Wuseless-cast
239*5c90c05cSAndroid Build Coastguard Worker          -Wvector-operation-performance -Wsized-deallocation -Wshadow)
240*5c90c05cSAndroid Build Coastguard Worker  endif ()
241*5c90c05cSAndroid Build Coastguard Worker  if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0)
242*5c90c05cSAndroid Build Coastguard Worker      set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wshift-overflow=2
243*5c90c05cSAndroid Build Coastguard Worker          -Wduplicated-cond)
244*5c90c05cSAndroid Build Coastguard Worker      # Workaround for GCC regression
245*5c90c05cSAndroid Build Coastguard Worker      # [12/13/14/15 regression] New (since gcc 12) false positive null-dereference in vector.resize
246*5c90c05cSAndroid Build Coastguard Worker      # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108860
247*5c90c05cSAndroid Build Coastguard Worker      if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0)
248*5c90c05cSAndroid Build Coastguard Worker        set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wnull-dereference)
249*5c90c05cSAndroid Build Coastguard Worker      endif ()
250*5c90c05cSAndroid Build Coastguard Worker  endif ()
251*5c90c05cSAndroid Build Coastguard Worker  set(WERROR_FLAG -Werror)
252*5c90c05cSAndroid Build Coastguard Workerendif ()
253*5c90c05cSAndroid Build Coastguard Worker
254*5c90c05cSAndroid Build Coastguard Workerif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
255*5c90c05cSAndroid Build Coastguard Worker  set(PEDANTIC_COMPILE_FLAGS -Wall -Wextra -pedantic -Wconversion -Wundef
256*5c90c05cSAndroid Build Coastguard Worker      -Wdeprecated -Wweak-vtables -Wshadow
257*5c90c05cSAndroid Build Coastguard Worker      -Wno-gnu-zero-variadic-macro-arguments)
258*5c90c05cSAndroid Build Coastguard Worker  check_cxx_compiler_flag(-Wzero-as-null-pointer-constant HAS_NULLPTR_WARNING)
259*5c90c05cSAndroid Build Coastguard Worker  if (HAS_NULLPTR_WARNING)
260*5c90c05cSAndroid Build Coastguard Worker    set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS}
261*5c90c05cSAndroid Build Coastguard Worker        -Wzero-as-null-pointer-constant)
262*5c90c05cSAndroid Build Coastguard Worker  endif ()
263*5c90c05cSAndroid Build Coastguard Worker  set(WERROR_FLAG -Werror)
264*5c90c05cSAndroid Build Coastguard Workerendif ()
265*5c90c05cSAndroid Build Coastguard Worker
266*5c90c05cSAndroid Build Coastguard Workerif (MSVC)
267*5c90c05cSAndroid Build Coastguard Worker  set(PEDANTIC_COMPILE_FLAGS /W3)
268*5c90c05cSAndroid Build Coastguard Worker  set(WERROR_FLAG /WX)
269*5c90c05cSAndroid Build Coastguard Workerendif ()
270*5c90c05cSAndroid Build Coastguard Worker
271*5c90c05cSAndroid Build Coastguard Workerif (FMT_MASTER_PROJECT AND CMAKE_GENERATOR MATCHES "Visual Studio")
272*5c90c05cSAndroid Build Coastguard Worker  # If Microsoft SDK is installed create script run-msbuild.bat that
273*5c90c05cSAndroid Build Coastguard Worker  # calls SetEnv.cmd to set up build environment and runs msbuild.
274*5c90c05cSAndroid Build Coastguard Worker  # It is useful when building Visual Studio projects with the SDK
275*5c90c05cSAndroid Build Coastguard Worker  # toolchain rather than Visual Studio.
276*5c90c05cSAndroid Build Coastguard Worker  include(FindSetEnv)
277*5c90c05cSAndroid Build Coastguard Worker  if (WINSDK_SETENV)
278*5c90c05cSAndroid Build Coastguard Worker    set(MSBUILD_SETUP "call \"${WINSDK_SETENV}\"")
279*5c90c05cSAndroid Build Coastguard Worker  endif ()
280*5c90c05cSAndroid Build Coastguard Worker  # Set FrameworkPathOverride to get rid of MSB3644 warnings.
281*5c90c05cSAndroid Build Coastguard Worker  join(netfxpath
282*5c90c05cSAndroid Build Coastguard Worker       "C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\"
283*5c90c05cSAndroid Build Coastguard Worker       ".NETFramework\\v4.0")
284*5c90c05cSAndroid Build Coastguard Worker  file(WRITE run-msbuild.bat "
285*5c90c05cSAndroid Build Coastguard Worker    ${MSBUILD_SETUP}
286*5c90c05cSAndroid Build Coastguard Worker    ${CMAKE_MAKE_PROGRAM} -p:FrameworkPathOverride=\"${netfxpath}\" %*")
287*5c90c05cSAndroid Build Coastguard Workerendif ()
288*5c90c05cSAndroid Build Coastguard Worker
289*5c90c05cSAndroid Build Coastguard Workerfunction(add_headers VAR)
290*5c90c05cSAndroid Build Coastguard Worker  set(headers ${${VAR}})
291*5c90c05cSAndroid Build Coastguard Worker  foreach (header ${ARGN})
292*5c90c05cSAndroid Build Coastguard Worker    set(headers ${headers} include/fmt/${header})
293*5c90c05cSAndroid Build Coastguard Worker  endforeach()
294*5c90c05cSAndroid Build Coastguard Worker  set(${VAR} ${headers} PARENT_SCOPE)
295*5c90c05cSAndroid Build Coastguard Workerendfunction()
296*5c90c05cSAndroid Build Coastguard Worker
297*5c90c05cSAndroid Build Coastguard Worker# Define the fmt library, its includes and the needed defines.
298*5c90c05cSAndroid Build Coastguard Workeradd_headers(FMT_HEADERS args.h base.h chrono.h color.h compile.h core.h format.h
299*5c90c05cSAndroid Build Coastguard Worker                        format-inl.h os.h ostream.h printf.h ranges.h std.h
300*5c90c05cSAndroid Build Coastguard Worker                        xchar.h)
301*5c90c05cSAndroid Build Coastguard Workerset(FMT_SOURCES src/format.cc)
302*5c90c05cSAndroid Build Coastguard Worker
303*5c90c05cSAndroid Build Coastguard Workeradd_module_library(fmt src/fmt.cc FALLBACK
304*5c90c05cSAndroid Build Coastguard Worker                   ${FMT_SOURCES} ${FMT_HEADERS} README.md ChangeLog.md
305*5c90c05cSAndroid Build Coastguard Worker                   IF FMT_MODULE)
306*5c90c05cSAndroid Build Coastguard Workeradd_library(fmt::fmt ALIAS fmt)
307*5c90c05cSAndroid Build Coastguard Workerif (FMT_MODULE)
308*5c90c05cSAndroid Build Coastguard Worker  enable_module(fmt)
309*5c90c05cSAndroid Build Coastguard Workerelseif (FMT_OS)
310*5c90c05cSAndroid Build Coastguard Worker  target_sources(fmt PRIVATE src/os.cc)
311*5c90c05cSAndroid Build Coastguard Workerelse()
312*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(fmt PRIVATE FMT_OS=0)
313*5c90c05cSAndroid Build Coastguard Workerendif ()
314*5c90c05cSAndroid Build Coastguard Worker
315*5c90c05cSAndroid Build Coastguard Workerif (FMT_WERROR)
316*5c90c05cSAndroid Build Coastguard Worker  target_compile_options(fmt PRIVATE ${WERROR_FLAG})
317*5c90c05cSAndroid Build Coastguard Workerendif ()
318*5c90c05cSAndroid Build Coastguard Workerif (FMT_PEDANTIC)
319*5c90c05cSAndroid Build Coastguard Worker  target_compile_options(fmt PRIVATE ${PEDANTIC_COMPILE_FLAGS})
320*5c90c05cSAndroid Build Coastguard Workerendif ()
321*5c90c05cSAndroid Build Coastguard Worker
322*5c90c05cSAndroid Build Coastguard Workerif (cxx_std_11 IN_LIST CMAKE_CXX_COMPILE_FEATURES)
323*5c90c05cSAndroid Build Coastguard Worker  target_compile_features(fmt PUBLIC cxx_std_11)
324*5c90c05cSAndroid Build Coastguard Workerelse ()
325*5c90c05cSAndroid Build Coastguard Worker  message(WARNING "Feature cxx_std_11 is unknown for the CXX compiler")
326*5c90c05cSAndroid Build Coastguard Workerendif ()
327*5c90c05cSAndroid Build Coastguard Worker
328*5c90c05cSAndroid Build Coastguard Workertarget_include_directories(fmt ${FMT_SYSTEM_HEADERS_ATTRIBUTE} BEFORE PUBLIC
329*5c90c05cSAndroid Build Coastguard Worker  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
330*5c90c05cSAndroid Build Coastguard Worker  $<INSTALL_INTERFACE:${FMT_INC_DIR}>)
331*5c90c05cSAndroid Build Coastguard Worker
332*5c90c05cSAndroid Build Coastguard Workerset(FMT_DEBUG_POSTFIX d CACHE STRING "Debug library postfix.")
333*5c90c05cSAndroid Build Coastguard Worker
334*5c90c05cSAndroid Build Coastguard Workerset_target_properties(fmt PROPERTIES
335*5c90c05cSAndroid Build Coastguard Worker  VERSION ${FMT_VERSION} SOVERSION ${CPACK_PACKAGE_VERSION_MAJOR}
336*5c90c05cSAndroid Build Coastguard Worker  PUBLIC_HEADER "${FMT_HEADERS}"
337*5c90c05cSAndroid Build Coastguard Worker  DEBUG_POSTFIX "${FMT_DEBUG_POSTFIX}"
338*5c90c05cSAndroid Build Coastguard Worker
339*5c90c05cSAndroid Build Coastguard Worker  # Workaround for Visual Studio 2017:
340*5c90c05cSAndroid Build Coastguard Worker  # Ensure the .pdb is created with the same name and in the same directory
341*5c90c05cSAndroid Build Coastguard Worker  # as the .lib. Newer VS versions already do this by default, but there is no
342*5c90c05cSAndroid Build Coastguard Worker  # harm in setting it for those too. Ignored by other generators.
343*5c90c05cSAndroid Build Coastguard Worker  COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
344*5c90c05cSAndroid Build Coastguard Worker  COMPILE_PDB_NAME "fmt"
345*5c90c05cSAndroid Build Coastguard Worker  COMPILE_PDB_NAME_DEBUG "fmt${FMT_DEBUG_POSTFIX}")
346*5c90c05cSAndroid Build Coastguard Worker
347*5c90c05cSAndroid Build Coastguard Worker# Set FMT_LIB_NAME for pkg-config fmt.pc. We cannot use the OUTPUT_NAME target
348*5c90c05cSAndroid Build Coastguard Worker# property because it's not set by default.
349*5c90c05cSAndroid Build Coastguard Workerset(FMT_LIB_NAME fmt)
350*5c90c05cSAndroid Build Coastguard Workerif (CMAKE_BUILD_TYPE STREQUAL "Debug")
351*5c90c05cSAndroid Build Coastguard Worker  set(FMT_LIB_NAME ${FMT_LIB_NAME}${FMT_DEBUG_POSTFIX})
352*5c90c05cSAndroid Build Coastguard Workerendif ()
353*5c90c05cSAndroid Build Coastguard Worker
354*5c90c05cSAndroid Build Coastguard Workerif (BUILD_SHARED_LIBS)
355*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(fmt PRIVATE FMT_LIB_EXPORT INTERFACE FMT_SHARED)
356*5c90c05cSAndroid Build Coastguard Workerendif ()
357*5c90c05cSAndroid Build Coastguard Workerif (FMT_SAFE_DURATION_CAST)
358*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(fmt PUBLIC FMT_SAFE_DURATION_CAST)
359*5c90c05cSAndroid Build Coastguard Workerendif ()
360*5c90c05cSAndroid Build Coastguard Worker
361*5c90c05cSAndroid Build Coastguard Workeradd_library(fmt-header-only INTERFACE)
362*5c90c05cSAndroid Build Coastguard Workeradd_library(fmt::fmt-header-only ALIAS fmt-header-only)
363*5c90c05cSAndroid Build Coastguard Worker
364*5c90c05cSAndroid Build Coastguard Workerif (NOT MSVC)
365*5c90c05cSAndroid Build Coastguard Worker  # Unicode is always supported on compilers other than MSVC.
366*5c90c05cSAndroid Build Coastguard Workerelseif (FMT_UNICODE)
367*5c90c05cSAndroid Build Coastguard Worker  # Unicode support requires compiling with /utf-8.
368*5c90c05cSAndroid Build Coastguard Worker  target_compile_options(fmt PUBLIC $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>>:/utf-8>)
369*5c90c05cSAndroid Build Coastguard Worker  target_compile_options(fmt-header-only INTERFACE $<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CXX_COMPILER_ID:MSVC>>:/utf-8>)
370*5c90c05cSAndroid Build Coastguard Workerelse ()
371*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(fmt PUBLIC FMT_UNICODE=0)
372*5c90c05cSAndroid Build Coastguard Workerendif ()
373*5c90c05cSAndroid Build Coastguard Worker
374*5c90c05cSAndroid Build Coastguard Workertarget_compile_definitions(fmt-header-only INTERFACE FMT_HEADER_ONLY=1)
375*5c90c05cSAndroid Build Coastguard Workertarget_compile_features(fmt-header-only INTERFACE cxx_std_11)
376*5c90c05cSAndroid Build Coastguard Worker
377*5c90c05cSAndroid Build Coastguard Workertarget_include_directories(fmt-header-only
378*5c90c05cSAndroid Build Coastguard Worker  ${FMT_SYSTEM_HEADERS_ATTRIBUTE} BEFORE INTERFACE
379*5c90c05cSAndroid Build Coastguard Worker  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
380*5c90c05cSAndroid Build Coastguard Worker  $<INSTALL_INTERFACE:${FMT_INC_DIR}>)
381*5c90c05cSAndroid Build Coastguard Worker
382*5c90c05cSAndroid Build Coastguard Worker# Install targets.
383*5c90c05cSAndroid Build Coastguard Workerif (FMT_INSTALL)
384*5c90c05cSAndroid Build Coastguard Worker  include(CMakePackageConfigHelpers)
385*5c90c05cSAndroid Build Coastguard Worker  set_verbose(FMT_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/fmt CACHE STRING
386*5c90c05cSAndroid Build Coastguard Worker              "Installation directory for cmake files, a relative path that "
387*5c90c05cSAndroid Build Coastguard Worker              "will be joined with ${CMAKE_INSTALL_PREFIX} or an absolute "
388*5c90c05cSAndroid Build Coastguard Worker              "path.")
389*5c90c05cSAndroid Build Coastguard Worker  set(version_config ${PROJECT_BINARY_DIR}/fmt-config-version.cmake)
390*5c90c05cSAndroid Build Coastguard Worker  set(project_config ${PROJECT_BINARY_DIR}/fmt-config.cmake)
391*5c90c05cSAndroid Build Coastguard Worker  set(pkgconfig ${PROJECT_BINARY_DIR}/fmt.pc)
392*5c90c05cSAndroid Build Coastguard Worker  set(targets_export_name fmt-targets)
393*5c90c05cSAndroid Build Coastguard Worker
394*5c90c05cSAndroid Build Coastguard Worker  set_verbose(FMT_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
395*5c90c05cSAndroid Build Coastguard Worker              "Installation directory for libraries, a relative path that "
396*5c90c05cSAndroid Build Coastguard Worker              "will be joined to ${CMAKE_INSTALL_PREFIX} or an absolute path.")
397*5c90c05cSAndroid Build Coastguard Worker
398*5c90c05cSAndroid Build Coastguard Worker  set_verbose(FMT_PKGCONFIG_DIR ${CMAKE_INSTALL_LIBDIR}/pkgconfig CACHE STRING
399*5c90c05cSAndroid Build Coastguard Worker              "Installation directory for pkgconfig (.pc) files, a relative "
400*5c90c05cSAndroid Build Coastguard Worker              "path that will be joined with ${CMAKE_INSTALL_PREFIX} or an "
401*5c90c05cSAndroid Build Coastguard Worker              "absolute path.")
402*5c90c05cSAndroid Build Coastguard Worker
403*5c90c05cSAndroid Build Coastguard Worker  # Generate the version, config and target files into the build directory.
404*5c90c05cSAndroid Build Coastguard Worker  write_basic_package_version_file(
405*5c90c05cSAndroid Build Coastguard Worker    ${version_config}
406*5c90c05cSAndroid Build Coastguard Worker    VERSION ${FMT_VERSION}
407*5c90c05cSAndroid Build Coastguard Worker    COMPATIBILITY AnyNewerVersion)
408*5c90c05cSAndroid Build Coastguard Worker
409*5c90c05cSAndroid Build Coastguard Worker  join_paths(libdir_for_pc_file "\${exec_prefix}" "${FMT_LIB_DIR}")
410*5c90c05cSAndroid Build Coastguard Worker  join_paths(includedir_for_pc_file "\${prefix}" "${FMT_INC_DIR}")
411*5c90c05cSAndroid Build Coastguard Worker
412*5c90c05cSAndroid Build Coastguard Worker  configure_file(
413*5c90c05cSAndroid Build Coastguard Worker    "${PROJECT_SOURCE_DIR}/support/cmake/fmt.pc.in"
414*5c90c05cSAndroid Build Coastguard Worker    "${pkgconfig}"
415*5c90c05cSAndroid Build Coastguard Worker    @ONLY)
416*5c90c05cSAndroid Build Coastguard Worker  configure_package_config_file(
417*5c90c05cSAndroid Build Coastguard Worker    ${PROJECT_SOURCE_DIR}/support/cmake/fmt-config.cmake.in
418*5c90c05cSAndroid Build Coastguard Worker    ${project_config}
419*5c90c05cSAndroid Build Coastguard Worker    INSTALL_DESTINATION ${FMT_CMAKE_DIR})
420*5c90c05cSAndroid Build Coastguard Worker
421*5c90c05cSAndroid Build Coastguard Worker  set(INSTALL_TARGETS fmt fmt-header-only)
422*5c90c05cSAndroid Build Coastguard Worker
423*5c90c05cSAndroid Build Coastguard Worker  set(INSTALL_FILE_SET)
424*5c90c05cSAndroid Build Coastguard Worker  if (FMT_USE_CMAKE_MODULES)
425*5c90c05cSAndroid Build Coastguard Worker    set(INSTALL_FILE_SET FILE_SET fmt DESTINATION "${FMT_INC_DIR}/fmt")
426*5c90c05cSAndroid Build Coastguard Worker  endif()
427*5c90c05cSAndroid Build Coastguard Worker
428*5c90c05cSAndroid Build Coastguard Worker  # Install the library and headers.
429*5c90c05cSAndroid Build Coastguard Worker  install(TARGETS ${INSTALL_TARGETS} EXPORT ${targets_export_name}
430*5c90c05cSAndroid Build Coastguard Worker          LIBRARY DESTINATION ${FMT_LIB_DIR}
431*5c90c05cSAndroid Build Coastguard Worker          ARCHIVE DESTINATION ${FMT_LIB_DIR}
432*5c90c05cSAndroid Build Coastguard Worker          PUBLIC_HEADER DESTINATION "${FMT_INC_DIR}/fmt"
433*5c90c05cSAndroid Build Coastguard Worker          RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
434*5c90c05cSAndroid Build Coastguard Worker          ${INSTALL_FILE_SET})
435*5c90c05cSAndroid Build Coastguard Worker
436*5c90c05cSAndroid Build Coastguard Worker  # Use a namespace because CMake provides better diagnostics for namespaced
437*5c90c05cSAndroid Build Coastguard Worker  # imported targets.
438*5c90c05cSAndroid Build Coastguard Worker  export(TARGETS ${INSTALL_TARGETS} NAMESPACE fmt::
439*5c90c05cSAndroid Build Coastguard Worker         FILE ${PROJECT_BINARY_DIR}/${targets_export_name}.cmake)
440*5c90c05cSAndroid Build Coastguard Worker
441*5c90c05cSAndroid Build Coastguard Worker  # Install version, config and target files.
442*5c90c05cSAndroid Build Coastguard Worker  install(
443*5c90c05cSAndroid Build Coastguard Worker    FILES ${project_config} ${version_config}
444*5c90c05cSAndroid Build Coastguard Worker    DESTINATION ${FMT_CMAKE_DIR})
445*5c90c05cSAndroid Build Coastguard Worker  install(EXPORT ${targets_export_name} DESTINATION ${FMT_CMAKE_DIR}
446*5c90c05cSAndroid Build Coastguard Worker          NAMESPACE fmt::)
447*5c90c05cSAndroid Build Coastguard Worker
448*5c90c05cSAndroid Build Coastguard Worker  install(FILES "${pkgconfig}" DESTINATION "${FMT_PKGCONFIG_DIR}")
449*5c90c05cSAndroid Build Coastguard Workerendif ()
450*5c90c05cSAndroid Build Coastguard Worker
451*5c90c05cSAndroid Build Coastguard Workerfunction(add_doc_target)
452*5c90c05cSAndroid Build Coastguard Worker  find_program(DOXYGEN doxygen
453*5c90c05cSAndroid Build Coastguard Worker    PATHS "$ENV{ProgramFiles}/doxygen/bin"
454*5c90c05cSAndroid Build Coastguard Worker          "$ENV{ProgramFiles\(x86\)}/doxygen/bin")
455*5c90c05cSAndroid Build Coastguard Worker  if (NOT DOXYGEN)
456*5c90c05cSAndroid Build Coastguard Worker    message(STATUS "Target 'doc' disabled because doxygen not found")
457*5c90c05cSAndroid Build Coastguard Worker    return ()
458*5c90c05cSAndroid Build Coastguard Worker  endif ()
459*5c90c05cSAndroid Build Coastguard Worker
460*5c90c05cSAndroid Build Coastguard Worker  find_program(MKDOCS mkdocs)
461*5c90c05cSAndroid Build Coastguard Worker  if (NOT MKDOCS)
462*5c90c05cSAndroid Build Coastguard Worker    message(STATUS "Target 'doc' disabled because mkdocs not found")
463*5c90c05cSAndroid Build Coastguard Worker    return ()
464*5c90c05cSAndroid Build Coastguard Worker  endif ()
465*5c90c05cSAndroid Build Coastguard Worker
466*5c90c05cSAndroid Build Coastguard Worker  set(sources )
467*5c90c05cSAndroid Build Coastguard Worker  foreach (source api.md index.md syntax.md get-started.md fmt.css fmt.js)
468*5c90c05cSAndroid Build Coastguard Worker    set(sources ${sources} doc/${source})
469*5c90c05cSAndroid Build Coastguard Worker  endforeach()
470*5c90c05cSAndroid Build Coastguard Worker
471*5c90c05cSAndroid Build Coastguard Worker  add_custom_target(
472*5c90c05cSAndroid Build Coastguard Worker    doc
473*5c90c05cSAndroid Build Coastguard Worker    COMMAND
474*5c90c05cSAndroid Build Coastguard Worker      ${CMAKE_COMMAND}
475*5c90c05cSAndroid Build Coastguard Worker        -E env PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/support/python
476*5c90c05cSAndroid Build Coastguard Worker        ${MKDOCS} build -f ${CMAKE_CURRENT_SOURCE_DIR}/support/mkdocs.yml
477*5c90c05cSAndroid Build Coastguard Worker        # MkDocs requires the site dir to be outside of the doc dir.
478*5c90c05cSAndroid Build Coastguard Worker                        --site-dir ${CMAKE_CURRENT_BINARY_DIR}/doc-html
479*5c90c05cSAndroid Build Coastguard Worker                        --no-directory-urls
480*5c90c05cSAndroid Build Coastguard Worker    SOURCES ${sources})
481*5c90c05cSAndroid Build Coastguard Worker
482*5c90c05cSAndroid Build Coastguard Worker  include(GNUInstallDirs)
483*5c90c05cSAndroid Build Coastguard Worker  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc-html/
484*5c90c05cSAndroid Build Coastguard Worker          DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/fmt OPTIONAL)
485*5c90c05cSAndroid Build Coastguard Workerendfunction()
486*5c90c05cSAndroid Build Coastguard Worker
487*5c90c05cSAndroid Build Coastguard Workerif (FMT_DOC)
488*5c90c05cSAndroid Build Coastguard Worker  add_doc_target()
489*5c90c05cSAndroid Build Coastguard Workerendif ()
490*5c90c05cSAndroid Build Coastguard Worker
491*5c90c05cSAndroid Build Coastguard Workerif (FMT_TEST)
492*5c90c05cSAndroid Build Coastguard Worker  enable_testing()
493*5c90c05cSAndroid Build Coastguard Worker  add_subdirectory(test)
494*5c90c05cSAndroid Build Coastguard Workerendif ()
495*5c90c05cSAndroid Build Coastguard Worker
496*5c90c05cSAndroid Build Coastguard Worker# Control fuzzing independent of the unit tests.
497*5c90c05cSAndroid Build Coastguard Workerif (FMT_FUZZ)
498*5c90c05cSAndroid Build Coastguard Worker  add_subdirectory(test/fuzzing)
499*5c90c05cSAndroid Build Coastguard Worker
500*5c90c05cSAndroid Build Coastguard Worker  # The FMT_FUZZ macro is used to prevent resource exhaustion in fuzzing
501*5c90c05cSAndroid Build Coastguard Worker  # mode and make fuzzing practically possible. It is similar to
502*5c90c05cSAndroid Build Coastguard Worker  # FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION but uses a different name to
503*5c90c05cSAndroid Build Coastguard Worker  # avoid interfering with fuzzing of projects that use {fmt}.
504*5c90c05cSAndroid Build Coastguard Worker  # See also https://llvm.org/docs/LibFuzzer.html#fuzzer-friendly-build-mode.
505*5c90c05cSAndroid Build Coastguard Worker  target_compile_definitions(fmt PUBLIC FMT_FUZZ)
506*5c90c05cSAndroid Build Coastguard Workerendif ()
507*5c90c05cSAndroid Build Coastguard Worker
508*5c90c05cSAndroid Build Coastguard Workerset(gitignore ${PROJECT_SOURCE_DIR}/.gitignore)
509*5c90c05cSAndroid Build Coastguard Workerif (FMT_MASTER_PROJECT AND EXISTS ${gitignore})
510*5c90c05cSAndroid Build Coastguard Worker  # Get the list of ignored files from .gitignore.
511*5c90c05cSAndroid Build Coastguard Worker  file (STRINGS ${gitignore} lines)
512*5c90c05cSAndroid Build Coastguard Worker  list(REMOVE_ITEM lines /doc/html)
513*5c90c05cSAndroid Build Coastguard Worker  foreach (line ${lines})
514*5c90c05cSAndroid Build Coastguard Worker    string(REPLACE "." "[.]" line "${line}")
515*5c90c05cSAndroid Build Coastguard Worker    string(REPLACE "*" ".*" line "${line}")
516*5c90c05cSAndroid Build Coastguard Worker    set(ignored_files ${ignored_files} "${line}$" "${line}/")
517*5c90c05cSAndroid Build Coastguard Worker  endforeach ()
518*5c90c05cSAndroid Build Coastguard Worker  set(ignored_files ${ignored_files} /.git /build/doxyxml .vagrant)
519*5c90c05cSAndroid Build Coastguard Worker
520*5c90c05cSAndroid Build Coastguard Worker  set(CPACK_SOURCE_GENERATOR ZIP)
521*5c90c05cSAndroid Build Coastguard Worker  set(CPACK_SOURCE_IGNORE_FILES ${ignored_files})
522*5c90c05cSAndroid Build Coastguard Worker  set(CPACK_SOURCE_PACKAGE_FILE_NAME fmt-${FMT_VERSION})
523*5c90c05cSAndroid Build Coastguard Worker  set(CPACK_PACKAGE_NAME fmt)
524*5c90c05cSAndroid Build Coastguard Worker  set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.md)
525*5c90c05cSAndroid Build Coastguard Worker  include(CPack)
526*5c90c05cSAndroid Build Coastguard Workerendif ()
527