1set(APPLE 1)
2
3if(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS" OR CMAKE_SYSTEM_NAME STREQUAL "watchOS")
4  if(NOT DEFINED CMAKE_MACOSX_BUNDLE)
5    set(CMAKE_MACOSX_BUNDLE ON)
6  endif()
7
8  list(APPEND CMAKE_FIND_ROOT_PATH "${_CMAKE_OSX_SYSROOT_PATH}")
9  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
10      set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
11  endif()
12  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
13      set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
14  endif()
15  if(NOT DEFINED CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
16      set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
17  endif()
18endif()
19
20# Darwin versions:
21#   6.x == Mac OSX 10.2 (Jaguar)
22#   7.x == Mac OSX 10.3 (Panther)
23#   8.x == Mac OSX 10.4 (Tiger)
24#   9.x == Mac OSX 10.5 (Leopard)
25#  10.x == Mac OSX 10.6 (Snow Leopard)
26#  11.x == Mac OSX 10.7 (Lion)
27#  12.x == Mac OSX 10.8 (Mountain Lion)
28string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\1" DARWIN_MAJOR_VERSION "${CMAKE_SYSTEM_VERSION}")
29string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*$" "\\2" DARWIN_MINOR_VERSION "${CMAKE_SYSTEM_VERSION}")
30
31# Do not use the "-Wl,-search_paths_first" flag with the OSX 10.2 compiler.
32# Done this way because it is too early to do a TRY_COMPILE.
33if(NOT DEFINED HAVE_FLAG_SEARCH_PATHS_FIRST)
34  set(HAVE_FLAG_SEARCH_PATHS_FIRST 0)
35  if("${DARWIN_MAJOR_VERSION}" GREATER 6)
36    set(HAVE_FLAG_SEARCH_PATHS_FIRST 1)
37  endif()
38endif()
39# More desirable, but does not work:
40  #include(CheckCXXCompilerFlag)
41  #CHECK_CXX_COMPILER_FLAG("-Wl,-search_paths_first" HAVE_FLAG_SEARCH_PATHS_FIRST)
42
43set(CMAKE_SHARED_LIBRARY_PREFIX "lib")
44set(CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
45set(CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES ".tbd" ".so")
46set(CMAKE_SHARED_MODULE_PREFIX "lib")
47set(CMAKE_SHARED_MODULE_SUFFIX ".so")
48set(CMAKE_MODULE_EXISTS 1)
49set(CMAKE_DL_LIBS "")
50if(NOT "${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
51  set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
52endif()
53
54foreach(lang C CXX OBJC OBJCXX)
55  set(CMAKE_${lang}_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
56  set(CMAKE_${lang}_OSX_CURRENT_VERSION_FLAG "-current_version ")
57  set(CMAKE_${lang}_LINK_FLAGS "-Wl,-headerpad_max_install_names")
58
59  if(HAVE_FLAG_SEARCH_PATHS_FIRST)
60    set(CMAKE_${lang}_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_${lang}_LINK_FLAGS}")
61  endif()
62
63  set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "-dynamiclib -Wl,-headerpad_max_install_names")
64  set(CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS "-bundle -Wl,-headerpad_max_install_names")
65  set(CMAKE_SHARED_MODULE_LOADER_${lang}_FLAG "-Wl,-bundle_loader,")
66endforeach()
67
68set(CMAKE_PLATFORM_HAS_INSTALLNAME 1)
69set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a")
70
71# hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree
72# (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache
73# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun)
74# hardcode CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did before, Alex
75if(NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
76  find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
77  mark_as_advanced(CMAKE_INSTALL_NAME_TOOL)
78endif()
79
80# Enable shared library versioning.
81set(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG "-install_name")
82
83if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
84  # Need to list dependent shared libraries on link line.  When building
85  # with -isysroot (for universal binaries), the linker always looks for
86  # dependent libraries under the sysroot.  Listing them on the link
87  # line works around the problem.
88  set(CMAKE_LINK_DEPENDENT_LIBRARY_FILES 1)
89endif()
90
91foreach(lang C CXX Fortran OBJC OBJCXX)
92  # Xcode does not support -isystem yet.
93  if(XCODE)
94    set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang})
95  endif()
96
97  set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
98    "<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>")
99
100  set(CMAKE_${lang}_CREATE_SHARED_MODULE
101      "<CMAKE_${lang}_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_${lang}_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>")
102
103  set(CMAKE_${lang}_CREATE_MACOSX_FRAMEWORK
104      "<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>")
105
106  # Set default framework search path flag for languages known to use a
107  # preprocessor that may find headers in frameworks.
108  set(CMAKE_${lang}_FRAMEWORK_SEARCH_FLAG -F)
109endforeach()
110
111# default to searching for frameworks first
112if(NOT DEFINED CMAKE_FIND_FRAMEWORK)
113  set(CMAKE_FIND_FRAMEWORK FIRST)
114endif()
115
116# Older OS X linkers do not report their framework search path
117# with -v but "man ld" documents the following locations.
118set(CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
119  ${_CMAKE_OSX_SYSROOT_PATH}/Library/Frameworks
120  ${_CMAKE_OSX_SYSROOT_PATH}/System/Library/Frameworks
121  )
122if(_CMAKE_OSX_SYSROOT_PATH)
123  # Treat some paths as implicit so we do not override the SDK versions.
124  list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
125    /System/Library/Frameworks)
126endif()
127if("${_CURRENT_OSX_VERSION}" VERSION_LESS "10.5")
128  # Older OS X tools had more implicit paths.
129  list(APPEND CMAKE_PLATFORM_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES
130    ${_CMAKE_OSX_SYSROOT_PATH}/Network/Library/Frameworks)
131endif()
132
133# set up the default search directories for frameworks
134set(CMAKE_SYSTEM_FRAMEWORK_PATH
135  ~/Library/Frameworks
136  )
137if(_CMAKE_OSX_SYSROOT_PATH)
138  list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
139    ${_CMAKE_OSX_SYSROOT_PATH}/Library/Frameworks
140    ${_CMAKE_OSX_SYSROOT_PATH}/Network/Library/Frameworks
141    ${_CMAKE_OSX_SYSROOT_PATH}/System/Library/Frameworks
142    )
143  # add platform developer framework path if exists
144  foreach(_path
145    # Xcode 6
146    ${_CMAKE_OSX_SYSROOT_PATH}/../../Library/Frameworks
147    # Xcode 5 iOS
148    ${_CMAKE_OSX_SYSROOT_PATH}/Developer/Library/Frameworks
149    # Xcode 5 OSX
150    ${_CMAKE_OSX_SYSROOT_PATH}/../../../../../Library/Frameworks
151    )
152    get_filename_component(_abolute_path "${_path}" ABSOLUTE)
153    if(EXISTS "${_abolute_path}")
154      list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH "${_abolute_path}")
155      break()
156    endif()
157  endforeach()
158
159  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib)
160    list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/lib)
161  endif()
162  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib)
163    list(INSERT CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/lib)
164  endif()
165endif()
166if (OSX_DEVELOPER_ROOT AND EXISTS "${OSX_DEVELOPER_ROOT}/Library/Frameworks")
167  list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
168    ${OSX_DEVELOPER_ROOT}/Library/Frameworks)
169endif()
170list(APPEND CMAKE_SYSTEM_FRAMEWORK_PATH
171  /Library/Frameworks
172  /Network/Library/Frameworks
173  /System/Library/Frameworks)
174
175# Warn about known system mis-configuration case.
176if(CMAKE_OSX_SYSROOT)
177  get_property(_IN_TC GLOBAL PROPERTY IN_TRY_COMPILE)
178  if(NOT _IN_TC AND
179     NOT IS_SYMLINK "${CMAKE_OSX_SYSROOT}/Library/Frameworks"
180     AND IS_SYMLINK "${CMAKE_OSX_SYSROOT}/Library/Frameworks/Frameworks")
181    message(WARNING "The SDK Library/Frameworks path\n"
182      " ${CMAKE_OSX_SYSROOT}/Library/Frameworks\n"
183      "is not set up correctly on this system.  "
184      "This is known to occur when installing Xcode 3.2.6:\n"
185      " http://bugs.python.org/issue14018\n"
186      "The problem may cause build errors that report missing system frameworks.  "
187      "Fix your SDK symlinks to resolve this issue and avoid this warning."
188      )
189  endif()
190endif()
191
192# default to searching for application bundles first
193if(NOT DEFINED CMAKE_FIND_APPBUNDLE)
194  set(CMAKE_FIND_APPBUNDLE FIRST)
195endif()
196# set up the default search directories for application bundles
197set(_apps_paths)
198foreach(_path
199  "~/Applications"
200  "/Applications"
201  "${OSX_DEVELOPER_ROOT}/../Applications" # Xcode 4.3+
202  "${OSX_DEVELOPER_ROOT}/Applications"    # pre-4.3
203  )
204  get_filename_component(_apps "${_path}" ABSOLUTE)
205  if(EXISTS "${_apps}")
206    list(APPEND _apps_paths "${_apps}")
207  endif()
208endforeach()
209if(_apps_paths)
210  list(REMOVE_DUPLICATES _apps_paths)
211endif()
212set(CMAKE_SYSTEM_APPBUNDLE_PATH
213  ${_apps_paths})
214unset(_apps_paths)
215
216include(Platform/UnixPaths)
217
218if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
219  list(PREPEND CMAKE_SYSTEM_PREFIX_PATH
220    /opt/homebrew # Brew on Apple Silicon
221    )
222endif()
223
224if(_CMAKE_OSX_SYSROOT_PATH)
225  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/include)
226    list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr)
227    foreach(lang C CXX OBJC OBJCXX Swift)
228      list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/include)
229    endforeach()
230  endif()
231  if(EXISTS ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include)
232    list(INSERT CMAKE_SYSTEM_PREFIX_PATH 0 ${_CMAKE_OSX_SYSROOT_PATH}/usr/local)
233    foreach(lang C CXX OBJC OBJCXX Swift)
234      list(APPEND _CMAKE_${lang}_IMPLICIT_INCLUDE_DIRECTORIES_INIT ${_CMAKE_OSX_SYSROOT_PATH}/usr/local/include)
235    endforeach()
236  endif()
237endif()
238list(APPEND CMAKE_SYSTEM_PREFIX_PATH
239  /sw        # Fink
240  /opt/local # MacPorts
241  )
242