buildspec_common.cmake 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. # Common build dependencies module
  2. # cmake-format: off
  3. # cmake-lint: disable=C0103
  4. # cmake-lint: disable=E1126
  5. # cmake-lint: disable=R0912
  6. # cmake-lint: disable=R0915
  7. # cmake-format: on
  8. include_guard(GLOBAL)
  9. # _check_deps_version: Checks for obs-deps VERSION file in prefix paths
  10. function(_check_deps_version version)
  11. # cmake-format: off
  12. set(found FALSE PARENT_SCOPE)
  13. # cmake-format: on
  14. foreach(path IN LISTS CMAKE_PREFIX_PATH)
  15. if(EXISTS "${path}/share/obs-deps/VERSION")
  16. if(dependency STREQUAL qt6 AND NOT EXISTS "${path}/lib/cmake/Qt6/Qt6Config.cmake")
  17. # cmake-format: off
  18. set(found FALSE PARENT_SCOPE)
  19. # cmake-format: on
  20. continue()
  21. endif()
  22. file(READ "${path}/share/obs-deps/VERSION" _check_version)
  23. string(REPLACE "\n" "" _check_version "${_check_version}")
  24. string(REPLACE "-" "." _check_version "${_check_version}")
  25. string(REPLACE "-" "." version "${version}")
  26. if(_check_version VERSION_EQUAL version)
  27. # cmake-format: off
  28. set(found TRUE PARENT_SCOPE)
  29. # cmake-format: on
  30. break()
  31. elseif(_check_version VERSION_LESS version)
  32. message(AUTHOR_WARNING "Older ${label} version detected in ${path}: \n"
  33. "Found ${_check_version}, require ${version}")
  34. list(REMOVE_ITEM CMAKE_PREFIX_PATH "${path}")
  35. list(APPEND CMAKE_PREFIX_PATH "${path}")
  36. # cmake-format: off
  37. set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
  38. # cmake-format: on
  39. continue()
  40. else()
  41. message(AUTHOR_WARNING "Newer ${label} version detected in ${path}: \n"
  42. "Found ${_check_version}, require ${version}")
  43. # cmake-format: off
  44. set(found TRUE PARENT_SCOPE)
  45. # cmake-format: on
  46. break()
  47. endif()
  48. endif()
  49. endforeach()
  50. endfunction()
  51. # _setup_obs_studio: Create obs-studio build project, then build libobs and obs-frontend-api
  52. function(_setup_obs_studio)
  53. if(NOT libobs_DIR)
  54. set(_is_fresh --fresh)
  55. endif()
  56. if(OS_WINDOWS)
  57. set(_cmake_generator "${CMAKE_GENERATOR}")
  58. set(_cmake_arch "-A ${arch}")
  59. set(_cmake_extra "-DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION} -DCMAKE_ENABLE_SCRIPTING=OFF")
  60. set(_cmake_version "2.0.0")
  61. elseif(OS_MACOS)
  62. set(_cmake_generator "Xcode")
  63. set(_cmake_arch "-DCMAKE_OSX_ARCHITECTURES:STRING='arm64;x86_64'")
  64. set(_cmake_extra "-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}")
  65. set(_cmake_version "3.0.0")
  66. endif()
  67. message(STATUS "Configure ${label} (${arch})")
  68. execute_process(
  69. COMMAND
  70. "${CMAKE_COMMAND}" -S "${dependencies_dir}/${_obs_destination}" -B
  71. "${dependencies_dir}/${_obs_destination}/build_${arch}" -G ${_cmake_generator} "${_cmake_arch}"
  72. -DOBS_CMAKE_VERSION:STRING=${_cmake_version} -DENABLE_PLUGINS:BOOL=OFF -DENABLE_UI:BOOL=OFF
  73. -DOBS_VERSION_OVERRIDE:STRING=${_obs_version} "-DCMAKE_PREFIX_PATH='${CMAKE_PREFIX_PATH}'" ${_is_fresh}
  74. ${_cmake_extra}
  75. RESULT_VARIABLE _process_result COMMAND_ERROR_IS_FATAL ANY
  76. OUTPUT_QUIET)
  77. message(STATUS "Configure ${label} (${arch}) - done")
  78. message(STATUS "Build ${label} (${arch})")
  79. execute_process(
  80. COMMAND "${CMAKE_COMMAND}" --build build_${arch} --target obs-frontend-api --config Debug --parallel
  81. WORKING_DIRECTORY "${dependencies_dir}/${_obs_destination}"
  82. RESULT_VARIABLE _process_result COMMAND_ERROR_IS_FATAL ANY
  83. OUTPUT_QUIET)
  84. message(STATUS "Build ${label} (${arch}) - done")
  85. message(STATUS "Install ${label} (${arch})")
  86. if(OS_WINDOWS)
  87. set(_cmake_extra "--component obs_libraries")
  88. else()
  89. set(_cmake_extra "")
  90. endif()
  91. execute_process(
  92. COMMAND "${CMAKE_COMMAND}" --install build_${arch} --component Development --config Debug --prefix
  93. "${dependencies_dir}" ${_cmake_extra}
  94. WORKING_DIRECTORY "${dependencies_dir}/${_obs_destination}"
  95. RESULT_VARIABLE _process_result COMMAND_ERROR_IS_FATAL ANY
  96. OUTPUT_QUIET)
  97. message(STATUS "Install ${label} (${arch}) - done")
  98. endfunction()
  99. # _check_dependencies: Fetch and extract pre-built OBS build dependencies
  100. function(_check_dependencies)
  101. if(NOT buildspec)
  102. file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec)
  103. endif()
  104. # cmake-format: off
  105. string(JSON dependency_data GET ${buildspec} dependencies)
  106. # cmake-format: on
  107. foreach(dependency IN LISTS dependencies_list)
  108. # cmake-format: off
  109. string(JSON data GET ${dependency_data} ${dependency})
  110. string(JSON version GET ${data} version)
  111. string(JSON hash GET ${data} hashes ${platform})
  112. string(JSON url GET ${data} baseUrl)
  113. string(JSON label GET ${data} label)
  114. string(JSON revision ERROR_VARIABLE error GET ${data} revision ${platform})
  115. # cmake-format: on
  116. message(STATUS "Setting up ${label} (${arch})")
  117. set(file "${${dependency}_filename}")
  118. set(destination "${${dependency}_destination}")
  119. string(REPLACE "VERSION" "${version}" file "${file}")
  120. string(REPLACE "VERSION" "${version}" destination "${destination}")
  121. string(REPLACE "ARCH" "${arch}" file "${file}")
  122. string(REPLACE "ARCH" "${arch}" destination "${destination}")
  123. if(revision)
  124. string(REPLACE "_REVISION" "_v${revision}" file "${file}")
  125. string(REPLACE "-REVISION" "-v${revision}" file "${file}")
  126. else()
  127. string(REPLACE "_REVISION" "" file "${file}")
  128. string(REPLACE "-REVISION" "" file "${file}")
  129. endif()
  130. set(skip FALSE)
  131. if(dependency STREQUAL prebuilt OR dependency STREQUAL qt6)
  132. _check_deps_version(${version})
  133. if(found)
  134. set(skip TRUE)
  135. endif()
  136. endif()
  137. if(skip)
  138. message(STATUS "Setting up ${label} (${arch}) - skipped")
  139. continue()
  140. endif()
  141. if(dependency STREQUAL obs-studio)
  142. set(url ${url}/${file})
  143. else()
  144. set(url ${url}/${version}/${file})
  145. endif()
  146. if(NOT EXISTS "${dependencies_dir}/${file}")
  147. message(STATUS "Downloading ${url}")
  148. file(
  149. DOWNLOAD "${url}" "${dependencies_dir}/${file}"
  150. STATUS download_status
  151. EXPECTED_HASH SHA256=${hash})
  152. list(GET download_status 0 error_code)
  153. list(GET download_status 1 error_message)
  154. if(error_code GREATER 0)
  155. message(STATUS "Downloading ${url} - Failure")
  156. message(FATAL_ERROR "Unable to download ${url}, failed with error: ${error_message}")
  157. file(REMOVE "${dependencies_dir}/${file}")
  158. else()
  159. message(STATUS "Downloading ${url} - done")
  160. endif()
  161. endif()
  162. if(NOT EXISTS "${dependencies_dir}/${destination}")
  163. file(MAKE_DIRECTORY "${dependencies_dir}/${destination}")
  164. if(dependency STREQUAL obs-studio)
  165. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}")
  166. else()
  167. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}/${destination}")
  168. endif()
  169. endif()
  170. if(dependency STREQUAL prebuilt)
  171. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  172. elseif(dependency STREQUAL qt6)
  173. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  174. elseif(dependency STREQUAL obs-studio)
  175. set(_obs_version ${version})
  176. set(_obs_destination "${destination}")
  177. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}")
  178. endif()
  179. message(STATUS "Setting up ${label} (${arch}) - done")
  180. endforeach()
  181. list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
  182. # cmake-format: off
  183. set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} CACHE PATH "CMake prefix search path" FORCE)
  184. # cmake-format: on
  185. _setup_obs_studio()
  186. endfunction()