Darwin.cmake 9.82 KB
Newer Older
1
set(APPLE 1)
Alexander Neundorf's avatar
   
Alexander Neundorf committed
2

3
if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS" OR CMAKE_SYSTEM_NAME STREQUAL "watchOS")
4
5
6
  if(NOT DEFINED CMAKE_MACOSX_BUNDLE)
    set(CMAKE_MACOSX_BUNDLE ON)
  endif()
7

8
  list(APPEND CMAKE_FIND_ROOT_PATH "${_CMAKE_OSX_SYSROOT_PATH}")
9
10
11
12
13
14
15
16
17
  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
      set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  endif()
  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
      set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  endif()
  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
      set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  endif()
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
  if(NOT DEFINED HAVE_FLAG_SEARCH_PATHS_FIRST)
    # FIXME: We should be able to unilaterally set HAVE_FLAG_SEARCH_PATHS_FIRST
    #        to 1 here, but we need this condition to preserve backward
    #        compatibility. The old code used to assume CMAKE_SYSTEM_VERSION
    #        was always set and therefore DARWIN_MAJOR_VERSION would always
    #        be populated. For device platforms, it would end up as an empty
    #        string, resulting in HAVE_FLAG_SEARCH_PATHS_FIRST being set to 0.
    #        Some projects worked around another symptom of this by setting
    #        CMAKE_SYSTEM_VERSION, which is wrong but gave the behavior they
    #        wanted. We have to continue to honor that. We should remove all of
    #        this logic with a policy and set it to 1 always if not already
    #        defined.
    set(HAVE_FLAG_SEARCH_PATHS_FIRST 0)
    if("${CMAKE_SYSTEM_VERSION}" VERSION_GREATER_EQUAL 7)
      set(HAVE_FLAG_SEARCH_PATHS_FIRST 1)
    endif()
  endif()
else()
  # Darwin versions:
  #   6.x == Mac OSX 10.2 (Jaguar)
  #   7.x == Mac OSX 10.3 (Panther)
  #   8.x == Mac OSX 10.4 (Tiger)
  #   9.x == Mac OSX 10.5 (Leopard)
  #  10.x == Mac OSX 10.6 (Snow Leopard)
  #  11.x == Mac OSX 10.7 (Lion)
  #  12.x == Mac OSX 10.8 (Mountain Lion)
  string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_SYSTEM_VERSION}")
  string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\2" DARWIN_MINOR_VERSION "${CMAKE_SYSTEM_VERSION}")
47

48
49
  # Done this way because it is too early to do a TRY_COMPILE.
  if(NOT DEFINED HAVE_FLAG_SEARCH_PATHS_FIRST)
50
    set(HAVE_FLAG_SEARCH_PATHS_FIRST 1)
51
52
  endif()
endif()
53

54
55
set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
56
set(CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES ".tbd" ".so")
57
58
59
60
set(CMAKE_SHARED_MODULE_PREFIX "lib")
set(CMAKE_SHARED_MODULE_SUFFIX ".so")
set(CMAKE_MODULE_EXISTS 1)
set(CMAKE_DL_LIBS "")
61
62
63
if(NOT "${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
  set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
endif()
64

65
66
67
68
foreach(lang C CXX OBJC OBJCXX)
  set(CMAKE_${lang}_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
  set(CMAKE_${lang}_OSX_CURRENT_VERSION_FLAG "-current_version ")
  set(CMAKE_${lang}_LINK_FLAGS "-Wl,-headerpad_max_install_names")
69

70
71
72
  if(HAVE_FLAG_SEARCH_PATHS_FIRST)
    set(CMAKE_${lang}_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_${lang}_LINK_FLAGS}")
  endif()
73

74
75
76
77
  set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names")
  set(CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS "-bundle -Wl,-headerpad_max_install_names")
  set(CMAKE_SHARED_MODULE_LOADER_${lang}_FLAG "-Wl,-bundle_loader,")
endforeach()
78
79

set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
80
set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a")
81

82
83
84
85
# hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree
# (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache
# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun)
# hardcode CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did before, Alex
86
87
88
if(NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
  find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
  mark_as_advanced(CMAKE_INSTALL_NAME_TOOL)
89
endif()
90

91
92
# Enable shared library versioning.
set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name")
93

94
if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
95
96
97
98
  # Need to list dependent shared libraries on link line.  When building
  # with -isysroot (for universal binaries), the linker always looks for
  # dependent libraries under the sysroot.  Listing them on the link
  # line works around the problem.
99
100
  set(CMAKE_LINK_DEPENDENT_LIBRARY_FILES 1)
endif()
101

102
103
104
105
106
foreach(lang C CXX Fortran OBJC OBJCXX)
  # Xcode does not support -isystem yet.
  if(XCODE)
    set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang})
  endif()
107

108
109
  set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
    "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
110

111
112
  set(CMAKE_${lang}_CREATE_SHARED_MODULE
      "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
113

114
115
  set(CMAKE_${lang}_CREATE_MACOSX_FRAMEWORK
      "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>")
116

117
118
119
120
  # Set default framework search path flag for languages known to use a
  # preprocessor that may find headers in frameworks.
  set(CMAKE_${lang}_FRAMEWORK_SEARCH_FLAG -F)
endforeach()
121

122
# default to searching for frameworks first
123
124
125
if(NOT DEFINED CMAKE_FIND_FRAMEWORK)
  set(CMAKE_FIND_FRAMEWORK FIRST)
endif()
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143

# Older OS X linkers do not report their framework search path
# with -v but "man ld" documents the following locations.
set(CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
  ${_CMAKE_OSX_SYSROOT_PATH}/Library/Frameworks
  ${_CMAKE_OSX_SYSROOT_PATH}/System/Library/Frameworks
  )
if(_CMAKE_OSX_SYSROOT_PATH)
  # Treat some paths as implicit so we do not override the SDK versions.
  list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
    /System/Library/Frameworks)
endif()
if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
  # Older OS X tools had more implicit paths.
  list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
    ${_CMAKE_OSX_SYSROOT_PATH}/Network/Library/Frameworks)
endif()

144
# set up the default search directories for frameworks
145
set(CMAKE_SYSTEM_FRAMEWORK_PATH
146
  ~/Library/Frameworks
147
148
149
150
151
152
153
  )
if(_CMAKE_OSX_SYSROOT_PATH)
  list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
    ${_CMAKE_OSX_SYSROOT_PATH}/Library/Frameworks
    ${_CMAKE_OSX_SYSROOT_PATH}/Network/Library/Frameworks
    ${_CMAKE_OSX_SYSROOT_PATH}/System/Library/Frameworks
    )
154
  # add platform developer framework path if exists
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  foreach(_path
    # Xcode 6
    ${_CMAKE_OSX_SYSROOT_PATH}/../../Library/Frameworks
    # Xcode 5 iOS
    ${_CMAKE_OSX_SYSROOT_PATH}/Developer/Library/Frameworks
    # Xcode 5 OSX
    ${_CMAKE_OSX_SYSROOT_PATH}/../../../../../Library/Frameworks
    )
    get_filename_component(_abolute_path "${_path}" ABSOLUTE)
    if(EXISTS "${_abolute_path}")
      list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH "${_abolute_path}")
      break()
    endif()
  endforeach()
169
170
171
172
173
174
175

  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib)
    list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib)
  endif()
  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib)
    list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib)
  endif()
176
endif()
177
178
179
180
if (OSX_DEVELOPER_ROOT AND EXISTS "${OSX_DEVELOPER_ROOT}/Library/Frameworks")
  list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
    ${OSX_DEVELOPER_ROOT}/Library/Frameworks)
endif()
181
list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
Bill Hoffman's avatar
Bill Hoffman committed
182
  /Library/Frameworks
183
184
185
  /Network/Library/Frameworks
  /System/Library/Frameworks)

186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# Warn about known system mis-configuration case.
if(CMAKE_OSX_SYSROOT)
  get_property(_IN_TC GLOBAL PROPERTY IN_TRY_COMPILE)
  if(NOT _IN_TC AND
     NOT IS_SYMLINK "${CMAKE_OSX_SYSROOT}/Library/Frameworks"
     AND IS_SYMLINK "${CMAKE_OSX_SYSROOT}/Library/Frameworks/Frameworks")
    message(WARNING "The SDK Library/Frameworks path\n"
      " ${CMAKE_OSX_SYSROOT}/Library/Frameworks\n"
      "is not set up correctly on this system.  "
      "This is known to occur when installing Xcode 3.2.6:\n"
      " http://bugs.python.org/issue14018\n"
      "The problem may cause build errors that report missing system frameworks.  "
      "Fix your SDK symlinks to resolve this issue and avoid this warning."
      )
  endif()
endif()

203
# default to searching for application bundles first
204
205
206
if(NOT DEFINED CMAKE_FIND_APPBUNDLE)
  set(CMAKE_FIND_APPBUNDLE FIRST)
endif()
207
# set up the default search directories for application bundles
208
209
set(_apps_paths)
foreach(_path
210
211
212
213
214
  "~/Applications"
  "/Applications"
  "${OSX_DEVELOPER_ROOT}/../Applications" # Xcode 4.3+
  "${OSX_DEVELOPER_ROOT}/Applications"    # pre-4.3
  )
215
216
217
218
219
  get_filename_component(_apps "${_path}" ABSOLUTE)
  if(EXISTS "${_apps}")
    list(APPEND _apps_paths "${_apps}")
  endif()
endforeach()
220
221
222
if(_apps_paths)
  list(REMOVE_DUPLICATES _apps_paths)
endif()
223
set(CMAKE_SYSTEM_APPBUNDLE_PATH
224
  ${_apps_paths})
225
unset(_apps_paths)
226

227
include(Platform/UnixPaths)
228
229
230
231
232
233
234

if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
  list(PREPEND CMAKE_SYSTEM_PREFIX_PATH
    /opt/homebrew # Brew on Apple Silicon
    )
endif()

235
236
237
238
239
240
241
242
243
244
245
246
247
if(_CMAKE_OSX_SYSROOT_PATH)
  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/include)
    list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr)
    foreach(lang C CXX OBJC OBJCXX Swift)
      list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/include)
    endforeach()
  endif()
  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include)
    list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local)
    foreach(lang C CXX OBJC OBJCXX Swift)
      list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include)
    endforeach()
  endif()
248
endif()
249
list(APPEND CMAKE_SYSTEM_PREFIX_PATH
250
251
252
  /sw        # Fink
  /opt/local # MacPorts
  )