Darwin-Initialize.cmake 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. # Ask xcode-select where to find /Developer or fall back to ancient location.
  2. execute_process(COMMAND xcode-select -print-path
  3. OUTPUT_VARIABLE _stdout
  4. OUTPUT_STRIP_TRAILING_WHITESPACE
  5. ERROR_VARIABLE _stderr
  6. RESULT_VARIABLE _failed)
  7. if(NOT _failed AND IS_DIRECTORY ${_stdout})
  8. set(OSX_DEVELOPER_ROOT ${_stdout})
  9. elseif(IS_DIRECTORY "/Developer")
  10. set(OSX_DEVELOPER_ROOT "/Developer")
  11. else()
  12. set(OSX_DEVELOPER_ROOT "")
  13. endif()
  14. execute_process(COMMAND sw_vers -productVersion
  15. OUTPUT_VARIABLE CURRENT_OSX_VERSION
  16. OUTPUT_STRIP_TRAILING_WHITESPACE)
  17. # Save CMAKE_OSX_ARCHITECTURES from the environment.
  18. set(CMAKE_OSX_ARCHITECTURES "$ENV{CMAKE_OSX_ARCHITECTURES}" CACHE STRING
  19. "Build architectures for OSX")
  20. # macOS, iOS, tvOS, and watchOS should lookup compilers from
  21. # Platform/Apple-${CMAKE_CXX_COMPILER_ID}-<LANG>
  22. set(CMAKE_EFFECTIVE_SYSTEM_NAME "Apple")
  23. #----------------------------------------------------------------------------
  24. # _CURRENT_OSX_VERSION - as a two-component string: 10.5, 10.6, ...
  25. #
  26. string(REGEX REPLACE "^([0-9]+\\.[0-9]+).*$" "\\1"
  27. _CURRENT_OSX_VERSION "${CURRENT_OSX_VERSION}")
  28. #----------------------------------------------------------------------------
  29. # CMAKE_OSX_DEPLOYMENT_TARGET
  30. # Set cache variable - end user may change this during ccmake or cmake-gui configure.
  31. if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND _CURRENT_OSX_VERSION VERSION_GREATER 10.3)
  32. set(CMAKE_OSX_DEPLOYMENT_TARGET "$ENV{MACOSX_DEPLOYMENT_TARGET}" CACHE STRING
  33. "Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value.")
  34. endif()
  35. #----------------------------------------------------------------------------
  36. # CMAKE_OSX_SYSROOT
  37. if(CMAKE_OSX_SYSROOT)
  38. # Use the existing value without further computation to choose a default.
  39. set(_CMAKE_OSX_SYSROOT_DEFAULT "${CMAKE_OSX_SYSROOT}")
  40. elseif(NOT "x$ENV{SDKROOT}" STREQUAL "x" AND
  41. (NOT "x$ENV{SDKROOT}" MATCHES "/" OR IS_DIRECTORY "$ENV{SDKROOT}"))
  42. # Use the value of SDKROOT from the environment.
  43. set(_CMAKE_OSX_SYSROOT_DEFAULT "$ENV{SDKROOT}")
  44. elseif(CMAKE_SYSTEM_NAME STREQUAL iOS)
  45. set(_CMAKE_OSX_SYSROOT_DEFAULT "iphoneos")
  46. elseif(CMAKE_SYSTEM_NAME STREQUAL tvOS)
  47. set(_CMAKE_OSX_SYSROOT_DEFAULT "appletvos")
  48. elseif(CMAKE_SYSTEM_NAME STREQUAL watchOS)
  49. set(_CMAKE_OSX_SYSROOT_DEFAULT "watchos")
  50. elseif("${CMAKE_GENERATOR}" MATCHES Xcode
  51. OR CMAKE_OSX_DEPLOYMENT_TARGET
  52. OR CMAKE_OSX_ARCHITECTURES MATCHES "[^;]"
  53. OR NOT EXISTS "/usr/include/sys/types.h")
  54. # Find installed SDKs in either Xcode-4.3+ or pre-4.3 SDKs directory.
  55. set(_CMAKE_OSX_SDKS_DIR "")
  56. if(OSX_DEVELOPER_ROOT)
  57. foreach(d Platforms/MacOSX.platform/Developer/SDKs SDKs)
  58. file(GLOB _CMAKE_OSX_SDKS ${OSX_DEVELOPER_ROOT}/${d}/*)
  59. if(_CMAKE_OSX_SDKS)
  60. set(_CMAKE_OSX_SDKS_DIR ${OSX_DEVELOPER_ROOT}/${d})
  61. break()
  62. endif()
  63. endforeach()
  64. endif()
  65. if(_CMAKE_OSX_SDKS_DIR)
  66. # Select SDK for current OSX version accounting for the known
  67. # specially named SDKs.
  68. set(_CMAKE_OSX_SDKS_VER_SUFFIX_10.4 "u")
  69. set(_CMAKE_OSX_SDKS_VER_SUFFIX_10.3 ".9")
  70. # find the latest SDK
  71. set(_CMAKE_OSX_LATEST_SDK_VERSION "0.0")
  72. file(GLOB _CMAKE_OSX_SDKS RELATIVE "${_CMAKE_OSX_SDKS_DIR}" "${_CMAKE_OSX_SDKS_DIR}/MacOSX*.sdk")
  73. foreach(_SDK ${_CMAKE_OSX_SDKS})
  74. if(_SDK MATCHES "MacOSX([0-9]+\\.[0-9]+)[^/]*\\.sdk" AND CMAKE_MATCH_1 VERSION_GREATER ${_CMAKE_OSX_LATEST_SDK_VERSION})
  75. set(_CMAKE_OSX_LATEST_SDK_VERSION "${CMAKE_MATCH_1}")
  76. endif()
  77. endforeach()
  78. # pick an SDK that works
  79. set(_CMAKE_OSX_SYSROOT_DEFAULT)
  80. foreach(ver ${CMAKE_OSX_DEPLOYMENT_TARGET}
  81. ${_CURRENT_OSX_VERSION}
  82. ${_CMAKE_OSX_LATEST_SDK_VERSION})
  83. set(_CMAKE_OSX_DEPLOYMENT_TARGET ${ver})
  84. set(_CMAKE_OSX_SDKS_VER ${_CMAKE_OSX_DEPLOYMENT_TARGET}${_CMAKE_OSX_SDKS_VER_SUFFIX_${_CMAKE_OSX_DEPLOYMENT_TARGET}})
  85. set(_CMAKE_OSX_SYSROOT_CHECK "${_CMAKE_OSX_SDKS_DIR}/MacOSX${_CMAKE_OSX_SDKS_VER}.sdk")
  86. if(IS_DIRECTORY "${_CMAKE_OSX_SYSROOT_CHECK}")
  87. set(_CMAKE_OSX_SYSROOT_DEFAULT "${_CMAKE_OSX_SYSROOT_CHECK}")
  88. break()
  89. endif()
  90. endforeach()
  91. if(NOT CMAKE_CROSSCOMPILING AND NOT CMAKE_OSX_DEPLOYMENT_TARGET AND _CURRENT_OSX_VERSION VERSION_LESS _CMAKE_OSX_DEPLOYMENT_TARGET)
  92. set(CMAKE_OSX_DEPLOYMENT_TARGET ${_CURRENT_OSX_VERSION} CACHE STRING
  93. "Minimum OS X version to target for deployment (at runtime); newer APIs weak linked. Set to empty string for default value." FORCE)
  94. endif()
  95. else()
  96. # Assume developer files are in root (such as Xcode 4.5 command-line tools).
  97. set(_CMAKE_OSX_SYSROOT_DEFAULT "")
  98. endif()
  99. endif()
  100. # Set cache variable - end user may change this during ccmake or cmake-gui configure.
  101. # Choose the type based on the current value.
  102. set(_CMAKE_OSX_SYSROOT_TYPE STRING)
  103. foreach(v CMAKE_OSX_SYSROOT _CMAKE_OSX_SYSROOT_DEFAULT)
  104. if("x${${v}}" MATCHES "/")
  105. set(_CMAKE_OSX_SYSROOT_TYPE PATH)
  106. break()
  107. endif()
  108. endforeach()
  109. set(CMAKE_OSX_SYSROOT "${_CMAKE_OSX_SYSROOT_DEFAULT}" CACHE ${_CMAKE_OSX_SYSROOT_TYPE}
  110. "The product will be built against the headers and libraries located inside the indicated SDK.")
  111. # Resolves the SDK name into a path
  112. function(_apple_resolve_sdk_path sdk_name ret)
  113. execute_process(
  114. COMMAND xcrun -sdk ${sdk_name} --show-sdk-path
  115. OUTPUT_VARIABLE _stdout
  116. OUTPUT_STRIP_TRAILING_WHITESPACE
  117. ERROR_VARIABLE _stderr
  118. RESULT_VARIABLE _failed
  119. )
  120. set(${ret} "${_stdout}" PARENT_SCOPE)
  121. endfunction()
  122. # Handle multi-arch sysroots. Do this before CMAKE_OSX_SYSROOT is
  123. # transformed into a path, so that we know the sysroot name.
  124. function(_apple_resolve_multi_arch_sysroots)
  125. if(CMAKE_APPLE_ARCH_SYSROOTS)
  126. return() # Already cached
  127. endif()
  128. list(LENGTH CMAKE_OSX_ARCHITECTURES _num_archs)
  129. if(NOT (_num_archs GREATER 1))
  130. return() # Only apply to multi-arch
  131. endif()
  132. if(CMAKE_OSX_SYSROOT STREQUAL "macosx")
  133. # macOS doesn't have a simulator sdk / sysroot, so there is no need to handle per-sdk arches.
  134. return()
  135. endif()
  136. if(IS_DIRECTORY "${CMAKE_OSX_SYSROOT}")
  137. if(NOT CMAKE_OSX_SYSROOT STREQUAL _CMAKE_OSX_SYSROOT_DEFAULT)
  138. message(WARNING "Can not resolve multi-arch sysroots with CMAKE_OSX_SYSROOT set to path (${CMAKE_OSX_SYSROOT})")
  139. endif()
  140. return()
  141. endif()
  142. string(REPLACE "os" "simulator" _simulator_sdk ${CMAKE_OSX_SYSROOT})
  143. set(_sdks "${CMAKE_OSX_SYSROOT};${_simulator_sdk}")
  144. foreach(sdk ${_sdks})
  145. _apple_resolve_sdk_path(${sdk} _sdk_path)
  146. if(NOT IS_DIRECTORY "${_sdk_path}")
  147. message(WARNING "Failed to resolve SDK path for '${sdk}'")
  148. continue()
  149. endif()
  150. execute_process(
  151. COMMAND plutil -extract SupportedTargets.${sdk}.Archs json ${_sdk_path}/SDKSettings.plist -o -
  152. OUTPUT_VARIABLE _sdk_archs_json
  153. OUTPUT_STRIP_TRAILING_WHITESPACE
  154. ERROR_VARIABLE _stderr
  155. RESULT_VARIABLE _failed
  156. )
  157. if(_failed)
  158. # Failure to extract supported architectures for an SDK means that the installed SDK is old
  159. # and does not provide such information (SDKs that come with Xcode >= 10.x started providing
  160. # the information). In such a case, return early, and handle multi-arch builds the old way
  161. # (no per-sdk arches).
  162. return()
  163. endif()
  164. # Poor man's JSON decoding
  165. string(REGEX REPLACE "[]\\[\"]" "" _sdk_archs ${_sdk_archs_json})
  166. string(REPLACE "," ";" _sdk_archs ${_sdk_archs})
  167. set(_sdk_archs_${sdk} ${_sdk_archs})
  168. set(_sdk_path_${sdk} ${_sdk_path})
  169. endforeach()
  170. foreach(arch ${CMAKE_OSX_ARCHITECTURES})
  171. set(_arch_sysroot "")
  172. foreach(sdk ${_sdks})
  173. list(FIND _sdk_archs_${sdk} ${arch} arch_index)
  174. if(NOT arch_index EQUAL -1)
  175. set(_arch_sysroot ${_sdk_path_${sdk}})
  176. break()
  177. endif()
  178. endforeach()
  179. if(_arch_sysroot)
  180. list(APPEND _arch_sysroots ${_arch_sysroot})
  181. else()
  182. message(WARNING "No SDK found for architecture '${arch}'")
  183. list(APPEND _arch_sysroots "") # Placeholder
  184. endif()
  185. endforeach()
  186. set(CMAKE_APPLE_ARCH_SYSROOTS "${_arch_sysroots}" CACHE INTERNAL
  187. "Architecture dependent sysroots, one per CMAKE_OSX_ARCHITECTURES")
  188. endfunction()
  189. _apple_resolve_multi_arch_sysroots()
  190. # Transform CMAKE_OSX_SYSROOT to absolute path
  191. set(_CMAKE_OSX_SYSROOT_PATH "")
  192. if(CMAKE_OSX_SYSROOT)
  193. if("x${CMAKE_OSX_SYSROOT}" MATCHES "/")
  194. # This is a path to the SDK. Make sure it exists.
  195. if(NOT IS_DIRECTORY "${CMAKE_OSX_SYSROOT}")
  196. message(WARNING "Ignoring CMAKE_OSX_SYSROOT value:\n ${CMAKE_OSX_SYSROOT}\n"
  197. "because the directory does not exist.")
  198. set(CMAKE_OSX_SYSROOT "")
  199. endif()
  200. set(_CMAKE_OSX_SYSROOT_PATH "${CMAKE_OSX_SYSROOT}")
  201. else()
  202. _apple_resolve_sdk_path(${CMAKE_OSX_SYSROOT} _sdk_path)
  203. if(IS_DIRECTORY "${_sdk_path}")
  204. set(_CMAKE_OSX_SYSROOT_PATH "${_sdk_path}")
  205. # For non-Xcode generators use the path.
  206. if(NOT "${CMAKE_GENERATOR}" MATCHES "Xcode")
  207. set(CMAKE_OSX_SYSROOT "${_CMAKE_OSX_SYSROOT_PATH}")
  208. endif()
  209. endif()
  210. endif()
  211. endif()