buildspec.cmake 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. # OBS CMake macOS build dependencies module
  2. # cmake-format: off
  3. # cmake-lint: disable=E1126
  4. # cmake-lint: disable=R0912
  5. # cmake-lint: disable=R0915
  6. # cmake-format: on
  7. # _check_deps_version: Checks for obs-deps VERSION file in prefix paths
  8. macro(_check_deps_version version)
  9. set(found FALSE)
  10. foreach(path IN LISTS CMAKE_PREFIX_PATH)
  11. if(EXISTS "${path}/share/obs-deps/VERSION")
  12. if(dependency STREQUAL qt6 AND NOT EXISTS "${path}/lib/cmake/Qt6/Qt6Config.cmake")
  13. set(found FALSE)
  14. break()
  15. endif()
  16. file(READ "${path}/share/obs-deps/VERSION" _check_version)
  17. string(REPLACE "\n" "" _check_version "${_check_version}")
  18. if(_check_version VERSION_EQUAL version)
  19. set(found TRUE)
  20. break()
  21. elseif(_check_version VERSION_LESS version)
  22. message(AUTHOR_WARNING "Outdated ${label} version detected in ${path}: \n"
  23. "Found ${_check_version}, require ${version}")
  24. list(REMOVE_ITEM CMAKE_PREFIX_PATH "${path}")
  25. list(APPEND CMAKE_PREFIX_PATH "${path}")
  26. continue()
  27. else()
  28. message(AUTHOR_WARNING "Future ${label} version detected in ${path}: \n"
  29. "Found ${_check_version}, require ${version}")
  30. set(found TRUE)
  31. break()
  32. endif()
  33. endif()
  34. endforeach()
  35. endmacro()
  36. # _check_dependencies: Fetch and extract pre-built OBS build dependencies
  37. function(_check_dependencies)
  38. if(CMAKE_OSX_ARCHITECTURES MATCHES ".+;.+")
  39. set(arch universal)
  40. else()
  41. set(arch ${CMAKE_OSX_ARCHITECTURES})
  42. endif()
  43. file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec)
  44. # cmake-format: off
  45. string(JSON deployment_target GET ${buildspec} platformConfig macos-${arch} deploymentTarget)
  46. string(JSON dependency_data GET ${buildspec} dependencies)
  47. # cmake-format: on
  48. if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
  49. set(CMAKE_OSX_DEPLOYMENT_TARGET
  50. ${_deployment_target}
  51. CACHE STRING "Minimum macOS version to target for deployment (at runtime). Newer APIs will be weak-linked."
  52. FORCE)
  53. endif()
  54. set(dependencies_dir "${CMAKE_CURRENT_SOURCE_DIR}/.deps")
  55. set(prebuilt_filename "macos-deps-VERSION-ARCH-REVISION.tar.xz")
  56. set(prebuilt_destination "obs-deps-VERSION-ARCH")
  57. set(qt6_filename "macos-deps-qt6-VERSION-ARCH-REVISION.tar.xz")
  58. set(qt6_destination "obs-deps-qt6-VERSION-ARCH")
  59. set(cef_filename "cef_binary_VERSION_macos_ARCH_REVISION.tar.xz")
  60. set(cef_destination "cef_binary_VERSION_macos_ARCH")
  61. foreach(dependency IN ITEMS prebuilt qt6 cef)
  62. # cmake-format: off
  63. string(JSON data GET ${dependency_data} ${dependency})
  64. string(JSON version GET ${data} version)
  65. string(JSON hash GET ${data} hashes macos-${arch})
  66. string(JSON url GET ${data} baseUrl)
  67. string(JSON label GET ${data} label)
  68. string(JSON revision ERROR_VARIABLE error GET ${data} revision macos-${arch})
  69. # cmake-format: on
  70. message(STATUS "Setting up ${label}")
  71. set(file "${${dependency}_filename}")
  72. set(destination "${${dependency}_destination}")
  73. string(REPLACE "VERSION" "${version}" file "${file}")
  74. string(REPLACE "VERSION" "${version}" destination "${destination}")
  75. string(REPLACE "ARCH" "${arch}" file "${file}")
  76. string(REPLACE "ARCH" "${arch}" destination "${destination}")
  77. if(revision)
  78. string(REPLACE "_REVISION" "_v${revision}" file "${file}")
  79. string(REPLACE "-REVISION" "-v${revision}" file "${file}")
  80. else()
  81. string(REPLACE "_REVISION" "" file "${file}")
  82. string(REPLACE "-REVISION" "" file "${file}")
  83. endif()
  84. set(skip FALSE)
  85. if(dependency STREQUAL prebuilt OR dependency STREQUAL qt6)
  86. _check_deps_version(${version})
  87. if(found)
  88. set(skip TRUE)
  89. endif()
  90. elseif(_dependency STREQUAL sparkle)
  91. find_library(SPARKLE Sparkle)
  92. if(NOT ENABLE_SPARKLE OR SPARKLE)
  93. set(skip TRUE)
  94. else()
  95. unset(SPARKLE CACHE)
  96. endif()
  97. elseif(dependency STREQUAL vlc)
  98. if(NOT ENABLE_VLC OR (VLC_PATH AND EXISTS "${VLC_PATH}"))
  99. set(skip TRUE)
  100. endif()
  101. elseif(dependency STREQUAL cef)
  102. if(NOT ENABLE_BROWSER OR (CEF_ROOT_DIR AND EXISTS "${CEF_ROOT_DIR}"))
  103. set(skip TRUE)
  104. endif()
  105. endif()
  106. if(skip)
  107. message(STATUS "Setting up ${label} - skipped")
  108. continue()
  109. endif()
  110. if(dependency STREQUAL qt6 AND "$ENV{CI}")
  111. # cmake-format: off
  112. string(JSON hash GET ${buildspec} dependencies qt6 hashes macos-universal)
  113. # cmake-format: on
  114. string(REPLACE "${arch}" "universal" file "${file}")
  115. endif()
  116. if(dependency STREQUAL cef)
  117. set(url ${url}/${file})
  118. else()
  119. set(url ${url}/${version}/${file})
  120. endif()
  121. if(NOT EXISTS "${dependencies_dir}/${file}")
  122. message(STATUS "Downloading ${url}")
  123. file(
  124. DOWNLOAD "${url}" "${dependencies_dir}/${file}"
  125. STATUS download_status
  126. EXPECTED_HASH SHA256=${hash})
  127. list(GET download_status 0 error_code)
  128. list(GET download_status 1 error_message)
  129. if(error_code GREATER 0)
  130. message(STATUS "Downloading ${url} - Failure")
  131. message(FATAL_ERROR "Unable to download ${url}, failed with error: ${error_message}")
  132. file(REMOVE "${dependencies_dir}/${file}")
  133. else()
  134. message(STATUS "Downloading ${url} - done")
  135. endif()
  136. endif()
  137. if(NOT EXISTS "${dependencies_dir}/${destination}")
  138. file(MAKE_DIRECTORY "${dependencies_dir}/${destination}")
  139. if(dependency STREQUAL vlc)
  140. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}")
  141. else()
  142. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}/${destination}")
  143. endif()
  144. execute_process(COMMAND "xattr" -r -d com.apple.quarantine "${dependencies_dir}/${destination}"
  145. RESULT_VARIABLE result COMMAND_ERROR_IS_FATAL ANY)
  146. endif()
  147. if(dependency STREQUAL cef)
  148. set(CEF_ROOT_DIR
  149. "${dependencies_dir}/${destination}"
  150. CACHE PATH "CEF Root directory" FORCE)
  151. elseif(dependency STREQUAL prebuilt)
  152. set(VLC_PATH
  153. "${dependencies_dir}/${destination}"
  154. CACHE PATH "VLC source code directory" FORCE)
  155. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  156. elseif(dependency STREQUAL qt6)
  157. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  158. endif()
  159. message(STATUS "Setting up ${label} - done")
  160. endforeach()
  161. list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
  162. set(CMAKE_PREFIX_PATH
  163. ${CMAKE_PREFIX_PATH}
  164. CACHE PATH "CMake prefix search path" FORCE)
  165. endfunction()
  166. _check_dependencies()