summaryrefslogtreecommitdiffstats
path: root/cmake/modules/FindFmt.cmake
blob: 7f0023be0512aa41f8da048cf7422807b62a3f06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# FindFmt
# -------
# Finds the Fmt library
#
# This will define the following variables::
#
# FMT_FOUND - system has Fmt
# FMT_INCLUDE_DIRS - the Fmt include directory
# FMT_LIBRARIES - the Fmt libraries
#
# and the following imported targets::
#
#   fmt::fmt   - The Fmt library

define_property(TARGET PROPERTY LIB_BUILD
                       BRIEF_DOCS "This target will be compiling the library"
                       FULL_DOCS "This target will be compiling the library")

set(FORCE_BUILD OFF)

# If target exists, no need to rerun find
# Allows a module that may be a dependency for multiple libraries to just be executed
# once to populate all required variables/targets
if((NOT TARGET fmt::fmt OR Fmt_FIND_REQUIRED) AND NOT TARGET fmt)

  # Build if ENABLE_INTERNAL_FMT, or if required version in find_package call is greater 
  # than already found FMT_VERSION from a previous find_package call
  if(ENABLE_INTERNAL_FMT OR (Fmt_FIND_REQUIRED AND FMT_VERSION VERSION_LESS Fmt_FIND_VERSION))

    include(cmake/scripts/common/ModuleHelpers.cmake)

    set(MODULE_LC fmt)

    SETUP_BUILD_VARS()

    # Check for existing FMT. If version >= FMT-VERSION file version, dont build
    find_package(FMT CONFIG QUIET)

    if(Fmt_FIND_VERSION)
      if(FMT_VERSION VERSION_LESS ${Fmt_FIND_VERSION})
        set(FORCE_BUILD ON)
      endif()
    else()
      set(FORCE_BUILD ON)
    endif()

    if(${FORCE_BUILD} OR FMT_VERSION VERSION_LESS ${${MODULE}_VER})

      # Set FORCE_BUILD to enable fmt::fmt property that build will occur
      set(FORCE_BUILD ON)

      if(APPLE)
        set(EXTRA_ARGS "-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}")
      endif()

      set(FMT_VERSION ${${MODULE}_VER})
      # fmt debug uses postfix d for all platforms
      set(FMT_DEBUG_POSTFIX d)

      if(WIN32 OR WINDOWS_STORE)
        set(patches "${CMAKE_SOURCE_DIR}/tools/depends/target/${MODULE_LC}/001-windows-pdb-symbol-gen.patch")
        generate_patchcommand("${patches}")
      endif()

      set(CMAKE_ARGS -DCMAKE_CXX_EXTENSIONS=${CMAKE_CXX_EXTENSIONS}
                     -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
                     -DFMT_DOC=OFF
                     -DFMT_TEST=OFF
                     -DFMT_INSTALL=ON
                     "${EXTRA_ARGS}")

      BUILD_DEP_TARGET()
    else()
      # Populate paths for find_package_handle_standard_args
      find_path(FMT_INCLUDE_DIR NAMES fmt/format.h)
      find_library(FMT_LIBRARY_RELEASE NAMES fmt)
      find_library(FMT_LIBRARY_DEBUG NAMES fmtd)
    endif()
  else()
    find_package(FMT 6.1.2 CONFIG REQUIRED QUIET)

    if(PKG_CONFIG_FOUND)
      pkg_check_modules(PC_FMT libfmt QUIET)
      if(PC_FMT_VERSION AND NOT FMT_VERSION)
        set(FMT_VERSION ${PC_FMT_VERSION})
      endif()
    endif()

    find_path(FMT_INCLUDE_DIR NAMES fmt/format.h
                              PATHS ${PC_FMT_INCLUDEDIR})

    find_library(FMT_LIBRARY_RELEASE NAMES fmt
                                    PATHS ${PC_FMT_LIBDIR})
    find_library(FMT_LIBRARY_DEBUG NAMES fmtd
                                   PATHS ${PC_FMT_LIBDIR})

  endif()

  include(SelectLibraryConfigurations)
  select_library_configurations(FMT)

  include(FindPackageHandleStandardArgs)
  find_package_handle_standard_args(Fmt
                                    REQUIRED_VARS FMT_LIBRARY FMT_INCLUDE_DIR
                                    VERSION_VAR FMT_VERSION)

  if(FMT_FOUND)
    set(FMT_LIBRARIES ${FMT_LIBRARY})
    set(FMT_INCLUDE_DIRS ${FMT_INCLUDE_DIR})

    # Reorder this to allow handling of FMT_FORCE_BUILD and not duplicate in property
    if(NOT TARGET fmt::fmt)
      set_property(GLOBAL APPEND PROPERTY INTERNAL_DEPS_PROP fmt::fmt)
    endif()

    if(NOT TARGET fmt::fmt OR FORCE_BUILD)
      if(NOT TARGET fmt::fmt)
        add_library(fmt::fmt UNKNOWN IMPORTED)
      endif()

      if(FMT_LIBRARY_RELEASE)
        set_target_properties(fmt::fmt PROPERTIES
                                       IMPORTED_CONFIGURATIONS RELEASE
                                       IMPORTED_LOCATION "${FMT_LIBRARY_RELEASE}")
      endif()
      if(FMT_LIBRARY_DEBUG)
        set_target_properties(fmt::fmt PROPERTIES
                                       IMPORTED_CONFIGURATIONS DEBUG
                                       IMPORTED_LOCATION "${FMT_LIBRARY_DEBUG}")
      endif()
      set_target_properties(fmt::fmt PROPERTIES
                                     INTERFACE_INCLUDE_DIRECTORIES "${FMT_INCLUDE_DIR}")

      # If a force build is done, let any calling packages know they may want to rebuild
      if(FORCE_BUILD)
        set_target_properties(fmt::fmt PROPERTIES LIB_BUILD ON)
      endif()
    endif()
    if(TARGET fmt)
      add_dependencies(fmt::fmt fmt)
    endif()
  else()
    if(FMT_FIND_REQUIRED)
      message(FATAL_ERROR "Fmt lib not found. Maybe use -DENABLE_INTERNAL_FMT=ON")
    endif()
  endif()

  mark_as_advanced(FMT_INCLUDE_DIR FMT_LIBRARY)
endif()