buildspec_common.cmake 8.0 KB

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