buildspec_common.cmake 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # OBS 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. # _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. # cmake-format: off
  55. string(JSON dependency_data GET ${buildspec} dependencies)
  56. # cmake-format: on
  57. foreach(dependency IN LISTS dependencies_list)
  58. if(dependency STREQUAL cef AND arch STREQUAL universal)
  59. if(CMAKE_OSX_ARCHITECTURES MATCHES ".+;.+")
  60. continue()
  61. endif()
  62. set(arch ${CMAKE_OSX_ARCHITECTURES})
  63. set(platform macos-${arch})
  64. endif()
  65. # cmake-format: off
  66. string(JSON data GET ${dependency_data} ${dependency})
  67. string(JSON version GET ${data} version)
  68. string(JSON hash GET ${data} hashes ${platform})
  69. string(JSON url GET ${data} baseUrl)
  70. string(JSON label GET ${data} label)
  71. string(JSON revision ERROR_VARIABLE error GET ${data} revision ${platform})
  72. # cmake-format: on
  73. message(STATUS "Setting up ${label} (${arch})")
  74. set(file "${${dependency}_filename}")
  75. set(destination "${${dependency}_destination}")
  76. string(REPLACE "VERSION" "${version}" file "${file}")
  77. string(REPLACE "VERSION" "${version}" destination "${destination}")
  78. string(REPLACE "ARCH" "${arch}" file "${file}")
  79. string(REPLACE "ARCH" "${arch}" destination "${destination}")
  80. if(revision)
  81. string(REPLACE "_REVISION" "_v${revision}" file "${file}")
  82. string(REPLACE "-REVISION" "-v${revision}" file "${file}")
  83. else()
  84. string(REPLACE "_REVISION" "" file "${file}")
  85. string(REPLACE "-REVISION" "" file "${file}")
  86. endif()
  87. set(skip FALSE)
  88. if(dependency STREQUAL prebuilt OR dependency STREQUAL qt6)
  89. _check_deps_version(${version})
  90. if(found)
  91. set(skip TRUE)
  92. endif()
  93. elseif(dependency STREQUAL cef)
  94. if(NOT ENABLE_BROWSER OR (CEF_ROOT_DIR AND EXISTS "${CEF_ROOT_DIR}"))
  95. set(skip TRUE)
  96. endif()
  97. endif()
  98. if(skip)
  99. message(STATUS "Setting up ${label} (${arch}) - skipped")
  100. continue()
  101. endif()
  102. if(dependency STREQUAL cef)
  103. set(url ${url}/${file})
  104. else()
  105. set(url ${url}/${version}/${file})
  106. endif()
  107. if(NOT EXISTS "${dependencies_dir}/${file}")
  108. message(STATUS "Downloading ${url}")
  109. file(
  110. DOWNLOAD "${url}" "${dependencies_dir}/${file}"
  111. STATUS download_status
  112. EXPECTED_HASH SHA256=${hash})
  113. list(GET download_status 0 error_code)
  114. list(GET download_status 1 error_message)
  115. if(error_code GREATER 0)
  116. message(STATUS "Downloading ${url} - Failure")
  117. message(FATAL_ERROR "Unable to download ${url}, failed with error: ${error_message}")
  118. file(REMOVE "${dependencies_dir}/${file}")
  119. else()
  120. message(STATUS "Downloading ${url} - done")
  121. endif()
  122. endif()
  123. if(NOT EXISTS "${dependencies_dir}/${destination}")
  124. file(MAKE_DIRECTORY "${dependencies_dir}/${destination}")
  125. if(dependency STREQUAL obs-studio)
  126. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}")
  127. else()
  128. file(ARCHIVE_EXTRACT INPUT "${dependencies_dir}/${file}" DESTINATION "${dependencies_dir}/${destination}")
  129. endif()
  130. endif()
  131. if(dependency STREQUAL prebuilt)
  132. set(VLC_PATH
  133. "${dependencies_dir}/${destination}"
  134. CACHE PATH "VLC source code directory" FORCE)
  135. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  136. elseif(dependency STREQUAL qt6)
  137. list(APPEND CMAKE_PREFIX_PATH "${dependencies_dir}/${destination}")
  138. elseif(dependency STREQUAL cef)
  139. set(CEF_ROOT_DIR
  140. "${dependencies_dir}/${destination}"
  141. CACHE PATH "CEF root directory" FORCE)
  142. endif()
  143. message(STATUS "Setting up ${label} (${arch}) - done")
  144. endforeach()
  145. list(REMOVE_DUPLICATES CMAKE_PREFIX_PATH)
  146. # cmake-format: off
  147. set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} CACHE PATH "CMake prefix search path" FORCE)
  148. # cmake-format: on
  149. endfunction()