buildspec_common.cmake 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # OBS common build dependencies module
  2. # cmake-format: off
  3. # cmake-lint: disable=E1121
  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. set(found
  12. FALSE
  13. PARENT_SCOPE)
  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. set(found
  28. TRUE
  29. PARENT_SCOPE)
  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. set(CMAKE_PREFIX_PATH
  37. ${CMAKE_PREFIX_PATH}
  38. PARENT_SCOPE)
  39. continue()
  40. else()
  41. message(AUTHOR_WARNING "Newer ${label} version detected in ${path}: \n"
  42. "Found ${_check_version}, require ${version}")
  43. set(found
  44. TRUE
  45. PARENT_SCOPE)
  46. break()
  47. endif()
  48. endif()
  49. endforeach()
  50. endfunction()
  51. # _check_dependencies: Fetch and extract pre-built OBS build dependencies
  52. function(_check_dependencies)
  53. file(READ "${CMAKE_CURRENT_SOURCE_DIR}/buildspec.json" buildspec)
  54. string(JSON dependency_data GET ${buildspec} dependencies)
  55. foreach(dependency IN LISTS dependencies_list)
  56. if(dependency STREQUAL cef AND arch STREQUAL universal)
  57. if(CMAKE_OSX_ARCHITECTURES MATCHES ".+;.+")
  58. continue()
  59. endif()
  60. set(arch ${CMAKE_OSX_ARCHITECTURES})
  61. set(platform macos-${arch})
  62. endif()
  63. string(JSON data GET ${dependency_data} ${dependency})
  64. string(JSON version GET ${data} version)
  65. string(JSON hash GET ${data} hashes ${platform})
  66. string(JSON url GET ${data} baseUrl)
  67. string(JSON label GET ${data} label)
  68. # cmake-format: off
  69. string(JSON revision ERROR_VARIABLE error GET ${data} revision ${platform})
  70. # cmake-format: on
  71. message(STATUS "Setting up ${label} (${arch})")
  72. set(file "${${dependency}_filename}")
  73. set(destination "${${dependency}_destination}")
  74. string(REPLACE "VERSION" "${version}" file "${file}")
  75. string(REPLACE "VERSION" "${version}" destination "${destination}")
  76. string(REPLACE "ARCH" "${arch}" file "${file}")
  77. string(REPLACE "ARCH" "${arch}" destination "${destination}")
  78. if(revision)
  79. string(REPLACE "_REVISION" "_v${revision}" file "${file}")
  80. string(REPLACE "-REVISION" "-v${revision}" file "${file}")
  81. else()
  82. string(REPLACE "_REVISION" "" file "${file}")
  83. string(REPLACE "-REVISION" "" file "${file}")
  84. endif()
  85. if(EXISTS "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256")
  86. file(READ "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256"
  87. OBS_DEPENDENCY_${dependency}_${arch}_HASH)
  88. endif()
  89. set(skip FALSE)
  90. if(dependency STREQUAL prebuilt OR dependency STREQUAL qt6)
  91. if(OBS_DEPENDENCY_${dependency}_${arch}_HASH STREQUAL ${hash})
  92. _check_deps_version(${version})
  93. if(found)
  94. set(skip TRUE)
  95. endif()
  96. endif()
  97. elseif(dependency STREQUAL cef)
  98. if(NOT ENABLE_BROWSER)
  99. set(skip TRUE)
  100. elseif(OBS_DEPENDENCY_${dependency}_${arch}_HASH STREQUAL ${hash} AND (CEF_ROOT_DIR AND EXISTS "${CEF_ROOT_DIR}"))
  101. set(skip TRUE)
  102. endif()
  103. endif()
  104. if(skip)
  105. message(STATUS "Setting up ${label} (${arch}) - skipped")
  106. continue()
  107. endif()
  108. if(dependency STREQUAL cef)
  109. set(url ${url}/${file})
  110. else()
  111. set(url ${url}/${version}/${file})
  112. endif()
  113. if(NOT EXISTS "${dependencies_dir}/${file}")
  114. message(STATUS "Downloading ${url}")
  115. file(
  116. DOWNLOAD "${url}" "${dependencies_dir}/${file}"
  117. STATUS download_status
  118. EXPECTED_HASH SHA256=${hash})
  119. list(GET download_status 0 error_code)
  120. list(GET download_status 1 error_message)
  121. if(error_code GREATER 0)
  122. message(STATUS "Downloading ${url} - Failure")
  123. message(FATAL_ERROR "Unable to download ${url}, failed with error: ${error_message}")
  124. file(REMOVE "${dependencies_dir}/${file}")
  125. else()
  126. message(STATUS "Downloading ${url} - done")
  127. endif()
  128. endif()
  129. if(NOT OBS_DEPENDENCY_${dependency}_${arch}_HASH STREQUAL ${hash})
  130. file(REMOVE_RECURSE "${dependencies_dir}/${destination}")
  131. endif()
  132. if(NOT EXISTS "${dependencies_dir}/${destination}")
  133. file(MAKE_DIRECTORY "${dependencies_dir}/${destination}")
  134. if(dependency STREQUAL obs-studio)
  135. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}")
  136. else()
  137. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}/${destination}")
  138. endif()
  139. endif()
  140. file(WRITE "${dependencies_dir}/.dependency_${dependency}_${arch}.sha256" "${hash}")
  141. if(dependency STREQUAL prebuilt)
  142. set(VLC_PATH
  143. "${dependencies_dir}/${destination}"
  144. CACHE PATH "VLC source code directory" FORCE)
  145. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  146. elseif(dependency STREQUAL qt6)
  147. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  148. elseif(dependency STREQUAL cef)
  149. set(CEF_ROOT_DIR
  150. "${dependencies_dir}/${destination}"
  151. CACHE PATH "CEF root directory" FORCE)
  152. endif()
  153. message(STATUS "Setting up ${label} (${arch}) - done")
  154. endforeach()
  155. list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
  156. set(CMAKE_PREFIX_PATH
  157. ${CMAKE_PREFIX_PATH}
  158. CACHE PATH "CMake prefix search path" FORCE)
  159. endfunction()