From d94709d945ec56b7a11c52a5ab8cdf6eda624ca7 Mon Sep 17 00:00:00 2001 From: PatTheMav Date: Mon, 6 Jul 2020 20:38:13 +0200 Subject: [PATCH] CI: Update build script to use pre-built SWIG and QT dependencies --- .github/workflows/clang-format.yml | 7 +- .github/workflows/main.yml | 123 ++++++++++++++++++++--------- CI/full-build-macos.sh | 54 ++++++------- CI/scripts/macos/Brewfile | 2 - CI/scripts/macos/app/dylibbundler | Bin 230352 -> 234448 bytes cmake/Modules/FindSwigDeps.cmake | 6 ++ 6 files changed, 123 insertions(+), 69 deletions(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index beffb79c3..6364dcc4e 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -1,6 +1,7 @@ name: Clang Format Check on: [push, pull_request] + jobs: ubuntu64: runs-on: ubuntu-latest @@ -19,7 +20,7 @@ jobs: deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main LLVMAPT - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - sudo apt-get -qq update @@ -31,7 +32,7 @@ jobs: ./CI/check-format.sh macos64: - runs-on: macos-latest + runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v2 @@ -45,4 +46,4 @@ jobs: - name: Check the Formatting run: | ./formatcode.sh - ./CI/check-format.sh + ./CI/check-format.sh diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 253aa0ccd..e5346e18b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,6 +2,10 @@ name: 'CI Multiplatform Build' on: push: + paths-ignore: + - '**.md' + branches: + - master pull_request: paths-ignore: - '**.md' @@ -17,7 +21,7 @@ jobs: name: 'macOS 64-bit' runs-on: [macos-latest] env: - MACOS_DEPS_VERSION: '2020-04-24' + MACOS_DEPS_VERSION: '2020-07-06' VLC_VERSION: '3.0.8' SPARKLE_VERSION: '1.23.0' QT_VERSION: '5.14.1' @@ -32,17 +36,19 @@ jobs: echo ::set-env name=OBS_GIT_BRANCH::$(git rev-parse --abbrev-ref HEAD) echo ::set-env name=OBS_GIT_HASH::$(git rev-parse --short HEAD) echo ::set-env name=OBS_GIT_TAG::$(git describe --tags --abbrev=0) + - name: 'Check for Github Labels' + if: github.event_name == 'pull_request' + run: | + LABELS_URL="$(echo ${{ github.event.pull_request.url }} | sed s'/pulls/issues/')" + LABEL_FOUND="$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" "${LABELS_URL}/labels" | sed -n 's/.*"name": "\(.*\)",/\1/p' | grep 'Seeking Testers' || true)" + if [ "${LABEL_FOUND}" = "Seeking Testers" ]; then + echo ::set-env name=SEEKING_TESTERS::1 + else + echo ::set-env name=SEEKING_TESTERS::0 + fi - name: 'Install prerequisites (Homebrew)' shell: bash run: | - if [ -d "$(brew --cellar)/swig" ]; then - brew unlink swig - fi - - if [ -d "$(brew --cellar)/qt" ]; then - brew unlink qt - fi - brew bundle --file ./CI/scripts/macos/Brewfile - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache @@ -60,6 +66,14 @@ jobs: with: path: /tmp/obsdeps key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.MACOS_DEPS_VERSION }} + - name: 'Restore pre-built Qt dependency from cache' + id: deps-qt-cache + uses: actions/cache@v1 + env: + CACHE_NAME: 'deps-qt-cache' + with: + path: /tmp/obsdeps + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.MACOS_DEPS_VERSION }} - name: 'Restore VLC dependency from cache' id: vlc-cache uses: actions/cache@v1 @@ -80,8 +94,15 @@ jobs: if: steps.deps-cache.outputs.cache-hit != 'true' shell: bash run: | - curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/osx-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz - tar -xf ./osx-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz -C "/tmp" + curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz + tar -xf ./macos-deps-${{ env.MACOS_DEPS_VERSION }}.tar.gz -C "/tmp" + - name: 'Install prerequisite: Pre-built dependency Qt' + if: steps.deps-qt-cache.outputs.cache-hit != 'true' + shell: bash + run: | + curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-qt-${{ env.QT_VERSION }}-${{ env.MACOS_DEPS_VERSION }}.tar.gz + tar -xf ./macos-qt-${{ env.QT_VERSION }}-${{ env.MACOS_DEPS_VERSION }}.tar.gz -C "/tmp" + xattr -r -d com.apple.quarantine /tmp/obsdeps - name: 'Install prerequisite: VLC' if: steps.vlc-cache.outputs.cache-hit != 'true' shell: bash @@ -119,7 +140,7 @@ jobs: run: | mkdir ./build cd ./build - cmake -DENABLE_UNIT_TESTS=YES -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 -DQTDIR="/usr/local/Cellar/qt/${{ env.QT_VERSION }}" -DDepsPath="/tmp/obsdeps" -DVLCPath="${{ github.workspace }}/cmbuild/vlc-${{ env.VLC_VERSION }}" -DENABLE_VLC=ON -DBUILD_BROWSER=ON -DBROWSER_DEPLOY=ON -DBUILD_CAPTIONS=ON -DWITH_RTMPS=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_BUILD_VERSION }}_macosx64" .. + cmake -DENABLE_UNIT_TESTS=YES -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 -DQTDIR="/tmp/obsdeps" -DSWIGDIR="/tmp/obsdeps" -DDepsPath="/tmp/obsdeps" -DVLCPath="${{ github.workspace }}/cmbuild/vlc-${{ env.VLC_VERSION }}" -DENABLE_VLC=ON -DBUILD_BROWSER=ON -DBROWSER_DEPLOY=ON -DBUILD_CAPTIONS=ON -DWITH_RTMPS=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_BUILD_VERSION }}_macosx64" .. - name: 'Build' shell: bash working-directory: ${{ github.workspace }}/build @@ -129,18 +150,18 @@ jobs: working-directory: ${{ github.workspace }}/build run: make CTEST_OUTPUT_ON_FAILURE=1 test - name: 'Install prerequisite: Packages app' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') shell: bash run: | curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/Packages.pkg sudo installer -pkg ./Packages.pkg -target / - name: 'Install prerequisite: DMGbuild' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') shell: bash run: | pip3 install dmgbuild - name: 'Create macOS application bundle' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') working-directory: ${{ github.workspace }}/build shell: bash run: | @@ -149,7 +170,9 @@ jobs: mkdir OBS.app/Contents/PlugIns mkdir OBS.app/Contents/Resources - cp -R rundir/RelWithDebInfo/bin/ ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/obs ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/libobsglad.0.dylib ./OBS.app/Contents/MacOS cp -R rundir/RelWithDebInfo/data ./OBS.app/Contents/Resources cp ../CI/scripts/macos/app/obs.icns ./OBS.app/Contents/Resources cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/PlugIns @@ -162,13 +185,10 @@ jobs: rm -rf ./OBS.app/Contents/Resources/data/obs-scripting/ fi - install_name_tool -change libmbedtls.12.dylib @executable_path/../Frameworks/libmbedtls.12.dylib ./OBS.app/Contents/Plugins/obs-outputs.so - install_name_tool -change libmbedcrypto.3.dylib @executable_path/../Frameworks/libmbedcrypto.3.dylib ./OBS.app/Contents/Plugins/obs-outputs.so - install_name_tool -change libmbedx509.0.dylib @executable_path/../Frameworks/libmbedx509.0.dylib ./OBS.app/Contents/Plugins/obs-outputs.so - ../CI/scripts/macos/app/dylibBundler -cd -of -a ./OBS.app -q -f \ -s ./OBS.app/Contents/MacOS \ -s "${{ github.workspace }}/cmbuild/sparkle/Sparkle.framework" \ + -s ./rundir/RelWithDebInfo/bin \ -x ./OBS.app/Contents/PlugIns/coreaudio-encoder.so \ -x ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so \ -x ./OBS.app/Contents/PlugIns/frontend-tools.so \ @@ -194,13 +214,10 @@ jobs: -x ./OBS.app/Contents/PlugIns/obs-libfdk.so \ -x ./OBS.app/Contents/PlugIns/obs-outputs.so - mv ./OBS.app/Contents/MacOS/libobs-opengl.so ./OBS.app/Contents/Frameworks + mv ./libobs-opengl/libobs-opengl.so ./OBS.app/Contents/Frameworks sudo cp -R "${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_BUILD_VERSION }}_macosx64/Release/Chromium Embedded Framework.framework" ./OBS.app/Contents/Frameworks/ sudo chown -R $(whoami) ./OBS.app/Contents/Frameworks/ - install_name_tool -change /usr/local/Cellar/qt/${{ env.QT_VERSION }}/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/obs-browser.so - install_name_tool -change /usr/local/Cellar/qt/${{ env.QT_VERSION }}/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/obs-browser.so - install_name_tool -change /usr/local/Cellar/qt/${{ env.QT_VERSION }}/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/obs-browser.so cp ../CI/scripts/macos/app/OBSPublicDSAKey.pem ./OBS.app/Contents/Resources @@ -210,7 +227,7 @@ jobs: plutil -insert SUFeedURL -string https://obsproject.com/osx_update/stable/updates.xml ./OBS.app/Contents/Info.plist plutil -insert SUPublicDSAKeyFile -string OBSPublicDSAKey.pem ./OBS.app/Contents/Info.plist - name: 'Package' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') working-directory: ${{ github.workspace }}/build shell: bash run: | @@ -228,7 +245,7 @@ jobs: sudo mv ./${FILE_NAME} ../nightly/${FILE_NAME} - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') uses: actions/upload-artifact@v2-preview with: name: '${{ env.FILE_NAME }}' @@ -247,6 +264,16 @@ jobs: echo ::set-env name=OBS_GIT_BRANCH::$(git rev-parse --abbrev-ref HEAD) echo ::set-env name=OBS_GIT_HASH::$(git rev-parse --short HEAD) echo ::set-env name=OBS_GIT_TAG::$(git describe --tags --abbrev=0) + - name: 'Check for Github Labels' + if: github.event_name == 'pull_request' + run: | + LABELS_URL="$(echo ${{ github.event.pull_request.url }} | sed s'/pulls/issues/')" + LABEL_FOUND="$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" "${LABELS_URL}/labels" | sed -n 's/.*"name": "\(.*\)",/\1/p' | grep 'Seeking Testers' || true)" + if [ "${LABEL_FOUND}" = "Seeking Testers" ]; then + echo ::set-env name=SEEKING_TESTERS::1 + else + echo ::set-env name=SEEKING_TESTERS::0 + fi - name: Install prerequisites (Apt) shell: bash run: | @@ -323,7 +350,7 @@ jobs: working-directory: ${{ github.workspace }}/build run: make CTEST_OUTPUT_ON_FAILURE=1 test - name: 'Package' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') shell: bash run: | FILE_DATE=$(date +%Y-%m-%d) @@ -336,7 +363,7 @@ jobs: mv "${FILE_NAME}" ../nightly/ cd - - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') uses: actions/upload-artifact@v2-preview with: name: '${{ env.FILE_NAME }}' @@ -370,6 +397,17 @@ jobs: echo ::set-env name=OBS_GIT_BRANCH::$(git rev-parse --abbrev-ref HEAD) echo ::set-env name=OBS_GIT_HASH::$(git rev-parse --short HEAD) echo ::set-env name=OBS_GIT_TAG::$(git describe --tags --abbrev=0) + - name: 'Check for Github Labels' + if: github.event_name == 'pull_request' + shell: bash + run: | + LABELS_URL="$(echo ${{ github.event.pull_request.url }} | sed s'/pulls/issues/')" + LABEL_FOUND="$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" "${LABELS_URL}/labels" | sed -n 's/.*"name": "\(.*\)",/\1/p' | grep 'Seeking Testers' || true)" + if [ "${LABEL_FOUND}" = "Seeking Testers" ]; then + echo ::set-env name=SEEKING_TESTERS::1 + else + echo ::set-env name=SEEKING_TESTERS::0 + fi - name: 'Restore QT dependency from cache' id: qt-cache uses: actions/cache@v1 @@ -400,7 +438,7 @@ jobs: env: CACHE_NAME: 'windows-cef-64-cache' with: - path: ${{ github.workspace }}/cmdbuild/cef_binary_${{ env.CEF_BUILD_VERSION }}_windows64_minimal + path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_VERSION }}_windows64_minimal key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION }} - name: 'Install prerequisite: QT' if: steps.qt-cache.outputs.cache-hit != 'true' @@ -427,11 +465,11 @@ jobs: mkdir ./build mkdir ./build64 cd ./build64 - cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win64" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2017_64" -DENABLE_VLC=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmdbuild/cef_binary_${{ env.CEF_VERSION }}_windows64_minimal" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. + cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win64" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2017_64" -DENABLE_VLC=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_VERSION }}_windows64_minimal" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. - name: 'Build' run: msbuild /m /p:Configuration=RelWithDebInfo .\build64\obs-studio.sln - name: 'Package' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') run: | $env:FILE_DATE=(Get-Date -UFormat "%F") $env:FILE_NAME="${env:FILE_DATE}-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-win64.zip" @@ -439,7 +477,7 @@ jobs: robocopy .\build64\rundir\RelWithDebInfo .\build\ /E /XF .gitignore 7z a ${env:FILE_NAME} .\build\* - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') uses: actions/upload-artifact@v2-preview with: name: '${{ env.FILE_NAME }}' @@ -473,6 +511,17 @@ jobs: echo ::set-env name=OBS_GIT_BRANCH::$(git rev-parse --abbrev-ref HEAD) echo ::set-env name=OBS_GIT_HASH::$(git rev-parse --short HEAD) echo ::set-env name=OBS_GIT_TAG::$(git describe --tags --abbrev=0) + - name: 'Check for Github Labels' + if: github.event_name == 'pull_request' + shell: bash + run: | + LABELS_URL="$(echo ${{ github.event.pull_request.url }} | sed s'/pulls/issues/')" + LABEL_FOUND="$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" "${LABELS_URL}/labels" | sed -n 's/.*"name": "\(.*\)",/\1/p' | grep 'Seeking Testers' || true)" + if [ "${LABEL_FOUND}" = "Seeking Testers" ]; then + echo ::set-env name=SEEKING_TESTERS::1 + else + echo ::set-env name=SEEKING_TESTERS::0 + fi - name: 'Restore QT dependency from cache' id: qt-cache uses: actions/cache@v1 @@ -503,8 +552,8 @@ jobs: env: CACHE_NAME: 'cef-32-cache' with: - path: ${{ github.workspace }}/cmdbuild/cef_binary_${{ env.CEF_BUILD_VERSION }}_windows32_minimal - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_VERSION }} + path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_VERSION }}_windows32_minimal + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION }} - name: 'Install prerequisite: QT' if: steps.qt-cache.outputs.cache-hit != 'true' run: | @@ -530,11 +579,11 @@ jobs: mkdir ./build mkdir ./build32 cd ./build32 - cmake -G"${{ env.CMAKE_GENERATOR }}" -A"Win32" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DENABLE_VLC=ON -DBUILD_BROWSER=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win32" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2017" -DCEF_ROOT_DIR="${{ github.workspace }}/cmdbuild/cef_binary_${{ env.CEF_VERSION }}_windows32_minimal" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. + cmake -G"${{ env.CMAKE_GENERATOR }}" -A"Win32" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DENABLE_VLC=ON -DBUILD_BROWSER=true -DBUILD_CAPTIONS=true -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win32" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2017" -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.CEF_VERSION }}_windows32_minimal" -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE .. - name: 'Build' run: msbuild /m /p:Configuration=RelWithDebInfo .\build32\obs-studio.sln - name: 'Package' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') run: | $env:FILE_DATE=(Get-Date -UFormat "%F") $env:FILE_NAME="${env:FILE_DATE}-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-win32.zip" @@ -542,7 +591,7 @@ jobs: robocopy .\build32\rundir\RelWithDebInfo .\build\ /E /XF .gitignore 7z a ${env:FILE_NAME} .\build\* - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'Seeking Testers')) + if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') uses: actions/upload-artifact@v2-preview with: name: '${{ env.FILE_NAME }}' diff --git a/CI/full-build-macos.sh b/CI/full-build-macos.sh index 8dba686c2..84aa2c0e0 100755 --- a/CI/full-build-macos.sh +++ b/CI/full-build-macos.sh @@ -45,6 +45,7 @@ CI_QT_VERSION=$(cat ${CI_WORKFLOW} | sed -En "s/[ ]+QT_VERSION: '([0-9\.]+)'/\1/ BUILD_DEPS=( "obs-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}}" + "qt-deps ${QT_VERSION:-${CI_QT_VERSION}} ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}}" "cef ${CEF_BUILD_VERSION:-${CI_CEF_VERSION}}" "vlc ${VLC_VERSION:-${CI_VLC_VERSION}}" "sparkle ${SPARKLE_VERSION:-${CI_SPARKLE_VERSION}}" @@ -102,19 +103,7 @@ install_homebrew_deps() { exit 1 fi - info "Specific Swig and Qt versions will be installed and *pinned* on your system." - - if [ -d "$(brew --cellar)/swig" ]; then - brew unlink swig - fi - - if [ -d "$(brew --cellar)/qt" ]; then - brew unlink qt - fi - brew bundle --file ${CI_SCRIPTS}/Brewfile - brew pin qt - brew pin swig } check_ccache() { @@ -127,9 +116,19 @@ install_obs-deps() { hr "Setting up pre-built macOS OBS dependencies v${1}" ensure_dir ${DEPS_BUILD_DIR} step "Download..." - curl -s -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${1}/osx-deps-${1}.tar.gz + curl -s -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}.tar.gz step "Unpack..." - tar -xf ./osx-deps-${1}.tar.gz -C /tmp + tar -xf ./macos-deps-${1}.tar.gz -C /tmp +} + +install_qt-deps() { + hr "Setting up pre-built dependency QT v${1}" + ensure_dir ${DEPS_BUILD_DIR} + step "Download..." + curl -s -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${2}/macos-qt-${1}-${2}.tar.gz + step "Unpack..." + tar -xf ./macos-qt-${1}-${2}.tar.gz -C /tmp + xattr -r -d com.apple.quarantine /tmp/obsdeps } install_vlc() { @@ -233,8 +232,9 @@ configure_obs_build() { hr "Run CMAKE for OBS..." cmake -DENABLE_SPARKLE_UPDATER=ON \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 \ - -DQTDIR="/usr/local/Cellar/qt/${QT_VERSION:-${CI_QT_VERSION}}" \ - -DDepsPath=/tmp/obsdeps \ + -DQTDIR="/tmp/obsdeps" \ + -DSWIGDIR="/tmp/obsdeps" \ + -DDepsPath="/tmp/obsdeps" \ -DVLCPath="${DEPS_BUILD_DIR}/vlc-${VLC_VERSION:-${CI_VLC_VERSION}}" \ -DBUILD_BROWSER=ON \ -DBROWSER_DEPLOY=ON \ @@ -242,6 +242,7 @@ configure_obs_build() { -DWITH_RTMPS=ON \ -DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${CEF_BUILD_VERSION:-${CI_CEF_VERSION}}_macosx64" \ .. + } run_obs_build() { @@ -261,15 +262,16 @@ bundle_dylibs() { hr "Bundle dylibs for macOS application" - step "Fix mbedtls for obs-outputs..." - install_name_tool -change libmbedtls.12.dylib @executable_path/../Frameworks/libmbedtls.12.dylib ./OBS.app/Contents/Plugins/obs-outputs.so - install_name_tool -change libmbedcrypto.3.dylib @executable_path/../Frameworks/libmbedcrypto.3.dylib ./OBS.app/Contents/Plugins/obs-outputs.so - install_name_tool -change libmbedx509.0.dylib @executable_path/../Frameworks/libmbedx509.0.dylib ./OBS.app/Contents/Plugins/obs-outputs.so + # step "Fix mbedtls for obs-outputs..." + # install_name_tool -change libmbedtls.12.dylib @executable_path/../Frameworks/libmbedtls.12.dylib ./OBS.app/Contents/Plugins/obs-outputs.so + # install_name_tool -change libmbedcrypto.3.dylib @executable_path/../Frameworks/libmbedcrypto.3.dylib ./OBS.app/Contents/Plugins/obs-outputs.so + # install_name_tool -change libmbedx509.0.dylib @executable_path/../Frameworks/libmbedx509.0.dylib ./OBS.app/Contents/Plugins/obs-outputs.so step "Run dylibBundler.." ${CI_SCRIPTS}/app/dylibBundler -cd -of -a ./OBS.app -q -f \ -s ./OBS.app/Contents/MacOS \ -s "${DEPS_BUILD_DIR}/sparkle/Sparkle.framework" \ + -s ./rundir/RelWithDebInfo/bin/ \ -x ./OBS.app/Contents/PlugIns/coreaudio-encoder.so \ -x ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so \ -x ./OBS.app/Contents/PlugIns/frontend-tools.so \ @@ -295,7 +297,7 @@ bundle_dylibs() { -x ./OBS.app/Contents/PlugIns/obs-libfdk.so \ -x ./OBS.app/Contents/PlugIns/obs-outputs.so step "Move libobs-opengl to final destination" - mv ./OBS.app/Contents/MacOS/libobs-opengl.so ./OBS.app/Contents/Frameworks + cp ./libobs-opengl/libobs-opengl.so ./OBS.app/Contents/Frameworks } install_frameworks() { @@ -310,10 +312,6 @@ install_frameworks() { step "Copy Framework..." sudo cp -R "${DEPS_BUILD_DIR}/cef_binary_${CEF_BUILD_VERSION:-${CI_CEF_VERSION}}_macosx64/Release/Chromium Embedded Framework.framework" ./OBS.app/Contents/Frameworks/ sudo chown -R $(whoami) ./OBS.app/Contents/Frameworks/ - step "Fix dylib references in obs-browser.so" - install_name_tool -change /usr/local/Cellar/qt/${QT_VERSION:-${CI_QT_VERSION}}/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/obs-browser.so - install_name_tool -change /usr/local/Cellar/qt/${QT_VERSION:-${CI_QT_VERSION}}/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/obs-browser.so - install_name_tool -change /usr/local/Cellar/qt/${QT_VERSION:-${CI_QT_VERSION}}/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/obs-browser.so } prepare_macos_bundle() { @@ -332,7 +330,9 @@ prepare_macos_bundle() { mkdir OBS.app/Contents/PlugIns mkdir OBS.app/Contents/Resources - cp -R rundir/RelWithDebInfo/bin/ ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/obs ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS + cp rundir/RelWithDebInfo/bin/libobsglad.0.dylib ./OBS.app/Contents/MacOS cp -R rundir/RelWithDebInfo/data ./OBS.app/Contents/Resources cp ${CI_SCRIPTS}/app/obs.icns ./OBS.app/Contents/Resources cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/PlugIns @@ -501,7 +501,7 @@ full-build-macos() { set -- ${DEPENDENCY} trap "caught_error ${DEPENDENCY}" ERR FUNC_NAME="install_${1}" - ${FUNC_NAME} ${2} + ${FUNC_NAME} ${2} ${3} done check_ccache diff --git a/CI/scripts/macos/Brewfile b/CI/scripts/macos/Brewfile index 2401ad9e0..f1452d436 100644 --- a/CI/scripts/macos/Brewfile +++ b/CI/scripts/macos/Brewfile @@ -5,6 +5,4 @@ brew "cmake" brew "freetype" brew "fdk-aac" brew "cmocka" -brew "https://gist.githubusercontent.com/DDRBoxman/9c7a2b08933166f4b61ed9a44b242609/raw/ef4de6c587c6bd7f50210eccd5bd51ff08e6de13/qt.rb", link: true -brew "https://gist.githubusercontent.com/DDRBoxman/4cada55c51803a2f963fa40ce55c9d3e/raw/572c67e908bfbc1bcb8c476ea77ea3935133f5b5/swig.rb", link: true brew "akeru-inc/tap/xcnotary" diff --git a/CI/scripts/macos/app/dylibbundler b/CI/scripts/macos/app/dylibbundler index 23c45c814e75f9264e16bcbe9282e5d1a35f235d..2634e6396775f5d5d90921a5ccd40ad52b240c9e 100755 GIT binary patch delta 39689 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 Ub%+yjw|L}&H~-hw=j1