setup_linux 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. autoload -Uz log_group log_error log_status log_info log_debug
  2. if (( ! ${+commands[curl]} )) {
  3. log_error 'curl not found. Please install curl.'
  4. return 2
  5. }
  6. if (( ! ${+commands[jq]} )) {
  7. log_error 'jq not found. Please install jq.'
  8. return 2
  9. }
  10. if (( ! ${+project_root} )) {
  11. log_error "'project_root' not set. Please set before running ${0}."
  12. return 2
  13. }
  14. if (( ! ${+target} )) {
  15. log_error "'target' not set. Please set before running ${0}."
  16. return 2
  17. }
  18. local -a curl_opts=()
  19. if (( ! ${+CI} )) {
  20. curl_opts+=(--progress-bar --continue-at -)
  21. } else {
  22. curl_opts+=(--show-error --silent)
  23. }
  24. curl_opts+=(--location -O ${@})
  25. pushd ${project_root}
  26. typeset -g QT_VERSION
  27. read -r QT_VERSION <<< \
  28. "$(jq -r --arg target "${target}" \
  29. '.platformConfig[$target] | { qtVersion } | join(" ")' \
  30. ${buildspec_file})"
  31. if (( ! (${skips[(Ie)all]} + ${skips[(Ie)deps]}) )) {
  32. log_group 'Installing obs-studio build dependencies...'
  33. mkdir -p ${project_root}/.deps
  34. local deps_version
  35. local deps_baseurl
  36. local deps_label
  37. local deps_hash
  38. IFS=';' read -r deps_version deps_baseurl deps_label deps_hash <<< \
  39. "$(jq -r --arg target "${target}" \
  40. '.dependencies["cef"] | {version, baseUrl, "label", "hash": .hashes[$target]} | join(";")' \
  41. ${buildspec_file})"
  42. if (( ! deps_version )) {
  43. log_error 'No valid cef spec found in buildspec.json.'
  44. return 2
  45. }
  46. log_group 'Setting up pre-built Chromium Embedded Framework...'
  47. pushd ${project_root}/.deps
  48. local _filename="cef_binary_${deps_version}_${target//-/_}.tar.xz"
  49. local _url=${deps_baseurl}/${_filename}
  50. local _target="cef_binary_${deps_version}_${target//-/_}"
  51. typeset -g CEF_VERSION=${deps_version}
  52. log_status 'Checking for available wrapper library...'
  53. local -i _skip=0
  54. if [[ -f ${_target}/build/libcef_dll_wrapper/libcef_dll_wrapper.a ]] {
  55. _skip=1
  56. }
  57. if ! (( _skip )) {
  58. if [[ ! -f ${_filename} ]] {
  59. log_debug "Running curl ${curl_opts} ${_url}"
  60. curl ${curl_opts} ${_url} && \
  61. log_status "Downloaded ${deps_label} for ${target}."
  62. } else {
  63. log_status "Found downloaded ${deps_label}"
  64. }
  65. read -r artifact_checksum _ <<< "$(sha256sum ${_filename})"
  66. if [[ ${deps_hash} != ${artifact_checksum} ]] {
  67. log_error "Checksum of downloaded ${deps_label} does not match specification.
  68. Expected : ${deps_hash}
  69. Actual : ${artifact_checksum}"
  70. return 2
  71. }
  72. log_status "Checksum of downloaded ${deps_label} matches."
  73. mkdir -p ${_target} && pushd ${_target}
  74. XZ_OPT=-T0 tar --strip-components 1 -xJf ../${_filename} && log_status "${deps_label} extracted."
  75. if [[ ! -f build/libcef_dll_wrapper/libcef_dll_wrapper.a ]] {
  76. log_group "Configuring CEF wrapper library..."
  77. local -a cmake_args=(
  78. -DPROJECT_ARCH:STRING=${target##*-}
  79. -DCEF_COMPILER_FLAGS:STRING="-Wno-deprecated-copy"
  80. -DCMAKE_BUILD_TYPE:STRING=${config}
  81. -DCMAKE_CXX_FLAGS:STRING="-std=c++11 -Wno-deprecated-declarations -Wno-unknonw-warning-option"
  82. -DCMAKE_EXE_LINKER_FLAGS:STRING="-std=c++11"
  83. )
  84. if (( _loglevel == 0 )) cmake_args+=(-Wno-deprecated -Wno-dev --log-level=ERROR)
  85. if (( ${+commands[ccache]} )) {
  86. cmake_args+=(
  87. -DCMAKE_C_COMPILER_LAUNCHER:STRING=ccache
  88. -DCMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache
  89. )
  90. }
  91. cmake -S . -B build -G Ninja ${cmake_args}
  92. log_group "Building CEF Wrapper library..."
  93. cmake --build build
  94. }
  95. mkdir -p build/libcef_dll
  96. popd
  97. } else {
  98. log_info 'Found existing Chromium Embedded Framework and loader library...'
  99. }
  100. popd
  101. local -a apt_args=(
  102. ${CI:+-y}
  103. --no-install-recommends
  104. )
  105. if (( _loglevel == 0 )) apt_args+=(--quiet)
  106. local suffix
  107. if [[ ${CPUTYPE} != ${target##*-} ]] {
  108. local -A arch_mappings=(
  109. aarch64 arm64
  110. x86_64 amd64
  111. )
  112. suffix=":${arch_mappings[${target##*-}]}"
  113. sudo apt-get install ${apt_args} gcc-${${target##*-}//_/-}-linux-gnu g++-${${target##*-}//_/-}-linux-gnu
  114. }
  115. sudo apt-get install ${apt_args} \
  116. build-essential \
  117. libcurl4-openssl-dev \
  118. libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev \
  119. libswresample-dev libswscale-dev \
  120. libjansson-dev \
  121. libx11-xcb-dev \
  122. libgles2-mesa-dev libgles2-mesa \
  123. libwayland-dev \
  124. libpipewire-0.3-dev \
  125. libpulse-dev \
  126. libx264-dev \
  127. libmbedtls-dev \
  128. libgl1-mesa-dev \
  129. libjansson-dev \
  130. libluajit-5.1-dev python3-dev \
  131. libx11-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-xinerama0-dev \
  132. libxcb-composite0-dev libxinerama-dev libxcb1-dev libx11-xcb-dev libxcb-xfixes0-dev \
  133. swig libcmocka-dev libxss-dev libglvnd-dev \
  134. libxkbcommon-dev \
  135. libasound2-dev libfdk-aac-dev libfontconfig-dev libfreetype6-dev libjack-jackd2-dev \
  136. libpulse-dev libsndio-dev libspeexdsp-dev libudev-dev libv4l-dev libva-dev libvlc-dev \
  137. libpci-dev libdrm-dev \
  138. nlohmann-json3-dev libwebsocketpp-dev libasio-dev libvpl-dev libqrcodegencpp-dev
  139. if (( UBUNTU_2210_OR_LATER )) sudo apt-get install ${apt_args} librist-dev libsrt-openssl-dev
  140. local -a _qt_packages=()
  141. if (( QT_VERSION == 6 )) {
  142. _qt_packages+=(
  143. qt6-base-dev
  144. libqt6svg6-dev
  145. qt6-base-private-dev
  146. )
  147. } else {
  148. log_error "Unsupported Qt version '${QT_VERSION}' specified."
  149. return 2
  150. }
  151. sudo apt-get install ${apt_args} ${_qt_packages}
  152. } else {
  153. local cef_version
  154. read -r cef_version <<< \
  155. "$(jq -r '.dependencies | [.cef.version] | join(" ")' ${buildspec_file})"
  156. typeset -g CEF_VERSION=${cef_version}
  157. }