diff --git a/.cmake-format.json b/.cmake-format.json new file mode 100644 index 000000000..0ccd9bf0a --- /dev/null +++ b/.cmake-format.json @@ -0,0 +1,14 @@ +{ + "additional_commands": { + "find_qt": { + "flags": [], + "kwargs": { + "VERSION": "+", + "COMPONENTS": "+", + "COMPONENTS_WIN": "+", + "COMPONENTS_MACOS": "+", + "COMPONENTS_LINUX": "+" + } + } + } +} diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index ed14ba809..2c6f4f0c1 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -1,6 +1,12 @@ name: Clang Format Check -on: [push, pull_request] +on: + push: + paths-ignore: ['**.md'] + branches-ignore: [master] + pull_request: + paths-ignore: ['**.md'] + branches-ignore: [master] jobs: clang-format-check: @@ -15,7 +21,7 @@ jobs: run: | sudo apt-get install -y clang-format-12 - - name: Check the Formatting + - name: 'Run clang-format' run: | - ./formatcode.sh ./CI/check-format.sh + ./CI/check-changes.sh diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml index a27df29fc..b7ea6052c 100644 --- a/.github/workflows/flatpak.yml +++ b/.github/workflows/flatpak.yml @@ -3,12 +3,6 @@ name: Flatpak on: - push: - paths-ignore: ['**.md'] - branches: [master, 'release/**'] - pull_request: - paths-ignore: ['**.md'] - branches: [master, 'release/**'] release: types: [published] branches: [master, 'release/**'] @@ -24,44 +18,10 @@ env: YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} jobs: - generate_bundle: - name: Generate Flatpak Bundle - runs-on: [ubuntu-latest] - if: github.event_name != 'release' - container: - image: bilelmoussaoui/flatpak-github-actions:kde-5.15-21.08 - options: --privileged - steps: - - 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 "SEEKING_TESTERS=1" >> $GITHUB_ENV - else - echo "SEEKING_TESTERS=0" >> $GITHUB_ENV - fi - - - name: Checkout - uses: actions/checkout@v2.3.3 - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - with: - submodules: 'recursive' - - - name: Build Flatpak Manifest - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4 - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - with: - bundle: obs-studio-${{ github.sha }}.flatpak - manifest-path: CI/flatpak/com.obsproject.Studio.json - cache-key: flatpak-builder-${{ github.sha }} - publish: name: Publish to Flathub runs-on: [ubuntu-latest] - if: github.event_name == 'release' + if: "${{ github.event_name == 'release' && ( matrix.branch != 'stable' || (!contains(github.ref, '-beta') && !contains(github.ref, '-rc')) ) }}" env: FLATPAK_BUILD_PATH: flatpak_app/files/share container: @@ -71,21 +31,13 @@ jobs: matrix: branch: [stable, beta] steps: - - name: Check if job should run - id: should_run - if: "${{ matrix.branch != 'stable' || (!contains(github.ref, '-beta') && !contains(github.ref, '-rc')) }}" - run: | - echo "::set-output name=should_run::yes" - - name: Checkout uses: actions/checkout@v2.3.3 - if: steps.should_run.outputs.should_run == 'yes' with: submodules: 'recursive' - name: Build Flatpak Manifest uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@master - if: steps.should_run.outputs.should_run == 'yes' with: bundle: obs-studio-${{ github.sha }}.flatpak manifest-path: CI/flatpak/com.obsproject.Studio.json @@ -96,26 +48,23 @@ jobs: - name: Validate AppStream shell: bash working-directory: ${{ env.FLATPAK_BUILD_PATH }} - if: steps.should_run.outputs.should_run == 'yes' run: | appstream-util validate appdata/com.obsproject.Studio.appdata.xml - name: Verify icon and metadata in app-info shell: bash working-directory: ${{ env.FLATPAK_BUILD_PATH }} - if: steps.should_run.outputs.should_run == 'yes' run: | test -f app-info/icons/flatpak/128x128/com.obsproject.Studio.png || { echo "Missing 128x128 icon in app-info" ; exit 1; } test -f app-info/xmls/com.obsproject.Studio.xml.gz || { echo "Missing com.obsproject.Studio.xml.gz in app-info" ; exit 1; } - name: Commit screenshots to the OSTree repository - if: steps.should_run.outputs.should_run == 'yes' run: | ostree commit --repo=repo --canonical-permissions --branch=screenshots/x86_64 flatpak_app/screenshots - name: Publish to Flathub Beta uses: bilelmoussaoui/flatpak-github-actions/flat-manager@v4 - if: steps.should_run.outputs.should_run == 'yes' && matrix.branch == 'beta' + if: matrix.branch == 'beta' with: flat-manager-url: https://hub.flathub.org/ repository: beta @@ -123,7 +72,7 @@ jobs: - name: Publish to Flathub uses: bilelmoussaoui/flatpak-github-actions/flat-manager@v4 - if: steps.should_run.outputs.should_run == 'yes' && matrix.branch == 'stable' + if: matrix.branch == 'stable' with: flat-manager-url: https://hub.flathub.org/ repository: stable diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c164b7ea4..32b13bba0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,24 +1,34 @@ -name: 'CI Multiplatform Build' +name: 'BUILD' on: push: - paths-ignore: - - '**.md' + paths-ignore: ['**.md'] branches: - master - 'release/**' - tags: - - '*' + tags: ['*'] pull_request: - paths-ignore: - - '**.md' - branches: - - master + paths-ignore: ['**.md'] + branches: [master] env: - MACOS_CEF_BUILD_VERSION: '4638' - LINUX_CEF_BUILD_VERSION: '4638' - WINDOWS_CEF_BUILD_VERSION: '4638' + CACHE_REVISION: '004' + CEF_BUILD_VERSION_MAC: '4638' + CEF_HASH_MAC_X86_64: '2fe4cc39b1373b85086e4030dedd2a250d5dbbed8c2f8780002d6cd6214b6bc2' + CEF_HASH_MAC_ARM64: '27809aac427b9c97b0dadcab04371c5f8211f36c6f3e1caa00822de89c5ed249' + CEF_BUILD_VERSION_LINUX: '4638' + CEF_BUILD_VERSION_WIN: '4638' + QT_VERSION_MAC: '5.15.2' + QT_HASH_MAC_X86_64: '35a58fee8dfd70d3d2dcc0ae0b77132c04a451c6f041a02dc41b207b375fc74b' + QT_HASH_MAC_ARM64: 'e99146b9c7775c245a2d22f2ef24fc111fccd71bad0f03b64db707124ffb8707' + QT_VERSION_WIN: '5.15.2' + DEPS_VERSION_MAC: '2022-02-13' + DEPS_HASH_MAC_X86_64: '1a8715d66e664b857942deaded0dc46c4f6cd22e88f01ed1188f3bd3fcf632c4' + DEPS_HASH_MAC_ARM64: '2cfcaf05765400c696908f242aea87b6e1848e1a48cd3edc2eb7f8cb249c9d48' + DEPS_VERSION_WIN: '2022-03-16' + VLC_VERSION_MAC: '3.0.8' + VLC_HASH_MAC: 'e0149ef4a20a19b9ecd87309c2d27787ee3f47dfd47c6639644bc1f6fd95bdf6' + VLC_VERSION_WIN: '3.0.0-git' TWITCH_CLIENTID: ${{ secrets.TWITCH_CLIENT_ID }} TWITCH_HASH: ${{ secrets.TWITCH_HASH }} RESTREAM_CLIENTID: ${{ secrets.RESTREAM_CLIENTID }} @@ -29,687 +39,445 @@ env: YOUTUBE_SECRET_HASH: ${{ secrets.YOUTUBE_SECRET_HASH }} jobs: - macos64: - name: 'macOS 64-bit' - runs-on: [macos-latest] - env: - MIN_MACOS_VERSION: '10.13' - MACOS_DEPS_VERSION: '2022-02-13' - VLC_VERSION: '3.0.8' - SPARKLE_VERSION: '1.23.0' - QT_VERSION: '5.15.2' - SIGN_IDENTITY: '' - HAVE_CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY != '' && secrets.MACOS_SIGNING_CERT != '' }} + clang_check: + name: '01 - Code Format Check' + runs-on: [ubuntu-latest] steps: - - name: Get Current Arch - shell: bash - id: get_arch - run: echo "CURRENT_ARCH=$(uname -m)" >> $GITHUB_ENV - name: 'Checkout' uses: actions/checkout@v2.3.3 with: submodules: 'recursive' - - name: 'Fetch Git Tags' + + - name: 'Install clang-format' + run: sudo apt-get install -y clang-format-12 + + - name: 'Run clang-format' run: | - git fetch --prune --unshallow - echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + ./CI/check-format.sh + ./CI/check-changes.sh + + - name: 'Install cmake-format' + run: sudo pip install cmakelang + + - name: 'Run cmake-format' + run: | + ./CI/check-cmake.sh + + macos_build: + name: '02 - macOS' + runs-on: [macos-11] + strategy: + matrix: + arch: ['x86_64', 'arm64'] + if: always() + needs: [clang_check] + env: + MACOSX_DEPLOYMENT_TARGET_X86_64: '10.13' + MACOSX_DEPLOYMENT_TARGET_ARM64: '11.0' + SPARKLE_VERSION: '1.26.0' + SPARKLE_HASH: '8312cbf7528297a49f1b97692c33cb8d33254c396dc51be394e9484e4b6833a0' + BLOCKED_FORMULAS: 'speexdsp curl php composer' + CODESIGN_IDENT: '-' + HAVE_CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY != '' && secrets.MACOS_SIGNING_CERT != '' }} + defaults: + run: + shell: bash + working-directory: 'obs-studio' + steps: + - name: 'Checkout' + uses: actions/checkout@v2.3.3 + with: + submodules: 'recursive' + path: 'obs-studio' + fetch-depth: 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 + if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then echo "SEEKING_TESTERS=1" >> $GITHUB_ENV else echo "SEEKING_TESTERS=0" >> $GITHUB_ENV fi - - name: 'Setup build environment (Homebrew + ENV)' - shell: bash - run: | - if [ -d /usr/local/opt/openssl@1.0.2t ]; then - brew uninstall openssl@1.0.2t - brew untap local/openssl - fi - if [ -d /usr/local/opt/python@2.7.17 ]; then - brew uninstall python@2.7.17 - brew untap local/python2 - fi + echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + + - name: 'Restore ccache from cache' + id: ccache-cache + uses: actions/cache@v2.1.2 + env: + CACHE_NAME: 'ccache-cache' + with: + path: ${{ github.workspace }}/.ccache + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ matrix.arch }}-${{ env.CACHE_DATE }} - if [ -d /usr/local/opt/speexdsp ]; then - brew unlink speexdsp - fi - brew uninstall curl php composer - brew bundle --file ./CI/scripts/macos/Brewfile - echo "NPROC=$(sysctl -n hw.ncpu)" >> $GITHUB_ENV - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v2.1.2 env: CACHE_NAME: 'cef-cache' with: - path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64 - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.MACOS_CEF_BUILD_VERSION }}-1 + path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_MAC }}_macos_${{ matrix.arch }} + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_MAC }}-${{ matrix.arch }}-${{ env.CACHE_REVISION }} + - name: 'Restore VLC dependency from cache' id: vlc-cache uses: actions/cache@v2.1.2 env: CACHE_NAME: 'vlc-cache' with: - path: ${{ github.workspace }}/cmbuild/vlc-${{ env.VLC_VERSION }} - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION }} + path: ${{ github.workspace }}/obs-build-dependencies/vlc-${{ env.VLC_VERSION_MAC }} + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION_MAC }}-${{ env.CACHE_REVISION }} + - name: 'Restore Sparkle dependency from cache' id: sparkle-cache uses: actions/cache@v2.1.2 env: CACHE_NAME: 'sparkle-cache' with: - path: ${{ github.workspace }}/cmbuild/sparkle - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.SPARKLE_VERSION }} - - name: 'Install prerequisite: Pre-built dependencies' - if: steps.deps-cache.outputs.cache-hit != 'true' - shell: bash + path: ${{ github.workspace }}/obs-build-dependencies/obs-deps/lib/Sparkle.framework + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.SPARKLE_VERSION }}-${{ env.CACHE_REVISION }} + + - name: 'Setup build environment' run: | - mkdir /tmp/obsdeps - curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-deps-${{ env.MACOS_DEPS_VERSION }}-${{ env.CURRENT_ARCH }}.tar.xz - tar -xf ./macos-deps-${{ env.MACOS_DEPS_VERSION }}-${{ env.CURRENT_ARCH }}.tar.xz -C "/tmp/obsdeps" - - 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-deps-qt-${{ env.MACOS_DEPS_VERSION }}-${{ env.CURRENT_ARCH }}.tar.xz - tar -xf ./macos-deps-qt-${{ env.MACOS_DEPS_VERSION }}-${{ env.CURRENT_ARCH }}.tar.xz -C "/tmp/obsdeps" - xattr -r -d com.apple.quarantine /tmp/obsdeps - - name: 'Install prerequisite: VLC' - if: steps.vlc-cache.outputs.cache-hit != 'true' - shell: bash - run: | - curl -L -O https://downloads.videolan.org/vlc/${{ env.VLC_VERSION }}/vlc-${{ env.VLC_VERSION }}.tar.xz - if [ ! -d "${{ github.workspace }}/cmbuild" ]; then mkdir "${{ github.workspace }}/cmbuild"; fi - tar -xf ./vlc-${{ env.VLC_VERSION }}.tar.xz -C "${{ github.workspace }}/cmbuild" - - name: 'Install prerequisite: Sparkle' - if: steps.sparkle-cache.outputs.cache-hit != 'true' - shell: bash - run: | - curl -L -o sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/${{ env.SPARKLE_VERSION }}/Sparkle-${{ env.SPARKLE_VERSION }}.tar.bz2 - mkdir ${{ github.workspace }}/cmbuild/sparkle - tar -xf ./sparkle.tar.bz2 -C ${{ github.workspace }}/cmbuild/sparkle - - name: 'Setup prerequisite: Sparkle' - shell: bash - run: sudo cp -R ${{ github.workspace }}/cmbuild/sparkle/Sparkle.framework /Library/Frameworks/Sparkle.framework - - name: 'Install prerequisite: Chromium Embedded Framework' - if: steps.cef-cache.outputs.cache-hit != 'true' - shell: bash - run: | - curl -L -O https://cdn-fastly.obsproject.com/downloads/cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64.tar.xz - tar -xf ./cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64.tar.xz -C ${{ github.workspace }}/cmbuild/ - cd ${{ github.workspace }}/cmbuild/cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64 - /usr/bin/sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt - /usr/bin/sed -i '.orig' s/\"10.9\"/\"${{ env.MIN_MACOS_VERSION }}\"/ ./cmake/cef_variables.cmake - mkdir build && cd build - cmake -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++ -Wno-deprecated-declarations" -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" -DCMAKE_OSX_DEPLOYMENT_TARGET=${{ env.MIN_MACOS_VERSION }} .. - make -j${NPROC:-4} - mkdir libcef_dll - cd ../../ - - name: 'Configure' - shell: bash - run: | - mkdir ./build - cd ./build - LEGACY_BROWSER="$(test "${{ env.MACOS_CEF_BUILD_VERSION }}" -le 3770 && echo "ON" || echo "OFF")" - cmake -DENABLE_UNIT_TESTS=YES -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=${{ env.MIN_MACOS_VERSION }} -DQTDIR="/tmp/obsdeps" -DSWIGDIR="/tmp/obsdeps" -DDepsPath="/tmp/obsdeps" -DVLCPath="${{ github.workspace }}/cmbuild/vlc-${{ env.VLC_VERSION }}" -DENABLE_VLC=ON -DBUILD_BROWSER=ON -DBROWSER_LEGACY=$LEGACY_BROWSER -DWITH_RTMPS=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64" -DTWITCH_CLIENTID='${{ env.TWITCH_CLIENTID }}' -DTWITCH_HASH='${{ env.TWITCH_HASH }}' -DRESTREAM_CLIENTID='${{ env.RESTREAM_CLIENTID }}' -DRESTREAM_HASH='${{ env.RESTREAM_HASH }}' .. - - name: 'Build' - shell: bash - working-directory: ${{ github.workspace }}/build - run: make -j${NPROC:-4} - - name: 'Test' - shell: bash - working-directory: ${{ github.workspace }}/build - run: make CTEST_OUTPUT_ON_FAILURE=1 test - - name: 'Install prerequisite: DMGbuild' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - shell: bash - run: | - pip3 install dmgbuild==1.5.2 + REMOVE_FORMULAS="" + for FORMULA in ${{ env.BLOCKED_FORMULAS }}; do + if [ -d "/usr/local/opt/${FORMULA}" ]; then + REMOVE_FORMULAS="${REMOVE_FORMULAS}${FORMULA} " + fi + done + + if [ -n "${REMOVE_FORMULAS}" ]; then + brew uninstall ${REMOVE_FORMULAS} + fi + + - name: 'Install dependencies' + env: + RESTORED_VLC: ${{ steps.vlc-cache.outputs.cache-hit }} + RESTORED_SPARKLE: ${{ steps.sparkle-cache.outputs.cache-hit }} + RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} + run: CI/macos/01_install_dependencies.sh --architecture "${{ matrix.arch }}" + - name: 'Install Apple Developer Certificate' - if: success() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' + if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' }} uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 with: p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }} p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} + - name: 'Set Signing Identity' - if: success() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' + if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' }} run: | - echo "SIGN_IDENTITY=${{ secrets.MACOS_SIGNING_IDENTITY }}" >> $GITHUB_ENV - - name: 'Create macOS application bundle' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - working-directory: ${{ github.workspace }}/build - shell: bash + echo "CODESIGN_IDENT=${{ secrets.MACOS_SIGNING_IDENTITY }}" >> $GITHUB_ENV + echo "BUILD_FOR_DISTRIBUTION=ON" >> $GITHUB_ENV + + - name: 'Build OBS' + run: CI/macos/02_build_obs.sh --codesign --architecture "${{ matrix.arch }}" + + - name: 'Run tests' + if: ${{ success() && matrix.arch == 'x86_64' }} + run: cmake --build build -t test + + - name: 'Create build artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | - if [ -d ./OBS.app ]; then rm -rf ./OBS.app; fi - mkdir -p OBS.app/Contents/MacOS - mkdir OBS.app/Contents/PlugIns - mkdir OBS.app/Contents/Resources - mkdir OBS.app/Contents/Frameworks + CI/macos/03_package_obs.sh --codesign --architecture "${{ matrix.arch }}" + ARTIFACT_NAME=$(basename $(/usr/bin/find build -type f -name "obs-studio-*.dmg" -depth 1 | head -1)) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV - cp rundir/RelWithDebInfo/bin/obs ./OBS.app/Contents/MacOS - cp rundir/RelWithDebInfo/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS - if ! [ "${{ env.MACOS_CEF_BUILD_VERSION }}" -le 3770 ]; then - cp -R "rundir/RelWithDebInfo/bin/OBS Helper.app" "./OBS.app/Contents/Frameworks/OBS Helper.app" - cp -R "rundir/RelWithDebInfo/bin/OBS Helper (GPU).app" "./OBS.app/Contents/Frameworks/OBS Helper (GPU).app" - cp -R "rundir/RelWithDebInfo/bin/OBS Helper (Plugin).app" "./OBS.app/Contents/Frameworks/OBS Helper (Plugin).app" - cp -R "rundir/RelWithDebInfo/bin/OBS Helper (Renderer).app" "./OBS.app/Contents/Frameworks/OBS Helper (Renderer).app" - fi - 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/AppIcon.icns ./OBS.app/Contents/Resources - cp -R rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/PlugIns - cp ../CI/scripts/macos/app/Info.plist ./OBS.app/Contents - - if [ -d ./OBS.app/Contents/Resources/data/obs-scripting ]; then - mv ./OBS.app/Contents/Resources/data/obs-scripting/obslua.so ./OBS.app/Contents/MacOS/ - mv ./OBS.app/Contents/Resources/data/obs-scripting/_obspython.so ./OBS.app/Contents/MacOS/ - mv ./OBS.app/Contents/Resources/data/obs-scripting/obspython.py ./OBS.app/Contents/MacOS/ - rm -rf ./OBS.app/Contents/Resources/data/obs-scripting/ - fi - - /bin/cp -cpR /tmp/obsdeps/lib/*.dylib ./OBS.app/Contents/Frameworks - - BUNDLE_PLUGINS=( - ./OBS.app/Contents/PlugIns/coreaudio-encoder.so - ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so - ./OBS.app/Contents/PlugIns/decklink-captions.so - ./OBS.app/Contents/PlugIns/frontend-tools.so - ./OBS.app/Contents/PlugIns/image-source.so - ./OBS.app/Contents/PlugIns/mac-avcapture.so - ./OBS.app/Contents/PlugIns/mac-capture.so - ./OBS.app/Contents/PlugIns/mac-decklink.so - ./OBS.app/Contents/PlugIns/mac-syphon.so - ./OBS.app/Contents/PlugIns/mac-vth264.so - ./OBS.app/Contents/PlugIns/mac-virtualcam.so - ./OBS.app/Contents/PlugIns/obs-browser.so - ./OBS.app/Contents/PlugIns/obs-ffmpeg.so - ./OBS.app/Contents/PlugIns/obs-filters.so - ./OBS.app/Contents/PlugIns/obs-transitions.so - ./OBS.app/Contents/PlugIns/obs-vst.so - ./OBS.app/Contents/PlugIns/rtmp-services.so - ./OBS.app/Contents/MacOS/obs-ffmpeg-mux - ./OBS.app/Contents/MacOS/obslua.so - ./OBS.app/Contents/MacOS/_obspython.so - ./OBS.app/Contents/PlugIns/obs-x264.so - ./OBS.app/Contents/PlugIns/text-freetype2.so - ./OBS.app/Contents/PlugIns/obs-outputs.so - ) - - if ! [ "${{ env.MACOS_CEF_BUILD_VERSION }}" -le 3770 ]; then - ../CI/scripts/macos/app/dylibBundler -cd -of -a ./OBS.app -q -f \ - -s ./OBS.app/Contents/MacOS \ - -s /tmp/obsdeps/lib \ - -s /tmp/obsdeps/lib/QtSvg.framework \ - -s /tmp/obsdeps/lib/QtXml.framework \ - -s /tmp/obsdeps/lib/QtNetwork.framework \ - -s /tmp/obsdeps/lib/QtCore.framework \ - -s /tmp/obsdeps/lib/QtGui.framework \ - -s /tmp/obsdeps/lib/QtWidgets.framework \ - -s /tmp/obsdeps/lib/QtDBus.framework \ - -s /tmp/obsdeps/lib/QtPrintSupport.framework \ - -s "${{ github.workspace }}/cmbuild/sparkle/Sparkle.framework" \ - -s ./rundir/RelWithDebInfo/bin \ - $(echo "${BUNDLE_PLUGINS[@]/#/-x }") - else - ../CI/scripts/macos/app/dylibBundler -cd -of -a ./OBS.app -q -f \ - -s ./OBS.app/Contents/MacOS \ - -s /tmp/obsdeps/lib \ - -s /tmp/obsdeps/lib/QtSvg.framework \ - -s /tmp/obsdeps/lib/QtXml.framework \ - -s /tmp/obsdeps/lib/QtNetwork.framework \ - -s /tmp/obsdeps/lib/QtCore.framework \ - -s /tmp/obsdeps/lib/QtGui.framework \ - -s /tmp/obsdeps/lib/QtWidgets.framework \ - -s /tmp/obsdeps/lib/QtDBus.framework \ - -s /tmp/obsdeps/lib/QtPrintSupport.framework \ - -s "${{ github.workspace }}/cmbuild/sparkle/Sparkle.framework" \ - -s ./rundir/RelWithDebInfo/bin \ - $(echo "${BUNDLE_PLUGINS[@]/#/-x }") \ - -x ./OBS.app/Contents/PlugIns/obs-browser-page - fi - - mv ./libobs-opengl/libobs-opengl.so ./OBS.app/Contents/Frameworks - - cp -R "${{ github.workspace }}/cmbuild/cef_binary_${{ env.MACOS_CEF_BUILD_VERSION }}_macos_x86_64/Release/Chromium Embedded Framework.framework" ./OBS.app/Contents/Frameworks/ - chown -R $(whoami) ./OBS.app/Contents/Frameworks/ - - cp ../CI/scripts/macos/app/OBSPublicDSAKey.pem ./OBS.app/Contents/Resources - - if [ "${GITHUB_REF:0:10}" = "refs/tags/" ]; then - plutil -insert CFBundleVersion -string ${{ env.OBS_GIT_TAG }} ./OBS.app/Contents/Info.plist - plutil -insert CFBundleShortVersionString -string ${{ env.OBS_GIT_TAG }} ./OBS.app/Contents/Info.plist - else - plutil -insert CFBundleVersion -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist - plutil -insert CFBundleShortVersionString -string ${{ env.OBS_GIT_TAG }}-${{ env.OBS_GIT_HASH }} ./OBS.app/Contents/Info.plist - fi - - plutil -insert OBSFeedsURL -string https://obsproject.com/osx_update/feeds.xml ./OBS.app/Contents/Info.plist - 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 - - codesign --force --options runtime --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop" - codesign --force --options runtime --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate" - codesign --force --options runtime --sign "${SIGN_IDENTITY:--}" --deep ./OBS.app/Contents/Frameworks/Sparkle.framework - - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libEGL.dylib" - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libswiftshader_libEGL.dylib" - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libGLESv2.dylib" - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libswiftshader_libGLESv2.dylib" - if ! [ "${{ env.MACOS_CEF_BUILD_VERSION }}" -le 3770 ]; then - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libvk_swiftshader.dylib" - fi - - if ! [ "${{ env.MACOS_CEF_BUILD_VERSION }}" -le 3770 ]; then - codesign --force --options runtime --entitlements "../CI/scripts/macos/helpers/helper-entitlements.plist" --sign "${SIGN_IDENTITY:--}" --deep "./OBS.app/Contents/Frameworks/OBS Helper.app" - codesign --force --options runtime --entitlements "../CI/scripts/macos/helpers/helper-gpu-entitlements.plist" --sign "${SIGN_IDENTITY:--}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (GPU).app" - codesign --force --options runtime --entitlements "../CI/scripts/macos/helpers/helper-plugin-entitlements.plist" --sign "${SIGN_IDENTITY:--}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (Plugin).app" - codesign --force --options runtime --entitlements "../CI/scripts/macos/helpers/helper-renderer-entitlements.plist" --sign "${SIGN_IDENTITY:--}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (Renderer).app" - fi - - codesign --force --options runtime --deep --sign "${SIGN_IDENTITY:--}" "./OBS.app/Contents/Resources/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin" - - codesign --force --options runtime --entitlements "../CI/scripts/macos/app/entitlements.plist" --sign "${SIGN_IDENTITY:--}" --deep ./OBS.app - - codesign -dvv ./OBS.app - - name: 'Package' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - working-directory: ${{ github.workspace }}/build - shell: bash - run: | - FILE_DATE=$(date +%Y-%m-%d) - FILE_NAME=$FILE_DATE-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-macOS.dmg - echo "FILE_NAME=${FILE_NAME}" >> $GITHUB_ENV - - cp ../CI/scripts/macos/package/settings.json.template ./settings.json - /usr/bin/sed -i '' 's#\$\$VERSION\$\$#${{ env.OBS_GIT_TAG }}#g' ./settings.json - /usr/bin/sed -i '' 's#\$\$CI_PATH\$\$#../CI/scripts/macos#g' ./settings.json - /usr/bin/sed -i '' 's#\$\$BUNDLE_PATH\$\$#${{ github.workspace }}/build#g' ./settings.json - - dmgbuild "OBS-Studio ${{ env.OBS_GIT_TAG }}" "${FILE_NAME}" -s ./settings.json - mkdir ../nightly - codesign --force --sign "${SIGN_IDENTITY:--}" ./"${FILE_NAME}" - codesign -dvv ./"${FILE_NAME}" - sudo cp ./${FILE_NAME} ../nightly/${FILE_NAME} - - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - uses: actions/upload-artifact@v2.2.0 + - name: 'Upload build Artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + uses: actions/upload-artifact@v2 with: - name: '${{ env.FILE_NAME }}' - path: ./nightly/*.dmg - - name: 'Package Release' - if: success() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' - working-directory: ${{ github.workspace }}/build + name: 'obs-macos-${{ matrix.arch }}' + path: '${{ github.workspace }}/obs-studio/build/${{ env.FILE_NAME }}' + + linux_build: + name: '02 - Linux' + runs-on: ${{ matrix.ubuntu }} + strategy: + matrix: + ubuntu: ['ubuntu-20.04', 'ubuntu-18.04'] + if: always() + needs: [clang_check] + defaults: + run: shell: bash - run: | - FILE_DATE=$(date +%Y-%m-%d) - FILE_NAME=$FILE_DATE-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-macOS.dmg - RELEASE_FILE_NAME=$FILE_DATE-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-rel-macOS.dmg - echo "RELEASE_FILE_NAME=${RELEASE_FILE_NAME}" >> $GITHUB_ENV - - xcrun altool --store-password-in-keychain-item "AC_PASSWORD" -u "${{ secrets.MACOS_NOTARIZATION_USERNAME }}" -p "${{ secrets.MACOS_NOTARIZATION_PASSWORD }}" - - xcnotary precheck "./OBS.app" - - if [ "$?" -eq 0 ]; then - xcnotary notarize "$FILE_NAME" --developer-account "${{ secrets.MACOS_NOTARIZATION_USERNAME }}" --developer-password-keychain-item "AC_PASSWORD" --provider "${{ secrets.ASC_PROVIDER_SHORTNAME }}" - else - return 1 - fi - - mkdir ../release - sudo mv ./$FILE_NAME ../release/$RELEASE_FILE_NAME - - name: 'Publish Release' - if: success() && startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' && env.HAVE_CODESIGN_IDENTITY == 'true' - uses: actions/upload-artifact@v2.2.0 - with: - name: '${{ env.RELEASE_FILE_NAME }}' - path: ./release/*.dmg - ubuntu64: - name: 'Linux/Ubuntu 64-bit' - runs-on: [ubuntu-18.04] + working-directory: 'obs-studio' + env: + BUILD_FOR_DISTRIBUTION: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} steps: - name: 'Checkout' uses: actions/checkout@v2.3.3 with: submodules: 'recursive' - - name: 'Fetch Git Tags' - run: | - git fetch --prune --unshallow - echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + path: 'obs-studio' + fetch-depth: 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 + if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then echo "SEEKING_TESTERS=1" >> $GITHUB_ENV else echo "SEEKING_TESTERS=0" >> $GITHUB_ENV fi - - name: Install prerequisites (Apt) - shell: bash - run: | - echo "NPROC=$(($(nproc)+1))" >> $GITHUB_ENV - sudo dpkg --add-architecture amd64 - sudo apt-get -qq update - sudo apt-get install -y \ - build-essential \ - checkinstall \ - cmake \ - libasound2-dev \ - libavcodec-dev \ - libavdevice-dev \ - libavfilter-dev \ - libavformat-dev \ - libavutil-dev \ - libcurl4-openssl-dev \ - libfdk-aac-dev \ - libfontconfig-dev \ - libfreetype6-dev \ - libgl1-mesa-dev \ - libjack-jackd2-dev \ - libjansson-dev \ - libluajit-5.1-dev \ - libpulse-dev \ - libqt5x11extras5-dev \ - libsndio-dev \ - libspeexdsp-dev \ - libswresample-dev \ - libswscale-dev \ - libudev-dev \ - libv4l-dev \ - libva-dev \ - libvlc-dev \ - libx11-dev \ - libx264-dev \ - libxcb-randr0-dev \ - libxcb-shm0-dev \ - libxcb-xinerama0-dev \ - libxcomposite-dev \ - libxinerama-dev \ - libmbedtls-dev \ - pkg-config \ - python3-dev \ - qtbase5-dev \ - qtbase5-private-dev \ - libqt5svg5-dev \ - swig \ - libcmocka-dev \ - libpci-dev + + echo "CACHE_DATE=$(date +"%Y-%m-%d")" >> $GITHUB_ENV + + - name: 'Restore ccache from cache' + id: ccache-cache + uses: actions/cache@v2.1.2 + env: + CACHE_NAME: 'ccache-cache' + with: + path: ${{ github.workspace }}/.ccache + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ matrix.ubuntu }}-${{ env.CACHE_DATE }} + - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v2.1.2 env: CACHE_NAME: 'cef-cache' with: - path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.LINUX_CEF_BUILD_VERSION }}_linux64 - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.LINUX_CEF_BUILD_VERSION }}-1 - - name: 'Install prerequisite: Chromium Embedded Framework' - if: steps.cef-cache.outputs.cache-hit != 'true' - shell: bash + path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_LINUX }}_linux64 + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_LINUX }}-${{ env.CACHE_REVISION }} + + - name: 'Install dependencies' + env: + RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} + run: CI/linux/01_install_dependencies.sh --disable-pipewire + + - name: 'Build OBS' + run: CI/linux/02_build_obs.sh --disable-pipewire + + - name: 'Run tests' + if: success() + run: cmake --build build -t test + + - name: 'Create build artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | - curl -kL https://cdn-fastly.obsproject.com/downloads/cef_binary_${{ env.LINUX_CEF_BUILD_VERSION }}_linux64.tar.bz2 -f --retry 5 -o cef.tar.bz2 - if [ ! -d "${{ github.workspace }}/cmbuild" ]; then mkdir "${{ github.workspace }}/cmbuild"; fi - tar -C"${{ github.workspace }}/cmbuild" -xjf cef.tar.bz2 - - name: 'Configure' - shell: bash - run: | - mkdir ./build - cd ./build - cmake -DENABLE_PIPEWIRE=OFF -DUNIX_STRUCTURE=0 -DCMAKE_INSTALL_PREFIX="${{ github.workspace }}/obs-studio-portable" -DENABLE_UNIT_TESTS=ON -DENABLE_VLC=ON -DWITH_RTMPS=ON -DBUILD_BROWSER=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.LINUX_CEF_BUILD_VERSION }}_linux64" -DTWITCH_CLIENTID='${{ env.TWITCH_CLIENTID }}' -DTWITCH_HASH='${{ env.TWITCH_HASH }}' -DRESTREAM_CLIENTID='${{ env.RESTREAM_CLIENTID }}' -DRESTREAM_HASH='${{ env.RESTREAM_HASH }}' .. - - name: 'Build' - shell: bash - working-directory: ${{ github.workspace }}/build - run: make -j${NPROC:-4} - - name: 'Test' - shell: bash - working-directory: ${{ github.workspace }}/build - run: make CTEST_OUTPUT_ON_FAILURE=1 test - - name: 'Package' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - shell: bash - run: | - FILE_DATE=$(date +%Y-%m-%d) - FILE_NAME=$FILE_DATE-${{ env.OBS_GIT_HASH }}-${{ env.OBS_GIT_TAG }}-linux64.tar.gz - echo "FILE_NAME=${FILE_NAME}" >> $GITHUB_ENV - cd ./build - sudo checkinstall --default --install=no --pkgname=obs-studio --fstrans=yes --backup=no --pkgversion="$(date +%Y%m%d)-git" --deldoc=yes - mkdir ../nightly - tar -cvzf "${FILE_NAME}" *.deb - mv "${FILE_NAME}" ../nightly/ - cd - - - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - uses: actions/upload-artifact@v2.2.0 + CI/linux/03_package_obs.sh + ARTIFACT_NAME=$(basename $(/usr/bin/find build -maxdepth 1 -type f -name "obs-studio-*.deb" | sort -rn | head -1)) + echo "FILE_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV + + - name: 'Upload build Artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + uses: actions/upload-artifact@v2 with: - name: '${{ env.FILE_NAME }}' - path: './nightly/*.tar.gz' - win64: - name: 'Windows 64-bit' + name: 'obs-linux-deb' + path: '${{ github.workspace }}/obs-studio/build/${{ env.FILE_NAME }}' + + windows_build: + name: '02 - Windows' runs-on: [windows-2019] + needs: [clang_check] + if: always() + strategy: + matrix: + arch: [64, 32] env: - QT_VERSION: '5.15.2' - CMAKE_GENERATOR: "Visual Studio 16 2019" - CMAKE_SYSTEM_VERSION: "10.0.18363.657" - WINDOWS_DEPS_VERSION: '2022-01-31' - WINDOWS_DEPS_CACHE_VERSION: '1' - VLC_VERSION: '3.0.0-git' - VIRTUALCAM-GUID: "A3FCE0F5-3493-419F-958A-ABA1250EC20B" + CMAKE_GENERATOR: 'Visual Studio 16 2019' + CMAKE_SYSTEM_VERSION: '10.0.18363.657' + VIRTUALCAM-GUID: 'A3FCE0F5-3493-419F-958A-ABA1250EC20B' + BUILD_FOR_DISTRIBUTION: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} + defaults: + run: + working-directory: 'obs-studio' steps: - - name: 'Add msbuild to PATH' - uses: microsoft/setup-msbuild@v1.0.2 - name: 'Checkout' uses: actions/checkout@v2.3.3 with: submodules: 'recursive' - - name: 'Fetch Git Tags' - shell: bash - run: | - git fetch --prune --unshallow - echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV - - 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 "SEEKING_TESTERS=1" >> $GITHUB_ENV - else - echo "SEEKING_TESTERS=0" >> $GITHUB_ENV - fi - - name: 'Restore QT dependency from cache' - id: qt-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'windows-qt-cache' - with: - path: ${{ github.workspace }}/cmbuild/QT - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.QT_VERSION }} - - name: 'Restore pre-built dependencies from cache' - id: deps-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'windows-deps-cache' - with: - path: ${{ github.workspace }}/cmbuild/deps - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.WINDOWS_DEPS_VERSION }}-${{ env.WINDOWS_DEPS_CACHE_VERSION }} - - name: 'Restore VLC dependency from cache' - id: vlc-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'windows-vlc-cache' - with: - path: ${{ github.workspace }}/cmbuild/vlc - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION }} - - name: 'Restore CEF dependency from cache (64 bit)' - id: cef-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'windows-cef-64-cache' - with: - path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x64 - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.WINDOWS_CEF_BUILD_VERSION }}-3 - - name: 'Install prerequisite: QT' - if: steps.qt-cache.outputs.cache-hit != 'true' - run: | - curl -kLO https://cdn-fastly.obsproject.com/downloads/Qt_${{ env.QT_VERSION }}.7z -f --retry 5 -C - - 7z x Qt_${{ env.QT_VERSION }}.7z -o"${{ github.workspace }}/cmbuild/QT" - - name: 'Install prerequisite: Pre-built dependencies' - if: steps.deps-cache.outputs.cache-hit != 'true' - run: | - curl -L -O https://github.com/obsproject/obs-deps/releases/download/win-${{ env.WINDOWS_DEPS_VERSION }}/windows-deps-${{ env.WINDOWS_DEPS_VERSION }}.zip --retry 5 -C - - 7z x windows-deps-${{ env.WINDOWS_DEPS_VERSION }}.zip -o"${{ github.workspace }}/cmbuild/deps" - - name: 'Install prerequisite: VLC' - if: steps.vlc-cache.outputs.cache-hit != 'true' - run: | - curl -kL https://cdn-fastly.obsproject.com/downloads/vlc.zip -f --retry 5 -o vlc.zip - 7z x vlc.zip -o"${{ github.workspace }}/cmbuild/vlc" - - name: 'Install prerequisite: Chromium Embedded Framework' - if: steps.cef-cache.outputs.cache-hit != 'true' - run: | - curl -kL https://cdn-fastly.obsproject.com/downloads/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x64.zip -f --retry 5 -o cef.zip - 7z x cef.zip -o"${{ github.workspace }}/cmbuild" - - name: 'Configure' - run: | - mkdir ./build - mkdir ./build64 - cd ./build64 - cmake -G"${{ env.CMAKE_GENERATOR }}" -A"x64" -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DBUILD_BROWSER=true -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win64" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019_64" -DENABLE_VLC=ON -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x64" -DTWITCH_CLIENTID='${{ env.TWITCH_CLIENTID }}' -DTWITCH_HASH='${{ env.TWITCH_HASH }}' -DRESTREAM_CLIENTID='${{ env.RESTREAM_CLIENTID }}' -DRESTREAM_HASH='${{ env.RESTREAM_HASH }}' -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE -DVIRTUALCAM_GUID=${{ env.VIRTUALCAM-GUID }} .. - - name: 'Build' - run: msbuild /m /p:Configuration=RelWithDebInfo .\build64\obs-studio.sln - - name: 'Package' - 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" - echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV} - robocopy .\build64\rundir\RelWithDebInfo .\build\ /E /XF .gitignore - 7z - - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - uses: actions/upload-artifact@v2.2.0 - with: - name: '${{ env.FILE_NAME }}' - path: build/* - win32: - name: 'Windows 32-bit' - runs-on: [windows-2019] - env: - QT_VERSION: '5.15.2' - CMAKE_GENERATOR: "Visual Studio 16 2019" - CMAKE_SYSTEM_VERSION: "10.0.18363.657" - WINDOWS_DEPS_VERSION: '2022-01-31' - WINDOWS_DEPS_CACHE_VERSION: '1' - VIRTUALCAM-GUID: "A3FCE0F5-3493-419F-958A-ABA1250EC20B" - steps: + path: 'obs-studio' + fetch-depth: 0 + - name: 'Add msbuild to PATH' uses: microsoft/setup-msbuild@v1.0.2 - - name: 'Checkout' - uses: actions/checkout@v2.3.3 - with: - submodules: 'recursive' - - name: 'Fetch Git Tags' - shell: bash - run: | - git fetch --prune --unshallow - echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV - echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + - 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 "SEEKING_TESTERS=1" >> $GITHUB_ENV - else - echo "SEEKING_TESTERS=0" >> $GITHUB_ENV - fi - - name: 'Restore QT dependency from cache' - id: qt-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'qt-cache' - with: - path: ${{ github.workspace }}/cmbuild/QT - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.QT_VERSION }} - - name: 'Restore pre-built dependencies from cache' - id: deps-cache - uses: actions/cache@v2.1.2 - env: - CACHE_NAME: 'deps-cache' - with: - path: ${{ github.workspace }}/cmbuild/deps - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.WINDOWS_DEPS_VERSION }}-${{ env.WINDOWS_DEPS_CACHE_VERSION }} + $LabelFound = try { (Invoke-RestMethod -Authentication 'Bearer' -Token (ConvertTo-SecureString '${{ secrets.GITHUB_TOKEN }}' -AsPlainText) -Uri "${{ github.event.pull_request.url }}" -UseBasicParsing).labels.name.contains("Seeking Testers") } catch { $false } + Write-Output "SEEKING_TESTERS=$(if( $LabelFound -eq $true ) { 1 } else { 0 })" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + - name: 'Restore VLC dependency from cache' id: vlc-cache uses: actions/cache@v2.1.2 env: CACHE_NAME: 'vlc-cache' with: - path: ${{ github.workspace }}/cmbuild/vlc - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.WINDOWS_VLC_VERSION }} - - name: 'Restore CEF dependency from cache (32 bit)' + path: ${{ github.workspace }}/obs-build-dependencies/vlc-${{ env.VLC_VERSION_WIN }} + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.VLC_VERSION_WIN }}-${{ env.CACHE_REVISION }} + + - name: 'Restore Chromium Embedded Framework from cache' id: cef-cache uses: actions/cache@v2.1.2 env: - CACHE_NAME: 'cef-32-cache' + CACHE_NAME: 'cef-cache' with: - path: ${{ github.workspace }}/cmbuild/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x86 - key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.WINDOWS_CEF_BUILD_VERSION }}-3 - - name: 'Install prerequisite: QT' - if: steps.qt-cache.outputs.cache-hit != 'true' + path: ${{ github.workspace }}/obs-build-dependencies/cef_binary_${{ env.CEF_BUILD_VERSION_WIN }}_windows${{ matrix.arch }}_minimal + key: ${{ runner.os }}-pr-${{ env.CACHE_NAME }}-${{ env.CEF_BUILD_VERSION_WIN }}-${{ env.CACHE_REVISION }} + + - name: 'Install dependencies' + env: + RESTORED_VLC: ${{ steps.vlc-cache.outputs.cache-hit }} + RESTORED_CEF: ${{ steps.cef-cache.outputs.cache-hit }} + run: CI/windows/01_install_dependencies.ps1 -BuildArch ${{ matrix.arch }}-bit + + - name: 'Build OBS' + run: CI/windows/02_build_obs.ps1 -BuildArch ${{ matrix.arch }}-bit + + - name: 'Create build artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} run: | - curl -kLO https://cdn-fastly.obsproject.com/downloads/Qt_${{ env.QT_VERSION }}.7z -f --retry 5 -C - - 7z x Qt_${{ env.QT_VERSION }}.7z -o"${{ github.workspace }}/cmbuild/QT" - - name: 'Install prerequisite: Pre-built dependencies' - if: steps.deps-cache.outputs.cache-hit != 'true' - run: | - curl -L -O https://github.com/obsproject/obs-deps/releases/download/win-${{ env.WINDOWS_DEPS_VERSION }}/windows-deps-${{ env.WINDOWS_DEPS_VERSION }}.zip --retry 5 -C - - 7z x windows-deps-${{ env.WINDOWS_DEPS_VERSION }}.zip -o"${{ github.workspace }}/cmbuild/deps" - - name: 'Install prerequisite: VLC' - if: steps.vlc-cache.outputs.cache-hit != 'true' - run: | - curl -kL https://cdn-fastly.obsproject.com/downloads/vlc.zip -f --retry 5 -o vlc.zip - 7z x vlc.zip -o"${{ github.workspace }}/cmbuild/vlc" - - name: 'Install prerequisite: Chromium Embedded Framework' - if: steps.cef-cache.outputs.cache-hit != 'true' - run: | - curl -kL https://cdn-fastly.obsproject.com/downloads/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x86.zip -f --retry 5 -o cef.zip - 7z x cef.zip -o"${{ github.workspace }}/cmbuild" - - name: 'Configure' - run: | - 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 -DCOMPILE_D3D12_HOOK=true -DVLCPath="${{ github.workspace }}/cmbuild/vlc" -DDepsPath="${{ github.workspace }}/cmbuild/deps/win32" -DQTDIR="${{ github.workspace }}/cmbuild/QT/${{ env.QT_VERSION }}/msvc2019" -DCEF_ROOT_DIR="${{ github.workspace }}/cmbuild/cef_binary_${{ env.WINDOWS_CEF_BUILD_VERSION }}_windows_x86" -DTWITCH_CLIENTID='${{ env.TWITCH_CLIENTID }}' -DTWITCH_HASH='${{ env.TWITCH_HASH }}' -DRESTREAM_CLIENTID='${{ env.RESTREAM_CLIENTID }}' -DRESTREAM_HASH='${{ env.RESTREAM_HASH }}' -DCOPIED_DEPENDENCIES=FALSE -DCOPY_DEPENDENCIES=TRUE -DVIRTUALCAM_GUID=${{ env.VIRTUALCAM-GUID }} .. - - name: 'Build' - run: msbuild /m /p:Configuration=RelWithDebInfo .\build32\obs-studio.sln - - name: 'Package' - 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" - echo "FILE_NAME=${env:FILE_NAME}" >> ${env:GITHUB_ENV} - robocopy .\build32\rundir\RelWithDebInfo .\build\ /E /XF .gitignore - 7z - - name: 'Publish' - if: success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') - uses: actions/upload-artifact@v2.2.0 + CI/windows/03_package_obs.ps1 -BuildArch ${{ matrix.arch }}-bit -Package + $ArtifactName = Get-ChildItem -filter "OBS-Studio-*-Win${{ matrix.arch }}.zip" -File + Write-Output "FILE_NAME=${ArtifactName}" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + + - name: 'Upload build artifact' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + uses: actions/upload-artifact@v2 with: - name: '${{ env.FILE_NAME }}' - path: build/* + name: 'obs-win${{ matrix.arch }}' + path: '${{ env.FILE_NAME }}' + + linux_package: + name: '02 - Flatpak Bundle' + runs-on: [ubuntu-latest] + needs: [clang_check] + if: always() + defaults: + run: + shell: bash + container: + image: bilelmoussaoui/flatpak-github-actions:kde-5.15-21.08 + options: --privileged + steps: + - name: 'Check for Github Labels' + if: github.event_name == 'pull_request' + run: | + if ! /usr/bin/command -v "jq" >/dev/null 2>&1; then sudo dnf install -y -q jq; fi + if test -n "$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" -s "${{ github.event.pull_request.url }}" | jq -e '.labels[] | select(.name == "Seeking Testers")')"; then + echo "SEEKING_TESTERS=1" >> $GITHUB_ENV + else + echo "SEEKING_TESTERS=0" >> $GITHUB_ENV + fi + + - name: 'Checkout' + uses: actions/checkout@v2.3.3 + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + with: + submodules: 'recursive' + fetch-depth: 0 + + - name: 'Setup build environment' + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + run: | + echo "OBS_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV + echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV + echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV + + - name: Build Flatpak Manifest + uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4 + if: ${{ success() && (github.event_name != 'pull_request' || env.SEEKING_TESTERS == '1') }} + with: + bundle: obs-studio-${{ github.sha }}.flatpak + manifest-path: CI/flatpak/com.obsproject.Studio.json + cache-key: flatpak-builder-${{ github.sha }} + + windows_package: + name: '03 - Windows Installer' + runs-on: [windows-latest] + needs: [windows_build] + if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} + env: + BUILD_FOR_DISTRIBUTION: 'ON' + steps: + - name: 'Checkout' + uses: actions/checkout@v2.3.3 + + - name: 'Add msbuild to PATH' + uses: microsoft/setup-msbuild@v1.0.2 + + - name: 'Download 64-bit artifact' + uses: actions/download-artifact@v2 + with: + name: 'obs-win64' + + - name: 'Download 32-bit artifact' + uses: actions/download-artifact@v2 + with: + name: 'obs-win32' + + - name: 'Unpack Windows build artifacts' + run: | + if (!(Test-Path install_temp)) { + $null = New-Item -ItemType Directory -Force -Path install_temp + } + + Expand-Archive -Path "$(Get-ChildItem -filter "OBS-Studio-*-Win32.zip" -File)" -DestinationPath install_temp + Expand-Archive -Path "$(Get-ChildItem -filter "OBS-Studio-*-Win64.zip" -File)" -Force -DestinationPath install_temp + + CI/windows/03_package_obs.ps1 -CombinedArchs -Package + + $ArtifactName = (Get-ChildItem -filter "OBS-Studio-*-Windows.zip" -File).Name + Write-Output "FILE_NAME=${ArtifactName}" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append + + - name: 'Upload build artifact' + uses: actions/upload-artifact@v2 + with: + name: 'obs-windows' + path: '${{ env.FILE_NAME }}' + + macos_release: + name: '03 - macOS notarized image' + runs-on: [macos-11] + needs: [macos_build] + env: + HAVE_CODESIGN_IDENTITY: ${{ secrets.MACOS_SIGNING_IDENTITY != '' && secrets.MACOS_SIGNING_CERT != '' }} + BUILD_FOR_DISTRIBUTION: 'ON' + if: ${{ startsWith(github.ref, 'refs/tags/') && github.event_name != 'pull_request' }} + strategy: + matrix: + arch: ['x86_64', 'arm64'] + defaults: + run: + shell: bash + steps: + - name: 'Checkout' + if: env.HAVE_CODESIGN_IDENTITY == 'true' + uses: actions/checkout@v2.3.3 + + - name: 'Download artifact' + if: env.HAVE_CODESIGN_IDENTITY == 'true' + uses: actions/download-artifact@v2 + with: + name: 'obs-macos-${{ matrix.arch }}' + + - name: 'Install Apple Developer Certificate' + if: env.HAVE_CODESIGN_IDENTITY == 'true' + uses: apple-actions/import-codesign-certs@253ddeeac23f2bdad1646faac5c8c2832e800071 + with: + p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }} + p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }} + + - name: 'Create disk image for distribution' + if: env.HAVE_CODESIGN_IDENTITY == 'true' + env: + CODESIGN_IDENT: ${{ secrets.MACOS_SIGNING_IDENTITY }} + CODESIGN_IDENT_USER: ${{ secrets.MACOS_NOTARIZATION_USERNAME }} + CODESIGN_IDENT_PASS: ${{ secrets.MACOS_NOTARIZATION_PASSWORD }} + run: | + ARTIFACT_NAME=$(/usr/bin/find . -type f -name "obs-studio-*.dmg" -depth 1 | head -1) + CI/macos/03_package_obs.sh --notarize-image ${ARTIFACT_NAME} + + echo "FILE_NAME=$(basename ${ARTIFACT_NAME})" >> $GITHUB_ENV + + - name: 'Upload build Artifact' + if: env.HAVE_CODESIGN_IDENTITY == 'true' + uses: actions/upload-artifact@v2 + with: + name: 'obs-macos-${{ matrix.arch }}-notarized' + path: '${{ github.workspace }}/${{ env.FILE_NAME }}' diff --git a/.gitignore b/.gitignore index cf5e8c984..afcf382fc 100644 --- a/.gitignore +++ b/.gitignore @@ -21,9 +21,11 @@ *.ninja .ninja* .dirstamp +/cmake/.CMakeBuildNumber #xcode *.xcodeproj/ +/xcodebuild/ #clion .idea/ @@ -39,8 +41,7 @@ GeneratedFiles/ .moc/ /UI/obs.rc .vscode/ - - +/CI/include/*.lock.json /other/ diff --git a/CI/before-deploy-win.cmd b/CI/before-deploy-win.cmd deleted file mode 100644 index e9dcb48dd..000000000 --- a/CI/before-deploy-win.cmd +++ /dev/null @@ -1,3 +0,0 @@ -robocopy .\build32\rundir\RelWithDebInfo .\build\ /E /XF .gitignore -robocopy .\build64\rundir\RelWithDebInfo .\build\ /E /XC /XN /XO /XF .gitignore -7z a build.zip .\build\* \ No newline at end of file diff --git a/CI/before-script-linux.sh b/CI/before-script-linux.sh deleted file mode 100755 index 397810ef2..000000000 --- a/CI/before-script-linux.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -ex -ccache -s || echo "CCache is not available." -mkdir build && cd build -cmake -DENABLE_PIPEWIRE=OFF -DBUILD_BROWSER=ON -DCEF_ROOT_DIR="../cef_binary_${LINUX_CEF_BUILD_VERSION}_linux64" .. diff --git a/CI/build-freebsd.sh b/CI/build-freebsd.sh new file mode 100755 index 000000000..36b615a4c --- /dev/null +++ b/CI/build-freebsd.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +############################################################################## +# FreeBSD full build script +############################################################################## +# +# This script contains all steps necessary to: +# +# * Build OBS with all default plugins and dependencies +# * Package a FreeBSD package +# +# Parameters: +# -h, --help : Print usage help +# -q, --quiet : Suppress most build process output +# -v, --verbose : Enable more verbose build process output +# -d, --skip-dependency-checks : Skip dependency checks (default: off) +# -p, --portable : Create portable build (default: off) +# -pkg, --package : Create distributable archive +# (default: off) +# --build-dir : Specify alternative build directory +# (default: build)" +# +############################################################################## + +# Halt on errors +set -eE + +## SET UP ENVIRONMENT ## +_RUN_OBS_BUILD_SCRIPT=TRUE +PRODUCT_NAME="OBS-Studio" + +CHECKOUT_DIR="$(git rev-parse --show-toplevel)" +DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" +source "${CHECKOUT_DIR}/CI/include/build_support.sh" +source "${CHECKOUT_DIR}/CI/include/build_support_freebsd.sh" + +## DEPENDENCY INSTALLATION +source "${CHECKOUT_DIR}/CI/freebsd/01_install_dependencies.sh" + +## BUILD OBS ## +source "${CHECKOUT_DIR}/CI/freebsd/02_build_obs.sh" + +## PACKAGE OBS AND NOTARIZE ## +source "${CHECKOUT_DIR}/CI/freebsd/03_package_obs.sh" + +## MAIN SCRIPT FUNCTIONS ## +print_usage() { + echo "build-linux.sh - Build script for OBS-Studio\n" + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-d, --skip-dependency-checks : Skip dependency checks (default: off)\n" \ + "-p, --portable : Create portable build (default: off)\n" \ + "-pkg, --package : Create distributable disk image (default: off)\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +obs-build-main() { + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -d | --skip-dependency-checks ) SKIP_DEP_CHECKS=TRUE; shift ;; + -p | --portable ) PORTABLE=TRUE; shift ;; + -pkg | --package ) PACKAGE=TRUE; shift ;; + --disable-pipewire ) DISABLE_PIPEWIRE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + ensure_dir "${CHECKOUT_DIR}" + step "Fetching OBS tags..." + git fetch origin --tags + + GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(git rev-parse --short HEAD) + GIT_TAG=$(git describe --tags --abbrev=0) + + FILE_NAME="obs-studio-${GIT_TAG}-${GIT_HASH}-FreeBSD" + + if [ -z "${SKIP_DEP_CHECKS}" ]; then + install_dependencies + fi + + build_obs + + if [ "${PACKAGE}" ]; then + package_obs + fi + + cleanup +} + +obs-build-main $* diff --git a/CI/build-linux.sh b/CI/build-linux.sh new file mode 100755 index 000000000..dbeb15907 --- /dev/null +++ b/CI/build-linux.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +############################################################################## +# Linux full build script +############################################################################## +# +# This script contains all steps necessary to: +# +# * Build OBS with all default plugins and dependencies +# * Package a Linux deb package +# +# Parameters: +# -h, --help : Print usage help +# -q, --quiet : Suppress most build process output +# -v, --verbose : Enable more verbose build process output +# -d, --skip-dependency-checks : Skip dependency checks (default: off) +# -p, --portable : Create portable build (default: off) +# -pkg, --package : Create distributable disk image +# (default: off) +# --build-dir : Specify alternative build directory +# (default: build)" +# +############################################################################## + +# Halt on errors +set -eE + +## SET UP ENVIRONMENT ## +_RUN_OBS_BUILD_SCRIPT=TRUE +PRODUCT_NAME="OBS-Studio" + +CHECKOUT_DIR="$(git rev-parse --show-toplevel)" +DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" +source "${CHECKOUT_DIR}/CI/include/build_support.sh" +source "${CHECKOUT_DIR}/CI/include/build_support_linux.sh" + +## DEPENDENCY INSTALLATION +source "${CHECKOUT_DIR}/CI/linux/01_install_dependencies.sh" + +## BUILD OBS ## +source "${CHECKOUT_DIR}/CI/linux/02_build_obs.sh" + +## PACKAGE OBS AND NOTARIZE ## +source "${CHECKOUT_DIR}/CI/linux/03_package_obs.sh" + +## MAIN SCRIPT FUNCTIONS ## +print_usage() { + echo "build-linux.sh - Build script for OBS-Studio\n" + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-d, --skip-dependency-checks : Skip dependency checks (default: off)\n" \ + "-p, --portable : Create portable build (default: off)\n" \ + "-pkg, --package : Create distributable disk image (default: off)\n" \ + "--disable-pipewire : Disable building with Pipewire support (default: off)\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +obs-build-main() { + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -d | --skip-dependency-checks ) SKIP_DEP_CHECKS=TRUE; shift ;; + -p | --portable ) PORTABLE=TRUE; shift ;; + -pkg | --package ) PACKAGE=TRUE; shift ;; + --disable-pipewire ) DISABLE_PIPEWIRE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + ensure_dir "${CHECKOUT_DIR}" + step "Fetching OBS tags..." + git fetch origin --tags + + GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(git rev-parse --short HEAD) + GIT_TAG=$(git describe --tags --abbrev=0) + + if [ "${BUILD_FOR_DISTRIBUTION}" ]; then + VERSION_STRING="${GIT_TAG}" + else + VERSION_STRING="${GIT_TAG}-${GIT_HASH}" + fi + + FILE_NAME="obs-studio-${VERSION_STRING}-Linux.deb" + + if [ -z "${SKIP_DEP_CHECKS}" ]; then + install_dependencies + fi + + build_obs + + if [ "${PACKAGE}" ]; then + package_obs + fi + + cleanup +} + +obs-build-main $* diff --git a/CI/build-macos.sh b/CI/build-macos.sh new file mode 100755 index 000000000..2e1c8cb50 --- /dev/null +++ b/CI/build-macos.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +############################################################################## +# macOS build script +############################################################################## +# +# This script contains all steps necessary to: +# +# * Build OBS with all default plugins and dependencies +# * Create a macOS application bundle +# * Codesign the macOS application bundle +# * Package a macOS installation image +# * Notarize macOS application bundle and/or installation image +# +# Parameters: +# -h, --help : Print usage help +# -q, --quiet : Suppress most build process output +# -v, --verbose : Enable more verbose build process output +# -d, --skip-dependency-checks : Skip dependency checks (default: off) +# -b, --bundle : Create relocatable application bundle +# (default: off) +# -p, --package : Create distributable disk image +# (default: off) +# -c, --codesign : Codesign OBS and all libraries +# (default: ad-hoc only) +# -n, --notarize : Notarize OBS (default: off) +# --xcode : Create Xcode build environment instead +# of Ninja +# --build-dir : Specify alternative build directory +# (default: build)" +# Environment Variables (optional): +# +# MACOS_DEPS_VERSION : Precompiled macOS dependencies version +# MACOS_CEF_BUILD_VERSION : Chromium Embedded Framework version +# VLC_VERSION : VLC version +# SPARKLE_VERSION : Sparkle Framework version +# +############################################################################## + +# Halt on errors +set -eE + +## SET UP ENVIRONMENT ## +_RUN_OBS_BUILD_SCRIPT=TRUE +PRODUCT_NAME="OBS-Studio" + +CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" +DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" +source "${CHECKOUT_DIR}/CI/include/build_support.sh" +source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh" + +## INSTALL DEPENDENCIES ## +source "${CHECKOUT_DIR}/CI/macos/01_install_dependencies.sh" + +## BUILD OBS ## +source "${CHECKOUT_DIR}/CI/macos/02_build_obs.sh" + +## PACKAGE OBS AND NOTARIZE ## +source "${CHECKOUT_DIR}/CI/macos/03_package_obs.sh" + +## MAIN SCRIPT FUNCTIONS ## +print_usage() { + echo "build-macos.sh - Build script for OBS-Studio" + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \ + "-d, --skip-dependency-checks : Skip dependency checks (default: off)\n" \ + "-b, --bundle : Create relocatable application bundle (default: off)\n" \ + "-p, --package : Create distributable disk image (default: off)\n" \ + "-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \ + "-n, --notarize : Notarize OBS (default: off)\n" \ + "--xcode : Create Xcode build environment instead of Ninja\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +print_deprecation() { + echo -e "DEPRECATION ERROR:\n" \ + "The '${1}' switch has been deprecated!\n" + + if [ "${1}" = "-s" ]; then + echo -e "The macOS build script system has changed:\n" \ + " - To configure and build OBS, run the script 'CI/macos/02_build_obs.sh'\n" \ + " - To bundle OBS into a relocatable application bundle, run the script 'CI/macos/02_build_obs.sh --bundle\n" \ + " - To package OBS, run the script 'CI/macos/03_package_obs.sh'\n" \ + " - To notarize OBS, run the script 'CI/macos/03_package_obs.sh --notarize'\n" + fi + +} + +obs-build-main() { + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -a | --architecture ) ARCH="${2}"; shift 2 ;; + -d | --skip-dependency-checks ) SKIP_DEP_CHECKS=TRUE; shift ;; + -p | --package ) PACKAGE=TRUE; shift ;; + -c | --codesign ) CODESIGN=TRUE; shift ;; + -n | --notarize ) NOTARIZE=TRUE; PACKAGE=TRUE CODESIGN=TRUE; shift ;; + -b | --bundle ) BUNDLE=TRUE; shift ;; + --xcode ) XCODE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -s ) print_deprecation ${1}; exit 1 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + ensure_dir "${CHECKOUT_DIR}" + check_archs + check_macos_version + step "Fetching OBS tags..." + /usr/bin/git fetch origin --tags + + GIT_BRANCH=$(/usr/bin/git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(/usr/bin/git rev-parse --short HEAD) + GIT_TAG=$(/usr/bin/git describe --tags --abbrev=0) + + if [ "${BUILD_FOR_DISTRIBUTION}" ]; then + VERSION_STRING="${GIT_TAG}" + else + VERSION_STRING="${GIT_TAG}-${GIT_HASH}" + fi + + if [ "${ARCH}" = "arm64" ]; then + FILE_NAME="obs-studio-${VERSION_STRING}-macOS-Apple.dmg" + elif [ "${ARCH}" = "universal" ]; then + FILE_NAME="obs-studio-${VERSION_STRING}-macOS.dmg" + else + FILE_NAME="obs-studio-${VERSION_STRING}-macOS-Intel.dmg" + fi + + if [ -z "${SKIP_DEP_CHECKS}" ]; then + install_dependencies + fi + + build_obs + + if [ "${BUNDLE}" ]; then + bundle_obs + fi + + if [ "${PACKAGE}" ]; then + package_obs + fi + + if [ "${NOTARIZE}" ]; then + notarize_obs + fi + + cleanup +} + +obs-build-main $* diff --git a/CI/build-windows.ps1 b/CI/build-windows.ps1 new file mode 100644 index 000000000..b4e882871 --- /dev/null +++ b/CI/build-windows.ps1 @@ -0,0 +1,137 @@ +Param( + [Switch]$Help, + [Switch]$Quiet, + [Switch]$Verbose, + [Switch]$Package, + [Switch]$SkipDependencyChecks, + [Switch]$BuildInstaller, + [Switch]$CombinedArchs, + [String]$BuildDirectory = "build", + [ValidateSet("32-bit", "64-bit")] + [String]$BuildArch = (Get-CimInstance CIM_OperatingSystem).OSArchitecture, + [ValidateSet("Release", "RelWithDebInfo", "MinSizeRel", "Debug")] + [String]$BuildConfiguration = "RelWithDebInfo" +) + +############################################################################## +# Windows OBS build script +############################################################################## +# +# This script contains all steps necessary to: +# +# * Build OBS with all required dependencies +# * Create 64-bit and 32-bit variants +# +# Parameters: +# -Help : Print usage help +# -Quiet : Suppress most build process output +# -Verbose : Enable more verbose build process output +# -SkipDependencyChecks : Skip dependency checks +# -BuildDirectory : Directory to use for builds +# Default: build64 on 64-bit systems +# build32 on 32-bit systems +# -BuildArch : Build architecture to use ("32-bit" or "64-bit") +# -BuildConfiguration : Build configuration to use +# Default: RelWithDebInfo +# -CombinedArchs : Create combined packages and installer +# (64-bit and 32-bit) - Default: off +# -Package : Prepare folder structure for installer creation +# +# Environment Variables (optional): +# WindowsDepsVersion : Pre-compiled Windows dependencies version +# WindowsQtVersion : Pre-compiled Qt version +# +############################################################################## + +$ErrorActionPreference = "Stop" + +$_RunObsBuildScript = $true +$ProductName = "OBS-Studio" + +$CheckoutDir = Resolve-Path -Path "$PSScriptRoot\.." +$DepsBuildDir = "${CheckoutDir}/../obs-build-dependencies" +$ObsBuildDir = "${CheckoutDir}/../obs-studio" + +. ${CheckoutDir}/CI/include/build_support_windows.ps1 + +# Handle installation of build system components and build dependencies +. ${CheckoutDir}/CI/windows/01_install_dependencies.ps1 + +# Handle OBS build configuration +. ${CheckoutDir}/CI/windows/02_build_obs.ps1 + +# Handle packaging +. ${CheckoutDir}/CI/windows/03_package_obs.ps1 + +function Build-OBS-Main { + Ensure-Directory ${CheckoutDir} + Write-Step "Fetching version tags..." + $null = git fetch origin --tags + $GitBranch = git rev-parse --abbrev-ref HEAD + $GitHash = git rev-parse --short HEAD + $ErrorActionPreference = "SilentlyContinue" + $GitTag = git describe --tags --abbrev=0 + $ErrorActionPreference = "Stop" + + if(Test-Path variable:BUILD_FOR_DISTRIBUTION) { + $VersionString = "${GitTag}" + } else { + $VersionString = "${GitTag}-${GitHash}" + } + + $FileName = "${ProductName}-${VersionString}" + + if($CombinedArchs.isPresent) { + if (!(Test-Path env:obsInstallerTempDir)) { + $Env:obsInstallerTempDir = "${CheckoutDir}/install_temp" + } + + if(!($SkipDependencyChecks.isPresent)) { + Install-Dependencies -BuildArch 64-bit + } + + Build-OBS -BuildArch 64-bit + + if(!($SkipDependencyChecks.isPresent)) { + Install-Dependencies -BuildArch 32-bit + } + + Build-OBS -BuildArch 32-bit + } else { + if(!($SkipDependencyChecks.isPresent)) { + Install-Dependencies + } + + Build-OBS + } + + if($Package.isPresent) { + Package-OBS -CombinedArchs:$CombinedArchs + } +} + +## MAIN SCRIPT FUNCTIONS ## +function Print-Usage { + Write-Host "build-windows.ps1 - Build script for ${ProductName}" + $Lines = @( + "Usage: ${_ScriptName}", + "-Help : Print this help", + "-Quiet : Suppress most build process output" + "-Verbose : Enable more verbose build process output" + "-SkipDependencyChecks : Skip dependency checks - Default: off", + "-BuildDirectory : Directory to use for builds - Default: build64 on 64-bit systems, build32 on 32-bit systems", + "-BuildArch : Build architecture to use ('32-bit' or '64-bit') - Default: local architecture", + "-BuildConfiguration : Build configuration to use - Default: RelWithDebInfo", + "-CombinedArchs : Create combined packages and installer (64-bit and 32-bit) - Default: off" + "-Package : Prepare folder structure for installer creation" + ) + $Lines | Write-Host +} + +$_ScriptName = "$($MyInvocation.MyCommand.Name)" +if($Help.isPresent) { + Print-Usage + exit 0 +} + +Build-OBS-Main diff --git a/CI/check-changes.sh b/CI/check-changes.sh new file mode 100755 index 000000000..7642c190a --- /dev/null +++ b/CI/check-changes.sh @@ -0,0 +1,11 @@ +#!/bin/bash +dirty=$(git ls-files --modified) + +set +x +if [[ $dirty ]]; then + echo "=================================" + echo "Files were not formatted properly" + echo "$dirty" + echo "=================================" + exit 1 +fi \ No newline at end of file diff --git a/CI/check-cmake.sh b/CI/check-cmake.sh new file mode 100755 index 000000000..8879ea91e --- /dev/null +++ b/CI/check-cmake.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -o errexit +set -o pipefail + +if [ ${#} -eq 1 -a "${1}" = "VERBOSE" ]; then + VERBOSITY="-l debug" +else + VERBOSITY="" +fi + +if [ "${CI}" ]; then + MODE="--check" +else + MODE="-i" +fi + +# Runs the formatter in parallel on the code base. +# Return codes: +# - 1 there are files to be formatted +# - 0 everything looks fine + +# Get CPU count +OS=$(uname) +NPROC=1 +if [[ ${OS} = "Linux" ]] ; then + NPROC=$(nproc) +elif [[ ${OS} = "Darwin" ]] ; then + NPROC=$(sysctl -n hw.physicalcpu) +fi + +# Discover clang-format +if ! type cmake-format 2> /dev/null ; then + echo "Required cmake-format not found" + exit 1 +fi + +find . -type d \( \ + -path ./\*build -o \ + -path ./deps/jansson -o \ + -path ./plugins/decklink/\*/decklink-sdk -o \ + -path ./plugins/enc-amf -o \ + -path ./plugins/mac-syphon/syphon-framework -o \ + -path ./plugins/obs-outputs/ftl-sdk -o \ + -path ./plugins/obs-vst -o \ + -path ./plugins/obs-browser -o \ + -path ./plugins/win-dshow/libdshowcapture \ +\) -prune -false -type f -o \ + -name 'CMakeLists.txt' -or \ + -name '*.cmake' \ + | xargs -L10 -P ${NPROC} cmake-format ${MODE} ${VERBOSITY} diff --git a/CI/check-format.sh b/CI/check-format.sh index 7642c190a..50d542558 100755 --- a/CI/check-format.sh +++ b/CI/check-format.sh @@ -1,11 +1,60 @@ -#!/bin/bash -dirty=$(git ls-files --modified) +#!/usr/bin/env bash +# Original source https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/format.sh -set +x -if [[ $dirty ]]; then - echo "=================================" - echo "Files were not formatted properly" - echo "$dirty" - echo "=================================" +set -o errexit +set -o pipefail +set -o nounset + +if [ ${#} -eq 1 ]; then + VERBOSITY="--verbose" +else + VERBOSITY="" +fi + +# Runs the Clang Formatter in parallel on the code base. +# Return codes: +# - 1 there are files to be formatted +# - 0 everything looks fine + +# Get CPU count +OS=$(uname) +NPROC=1 +if [[ ${OS} = "Linux" ]] ; then + NPROC=$(nproc) +elif [[ ${OS} = "Darwin" ]] ; then + NPROC=$(sysctl -n hw.physicalcpu) +fi + +# Discover clang-format +if type clang-format-12 2> /dev/null ; then + CLANG_FORMAT=clang-format-12 +elif type clang-format 2> /dev/null ; then + # Clang format found, but need to check version + CLANG_FORMAT=clang-format + V=$(clang-format --version) + if [[ $V != *"version 12.0"* ]]; then + echo "clang-format is not 12.0 (returned ${V})" + exit 1 + fi +else + echo "No appropriate clang-format found (expected clang-format-12.0.0, or clang-format)" exit 1 -fi \ No newline at end of file +fi + +find . -type d \( \ + -path ./\*build -o \ + -path ./cmake -o \ + -path ./deps -o \ + -path ./plugins/decklink/\*/decklink-sdk -o \ + -path ./plugins/enc-amf -o \ + -path ./plugins/mac-syphon/syphon-framework -o \ + -path ./plugins/obs-outputs/ftl-sdk -o \ + -path ./plugins/obs-vst \ +\) -prune -false -type f -o \ + -name '*.h' -or \ + -name '*.hpp' -or \ + -name '*.m' -or \ + -name '*.m,' -or \ + -name '*.c' -or \ + -name '*.cpp' \ + | xargs -L100 -P ${NPROC} ${CLANG_FORMAT} ${VERBOSITY} -i -style=file -fallback-style=none diff --git a/CI/flatpak/com.obsproject.Studio.json b/CI/flatpak/com.obsproject.Studio.json index 3cb6dded8..ee7d63224 100644 --- a/CI/flatpak/com.obsproject.Studio.json +++ b/CI/flatpak/com.obsproject.Studio.json @@ -416,13 +416,14 @@ "config-opts": [ "-DCMAKE_BUILD_TYPE=Release", "-DENABLE_WAYLAND=ON", - "-DBUILD_BROWSER=ON", + "-DENABLE_BROWSER=ON", "-DCEF_ROOT_DIR=/app/cef", - "-DUNIX_STRUCTURE=ON", "-DUSE_XDG=ON", - "-DDISABLE_ALSA=ON", + "-DENABLE_ALSA=OFF", "-DENABLE_PULSEAUDIO=ON", - "-DWITH_RTMPS=ON" + "-DENABLE_RTMPS=ON", + "-DENABLE_VLC=OFF", + "-DENABLE_AJA=OFF" ], "secret-opts": [ "-DRESTREAM_CLIENTID=$RESTREAM_CLIENTID", diff --git a/CI/freebsd/01_install_dependencies.sh b/CI/freebsd/01_install_dependencies.sh new file mode 100644 index 000000000..203ebbea5 --- /dev/null +++ b/CI/freebsd/01_install_dependencies.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +############################################################################## +# FreeBSD dependency management function +############################################################################## +# +# This script file can be included in build scripts or run directly +# +############################################################################## + +# Halt on errors +set -eE + +install_build-deps() { + shift + status "Install OBS build dependencies" + trap "caught_error 'install_build-deps'" ERR + + sudo pkg install -U -y $@ +} + +install_obs-deps() { + shift + status "Install OBS dependencies" + trap "caught_error 'install_obs-deps'" ERR + + sudo pkg install -U -y $@ +} + +install_qt-deps() { + shift + status "Install Qt dependencies" + trap "caught_error 'install_qt-deps'" ERR + + sudo pkg install -U -y $@ +} + +install_plugin-deps() { + shift + status "Install plugin dependencies" + trap "caught_error 'install_plugin-deps'" ERR + + sudo pkg install -U -y $@ +} + +install_dependencies() { + status "Set up apt" + trap "caught_error 'install_dependencies'" ERR + + BUILD_DEPS=( + "build-deps cmake ninja pkgconf curl ccache" + "obs-deps ffmpeg libx264 mbedtls mesa-libs jansson lua52 luajit python37 libX11 xorgproto libxcb \ + libXcomposite libXext libXfixes libXinerama libXrandr swig dbus jansson libICE libSM libsysinfo" + "qt-deps qt5-buildtools qt5-qmake qt5-imageformats qt5-core qt5-gui qt5-svg qt5-widgets qt5-xml" + "plugin-deps v4l_compat fdk-aac fontconfig freetype2 speexdsp libudev-devd libv4l vlc audio/jack pulseaudio sndio" + ) + + for DEPENDENCY in "${BUILD_DEPS[@]}"; do + set -- ${DEPENDENCY} + trap "caught_error ${DEPENDENCY}" ERR + FUNC_NAME="install_${1}" + ${FUNC_NAME} ${@} + done +} + +install-dependencies-standalone() { + CHECKOUT_DIR="$(git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_freebsd.sh" + + status "Setup of OBS build dependencies" + install_dependencies +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" +} + +install-dependencies-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + install-dependencies-standalone + fi +} + +install-dependencies-main $* diff --git a/CI/freebsd/02_build_obs.sh b/CI/freebsd/02_build_obs.sh new file mode 100644 index 000000000..d2d5e4723 --- /dev/null +++ b/CI/freebsd/02_build_obs.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash + +############################################################################## +# FreeBSD build function +############################################################################## +# +# This script file can be included in build scripts for FreeBSD or run +# directly +# +############################################################################## + +# Halt on errors +set -eE + +build_obs() { + status "Build OBS" + if [ -z "${CI}" ]; then + _backup_artifacts + fi + + step "Configure OBS..." + _configure_obs + + ensure_dir "${CHECKOUT_DIR}/" + step "Build OBS targets..." + cmake --build ${BUILD_DIR} +} + +# Function to configure OBS build +_configure_obs() { + ensure_dir "${CHECKOUT_DIR}" + status "Configuration of OBS build system..." + check_ccache + + if [ "${TWITCH_CLIENTID}" -a "${TWICH_HASH}" ]; then + TWITCH_OPTIONS="-DTWITCH_CLIENTID=\"${TWITCH_CLIENTID}\" -DTWITCH_HASH=\"${TWITCH_HASH}\"" + fi + + if [ "${RESTREAM_CLIENTID}" -a "${RESTREAM_HASH}" ]; then + RESTREAM_OPTIONS="-DRESTREAM_CLIENTID=\"${RESTREAM_CLIENTID}\" -DRESTREAM_HASH=\"${RESTREAM_HASH}\"" + fi + + if [ "${YOUTUBE_CLIENTID}" -a "${YOUTUBE_CLIENTID_HASH}" -a "${YOUTUBE_SECRET}" -a "{YOUTUBE_SECRET_HASH}" ]; then + YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID=\"${YOUTUBE_CLIENTID}\" -DYOUTUBE_CLIENTID_HASH=\"${YOUTUBE_CLIENTID_HASH}\" -DYOUTUBE_SECRET=\"${YOUTUBE_SECRET}\" -DYOUTUBE_SECRET_HASH=\"${YOUTUBE_SECRET_HASH}\"" + fi + + if [ "${PORTABLE}" ]; then + PORTABLE_BUILD="ON" + fi + + cmake -S . -B ${BUILD_DIR} -G Ninja \ + -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \ + -DLINUX_PORTABLE=${PORTABLE_BUILD:-OFF} \ + -DENABLE_PIPEWIRE=OFF \ + ${CCACHE_OPTIONS} \ + ${TWITCH_OPTIONS} \ + ${YOUTUBE_OPTIONS} \ + ${RESTREAM_OPTIONS} \ + ${CI:+-DENABLE_UNIT_TESTS=ON -DBUILD_FOR_DISTRIBUTION=${BUILD_FOR_DISTRIBUTION} -DOBS_BUILD_NUMBER=${GITHUB_RUN_ID}} \ + ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR} +} + +# Function to backup previous build artifacts +_backup_artifacts() { + ensure_dir "${CHECKOUT_DIR}" + if [ -d "${BUILD_DIR}" ]; then + status "Backup of old OBS build artifacts" + + CUR_DATE=$(/bin/date +"%Y-%m-%d@%H%M%S") + NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}" + PACKAGE_NAME=$(/usr/bin/find ${BUILD_DIR} -maxdepth 1 -name "*.tar.gz" | sort -rn | head -1) + + if [ "${PACKAGE_NAME}" ]; then + step "Back up $(basename "${PACKAGE_NAME}")..." + ensure_dir "${NIGHTLY_DIR}" + ensure_dir "${CHECKOUT_DIR}" + /usr/bin/find "${BUILD_DIR}" -maxdepth 1 \( -name "obs-studio-*.sh" -o -name "obs-studio-*.tar.gz" -o -name "obs-studio-*.tar.Z" \) -print0 | /usr/bin/xargs -0 -I {} /bin/mv {} ${NIGHTLY_DIR}/ + info "You can find $(basename "${PACKAGE_NAME}") in ${NIGHTLY_DIR}" + fi + fi +} + +build-obs-standalone() { + CHECKOUT_DIR="$(git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_freebsd.sh" + + build_obs +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-p, --portable : Create portable build (default: off)\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +build-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -p | --portable ) export PORTABLE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + build-obs-standalone + fi +} + +build-obs-main $* diff --git a/CI/freebsd/03_package_obs.sh b/CI/freebsd/03_package_obs.sh new file mode 100644 index 000000000..351a0623a --- /dev/null +++ b/CI/freebsd/03_package_obs.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +############################################################################## +# FreeBSD OBS package function +############################################################################## +# +# This script file can be included in build scripts for FreeBSD or run directly +# +############################################################################## + +# Halt on errors +set -eE + +package_obs() { + status "Create FreeBSD debian package" + trap "caught_error 'package app'" ERR + + ensure_dir "${CHECKOUT_DIR}" + + step "Package OBS..." + cmake --build ${BUILD_DIR} -t package + + ZIP_NAME="$(/usr/bin/find "${BUILD_DIR}" -maxdepth 1 -type f -name "obs-studio-*.sh" | sort -rn | head -1)" + + if [ "${ZIP_NAME}" ]; then + mv "${ZIP_NAME%.*}.sh" "${BUILD_DIR}/${FILE_NAME}.sh" + mv "${ZIP_NAME%.*}.tar.gz" "${BUILD_DIR}/${FILE_NAME}.tar.gz" + mv "${ZIP_NAME%.*}.tar.Z" "${BUILD_DIR}/${FILE_NAME}.tar.Z" + else + error "ERROR No suitable OBS debian package generated" + fi +} + +package-obs-standalone() { + PRODUCT_NAME="OBS-Studio" + + CHECKOUT_DIR="$(git rev-parse --show-toplevel)" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source ${CHECKOUT_DIR}/CI/include/build_support.sh + source ${CHECKOUT_DIR}/CI/include/build_support_freebsd.sh + + step "Fetch OBS tags..." + git fetch origin --tags + + GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(git rev-parse --short HEAD) + GIT_TAG=$(git describe --tags --abbrev=0) + + FILE_NAME="obs-studio-${GIT_TAG}-${GIT_HASH}-FreeBSD" + package_obs +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +package-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + package-obs-standalone + fi +} + +package-obs-main $* diff --git a/CI/full-build-macos.sh b/CI/full-build-macos.sh deleted file mode 100755 index a0c0e6973..000000000 --- a/CI/full-build-macos.sh +++ /dev/null @@ -1,726 +0,0 @@ -#!/bin/bash - -############################################################################## -# macOS full build script -############################################################################## -# -# This script contains all steps necessary to: -# -# * Build OBS with all default plugins and dependencies -# * Create a macOS application bundle -# * Code-sign the macOS application-bundle -# * Package a macOS installation image -# * Notarize macOS application-bundle and/or installation image -# -# Parameters: -# -b: Create macOS bundle -# -d: Skip dependency checks -# -p: Create macOS distribution image -# -n: Notarize macOS app and disk image (implies bundling) -# -s: Skip the build process (useful for bundling/packaging only) -# -h: Print usage help -# -# Environment Variables (optional): -# MACOS_DEPS_VERSION : Pre-compiled macOS dependencies version -# MACOS_CEF_BUILD_VERSION : Chromium Embedded Framework version -# VLC_VERISON : VLC version -# SPARKLE_VERSION : Sparke Framework version -# BUILD_DIR : Alternative directory to build OBS in -# -############################################################################## - -# Halt on errors -set -eE - -## SET UP ENVIRONMENT ## -PRODUCT_NAME="OBS-Studio" - -CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" -DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" -BUILD_DIR="${BUILD_DIR:-build}" -BUILD_CONFIG=${BUILD_CONFIG:-RelWithDebInfo} -CI_SCRIPTS="${CHECKOUT_DIR}/CI/scripts/macos" -CI_WORKFLOW="${CHECKOUT_DIR}/.github/workflows/main.yml" -CI_MACOS_CEF_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+MACOS_CEF_BUILD_VERSION: '([0-9]+)'/\1/p") -CI_DEPS_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+MACOS_DEPS_VERSION: '([0-9\-]+)'/\1/p") -CI_VLC_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+VLC_VERSION: '([0-9\.]+)'/\1/p") -CI_SPARKLE_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+SPARKLE_VERSION: '([0-9\.]+)'/\1/p") -CI_QT_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+QT_VERSION: '([0-9\.]+)'/\1/p" | /usr/bin/head -1) -CI_MIN_MACOS_VERSION=$(/bin/cat "${CI_WORKFLOW}" | /usr/bin/sed -En "s/[ ]+MIN_MACOS_VERSION: '([0-9\.]+)'/\1/p") -NPROC="${NPROC:-$(sysctl -n hw.ncpu)}" -CURRENT_ARCH=$(uname -m) - -BUILD_DEPS=( - "obs-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}}" - "qt-deps ${QT_VERSION:-${CI_QT_VERSION}} ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}}" - "cef ${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" - "vlc ${VLC_VERSION:-${CI_VLC_VERSION}}" - "sparkle ${SPARKLE_VERSION:-${CI_SPARKLE_VERSION}}" -) - -if [ -n "${TERM-}" ]; then - COLOR_RED=$(/usr/bin/tput setaf 1) - COLOR_GREEN=$(/usr/bin/tput setaf 2) - COLOR_BLUE=$(/usr/bin/tput setaf 4) - COLOR_ORANGE=$(/usr/bin/tput setaf 3) - COLOR_RESET=$(/usr/bin/tput sgr0) -else - COLOR_RED="" - COLOR_GREEN="" - COLOR_BLUE="" - COLOR_ORANGE="" - COLOR_RESET="" -fi - - -MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)" -MACOS_MAJOR="$(/bin/echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 1)" -MACOS_MINOR="$(/bin/echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 2)" - -## DEFINE UTILITIES ## - -hr() { - /bin/echo "${COLOR_BLUE}[${PRODUCT_NAME}] ${1}${COLOR_RESET}" -} - -step() { - /bin/echo "${COLOR_GREEN} + ${1}${COLOR_RESET}" -} - -info() { - /bin/echo "${COLOR_ORANGE} + ${1}${COLOR_RESET}" -} - -error() { - /bin/echo "${COLOR_RED} + ${1}${COLOR_RESET}" -} - -exists() { - /usr/bin/command -v "$1" >/dev/null 2>&1 -} - -ensure_dir() { - [[ -n "${1}" ]] && /bin/mkdir -p "${1}" && builtin cd "${1}" -} - -cleanup() { - /bin/rm -rf "${CHECKOUT_DIR}/${BUILD_DIR}/settings.json" - unset CODESIGN_IDENT - unset CODESIGN_IDENT_USER - unset CODESIGN_IDENT_PASS -} - -caught_error() { - error "ERROR during build step: ${1}" - cleanup - exit 1 -} - -## CHECK AND INSTALL DEPENDENCIES ## -check_macos_version() { - MIN_VERSION=${MIN_MACOS_VERSION:-${CI_MIN_MACOS_VERSION}} - MIN_MAJOR=$(/bin/echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 1) - MIN_MINOR=$(/bin/echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 2) - - if [ "${MACOS_MAJOR}" -lt "11" ] && [ "${MACOS_MINOR}" -lt "${MIN_MINOR}" ]; then - error "WARNING: Minimum required macOS version is ${MIN_VERSION}, but running on ${MACOS_VERSION}" - fi -} - -install_homebrew_deps() { - if ! exists brew; then - error "Homebrew not found - please install homebrew (https://brew.sh)" - exit 1 - fi - - if [ -d /usr/local/opt/openssl@1.0.2t ]; then - brew uninstall openssl@1.0.2t - brew untap local/openssl - fi - - if [ -d /usr/local/opt/python@2.7.17 ]; then - brew uninstall python@2.7.17 - brew untap local/python2 - fi - - brew bundle --file "${CI_SCRIPTS}/Brewfile" - - check_curl -} - -check_curl() { - if [ "${MACOS_MAJOR}" -lt "11" ] && [ "${MACOS_MINOR}" -lt "15" ]; then - if [ ! -d /usr/local/opt/curl ]; then - step "Installing Homebrew curl.." - brew install curl - fi - export CURLCMD="/usr/local/opt/curl/bin/curl" - else - export CURLCMD="curl" - fi -} - -check_ccache() { - export PATH="/usr/local/opt/ccache/libexec:${PATH}" - CCACHE_STATUS=$(ccache -s >/dev/null 2>&1 && /bin/echo "CCache available." || /bin/echo "CCache is not available.") - info "${CCACHE_STATUS}" -} - -install_obs-deps() { - hr "Setting up pre-built macOS OBS dependencies v${1}" - ensure_dir "${DEPS_BUILD_DIR}" - step "Download..." - ${CURLCMD} --progress-bar -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}-${CURRENT_ARCH}.tar.xz - step "Unpack..." - mkdir -p /tmp/obsdeps - /usr/bin/tar -xf "./macos-deps-${1}-${CURRENT_ARCH}.tar.xz" -C /tmp/obsdeps - /usr/bin/xattr -r -d com.apple.quarantine /tmp/obsdeps -} - -install_qt-deps() { - hr "Setting up pre-built dependency QT v${1}" - ensure_dir "${DEPS_BUILD_DIR}" - step "Download..." - ${CURLCMD} --progress-bar -L -C - -O https://github.com/obsproject/obs-deps/releases/download/${2}/macos-deps-qt-${2}-${CURRENT_ARCH}.tar.xz - step "Unpack..." - mkdir -p /tmp/obsdeps - /usr/bin/tar -xf ./macos-deps-qt-${2}-${CURRENT_ARCH}.tar.xz -C /tmp/obsdeps - /usr/bin/xattr -r -d com.apple.quarantine /tmp/obsdeps -} - -install_vlc() { - hr "Setting up dependency VLC v${1}" - ensure_dir "${DEPS_BUILD_DIR}" - step "Download..." - ${CURLCMD} --progress-bar -L -C - -O https://downloads.videolan.org/vlc/${1}/vlc-${1}.tar.xz - step "Unpack ..." - /usr/bin/tar -xf vlc-${1}.tar.xz -} - -install_sparkle() { - hr "Setting up dependency Sparkle v${1} (might prompt for password)" - ensure_dir "${DEPS_BUILD_DIR}/sparkle" - step "Download..." - ${CURLCMD} --progress-bar -L -C - -o sparkle.tar.bz2 https://github.com/sparkle-project/Sparkle/releases/download/${1}/Sparkle-${1}.tar.bz2 - step "Unpack..." - /usr/bin/tar -xf ./sparkle.tar.bz2 - step "Copy to destination..." - if [ -d /Library/Frameworks/Sparkle.framework/ ]; then - info "Warning - Sparkle framework already found in /Library/Frameworks" - else - sudo /bin/cp -R ./Sparkle.framework/ /Library/Frameworks/Sparkle.framework/ - fi -} - -install_cef() { - hr "Building dependency CEF v${1}" - ensure_dir "${DEPS_BUILD_DIR}" - step "Download..." - ${CURLCMD} --progress-bar -L -C - -O https://cdn-fastly.obsproject.com/downloads/cef_binary_${1}_macos_x86_64.tar.xz - step "Unpack..." - /usr/bin/tar -xf ./cef_binary_${1}_macos_x86_64.tar.xz - cd ./cef_binary_${1}_macos_x86_64 - step "Fix tests..." - /usr/bin/sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt - /usr/bin/sed -i '.orig' 's/"'$(test "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 && echo "10.9" || echo "10.10")'"/"'${MIN_MACOS_VERSION:-${CI_MIN_MACOS_VERSION}}'"/' ./cmake/cef_variables.cmake - ensure_dir ./build - step "Run CMAKE..." - cmake \ - -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++ -Wno-deprecated-declarations"\ - -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++"\ - -DCMAKE_OSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION:-${CI_MIN_MACOS_VERSION}} \ - .. - step "Build..." - /usr/bin/make -j${NPROC} - if [ ! -d libcef_dll ]; then /bin/mkdir libcef_dll; fi -} - -## CHECK AND INSTALL PACKAGING DEPENDENCIES ## -install_dmgbuild() { - if ! exists dmgbuild; then - if exists "pip3"; then - PIPCMD="pip3" - elif exists "pip"; then - PIPCMD="pip" - else - error "Pip not found - please install pip via 'python -m ensurepip'" - exit 1 - fi - - ${PIPCMD} install dmgbuild - fi -} - -## OBS BUILD FROM SOURCE ## -configure_obs_build() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - CUR_DATE=$(/bin/date +"%Y-%m-%d@%H%M%S") - NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}" - PACKAGE_NAME=$(/usr/bin/find . -name "*.dmg") - - if [ -d ./OBS.app ]; then - ensure_dir "${NIGHTLY_DIR}" - /bin/mv "../${BUILD_DIR}/OBS.app" . - info "You can find OBS.app in ${NIGHTLY_DIR}" - fi - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - if ([ -n "${PACKAGE_NAME}" ] && [ -f ${PACKAGE_NAME} ]); then - ensure_dir "${NIGHTLY_DIR}" - /bin/mv "../${BUILD_DIR}/$(basename "${PACKAGE_NAME}")" . - info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}" - fi - - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - hr "Run CMAKE for OBS..." - cmake -DENABLE_SPARKLE_UPDATER=ON \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION:-${CI_MIN_MACOS_VERSION}} \ - -DQTDIR="/tmp/obsdeps" \ - -DSWIGDIR="/tmp/obsdeps" \ - -DDepsPath="/tmp/obsdeps" \ - -DVLCPath="${DEPS_BUILD_DIR}/vlc-${VLC_VERSION:-${CI_VLC_VERSION}}" \ - -DBUILD_BROWSER=ON \ - -DBROWSER_LEGACY="$(test "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 && echo "ON" || echo "OFF")" \ - -DWITH_RTMPS=ON \ - -DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}_macos_x86_64" \ - -DCMAKE_BUILD_TYPE="${BUILD_CONFIG}" \ - .. - -} - -run_obs_build() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - hr "Build OBS..." - /usr/bin/make -j${NPROC} -} - -## OBS BUNDLE AS MACOS APPLICATION ## -bundle_dylibs() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - if [ ! -d ./OBS.app ]; then - error "No OBS.app bundle found" - exit 1 - fi - - hr "Bundle dylibs for macOS application" - - step "Run dylibBundler.." - - BUNDLE_PLUGINS=( - ./OBS.app/Contents/PlugIns/coreaudio-encoder.so - ./OBS.app/Contents/PlugIns/decklink-ouput-ui.so - ./OBS.app/Contents/PlugIns/decklink-captions.so - ./OBS.app/Contents/PlugIns/frontend-tools.so - ./OBS.app/Contents/PlugIns/image-source.so - ./OBS.app/Contents/PlugIns/mac-avcapture.so - ./OBS.app/Contents/PlugIns/mac-capture.so - ./OBS.app/Contents/PlugIns/mac-decklink.so - ./OBS.app/Contents/PlugIns/mac-syphon.so - ./OBS.app/Contents/PlugIns/mac-vth264.so - ./OBS.app/Contents/PlugIns/mac-virtualcam.so - ./OBS.app/Contents/PlugIns/obs-browser.so - ./OBS.app/Contents/PlugIns/obs-ffmpeg.so - ./OBS.app/Contents/PlugIns/obs-filters.so - ./OBS.app/Contents/PlugIns/obs-transitions.so - ./OBS.app/Contents/PlugIns/obs-vst.so - ./OBS.app/Contents/PlugIns/rtmp-services.so - ./OBS.app/Contents/MacOS/obs-ffmpeg-mux - ./OBS.app/Contents/MacOS/obslua.so - ./OBS.app/Contents/MacOS/_obspython.so - ./OBS.app/Contents/PlugIns/obs-x264.so - ./OBS.app/Contents/PlugIns/text-freetype2.so - ./OBS.app/Contents/PlugIns/obs-outputs.so - ./OBS.app/Contents/PlugIns/aja.so - ./OBS.app/Contents/PlugIns/aja-output-ui.so - ) - - SEARCH_PATHS=( - /tmp/obsdeps/lib - /tmp/obsdeps/lib/QtSvg.framework - /tmp/obsdeps/lib/QtXml.framework - /tmp/obsdeps/lib/QtNetwork.framework - /tmp/obsdeps/lib/QtCore.framework - /tmp/obsdeps/lib/QtGui.framework - /tmp/obsdeps/lib/QtWidgets.framework - /tmp/obsdeps/lib/QtDBus.framework - /tmp/obsdeps/lib/QtPrintSupport.framework - ) - if ! [ "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 ]; then - "${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/${BUILD_CONFIG}/bin/ \ - $(echo "${SEARCH_PATHS[@]/#/-s }") \ - $(echo "${BUNDLE_PLUGINS[@]/#/-x }") - else - "${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/${BUILD_CONFIG}/bin/ \ - $(echo "${SEARCH_PATHS[@]/#/-s }") \ - $(echo "${BUNDLE_PLUGINS[@]/#/-x }") \ - -x ./OBS.app/Contents/PlugIns/obs-browser-page - fi - - step "Move libobs-opengl to final destination" - if [ -f "./libobs-opengl/libobs-opengl.so" ]; then - /bin/cp ./libobs-opengl/libobs-opengl.so ./OBS.app/Contents/Frameworks - else - /bin/cp ./libobs-opengl/${BUILD_CONFIG}/libobs-opengl.so ./OBS.app/Contents/Frameworks - fi -} - -install_frameworks() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - if [ ! -d ./OBS.app ]; then - error "No OBS.app bundle found" - exit 1 - fi - - hr "Adding Chromium Embedded Framework" - step "Copy Framework..." - /bin/cp -R "${DEPS_BUILD_DIR}/cef_binary_${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}_macos_x86_64/Release/Chromium Embedded Framework.framework" ./OBS.app/Contents/Frameworks/ -} - -prepare_macos_bundle() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - if [ ! -d ./rundir/${BUILD_CONFIG}/bin ]; then - error "No OBS build found" - return - fi - - if [ -d ./OBS.app ]; then /bin/rm -rf ./OBS.app; fi - - hr "Preparing OBS.app bundle" - step "Copy binary and plugins..." - /bin/mkdir -p OBS.app/Contents/MacOS - /bin/mkdir OBS.app/Contents/PlugIns - /bin/mkdir OBS.app/Contents/Resources - /bin/mkdir OBS.app/Contents/Frameworks - - /bin/cp rundir/${BUILD_CONFIG}/bin/obs ./OBS.app/Contents/MacOS - /bin/cp rundir/${BUILD_CONFIG}/bin/obs-ffmpeg-mux ./OBS.app/Contents/MacOS - /bin/cp rundir/${BUILD_CONFIG}/bin/libobsglad.0.dylib ./OBS.app/Contents/MacOS - if ! [ "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 ]; then - /bin/cp -R "rundir/${BUILD_CONFIG}/bin/OBS Helper.app" "./OBS.app/Contents/Frameworks/OBS Helper.app" - /bin/cp -R "rundir/${BUILD_CONFIG}/bin/OBS Helper (GPU).app" "./OBS.app/Contents/Frameworks/OBS Helper (GPU).app" - /bin/cp -R "rundir/${BUILD_CONFIG}/bin/OBS Helper (Plugin).app" "./OBS.app/Contents/Frameworks/OBS Helper (Plugin).app" - /bin/cp -R "rundir/${BUILD_CONFIG}/bin/OBS Helper (Renderer).app" "./OBS.app/Contents/Frameworks/OBS Helper (Renderer).app" - fi - /bin/cp -R rundir/${BUILD_CONFIG}/data ./OBS.app/Contents/Resources - /bin/cp "${CI_SCRIPTS}/app/AppIcon.icns" ./OBS.app/Contents/Resources - /bin/cp -R rundir/${BUILD_CONFIG}/obs-plugins/ ./OBS.app/Contents/PlugIns - /bin/cp "${CI_SCRIPTS}/app/Info.plist" ./OBS.app/Contents - # Scripting plugins are required to be placed in same directory as binary - if [ -d ./OBS.app/Contents/Resources/data/obs-scripting ]; then - /bin/mv ./OBS.app/Contents/Resources/data/obs-scripting/obslua.so ./OBS.app/Contents/MacOS/ - /bin/mv ./OBS.app/Contents/Resources/data/obs-scripting/_obspython.so ./OBS.app/Contents/MacOS/ - /bin/mv ./OBS.app/Contents/Resources/data/obs-scripting/obspython.py ./OBS.app/Contents/MacOS/ - /bin/rm -rf ./OBS.app/Contents/Resources/data/obs-scripting/ - fi - # dylibbundler will only copy actually linked files into bundle, but not symlinks - /bin/cp -cpR /tmp/obsdeps/lib/*.dylib ./OBS.app/Contents/Frameworks - - bundle_dylibs - install_frameworks - - /bin/cp "${CI_SCRIPTS}/app/OBSPublicDSAKey.pem" ./OBS.app/Contents/Resources - - step "Set bundle meta information..." - /usr/bin/plutil -insert CFBundleVersion -string ${GIT_TAG}-${GIT_HASH} ./OBS.app/Contents/Info.plist - /usr/bin/plutil -insert CFBundleShortVersionString -string ${GIT_TAG}-${GIT_HASH} ./OBS.app/Contents/Info.plist - /usr/bin/plutil -insert OBSFeedsURL -string https://obsproject.com/osx_update/feeds.xml ./OBS.app/Contents/Info.plist - /usr/bin/plutil -insert SUFeedURL -string https://obsproject.com/osx_update/stable/updates.xml ./OBS.app/Contents/Info.plist - /usr/bin/plutil -insert SUPublicDSAKeyFile -string OBSPublicDSAKey.pem ./OBS.app/Contents/Info.plist -} - -## CREATE MACOS DISTRIBUTION AND INSTALLER IMAGE ## -prepare_macos_image() { - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - if [ ! -d ./OBS.app ]; then - error "No OBS.app bundle found" - return - fi - - hr "Preparing macOS installation image" - - if [ -f "${FILE_NAME}" ]; then - /bin/rm "${FILE_NAME}" - fi - - step "Run dmgbuild..." - /bin/cp "${CI_SCRIPTS}/package/settings.json.template" ./settings.json - /usr/bin/sed -i '' 's#\$\$VERSION\$\$#'"${GIT_TAG}"'#g' ./settings.json - /usr/bin/sed -i '' 's#\$\$CI_PATH\$\$#'"${CI_SCRIPTS}"'#g' ./settings.json - /usr/bin/sed -i '' 's#\$\$BUNDLE_PATH\$\$#'"${CHECKOUT_DIR}"'/build#g' ./settings.json - /bin/echo -n "${COLOR_ORANGE}" - dmgbuild "OBS-Studio ${GIT_TAG}" "${FILE_NAME}" -s ./settings.json - /bin/echo -n "${COLOR_RESET}" - - if [ -n "${CODESIGN_OBS}" ]; then - codesign_image - fi -} - -## SET UP CODE SIGNING AND NOTARIZATION CREDENTIALS ## -############################################################################## -# Apple Developer Identity needed: -# -# + Signing the code requires a developer identity in the system's keychain -# + codesign will look up and find the identity automatically -# -############################################################################## -read_codesign_ident() { - if [ ! -n "${CODESIGN_IDENT}" ]; then - step "Code-signing Setup" - /usr/bin/read -p "${COLOR_ORANGE} + Apple developer identity: ${COLOR_RESET}" CODESIGN_IDENT - fi -} - -############################################################################## -# Apple Developer credentials necessary: -# -# + Signing for distribution and notarization require an active Apple -# Developer membership -# + An Apple Development identity is needed for code signing -# (i.e. 'Apple Development: YOUR APPLE ID (PROVIDER)') -# + Your Apple developer ID is needed for notarization -# + An app-specific password is necessary for notarization from CLI -# + This password will be stored in your macOS keychain under the identifier -# 'OBS-Codesign-Password'with access Apple's 'altool' only. -############################################################################## - -read_codesign_pass() { - if [ ! -n "${CODESIGN_IDENT_PASS}" ]; then - step "Notarization Setup" - /usr/bin/read -p "${COLOR_ORANGE} + Apple account id: ${COLOR_RESET}" CODESIGN_IDENT_USER - CODESIGN_IDENT_PASS=$(stty -echo; /usr/bin/read -p "${COLOR_ORANGE} + Apple developer password: ${COLOR_RESET}" pwd; stty echo; /bin/echo $pwd) - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/xcrun altool --store-password-in-keychain-item "OBS-Codesign-Password" -u "${CODESIGN_IDENT_USER}" -p "${CODESIGN_IDENT_PASS}" - /bin/echo -n "${COLOR_RESET}" - CODESIGN_IDENT_SHORT=$(/bin/echo "${CODESIGN_IDENT}" | /usr/bin/sed -En "s/.+\((.+)\)/\1/p") - fi -} - -codesign_bundle() { - if [ ! -n "${CODESIGN_OBS}" ]; then step "Skipping application bundle code signing"; return; fi - - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - trap "caught_error 'code-signing app'" ERR - - if [ ! -d ./OBS.app ]; then - error "No OBS.app bundle found" - return - fi - - hr "Code-signing application bundle" - - /usr/bin/xattr -crs ./OBS.app - - read_codesign_ident - step "Code-sign Sparkle framework..." - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/codesign --force --options runtime --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop" - /usr/bin/codesign --force --options runtime --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate" - /usr/bin/codesign --force --options runtime --sign "${CODESIGN_IDENT}" --deep ./OBS.app/Contents/Frameworks/Sparkle.framework - /bin/echo -n "${COLOR_RESET}" - - step "Code-sign CEF framework..." - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libEGL.dylib" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libswiftshader_libEGL.dylib" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libGLESv2.dylib" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libswiftshader_libGLESv2.dylib" - if ! [ "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 ]; then - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Frameworks/Chromium Embedded Framework.framework/Libraries/libvk_swiftshader.dylib" - fi - - /bin/echo -n "${COLOR_RESET}" - - if ! [ "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 ]; then - step "Code-sign CEF helper apps..." - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/helpers/helper-entitlements.plist" --sign "${CODESIGN_IDENT}" --deep "./OBS.app/Contents/Frameworks/OBS Helper.app" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/helpers/helper-gpu-entitlements.plist" --sign "${CODESIGN_IDENT}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (GPU).app" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/helpers/helper-plugin-entitlements.plist" --sign "${CODESIGN_IDENT}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (Plugin).app" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/helpers/helper-renderer-entitlements.plist" --sign "${CODESIGN_IDENT}" --deep "./OBS.app/Contents/Frameworks/OBS Helper (Renderer).app" - /bin/echo -n "${COLOR_RESET}" - fi - - step "Code-sign DAL Plugin..." - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/codesign --force --options runtime --deep --sign "${CODESIGN_IDENT}" "./OBS.app/Contents/Resources/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin" - /bin/echo -n "${COLOR_RESET}" - - step "Code-sign OBS code..." - /bin/echo -n "${COLOR_ORANGE}" - /usr/bin/codesign --force --options runtime --entitlements "${CI_SCRIPTS}/app/entitlements.plist" --sign "${CODESIGN_IDENT}" --deep ./OBS.app - /bin/echo -n "${COLOR_RESET}" - - step "Check code-sign result..." - /usr/bin/codesign -dvv ./OBS.app -} - -codesign_image() { - if [ ! -n "${CODESIGN_OBS}" ]; then step "Skipping installer image code signing"; return; fi - - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - trap "caught_error 'code-signing image'" ERR - - if [ ! -f "${FILE_NAME}" ]; then - error "No OBS disk image found" - return - fi - - hr "Code-signing installation image" - - read_codesign_ident - - step "Code-sign OBS installer image..." - /bin/echo -n "${COLOR_ORANGE}"; - /usr/bin/codesign --force --sign "${CODESIGN_IDENT}" "${FILE_NAME}" - /bin/echo -n "${COLOR_RESET}" - step "Check code-sign result..." - /usr/bin/codesign -dvv "${FILE_NAME}" -} - -## BUILD FROM SOURCE META FUNCTION ## -full-build-macos() { - if [ -n "${SKIP_BUILD}" ]; then step "Skipping full build"; return; fi - - if [ ! -n "${SKIP_DEPS}" ]; then - - hr "Installing Homebrew dependencies" - install_homebrew_deps - - for DEPENDENCY in "${BUILD_DEPS[@]}"; do - set -- ${DEPENDENCY} - trap "caught_error ${DEPENDENCY}" ERR - FUNC_NAME="install_${1}" - ${FUNC_NAME} ${2} ${3} - done - - check_ccache - trap "caught_error 'cmake'" ERR - fi - - configure_obs_build - run_obs_build -} - -## BUNDLE MACOS APPLICATION META FUNCTION ## -bundle_macos() { - if [ ! -n "${BUNDLE_OBS}" ]; then step "Skipping application bundle creation"; return; fi - - hr "Creating macOS app bundle" - trap "caught_error 'bundle app'" ERR - ensure_dir ${CHECKOUT_DIR} - prepare_macos_bundle -} - -## PACKAGE MACOS DISTRIBUTION IMAGE META FUNCTION ## -package_macos() { - if [ ! -n "${PACKAGE_OBS}" ]; then step "Skipping installer image creation"; return; fi - - hr "Creating macOS .dmg image" - trap "caught_error 'package app'" ERR - - install_dmgbuild - prepare_macos_image -} - -## NOTARIZATION META FUNCTION ## -notarize_macos() { - if [ ! -n "${NOTARIZE_OBS}" ]; then step "Skipping macOS notarization"; return; fi; - - hr "Notarizing OBS for macOS" - trap "caught_error 'notarizing app'" ERR - - ensure_dir "${CHECKOUT_DIR}/${BUILD_DIR}" - - if [ -f "${FILE_NAME}" ]; then - NOTARIZE_TARGET="${FILE_NAME}" - xcnotary precheck "./OBS.app" - elif [ -d "OBS.app" ]; then - NOTARIZE_TARGET="./OBS.app" - else - error "No notarization app bundle ('OBS.app') or disk image ('${FILE_NAME}') found" - return - fi - - if [ "$?" -eq 0 ]; then - read_codesign_ident - read_codesign_pass - - step "Run xcnotary with ${NOTARIZE_TARGET}..." - xcnotary notarize "${NOTARIZE_TARGET}" --developer-account "${CODESIGN_IDENT_USER}" --developer-password-keychain-item "OBS-Codesign-Password" --provider "${CODESIGN_IDENT_SHORT}" - fi -} - -## MAIN SCRIPT FUNCTIONS ## -print_usage() { - /bin/echo "full-build-macos.sh - Build helper script for OBS-Studio\n" - /bin/echo "Usage: ${0}\n" \ - "-d: Skip dependency checks\n" \ - "-b: Create macOS app bundle\n" \ - "-c: Codesign macOS app bundle\n" \ - "-p: Package macOS app into disk image\n" \ - "-n: Notarize macOS app and disk image (implies -b)\n" \ - "-s: Skip build process (useful for bundling/packaging only)\n" \ - "-h: Print this help" - exit 0 -} - -obs-build-main() { - ensure_dir ${CHECKOUT_DIR} - check_macos_version - step "Fetching OBS tags..." - /usr/bin/git fetch origin --tags - GIT_BRANCH=$(/usr/bin/git rev-parse --abbrev-ref HEAD) - GIT_HASH=$(/usr/bin/git rev-parse --short HEAD) - GIT_TAG=$(/usr/bin/git describe --tags --abbrev=0) - FILE_NAME="obs-studio-${GIT_TAG}-${GIT_HASH}-macOS.dmg" - - ########################################################################## - # IMPORTANT: - # - # Be careful when choosing to notarize and code-sign. The script will try - # to sign any pre-existing bundle but also pre-existing images. - # - # This could lead to a package containing a non-signed bundle, which - # will then fail notarization. - # - # To avoid this, run this script with -b -c first, then -p -c or -p -n - # after to make sure that a code-signed bundle will be packaged. - # - ########################################################################## - - while getopts ":hdsbnpc" OPTION; do - case ${OPTION} in - h) print_usage ;; - d) SKIP_DEPS=1 ;; - s) SKIP_BUILD=1 ;; - b) BUNDLE_OBS=1 ;; - n) CODESIGN_OBS=1; NOTARIZE_OBS=1 ;; - p) PACKAGE_OBS=1 ;; - c) CODESIGN_OBS=1 ;; - \?) ;; - esac - done - - full-build-macos - bundle_macos - codesign_bundle - package_macos - codesign_image - notarize_macos - - cleanup -} - -obs-build-main $* diff --git a/CI/include/Brewfile b/CI/include/Brewfile new file mode 100644 index 000000000..56b1bfcb7 --- /dev/null +++ b/CI/include/Brewfile @@ -0,0 +1,7 @@ +brew "cmake" +brew "ccache" +brew "ninja" +brew "freetype" +brew "cmocka" +brew "swig" +brew "coreutils" diff --git a/CI/include/Wingetfile b/CI/include/Wingetfile new file mode 100644 index 000000000..3b8f56963 --- /dev/null +++ b/CI/include/Wingetfile @@ -0,0 +1,2 @@ +package '7zip.7zip', path: '7-zip', bin: '7z' +package 'cmake', path: 'Cmake\bin', bin: 'cmake' diff --git a/CI/include/build_support.sh b/CI/include/build_support.sh new file mode 100644 index 000000000..06465c846 --- /dev/null +++ b/CI/include/build_support.sh @@ -0,0 +1,217 @@ +#!/bin/bash + +############################################################################## +# Unix support functions +############################################################################## +# +# This script file can be included in build scripts for UNIX-compatible +# shells to compose build scripts. +# +############################################################################## + +## DEFINE UTILITIES ## + +if [ -z "${QUIET}" ]; then + status() { + echo -e "${COLOR_BLUE}[${PRODUCT_NAME}] ${1}${COLOR_RESET}" + } + + step() { + echo -e "${COLOR_GREEN} + ${1}${COLOR_RESET}" + } + + info() { + echo -e "${COLOR_ORANGE} + ${1}${COLOR_RESET}" + } + + error() { + echo -e "${COLOR_RED} + ${1}${COLOR_RESET}" + } +else + status() { + : + } + + step() { + : + } + + info() { + : + } + + error() { + echo -e "${COLOR_RED} + ${1}${COLOR_RESET}" + } +fi + +exists() { + /usr/bin/command -v "$1" >/dev/null 2>&1 +} + +ensure_dir() { + [ -n "${1}" ] && /bin/mkdir -p "${1}" && builtin cd "${1}" +} + +cleanup() { + : +} + +caught_error() { + error "ERROR during build step: ${1}" + cleanup + exit 1 +} + +# Setup build environment +BUILD_DIR="${BUILD_DIR:-build}" +BUILD_CONFIG="${BUILD_CONFIG:-RelWithDebInfo}" +CI_WORKFLOW="${CHECKOUT_DIR}/.github/workflows/main.yml" +CURRENT_ARCH="$(uname -m)" +CURRENT_DATE="$(date +"%Y-%m-%d")" + +## Utility functions ## + +check_ccache() { + step "Check CCache..." + if ccache -V >/dev/null 2>&1; then + info "CCache available" + CMAKE_CCACHE_OPTIONS="-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache" + + if [ "${CI}" ]; then + ccache --set-config=cache_dir=${GITHUB_WORKSPACE:-${HOME}}/.ccache + ccache --set-config=max_size=${CCACHE_SIZE:-500M} + ccache --set-config=compression=true + ccache -z + fi + else + info "CCache not available" + fi +} + +safe_fetch() { + if [ $# -lt 2 ]; then + error "Usage: safe_fetch URL HASH" + return 1 + fi + + while true; do + case "${1}" in + -n | --nocontinue ) NOCONTINUE=TRUE; shift ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + DOWNLOAD_URL="${1}" + DOWNLOAD_HASH="${2}" + DOWNLOAD_FILE="$(basename ${DOWNLOAD_URL})" + CURLCMD=${CURLCMD:-curl} + + if [ "${NOCONTINUE}" ]; then + ${CURLCMD/--continue-at -/} "${DOWNLOAD_URL}" + else + ${CURLCMD} "${DOWNLOAD_URL}" + fi + + if [ "${DOWNLOAD_HASH}" = "$(sha256sum "${DOWNLOAD_FILE}" | cut -d " " -f 1)" ]; then + info "${DOWNLOAD_FILE} downloaded successfully and passed hash check" + return 0 + else + error "${DOWNLOAD_FILE} downloaded successfully and failed hash check" + return 1 + fi +} + +check_and_fetch() { + if [ $# -lt 2 ]; then + caught_error "Usage: check_and_fetch URL HASH" + fi + + while true; do + case "${1}" in + -n | --nocontinue ) NOCONTINUE=TRUE; shift ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + DOWNLOAD_URL="${1}" + DOWNLOAD_HASH="${2}" + DOWNLOAD_FILE="$(basename "${DOWNLOAD_URL}")" + + if [ -f "${DOWNLOAD_FILE}" ] && [ "${DOWNLOAD_HASH}" = "$(sha256sum "${DOWNLOAD_FILE}" | cut -d " " -f 1)" ]; then + info "${DOWNLOAD_FILE} exists and passed hash check" + return 0 + else + safe_fetch "${DOWNLOAD_URL}" "${DOWNLOAD_HASH}" + fi +} + +github_fetch() { + if [ $# -ne 3 ]; then + error "Usage: github_fetch GITHUB_USER GITHUB_REPOSITORY GITHUB_COMMIT_HASH" + return 1 + fi + + GH_USER="${1}" + GH_REPO="${2}" + GH_REF="${3}" + + if [ -d "./.git" ]; then + info "Repository ${GH_USER}/${GH_REPO} already exists, updating..." + git config advice.detachedHead false + git config remote.origin.url "https://github.com/${GH_USER}/${GH_REPO}.git" + git config remote.origin.fetch "+refs/heads/master:refs/remotes/origin/master" + git config remote.origin.tapOpt --no-tags + + if ! git rev-parse -q --verify "${GH_COMMIT}^{commit}"; then + git fetch origin + fi + + git checkout -f "${GH_REF}" -- + git reset --hard "${GH_REF}" -- + if [ -d "./.gitmodules" ]; then + git submodule foreach --recursive git submodule sync + git submodule update --init --recursive + fi + + else + git clone "https://github.com/${GH_USER}/${GH_REPO}.git" "$(pwd)" + git config advice.detachedHead false + info "Checking out commit ${GH_REF}..." + git checkout -f "${GH_REF}" -- + + if [ -d "./.gitmodules" ]; then + git submodule foreach --recursive git submodule sync + git submodule update --init --recursive + fi + fi +} + +apply_patch() { + if [ $# -ne 2 ]; then + error "Usage: apply_patch PATCH_URL PATCH_HASH" + return 1 + fi + + COMMIT_URL="${1}" + COMMIT_HASH="${2}" + PATCH_FILE="$(basename ${COMMIT_URL})" + + if [ "${COMMIT_URL:0:5}" = "https" ]; then + ${CURLCMD:-curl} "${COMMIT_URL}" + if [ "${COMMIT_HASH}" = "$(sha256sum ${PATCH_FILE} | cut -d " " -f 1)" ]; then + info "${PATCH_FILE} downloaded successfully and passed hash check" + else + error "${PATCH_FILE} downloaded successfully and failed hash check" + return 1 + fi + + info "Applying patch ${COMMIT_URL}" + else + PATCH_FILE="${COMMIT_URL}" + fi + + patch -g 0 -f -p1 -i "${PATCH_FILE}" +} diff --git a/CI/include/build_support_freebsd.sh b/CI/include/build_support_freebsd.sh new file mode 100644 index 000000000..67209416b --- /dev/null +++ b/CI/include/build_support_freebsd.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +############################################################################## +# FreeBSD support functions +############################################################################## +# +# This script file can be included in build scripts for FreeBSD. +# +############################################################################## + +# Setup build environment + +if [ "${TERM-}" -a -x /usr/local/bin/tput ]; then + COLOR_RED=$(/usr/local/bin/tput setaf 1) + COLOR_GREEN=$(/usr/local/bin/tput setaf 2) + COLOR_BLUE=$(/usr/local/bin/tput setaf 4) + COLOR_ORANGE=$(/usr/local/bin/tput setaf 3) + COLOR_RESET=$(/usr/local/bin/tput sgr0) +else + COLOR_RED="" + COLOR_GREEN="" + COLOR_BLUE="" + COLOR_ORANGE="" + COLOR_RESET="" +fi + +if [ "${CI}" -o "${QUIET}" ]; then + export CURLCMD="curl --silent --show-error --location -O" +else + export CURLCMD="curl --progress-bar --location --continue-at - -O" +fi + +_add_ccache_to_path() { + if [ "${CMAKE_CCACHE_OPTIONS}" ]; then + PATH="/usr/local/opt/ccache/libexec:${PATH}" + status "Compiler Info:" + local IFS=$'\n' + for COMPILER_INFO in $(type cc c++ gcc g++ clang clang++ || true); do + info "${COMPILER_INFO}" + done + fi +} diff --git a/CI/include/build_support_linux.sh b/CI/include/build_support_linux.sh new file mode 100644 index 000000000..23a9ffd1c --- /dev/null +++ b/CI/include/build_support_linux.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +############################################################################## +# Linux support functions +############################################################################## +# +# This script file can be included in build scripts for Linux. +# +############################################################################## + +# Setup build environment + +CI_LINUX_CEF_VERSION=$(cat "${CI_WORKFLOW}" | sed -En "s/[ ]+CEF_BUILD_VERSION_LINUX: '([0-9]+)'/\1/p") + +if [ "${TERM-}" -a -z "${CI}" ]; then + COLOR_RED=$(tput setaf 1) + COLOR_GREEN=$(tput setaf 2) + COLOR_BLUE=$(tput setaf 4) + COLOR_ORANGE=$(tput setaf 3) + COLOR_RESET=$(tput sgr0) +else + COLOR_RED="" + COLOR_GREEN="" + COLOR_BLUE="" + COLOR_ORANGE="" + COLOR_RESET="" +fi + +if [ "${CI}" -o "${QUIET}" ]; then + export CURLCMD="curl --silent --show-error --location -O" +else + export CURLCMD="curl --progress-bar --location --continue-at - -O" +fi + +_add_ccache_to_path() { + if [ "${CMAKE_CCACHE_OPTIONS}" ]; then + PATH="/usr/local/opt/ccache/libexec:${PATH}" + status "Compiler Info:" + local IFS=$'\n' + for COMPILER_INFO in $(type cc c++ gcc g++ clang clang++ || true); do + info "${COMPILER_INFO}" + done + fi +} diff --git a/CI/include/build_support_macos.sh b/CI/include/build_support_macos.sh new file mode 100644 index 000000000..e7272e66d --- /dev/null +++ b/CI/include/build_support_macos.sh @@ -0,0 +1,180 @@ +#!/bin/bash + +############################################################################## +# macOS support functions +############################################################################## +# +# This script file can be included in build scripts for macOS. +# +############################################################################## + +# Setup build environment +WORKFLOW_CONTENT=$(/bin/cat "${CI_WORKFLOW}") +CI_DEPS_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_VERSION_MAC: '([0-9\-]+)'/\1/p") +CI_DEPS_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p") +CI_DEPS_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+DEPS_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p") +CI_VLC_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_VERSION_MAC: '([0-9\.]+)'/\1/p") +CI_VLC_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+VLC_HASH_MAC: '([0-9a-f]+)'/\1/p") +CI_SPARKLE_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_VERSION: '([0-9\.]+)'/\1/p") +CI_SPARKLE_HASH=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+SPARKLE_HASH: '([0-9a-f]+)'/\1/p") +CI_QT_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_VERSION_MAC: '([0-9\.]+)'/\1/p" | /usr/bin/head -1) +CI_QT_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p") +CI_QT_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+QT_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p") +CI_MACOSX_DEPLOYMENT_TARGET_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_X86_64: '([0-9\.]+)'/\1/p") +CI_MACOSX_DEPLOYMENT_TARGET_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+MACOSX_DEPLOYMENT_TARGET_ARM64: '([0-9\.]+)'/\1/p") +CI_MACOS_CEF_VERSION=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_BUILD_VERSION_MAC: '([0-9]+)'/\1/p") +CI_CEF_HASH_X86_64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_X86_64: '([0-9a-f]+)'/\1/p") +CI_CEF_HASH_ARM64=$(echo "${WORKFLOW_CONTENT}" | /usr/bin/sed -En "s/[ ]+CEF_HASH_MAC_ARM64: '([0-9a-f]+)'/\1/p") + +MACOS_VERSION="$(/usr/bin/sw_vers -productVersion)" +MACOS_MAJOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 1)" +MACOS_MINOR="$(echo ${MACOS_VERSION} | /usr/bin/cut -d '.' -f 2)" + +if [ "${TERM-}" -a -z "${CI}" ]; then + COLOR_RED=$(/usr/bin/tput setaf 1) + COLOR_GREEN=$(/usr/bin/tput setaf 2) + COLOR_BLUE=$(/usr/bin/tput setaf 4) + COLOR_ORANGE=$(/usr/bin/tput setaf 3) + COLOR_RESET=$(/usr/bin/tput sgr0) +else + COLOR_RED="" + COLOR_GREEN="" + COLOR_BLUE="" + COLOR_ORANGE="" + COLOR_RESET="" +fi + +## DEFINE UTILITIES ## +check_macos_version() { + ARCH="${ARCH:-${CURRENT_ARCH}}" + if [ "${ARCH}" = "x86_64" ]; then + CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_X86_64}" + CI_CEF_HASH="${CI_CEF_HASH_X86_64}" + CI_QT_HASH="${CI_QT_HASH_X86_64}" + CI_DEPS_HASH="${CI_DEPS_HASH_X86_64}" + elif [ "${ARCH}" = "arm64" ]; then + CI_MACOSX_DEPLOYMENT_TARGET="${CI_MACOSX_DEPLOYMENT_TARGET_ARM64}" + CI_CEF_HASH="${CI_CEF_HASH_ARM64}" + CI_QT_HASH="${CI_QT_HASH_ARM64}" + CI_DEPS_HASH="${CI_DEPS_HASH_ARM64}" + else + caught_error "Unsupported architecture '${ARCH}' provided" + fi + + step "Check macOS version..." + MIN_VERSION=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} + MIN_MAJOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 1) + MIN_MINOR=$(echo ${MIN_VERSION} | /usr/bin/cut -d '.' -f 2) + + if [ "${MACOS_MAJOR}" -lt "11" -a "${MACOS_MINOR}" -lt "${MIN_MINOR}" ]; then + error "ERROR: Minimum required macOS version is ${MIN_VERSION}, but running on ${MACOS_VERSION}" + fi + + if [ "${MACOS_MAJOR}" -ge "11" ]; then + export CODESIGN_LINKER="ON" + fi +} + +install_homebrew_deps() { + if ! exists brew; then + caught_error "Homebrew not found - please install Homebrew (https://brew.sh)" + fi + + brew bundle --file "${CHECKOUT_DIR}/CI/include/Brewfile" ${QUIET:+--quiet} + + check_curl +} + +check_curl() { + if [ "${MACOS_MAJOR}" -lt "11" -a "${MACOS_MINOR}" -lt "15" ]; then + if [ ! -d /usr/local/opt/curl ]; then + step "Install Homebrew curl..." + brew install curl + fi + + CURLCMD="/usr/local/opt/curl/bin/curl" + else + CURLCMD="curl" + fi + + if [ "${CI}" -o "${QUIET}" ]; then + export CURLCMD="${CURLCMD} --silent --show-error --location -O" + else + export CURLCMD="${CURLCMD} --progress-bar --location --continue-at - -O" + fi +} + +check_archs() { + step "Check Architecture..." + ARCH="${ARCH:-${CURRENT_ARCH}}" + if [ "${ARCH}" = "universal" ]; then + CMAKE_ARCHS="x86_64;arm64" + elif [ "${ARCH}" != "x86_64" -a "${ARCH}" != "arm64" ]; then + caught_error "Unsupported architecture '${ARCH}' provided" + else + CMAKE_ARCHS="${ARCH}" + fi +} + +_add_ccache_to_path() { + if [ "${CMAKE_CCACHE_OPTIONS}" ]; then + if [ "${CURRENT_ARCH}" == "arm64" ]; then + PATH="/opt/homebrew/opt/ccache/libexec:${PATH}" + else + PATH="/usr/local/opt/ccache/libexec:${PATH}" + fi + status "Compiler Info:" + local IFS=$'\n' + for COMPILER_INFO in $(type cc c++ gcc g++ clang clang++ || true); do + info "${COMPILER_INFO}" + done + fi +} + +## SET UP CODE SIGNING AND NOTARIZATION CREDENTIALS ## +############################################################################## +# Apple Developer Identity needed: +# +# + Signing the code requires a developer identity in the system's keychain +# + codesign will look up and find the identity automatically +# +############################################################################## +read_codesign_ident() { + if [ -z "${CODESIGN_IDENT}" ]; then + step "Set up code signing..." + read -p "${COLOR_ORANGE} + Apple developer identity: ${COLOR_RESET}" CODESIGN_IDENT + fi +} + +############################################################################## +# Apple Developer credentials necessary: +# +# + Signing for distribution and notarization require an active Apple +# Developer membership +# + An Apple Development identity is needed for code signing +# (i.e. 'Apple Development: YOUR APPLE ID (PROVIDER)') +# + Your Apple developer ID is needed for notarization +# + An app-specific password is necessary for notarization from CLI +# + This password will be stored in your macOS keychain under the identifier +# 'OBS-Codesign-Password' with access Apple's 'altool' only. +############################################################################## + +read_codesign_pass() { + step "Set up notarization..." + + if [ -z "${CODESIGN_IDENT_USER}" ]; then + read -p "${COLOR_ORANGE} + Apple account id: ${COLOR_RESET}" CODESIGN_IDENT_USER + fi + + if [ -z "${CODESIGN_IDENT_PASS}" ]; then + CODESIGN_IDENT_PASS=$(stty -echo; read -p "${COLOR_ORANGE} + Apple developer password: ${COLOR_RESET}" secret; stty echo; echo $secret) + echo "" + fi + + step "Update notarization keychain..." + + echo -n "${COLOR_ORANGE}" + /usr/bin/xcrun altool --store-password-in-keychain-item "OBS-Codesign-Password" -u "${CODESIGN_IDENT_USER}" -p "${CODESIGN_IDENT_PASS}" + echo -n "${COLOR_RESET}" + CODESIGN_IDENT_SHORT=$(echo "${CODESIGN_IDENT}" | /usr/bin/sed -En "s/.+\((.+)\)/\1/p") +} diff --git a/CI/include/build_support_windows.ps1 b/CI/include/build_support_windows.ps1 new file mode 100644 index 000000000..96c9bd891 --- /dev/null +++ b/CI/include/build_support_windows.ps1 @@ -0,0 +1,156 @@ +$CIWorkflow = "${CheckoutDir}/.github/workflows/main.yml" +$WorkflowContent = Get-Content ${CIWorkflow} + +$CIDepsVersion = ${WorkflowContent} | Select-String "[ ]+DEPS_VERSION_WIN: '([0-9\-]+)'" | ForEach-Object{$_.Matches.Groups[1].Value} +$CIQtVersion = ${WorkflowContent} | Select-String "[ ]+QT_VERSION_WIN: '([0-9\.]+)'" | ForEach-Object{$_.Matches.Groups[1].Value} +$CIVlcVersion = ${WorkflowContent} | Select-String "[ ]+VLC_VERSION_WIN: '(.+)'" | ForEach-Object{$_.Matches.Groups[1].Value} +$CICefVersion = ${WorkflowContent} | Select-String "[ ]+CEF_BUILD_VERSION_WIN: '([0-9\.]+)'" | ForEach-Object{$_.Matches.Groups[1].Value} +$CIGenerator = ${WorkflowContent} | Select-String "[ ]+CMAKE_GENERATOR: '(.+)'" | ForEach-Object{$_.Matches.Groups[1].Value} + +function Write-Status { + Param( + [Parameter(Mandatory=$true)] + [String] $Output + ) + + if (!($Quiet.isPresent)) { + if (Test-Path Env:CI) { + Write-Host "[${ProductName}] ${Output}" + } else { + Write-Host -ForegroundColor blue "[${ProductName}] ${Output}" + } + } +} + +function Write-Info { + Param( + [Parameter(Mandatory=$true)] + [String] $Output + ) + + if (!($Quiet.isPresent)) { + if (Test-Path Env:CI) { + Write-Host " + ${Output}" + } else { + Write-Host -ForegroundColor DarkYellow " + ${Output}" + } + } +} + +function Write-Step { + Param( + [Parameter(Mandatory=$true)] + [String] $Output + ) + + if (!($Quiet.isPresent)) { + if (Test-Path Env:CI) { + Write-Host " + ${Output}" + } else { + Write-Host -ForegroundColor green " + ${Output}" + } + } +} + +function Write-Failure { + Param( + [Parameter(Mandatory=$true)] + [String] $Output + ) + + if (Test-Path Env:CI) { + Write-Host " + ${Output}" + } else { + Write-Host -ForegroundColor red " + ${Output}" + } +} + +function Test-CommandExists { + Param( + [Parameter(Mandatory=$true)] + [String] $Command + ) + + $CommandExists = $false + $OldActionPref = $ErrorActionPreference + $ErrorActionPreference = "stop" + + try { + if (Get-Command $Command) { + $CommandExists = $true + } + } Catch { + $CommandExists = $false + } Finally { + $ErrorActionPreference = $OldActionPref + } + + return $CommandExists +} + +function Ensure-Directory { + Param( + [Parameter(Mandatory=$true)] + [String] $Directory + ) + + if (!(Test-Path $Directory)) { + $null = New-Item -ItemType Directory -Force -Path $Directory + } + + Set-Location -Path $Directory +} + +$BuildDirectory = "$(if (Test-Path Env:BuildDirectory) { $env:BuildDirectory } else { $BuildDirectory })" +$BuildConfiguration = "$(if (Test-Path Env:BuildConfiguration) { $env:BuildConfiguration } else { $BuildConfiguration })" +$BuildArch = "$(if (Test-Path Env:BuildArch) { $env:BuildArch } else { $BuildArch })" +$WindowsDepsVersion = "$(if (Test-Path Env:WindowsDepsVersion ) { $env:WindowsDepsVersion } else { $CIDepsVersion })" +$WindowsQtVersion = "$(if (Test-Path Env:WindowsQtVersion ) { $env:WindowsQtVersion } else { $CIQtVersion })" +$WindowsVlcVersion = "$(if (Test-Path Env:WindowsVlcVersion ) { $env:WindowsVlcVersion } else { $CIVlcVersion })" +$WindowsCefVersion = "$(if (Test-Path Env:WindowsCefVersion ) { $env:WindowsCefVersion } else { $CICefVersion })" +$CmakeSystemVersion = "$(if (Test-Path Env:CMAKE_SYSTEM_VERSION) { $Env:CMAKE_SYSTEM_VERSION } else { "10.0.18363.657" })" +$CmakeGenerator = "$(if (Test-Path Env:CmakeGenerator) { $Env:CmakeGenerator } else { $CIGenerator })" + + +function Install-Windows-Dependencies { + $WingetFile = "$PSScriptRoot/Wingetfile" + + $Host64Bit = [System.Environment]::Is64BitOperatingSystem + + $Prefix = (${Env:ProgramFiles(x86)}, $Env:ProgramFiles)[$Host64Bit] + + $Paths = $Env:Path -split [System.IO.Path]::PathSeparator + + $WingetOptions = @('install', '--accept-package-agreements', '--accept-source-agreements') + + if ( $script:Quiet ) { + $WingetOptions += '--silent' + } + + Get-Content $WingetFile | ForEach-Object { + $_, $Package, $_, $Path, $_, $Binary = $_ -replace ',','' -replace "'", '' -split ' ' + + $FullPath = "${Prefix}\${Path}" + if ( ( Test-Path $FullPath ) -and ! ( $Paths -contains $FullPath ) ) { + $Paths += $FullPath + $Env:Path = $Paths -join [System.IO.Path]::PathSeparator + } + + Write-Step "Checking for command ${Binary}" + $Found = Get-Command -ErrorAction SilentlyContinue $Binary + + if ( $Found ) { + Write-Info "Found dependency ${Binary} as $($Found.Source)" + } else { + Write-Info "Installing package ${Package}" + + try { + $Params = $WingetOptions + $Package + + winget @Params + } catch { + throw "Error while installing winget package ${Package}: $_" + } + } + } +} diff --git a/CI/install-dependencies-linux.sh b/CI/install-dependencies-linux.sh deleted file mode 100755 index f432544ab..000000000 --- a/CI/install-dependencies-linux.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -set -ex - -curl -L https://packagecloud.io/github/git-lfs/gpgkey | sudo apt-key add - - -sudo apt-get -qq update -sudo apt-get install -y \ - build-essential \ - checkinstall \ - cmake \ - libasound2-dev \ - libavcodec-dev \ - libavdevice-dev \ - libavfilter-dev \ - libavformat-dev \ - libavutil-dev \ - libcurl4-openssl-dev \ - libfdk-aac-dev \ - libfontconfig-dev \ - libfreetype6-dev \ - libgl1-mesa-dev \ - libjack-jackd2-dev \ - libjansson-dev \ - libluajit-5.1-dev \ - libpulse-dev \ - libqt5x11extras5-dev \ - libspeexdsp-dev \ - libswresample-dev \ - libswscale-dev \ - libudev-dev \ - libv4l-dev \ - libva-dev \ - libvlc-dev \ - libx11-dev \ - libx264-dev \ - libxkbcommon-dev \ - libxcb-randr0-dev \ - libxcb-shm0-dev \ - libxcb-xinerama0-dev \ - libxcomposite-dev \ - libxinerama-dev \ - libmbedtls-dev \ - pkg-config \ - python3-dev \ - qtbase5-dev \ - qtbase5-private-dev \ - libqt5svg5-dev \ - swig - -# build cef -wget --quiet --retry-connrefused --waitretry=1 https://cdn-fastly.obsproject.com/downloads/cef_binary_${LINUX_CEF_BUILD_VERSION}_linux64.tar.bz2 -tar -xjf ./cef_binary_${LINUX_CEF_BUILD_VERSION}_linux64.tar.bz2 diff --git a/CI/install-qt-win.cmd b/CI/install-qt-win.cmd deleted file mode 100644 index 147784e28..000000000 --- a/CI/install-qt-win.cmd +++ /dev/null @@ -1,4 +0,0 @@ -if exist Qt_5.15.2.7z (curl -kLO https://cdn-fastly.obsproject.com/downloads/Qt_5.15.2.7z -f --retry 5 -z Qt_5.15.2.7z) else (curl -kLO https://cdn-fastly.obsproject.com/downloads/Qt_5.15.2.7z -f --retry 5 -C -) -7z x Qt_5.15.2.7z -oQt -mv Qt C:\QtDep -dir C:\QtDep diff --git a/CI/install-script-linux.sh b/CI/install-script-linux.sh deleted file mode 100755 index abbfbf00c..000000000 --- a/CI/install-script-linux.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -set -ex - -build_config=RelWithDebInfo diff --git a/CI/install-script-win.cmd b/CI/install-script-win.cmd deleted file mode 100644 index dd3852d19..000000000 --- a/CI/install-script-win.cmd +++ /dev/null @@ -1,30 +0,0 @@ -if exist dependencies2019.zip (curl -kLO https://cdn-fastly.obsproject.com/downloads/dependencies2019.zip -f --retry 5 -z dependencies2019.zip) else (curl -kLO https://cdn-fastly.obsproject.com/downloads/dependencies2019.zip -f --retry 5 -C -) -if exist vlc.zip (curl -kLO https://cdn-fastly.obsproject.com/downloads/vlc.zip -f --retry 5 -z vlc.zip) else (curl -kLO https://cdn-fastly.obsproject.com/downloads/vlc.zip -f --retry 5 -C -) -if exist cef_binary_%CEF_VERSION%_windows32_minimal.zip (curl -kLO https://cdn-fastly.obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows32_minimal.zip -f --retry 5 -z cef_binary_%CEF_VERSION%_windows32_minimal.zip) else (curl -kLO https://cdn-fastly.obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows32_minimal.zip -f --retry 5 -C -) -if exist cef_binary_%CEF_VERSION%_windows64_minimal.zip (curl -kLO https://cdn-fastly.obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows64_minimal.zip -f --retry 5 -z cef_binary_%CEF_VERSION%_windows64_minimal.zip) else (curl -kLO https://cdn-fastly.obsproject.com/downloads/cef_binary_%CEF_VERSION%_windows64_minimal.zip -f --retry 5 -C -) -7z x dependencies2019.zip -odependencies2019 -7z x vlc.zip -ovlc -7z x cef_binary_%CEF_VERSION%_windows32_minimal.zip -oCEF_32 -7z x cef_binary_%CEF_VERSION%_windows64_minimal.zip -oCEF_64 -set DepsPath32=%CD%\dependencies2019\win32 -set DepsPath64=%CD%\dependencies2019\win64 -set VLCPath=%CD%\vlc -set QTDIR32=C:\QtDep\5.15.2\msvc2019 -set QTDIR64=C:\QtDep\5.15.2\msvc2019_64 -set CEF_32=%CD%\CEF_32\cef_binary_%CEF_VERSION%_windows32_minimal -set CEF_64=%CD%\CEF_64\cef_binary_%CEF_VERSION%_windows64_minimal -set build_config=RelWithDebInfo -set VIRTUALCAM-GUID=A3FCE0F5-3493-419F-958A-ABA1250EC20B -mkdir build build32 build64 -if "%TWITCH-CLIENTID%"=="$(twitch_clientid)" ( -cd ./build32 -cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DENABLE_VLC=ON -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% -DVIRTUALCAM_GUID="%VIRTUALCAM-GUID%" .. -cd ../build64 -cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DENABLE_VLC=ON -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% -DVIRTUALCAM_GUID="%VIRTUALCAM-GUID%" .. -) else ( -cd ./build32 -cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DENABLE_VLC=ON -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_32% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" -DVIRTUALCAM_GUID="%VIRTUALCAM-GUID%" .. -cd ../build64 -cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_SYSTEM_VERSION=10.0 -DCOPIED_DEPENDENCIES=false -DCOPY_DEPENDENCIES=true -DENABLE_VLC=ON -DCOMPILE_D3D12_HOOK=true -DBUILD_BROWSER=true -DCEF_ROOT_DIR=%CEF_64% -DTWITCH_CLIENTID="%TWITCH-CLIENTID%" -DTWITCH_HASH="%TWITCH-HASH%" -DRESTREAM_CLIENTID="%RESTREAM-CLIENTID%" -DRESTREAM_HASH="%RESTREAM-HASH%" -DVIRTUALCAM_GUID="%VIRTUALCAM-GUID%" .. -) -cd .. diff --git a/CI/linux/01_install_dependencies.sh b/CI/linux/01_install_dependencies.sh new file mode 100755 index 000000000..dc8a9594c --- /dev/null +++ b/CI/linux/01_install_dependencies.sh @@ -0,0 +1,136 @@ +#!/bin/bash + +############################################################################## +# Linux dependency management function +############################################################################## +# +# This script file can be included in build scripts for Linux or run directly +# with the -s/--standalone switch +# +############################################################################## + +# Halt on errors +set -eE + +install_build-deps() { + shift + status "Install OBS build dependencies" + trap "caught_error 'install_build-deps'" ERR + + sudo apt-get install -y $@ +} + +install_obs-deps() { + shift + status "Install OBS dependencies" + trap "caught_error 'install_obs-deps'" ERR + + if [ -z "${DISABLE_PIPEWIRE}" ]; then + sudo apt-get install -y $@ libpipewire-0.3-dev + else + sudo apt-get install -y $@ + fi +} + +install_qt-deps() { + shift + status "Install Qt dependencies" + trap "caught_error 'install_qt-deps'" ERR + + sudo apt-get install -y $@ +} + +install_cef() { + shift + status "Setup for dependency CEF v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + + if [ "${CI}" -a "${RESTORED_CEF}" ]; then + _SKIP=TRUE + elif [ -d "${DEPS_BUILD_DIR}/cef_binary_${1}_linux64" -a -f "${DEPS_BUILD_DIR}/cef_binary_${1}_linux64/build/libcef_dll_wrapper/libcef_dll_wrapper.a" ]; then + _SKIP=TRUE + fi + + if [ -z "${_SKIP}" ]; then + step "Download..." + ${CURLCMD:-curl -O} https://cdn-fastly.obsproject.com/downloads/cef_binary_${1}_linux64.tar.bz2 + step "Unpack..." + tar -xf cef_binary_${1}_linux64.tar.bz2 + else + step "Found existing Chromium Embedded Framework and loader library..." + fi +} + +install_plugin-deps() { + shift + status "Install plugin dependencies" + trap "caught_error 'install_plugin-deps'" ERR + + sudo apt-get install -y $@ +} + +install_dependencies() { + status "Set up apt" + trap "caught_error 'install_dependencies'" ERR + + BUILD_DEPS=( + "build-deps cmake ninja-build pkg-config clang clang-format build-essential curl ccache" + "obs-deps libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev \ + libswscale-dev libx264-dev libcurl4-openssl-dev libmbedtls-dev libgl1-mesa-dev libjansson-dev \ + libluajit-5.1-dev python3-dev libx11-dev libxcb-randr0-dev libxcb-shm0-dev libxcb-xinerama0-dev \ + libxcomposite-dev libxinerama-dev libxcb1-dev libx11-xcb-dev libxcb-xfixes0-dev swig libcmocka-dev \ + libpci-dev libxss-dev libglvnd-dev libgles2-mesa libgles2-mesa-dev libwayland-dev libxkbcommon-dev" + "qt-deps qtbase5-dev qtbase5-private-dev libqt5svg5-dev qtwayland5" + "cef ${LINUX_CEF_BUILD_VERSION:-${CI_LINUX_CEF_VERSION}}" + "plugin-deps libasound2-dev libfdk-aac-dev libfontconfig-dev libfreetype6-dev libjack-jackd2-dev \ + libpulse-dev libsndio-dev libspeexdsp-dev libudev-dev libv4l-dev libva-dev libvlc-dev libdrm-dev" + ) + + sudo dpkg --add-architecture amd64 + sudo apt-get -qq update + + for DEPENDENCY in "${BUILD_DEPS[@]}"; do + set -- ${DEPENDENCY} + trap "caught_error ${DEPENDENCY}" ERR + FUNC_NAME="install_${1}" + ${FUNC_NAME} ${@} + done +} + +install-dependencies-standalone() { + CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_linux.sh" + + status "Setup of OBS build dependencies" + install_dependencies +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "--disable-pipewire : Disable building with Pipewire support (default: off)\n" +} + +install-dependencies-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + --disable-pipewire ) DISABLE_PIPEWIRE=TRUE; shift ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + install-dependencies-standalone + fi +} + +install-dependencies-main $* diff --git a/CI/linux/02_build_obs.sh b/CI/linux/02_build_obs.sh new file mode 100755 index 000000000..b7006609a --- /dev/null +++ b/CI/linux/02_build_obs.sh @@ -0,0 +1,127 @@ +#!/bin/bash + +############################################################################## +# Linux build function +############################################################################## +# +# This script file can be included in build scripts for Linux or run directly +# +############################################################################## + +# Halt on errors +set -eE + +build_obs() { + status "Build OBS" + trap "caught_error 'build app'" ERR + if [ -z "${CI}" ]; then + _backup_artifacts + fi + + step "Configure OBS..." + _configure_obs + + ensure_dir "${CHECKOUT_DIR}/" + step "Build OBS targets..." + cmake --build ${BUILD_DIR} +} + +# Function to configure OBS build +_configure_obs() { + ensure_dir "${CHECKOUT_DIR}" + status "Configuration of OBS build system..." + trap "caught_error 'configure build'" ERR + check_ccache + + if [ "${TWITCH_CLIENTID}" -a "${TWICH_HASH}" ]; then + TWITCH_OPTIONS="-DTWITCH_CLIENTID=\"${TWITCH_CLIENTID}\" -DTWITCH_HASH=\"${TWITCH_HASH}\"" + fi + + if [ "${RESTREAM_CLIENTID}" -a "${RESTREAM_HASH}" ]; then + RESTREAM_OPTIONS="-DRESTREAM_CLIENTID=\"${RESTREAM_CLIENTID}\" -DRESTREAM_HASH=\"${RESTREAM_HASH}\"" + fi + + if [ "${YOUTUBE_CLIENTID}" -a "${YOUTUBE_CLIENTID_HASH}" -a "${YOUTUBE_SECRET}" -a "{YOUTUBE_SECRET_HASH}" ]; then + YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID=\"${YOUTUBE_CLIENTID}\" -DYOUTUBE_CLIENTID_HASH=\"${YOUTUBE_CLIENTID_HASH}\" -DYOUTUBE_SECRET=\"${YOUTUBE_SECRET}\" -DYOUTUBE_SECRET_HASH=\"${YOUTUBE_SECRET_HASH}\"" + fi + + if [ "${PORTABLE}" ]; then + PORTABLE_BUILD="ON" + fi + + if [ "${DISABLE_PIPEWIRE}" ]; then + PIPEWIRE_OPTION="-DENABLE_PIPEWIRE=OFF" + fi + + cmake -S . -B ${BUILD_DIR} -G Ninja \ + -DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${LINUX_CEF_BUILD_VERSION:-${CI_LINUX_CEF_VERSION}}_linux64" \ + -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \ + -DLINUX_PORTABLE=${PORTABLE_BUILD:-OFF} \ + -DENABLE_AJA=OFF \ + ${PIPEWIRE_OPTION} \ + ${YOUTUBE_OPTIONS} \ + ${TWITCH_OPTIONS} \ + ${RESTREAM_OPTIONS} \ + ${CI:+-DENABLE_UNIT_TESTS=ON -DBUILD_FOR_DISTRIBUTION=${BUILD_FOR_DISTRIBUTION} -DOBS_BUILD_NUMBER=${GITHUB_RUN_ID}} \ + ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR} +} + +# Function to backup previous build artifacts +_backup_artifacts() { + ensure_dir "${CHECKOUT_DIR}" + if [ -d ${BUILD_DIR} ]; then + status "Backup of old OBS build artifacts" + + CUR_DATE=$(date +"%Y-%m-%d@%H%M%S") + NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}" + PACKAGE_NAME=$(find ${BUILD_DIR} -maxdepth 1 -name "*.deb" | sort -rn | head -1) + + if [ "${PACKAGE_NAME}" ]; then + step "Back up $(basename "${PACKAGE_NAME}")..." + ensure_dir "${NIGHTLY_DIR}" + mv "../${BUILD_DIR}/$(basename "${PACKAGE_NAME}")" ${NIGHTLY_DIR}/ + info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}" + fi + fi +} + +build-obs-standalone() { + CHECKOUT_DIR="$(git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_linux.sh" + + build_obs +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-p, --portable : Create portable build (default: off)\n" \ + "--disable-pipewire : Disable building with PipeWire support (default: off)\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +build-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -p | --portable ) export PORTABLE=TRUE; shift ;; + --disable-pipewire ) DISABLE_PIPEWIRE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + build-obs-standalone + fi +} + +build-obs-main $* diff --git a/CI/linux/03_package_obs.sh b/CI/linux/03_package_obs.sh new file mode 100755 index 000000000..170fba216 --- /dev/null +++ b/CI/linux/03_package_obs.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +############################################################################## +# Linux libobs plugin package function +############################################################################## +# +# This script file can be included in build scripts for Linux or run directly +# +############################################################################## + +# Halt on errors +set -eE + +package_obs() { + status "Create Linux debian package" + trap "caught_error 'package app'" ERR + + ensure_dir "${CHECKOUT_DIR}" + + step "Package OBS..." + cmake --build ${BUILD_DIR} -t package + + DEB_NAME=$(find ${BUILD_DIR} -maxdepth 1 -type f -name "obs*.deb" | sort -rn | head -1) + + if [ "${DEB_NAME}" ]; then + mv ${DEB_NAME} ${BUILD_DIR}/${FILE_NAME} + else + error "ERROR No suitable OBS debian package generated" + fi +} + +package-obs-standalone() { + PRODUCT_NAME="OBS-Studio" + + CHECKOUT_DIR="$(git rev-parse --show-toplevel)" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_linux.sh" + + step "Fetch OBS tags..." + git fetch origin --tags + + GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(git rev-parse --short HEAD) + GIT_TAG=$(git describe --tags --abbrev=0) + + if [ "${BUILD_FOR_DISTRIBUTION}" ]; then + VERSION_STRING="${GIT_TAG}" + else + VERSION_STRING="${GIT_TAG}-${GIT_HASH}" + fi + + FILE_NAME="obs-studio-${VERSION_STRING}-Linux.deb" + package_obs +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +package-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + package-obs-standalone + fi +} + +package-obs-main $* diff --git a/CI/macos/01_install_dependencies.sh b/CI/macos/01_install_dependencies.sh new file mode 100755 index 000000000..adc75a424 --- /dev/null +++ b/CI/macos/01_install_dependencies.sh @@ -0,0 +1,182 @@ +#!/bin/bash + +############################################################################## +# macOS dependency management function +############################################################################## +# +# This script file can be included in build scripts for macOS or run directly. +# +############################################################################## + +# Halt on errors +set -eE + +install_obs-deps() { + status "Set up precompiled macOS OBS dependencies v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + step "Download..." + check_and_fetch "https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-${1}-${ARCH:-x86_64}.tar.xz" "${2}" + mkdir -p obs-deps + step "Unpack..." + /usr/bin/tar -xf "./macos-deps-${1}-${ARCH:-x86_64}.tar.xz" -C ./obs-deps + /usr/bin/xattr -r -d com.apple.quarantine ./obs-deps +} + +install_qt-deps() { + status "Set up precompiled dependency Qt v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + step "Download..." + check_and_fetch "https://github.com/obsproject/obs-deps/releases/download/${1}/macos-deps-qt-${1}-${ARCH:-x86_64}.tar.xz" "${2}" + mkdir -p obs-deps + step "Unpack..." + /usr/bin/tar -xf "./macos-deps-qt-${1}-${ARCH:-x86_64}.tar.xz" -C ./obs-deps + /usr/bin/xattr -r -d com.apple.quarantine ./obs-deps +} + +install_vlc() { + status "Set up dependency VLC v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + unset _SKIP + + if [ "${CI}" -a "${RESTORED_VLC}" ]; then + _SKIP=TRUE + elif [ -d "${DEPS_BUILD_DIR}/vlc-${1}" -a -f "${DEPS_BUILD_DIR}/vlc-${1}/include/vlc/vlc.h" ]; then + _SKIP=TRUE + fi + + if [ -z "${_SKIP}" ]; then + step "Download..." + check_and_fetch "https://downloads.videolan.org/vlc/${1}/vlc-${1}.tar.xz" "${2}" + step "Unpack..." + /usr/bin/tar -xf vlc-${1}.tar.xz + else + step "Found existing VLC..." + fi +} + +install_sparkle() { + status "Set up dependency Sparkle v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + unset _SKIP + + if [ "${CI}" -a "${RESTORED_SPARKLE}" ]; then + _SKIP=TRUE + elif [ -d "${DEPS_BUILD_DIR}/obs-deps/Frameworks/Sparkle.framework" -a -f "${DEPS_BUILD_DIR}/obs-deps/Frameworks/Sparkle.framework/Sparkle" ]; then + _SKIP=TRUE + fi + + if [ -z "${_SKIP}" ]; then + step "Download..." + check_and_fetch "https://github.com/sparkle-project/Sparkle/releases/download/${1}/Sparkle-${1}.tar.xz" "${2}" + step "Unpack..." + ensure_dir "${DEPS_BUILD_DIR}/sparkle" + /usr/bin/tar -xf ../Sparkle-${1}.tar.xz + cp -cpR "${DEPS_BUILD_DIR}"/sparkle/Sparkle.framework "${DEPS_BUILD_DIR}"/obs-deps/lib/ + else + step "Found existing Sparkle Framework..." + fi +} + +install_cef() { + status "Set up dependency CEF v${1}" + ensure_dir "${DEPS_BUILD_DIR}" + unset _SKIP + + if [ "${CI}" -a "${RESTORED_CEF}" ]; then + _SKIP=TRUE + elif [ -d "${DEPS_BUILD_DIR}/cef_binary_${1}_macos_${ARCH:-x86_64}" -a -f "${DEPS_BUILD_DIR}/cef_binary_${1}_macos_${ARCH:-x86_64}/build/libcef_dll_wrapper/libcef_dll_wrapper.a" ]; then + _SKIP=TRUE + fi + + if [ -z "${_SKIP}" ]; then + step "Download..." + check_and_fetch "https://cdn-fastly.obsproject.com/downloads/cef_binary_${1}_macos_${ARCH:-x86_64}.tar.xz" "${2}" + step "Unpack..." + /usr/bin/tar -xf cef_binary_${1}_macos_${ARCH:-x86_64}.tar.xz + cd cef_binary_${1}_macos_${ARCH:-x86_64} + step "Fix tests..." + + /usr/bin/sed -i '.orig' '/add_subdirectory(tests\/ceftests)/d' ./CMakeLists.txt + /usr/bin/sed -E -i '' 's/"10.(9|10|11)"/"'${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}}'"/' ./cmake/cef_variables.cmake + + step "Run CMake..." + check_ccache + cmake ${CCACHE_OPTIONS} ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR} \ + -S . -B build \ + -G Ninja \ + -DPROJECT_ARCH=${CMAKE_ARCHS:-x86_64} \ + -DCEF_COMPILER_FLAGS="-Wno-deprecated-copy" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++ -Wno-deprecated-declarations -Wno-unknown-warning-option" \ + -DCMAKE_EXE_LINKER_FLAGS="-std=c++11 -stdlib=libc++" \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} + + step "Build CEF v${1}..." + cmake --build build + mkdir -p build/libcef_dll + else + step "Found existing Chromium Embedded Framework and loader library..." + fi +} + +install_dependencies() { + status "Install Homebrew dependencies" + trap "caught_error 'install_dependencies'" ERR + + BUILD_DEPS=( + "obs-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}} ${MACOS_DEPS_HASH:-${CI_DEPS_HASH}}" + "qt-deps ${MACOS_DEPS_VERSION:-${CI_DEPS_VERSION}} ${QT_HASH:-${CI_QT_HASH}}" + "cef ${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}} ${CEF_HASH:-${CI_CEF_HASH}}" + "vlc ${VLC_VERSION:-${CI_VLC_VERSION}} ${VLC_HASH:-${CI_VLC_HASH}}" + "sparkle ${SPARKLE_VERSION:-${CI_SPARKLE_VERSION}} ${SPARKLE_HASH:-${CI_SPARKLE_HASH}}" + ) + + install_homebrew_deps + + for DEPENDENCY in "${BUILD_DEPS[@]}"; do + set -- ${DEPENDENCY} + trap "caught_error ${DEPENDENCY}" ERR + FUNC_NAME="install_${1}" + ${FUNC_NAME} ${2} ${3} ${4} + done +} + +install-dependencies-standalone() { + CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh" + + status "Setup of OBS build dependencies" + check_macos_version + check_archs + install_dependencies +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" +} + +install-dependencies-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -a | --architecture ) ARCH="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + install-dependencies-standalone + fi +} + +install-dependencies-main $* diff --git a/CI/macos/02_build_obs.sh b/CI/macos/02_build_obs.sh new file mode 100755 index 000000000..5fcea868d --- /dev/null +++ b/CI/macos/02_build_obs.sh @@ -0,0 +1,168 @@ +#!/bin/bash + +############################################################################## +# macOS build function +############################################################################## +# +# This script file can be included in build scripts for macOS or run directly +# +############################################################################## + +# Halt on errors +set -eE + +build_obs() { + status "Build OBS" + trap "caught_error 'build app'" ERR + + if [ -z "${CI}" ]; then + _backup_artifacts + fi + step "Configure OBS..." + _configure_obs + + ensure_dir "${CHECKOUT_DIR}/" + step "Build OBS targets..." + cmake --build ${BUILD_DIR} +} + +bundle_obs() { + status "Create relocatable macOS application bundle" + trap "caught_error 'package app'" ERR + + ensure_dir "${CHECKOUT_DIR}" + + step "Install OBS application bundle..." + cmake --install ${BUILD_DIR} +} + +# Function to configure OBS build +_configure_obs() { + if [ "${CODESIGN}" ]; then + read_codesign_ident + fi + + ensure_dir "${CHECKOUT_DIR}" + status "Configure OBS build system..." + trap "caught_error 'configure build'" ERR + check_ccache + + if [ "${TWITCH_CLIENTID}" -a "${TWICH_HASH}" ]; then + TWITCH_OPTIONS="-DTWITCH_CLIENTID=\"${TWITCH_CLIENTID}\" -DTWITCH_HASH=\"${TWITCH_HASH}\"" + fi + + if [ "${RESTREAM_CLIENTID}" -a "${RESTREAM_HASH}" ]; then + RESTREAM_OPTIONS="-DRESTREAM_CLIENTID=\"${RESTREAM_CLIENTID}\" -DRESTREAM_HASH=\"${RESTREAM_HASH}\"" + fi + + if [ "${YOUTUBE_CLIENTID}" -a "${YOUTUBE_CLIENTID_HASH}" -a "${YOUTUBE_SECRET}" -a "{YOUTUBE_SECRET_HASH}" ]; then + YOUTUBE_OPTIONS="-DYOUTUBE_CLIENTID=\"${YOUTUBE_CLIENTID}\" -DYOUTUBE_CLIENTID_HASH=\"${YOUTUBE_CLIENTID_HASH}\" -DYOUTUBE_SECRET=\"${YOUTUBE_SECRET}\" -DYOUTUBE_SECRET_HASH=\"${YOUTUBE_SECRET_HASH}\"" + fi + + if [ "${XCODE}" ]; then + GENERATOR="Xcode" + else + GENERATOR="Ninja" + fi + + if [ "${CI}" -a "${ARCH}" = "x86_64" ]; then + UNITTEST_OPTIONS="-DENABLE_UNIT_TESTS=ON" + fi + + cmake -S . -B ${BUILD_DIR} -G ${GENERATOR} \ + -DCEF_ROOT_DIR="${DEPS_BUILD_DIR}/cef_binary_${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}_macos_${ARCH:-x86_64}" \ + -DENABLE_BROWSER=ON \ + -DVLC_PATH="${DEPS_BUILD_DIR}/vlc-${VLC_VERSION:-${CI_VLC_VERSION}}" \ + -DENABLE_VLC=ON \ + -DCMAKE_PREFIX_PATH="${DEPS_BUILD_DIR}/obs-deps" \ + -DBROWSER_LEGACY=$(test "${MACOS_CEF_BUILD_VERSION:-${CI_MACOS_CEF_VERSION}}" -le 3770 && echo "ON" || echo "OFF") \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET:-${CI_MACOSX_DEPLOYMENT_TARGET}} \ + -DCMAKE_OSX_ARCHITECTURES=${CMAKE_ARCHS} \ + -DOBS_CODESIGN_LINKER=${CODESIGN_LINKER:-OFF} \ + -DCMAKE_INSTALL_PREFIX=${BUILD_DIR}/install \ + -DCMAKE_BUILD_TYPE=${BUILD_CONFIG} \ + -DOBS_BUNDLE_CODESIGN_IDENTITY="${CODESIGN_IDENT:--}" \ + ${YOUTUBE_OPTIONS} \ + ${TWITCH_OPTIONS} \ + ${RESTREAM_OPTIONS} \ + ${UNITTEST_OPTIONS} \ + ${CI:+-DBUILD_FOR_DISTRIBUTION=${BUILD_FOR_DISTRIBUTION} -DOBS_BUILD_NUMBER=${GITHUB_RUN_ID}} \ + ${QUIET:+-Wno-deprecated -Wno-dev --log-level=ERROR} +} + +# Function to backup previous build artifacts +_backup_artifacts() { + ensure_dir "${CHECKOUT_DIR}" + if [ -d "${BUILD_DIR}" ]; then + status "Backup old OBS build artifacts" + + CUR_DATE=$(/bin/date +"%Y-%m-%d@%H%M%S") + NIGHTLY_DIR="${CHECKOUT_DIR}/nightly-${CUR_DATE}" + PACKAGE_NAME=$(/usr/bin/find "${BUILD_DIR}" -name "*.dmg" -depth 1 | sort -rn | head -1) + + if [ -d "${BUILD_DIR}/install/OBS.app" ]; then + step "Back up OBS.app..." + ensure_dir "${NIGHTLY_DIR}" + /bin/mv "${CHECKOUT_DIR}/${BUILD_DIR}/install/OBS.app" "${NIGHTLY_DIR}/" + info "You can find OBS.app in ${NIGHTLY_DIR}" + fi + + if [ "${PACKAGE_NAME}" ]; then + step "Back up $(basename "${PACKAGE_NAME}")..." + ensure_dir "${NIGHTLY_DIR}" + /bin/mv "../${BUILD_DIR}/$(basename "${PACKAGE_NAME}")" "${NIGHTLY_DIR}/" + info "You can find ${PACKAGE_NAME} in ${NIGHTLY_DIR}" + fi + fi +} + +build-obs-standalone() { + CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" + PRODUCT_NAME="OBS-Studio" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh" + + check_archs + check_macos_version + build_obs + + if [ "${BUNDLE}" ]; then + bundle_obs + fi +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \ + "-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \ + "-b, --bundle : Create relocatable OBS application bundle in build directory (default: build/install/OBS.app)\n" \ + "--xcode : Create Xcode build environment instead of Ninja\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +build-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -a | --architecture ) ARCH="${2}"; shift 2 ;; + -c | --codesign ) CODESIGN=TRUE; shift ;; + -b | --bundle ) BUNDLE=TRUE; shift ;; + --xcode ) XCODE=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + build-obs-standalone + fi +} + +build-obs-main $* diff --git a/CI/macos/03_package_obs.sh b/CI/macos/03_package_obs.sh new file mode 100755 index 000000000..7ee6e5f2d --- /dev/null +++ b/CI/macos/03_package_obs.sh @@ -0,0 +1,187 @@ +#!/bin/bash + +############################################################################## +# macOS libobs plugin package function +############################################################################## +# +# This script file can be included in build scripts for macOS or run directly +# +############################################################################## + +# Halt on errors +set -eE + +package_obs() { + if [ "${CODESIGN}" ]; then + read_codesign_ident + fi + + status "Create macOS disk image" + trap "caught_error 'package app'" ERR + + info "/!\\ CPack will use an AppleScript to create the disk image, this will lead to a Finder window opening to adjust window settings. /!\\" + + ensure_dir "${CHECKOUT_DIR}" + + step "Package OBS..." + cmake --build ${BUILD_DIR} -t package + + DMG_NAME=$(/usr/bin/find "${BUILD_DIR}" -type f -name "OBS-*.dmg" -depth 1 | sort -rn | head -1) + + if [ "${DMG_NAME}" ]; then + mv "${DMG_NAME}" "${BUILD_DIR}/${FILE_NAME}" + + step "Codesign OBS disk image..." + /usr/bin/codesign --force --sign "${CODESIGN_IDENT:--}" "${BUILD_DIR}/${FILE_NAME}" + else + error "ERROR No suitable OBS disk image generated" + fi +} + +notarize_obs() { + status "Notarize OBS" + trap "caught_error 'notarizing app'" ERR + + if ! exists brew; then + error "ERROR Homebrew not found - please install homebrew (https://brew.sh)" + exit 1 + fi + + if ! exists xcnotary; then + step "Install notarization dependency 'xcnotary'" + brew install akeru-inc/tap/xcnotary + fi + + ensure_dir "${CHECKOUT_DIR}" + + if [ "${NOTARIZE_IMAGE}" ]; then + trap "_caught_error_xcnotary '${NOTARIZE_IMAGE}'" ERR + + step "Attach OBS disk image ${NOTARIZE_IMAGE}..." + hdiutil attach -readonly -noverify -noautoopen -quiet "${NOTARIZE_IMAGE}" + + VOLUME_NAME=$(hdiutil info -plist | grep "/Volumes/OBS-" | sed 's/\/Volumes\/\([^<]*\)<\/string>/\1/' | sed -e 's/^[[:space:]]*//') + PRECHECK="/Volumes/${VOLUME_NAME}/OBS.app" + NOTARIZE_TARGET="${NOTARIZE_IMAGE}" + elif [ "${NOTARIZE_BUNDLE}" ]; then + PRECHECK="${NOTARIZE_BUNDLE}" + NOTARIZE_TARGET="${NOTARIZE_BUNDLE}" + else + OBS_IMAGE="${BUILD_DIR}/${FILE_NAME}" + + if [ -f "${OBS_IMAGE}" ]; then + OBS_BUNDLE=$(/usr/bin/find "${BUILD_DIR}/_CPack_Packages" -type d -name "OBS.app") + PRECHECK="${OBS_BUNDLE}" + NOTARIZE_TARGET="${OBS_IMAGE}" + else + error "No notarization application bundle ('OBS.app') or disk image ('${NOTARIZE_IMAGE:-${FILE_NAME}}') found" + return + fi + fi + + step "Run notarization pre-checks on OBS.app..." + xcnotary precheck "${PRECHECK}" + + if [ "$?" -eq 0 ]; then + read_codesign_ident + read_codesign_pass + + step "Run xcnotary with ${NOTARIZE_TARGET}..." + xcnotary notarize "${NOTARIZE_TARGET}" --developer-account "${CODESIGN_IDENT_USER}" --developer-password-keychain-item "OBS-Codesign-Password" --provider "${CODESIGN_IDENT_SHORT}" + fi + + if [ "${NOTARIZE_IMAGE}" -a -d "/Volumes/${VOLUME_NAME}" ]; then + step "Detach OBS disk image ${NOTARIZE_IMAGE}..." + hdiutil detach "/Volumes/${VOLUME_NAME}" -quiet + fi +} + +_caught_error_xcnotary() { + error "ERROR during notarization of image '${1}'" + + if [ -d "/Volumes/${1}" ]; then + step "Detach OBS disk image ${1}..." + hdiutil detach "/Volumes/${1}" -quiet + fi + + cleanup + exit 1 +} + +package-obs-standalone() { + PRODUCT_NAME="OBS-Studio" + + CHECKOUT_DIR="$(/usr/bin/git rev-parse --show-toplevel)" + DEPS_BUILD_DIR="${CHECKOUT_DIR}/../obs-build-dependencies" + source "${CHECKOUT_DIR}/CI/include/build_support.sh" + source "${CHECKOUT_DIR}/CI/include/build_support_macos.sh" + + check_archs + check_macos_version + + step "Fetch OBS tags..." + /usr/bin/git fetch origin --tags + + GIT_BRANCH=$(/usr/bin/git rev-parse --abbrev-ref HEAD) + GIT_HASH=$(/usr/bin/git rev-parse --short HEAD) + GIT_TAG=$(/usr/bin/git describe --tags --abbrev=0) + + if [ "${BUILD_FOR_DISTRIBUTION}" ]; then + VERSION_STRING="${GIT_TAG}" + else + VERSION_STRING="${GIT_TAG}-${GIT_HASH}" + fi + + if [ -z "${NOTARIZE_IMAGE}" -a -z "${NOTARIZE_BUNDLE}" ]; then + if [ "${ARCH}" = "arm64" ]; then + FILE_NAME="obs-studio-${VERSION_STRING}-macOS-Apple.dmg" + elif [ "${ARCH}" = "universal" ]; then + FILE_NAME="obs-studio-${VERSION_STRING}-macOS.dmg" + else + FILE_NAME="obs-studio-${VERSION_STRING}-macOS-Intel.dmg" + fi + + package_obs + fi + + if [ "${NOTARIZE}" ]; then + notarize_obs + fi +} + +print_usage() { + echo -e "Usage: ${0}\n" \ + "-h, --help : Print this help\n" \ + "-q, --quiet : Suppress most build process output\n" \ + "-v, --verbose : Enable more verbose build process output\n" \ + "-a, --architecture : Specify build architecture (default: x86_64, alternative: arm64)\n" \ + "-c, --codesign : Codesign OBS and all libraries (default: ad-hoc only)\n" \ + "-n, --notarize : Notarize OBS (default: off)\n" \ + "--notarize-image [IMAGE] : Specify existing OBS disk image for notarization\n" \ + "--notarize-bundle [BUNDLE] : Specify existing OBS application bundle for notarization\n" \ + "--build-dir : Specify alternative build directory (default: build)\n" +} + +package-obs-main() { + if [ -z "${_RUN_OBS_BUILD_SCRIPT}" ]; then + while true; do + case "${1}" in + -h | --help ) print_usage; exit 0 ;; + -q | --quiet ) export QUIET=TRUE; shift ;; + -v | --verbose ) export VERBOSE=TRUE; shift ;; + -a | --architecture ) ARCH="${2}"; shift 2 ;; + -c | --codesign ) CODESIGN=TRUE; shift ;; + -n | --notarize ) NOTARIZE=TRUE; CODESIGN=TRUE; shift ;; + --build-dir ) BUILD_DIR="${2}"; shift 2 ;; + --notarize-image ) NOTARIZE_IMAGE="${2}"; NOTARIZE=TRUE; CODESIGN=TRUE; shift 2 ;; + --notarize-bundle ) NOTARIZE_BUNDLE="${2}"; NOTARIZE=TRUE; CODESIGN=TRUE; shift 2 ;; + -- ) shift; break ;; + * ) break ;; + esac + done + + package-obs-standalone + fi +} + +package-obs-main $* diff --git a/CI/scripts/macos/Brewfile b/CI/scripts/macos/Brewfile deleted file mode 100644 index eff533552..000000000 --- a/CI/scripts/macos/Brewfile +++ /dev/null @@ -1,5 +0,0 @@ -tap "akeru-inc/tap" -brew "cmake" -brew "freetype" -brew "cmocka" -brew "akeru-inc/tap/xcnotary" \ No newline at end of file diff --git a/CI/scripts/macos/app/big_sur_icon_template.psd b/CI/scripts/macos/app/big_sur_icon_template.psd deleted file mode 100644 index 71af91dd1..000000000 Binary files a/CI/scripts/macos/app/big_sur_icon_template.psd and /dev/null differ diff --git a/CI/scripts/macos/app/dylibbundler b/CI/scripts/macos/app/dylibbundler deleted file mode 100755 index 2634e6396..000000000 Binary files a/CI/scripts/macos/app/dylibbundler and /dev/null differ diff --git a/CI/scripts/macos/app/obs.icns b/CI/scripts/macos/app/obs.icns deleted file mode 100644 index 6f878d6a3..000000000 Binary files a/CI/scripts/macos/app/obs.icns and /dev/null differ diff --git a/CI/scripts/macos/package/settings.json.template b/CI/scripts/macos/package/settings.json.template deleted file mode 100644 index de39e030f..000000000 --- a/CI/scripts/macos/package/settings.json.template +++ /dev/null @@ -1,28 +0,0 @@ -{ - "title": "OBS-Studio $$VERSION$$", - "background": "$$CI_PATH$$/package/background.tiff", - "icon": "$$CI_PATH$$/app/AppIcon.icns", - "format": "ULFO", - "icon-size": 96, - "window": { - "position": { - "x": 100, - "y": 100 - }, - "size": { - "width": 540, - "height": 380 - } - }, - "contents": [{ - "x": 124, - "y": 180, - "type": "file", - "path": "$$BUNDLE_PATH$$/OBS.app" - }, { - "x": 416, - "y": 180, - "type": "link", - "path": "/Applications" - }] -} \ No newline at end of file diff --git a/CI/scripts/macos/package/src/background.png b/CI/scripts/macos/package/src/background.png deleted file mode 100644 index 02c4d5501..000000000 Binary files a/CI/scripts/macos/package/src/background.png and /dev/null differ diff --git a/CI/scripts/macos/package/src/background@2x.png b/CI/scripts/macos/package/src/background@2x.png deleted file mode 100644 index a001edf36..000000000 Binary files a/CI/scripts/macos/package/src/background@2x.png and /dev/null differ diff --git a/CI/scripts/macos/package/src/makeRetinaBG b/CI/scripts/macos/package/src/makeRetinaBG deleted file mode 100755 index 5d7f309b5..000000000 --- a/CI/scripts/macos/package/src/makeRetinaBG +++ /dev/null @@ -1 +0,0 @@ -tiffutil -cathidpicheck background.png background@2x.png -out background.tiff diff --git a/CI/windows/01_install_dependencies.ps1 b/CI/windows/01_install_dependencies.ps1 new file mode 100644 index 000000000..395a5c1ae --- /dev/null +++ b/CI/windows/01_install_dependencies.ps1 @@ -0,0 +1,177 @@ +Param( + [Switch]$Help = $(if (Test-Path variable:Help) { $Help }), + [Switch]$Quiet = $(if (Test-Path variable:Quiet) { $Quiet }), + [Switch]$Verbose = $(if (Test-Path variable:Verbose) { $Verbose }), + [ValidateSet("32-bit", "64-bit")] + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" } else { (Get-CimInstance CIM_OperatingSystem).OSArchitecture }) +) + +############################################################################## +# Windows dependency management function +############################################################################## +# +# This script file can be included in build scripts for Windows or run +# directly +# +############################################################################## + +$ErrorActionPreference = "Stop" + +Function Install-obs-deps { + Param( + [Parameter(Mandatory=$true)] + [String]$Version + ) + + Write-Status "Setup for pre-built Windows OBS dependencies v${Version}" + Ensure-Directory $DepsBuildDir + + $ArchSuffix = "$(if ($BuildArch -eq "64-bit") { "x64" } else { "x86" })" + + if (!(Test-Path "${DepsBuildDir}/windows-deps-${Version}-${ArchSuffix}")) { + + Write-Step "Download..." + $ProgressPreference = $(if ($Quiet.isPresent) { "SilentlyContinue" } else { "Continue" }) + Invoke-WebRequest -Uri "https://github.com/obsproject/obs-deps/releases/download/win-${Version}/windows-deps-${Version}-${ArchSuffix}.zip" -UseBasicParsing -OutFile "windows-deps-${Version}-${ArchSuffix}.zip" + $ProgressPreference = "Continue" + + Write-Step "Unpack..." + + Expand-Archive -Path "windows-deps-${Version}-${ArchSuffix}.zip" -DestinationPath "${DepsBuildDir}/windows-deps-${Version}-${ArchSuffix}" -Force + } else { + Write-Step "Found existing pre-built dependencies..." + } +} + +function Install-qt-deps { + Param( + [Parameter(Mandatory=$true)] + [String]$Version + ) + + Write-Status "Setup for pre-built dependency Qt v${Version}" + Ensure-Directory $DepsBuildDir + + $ArchSuffix = "$(if ($BuildArch -eq "64-bit") { "x64" } else { "x86" })" + + if (!(Test-Path "${DepsBuildDir}/windows-deps-${Version}-${ArchSuffix}/mkspecs")) { + + Write-Step "Download..." + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Invoke-WebRequest -Uri "https://cdn-fastly.obsproject.com/downloads/windows-deps-qt-${Version}-${ArchSuffix}.zip" -UseBasicParsing -OutFile "windows-deps-qt-${Version}-${ArchSuffix}.zip" + $ProgressPreference = "Continue" + + Write-Step "Unpack..." + + Expand-Archive -Path "windows-deps-qt-${Version}-${ArchSuffix}.zip" -DestinationPath "${DepsBuildDir}/windows-deps-${Version}-${ArchSuffix}" -Force + } else { + Write-Step "Found existing pre-built Qt..." + } +} + +function Install-vlc { + Param( + [Parameter(Mandatory=$true)] + [String]$Version + ) + + Write-Status "Setup for dependency VLC v${Version}" + Ensure-Directory $DepsBuildDir + + if (!((Test-Path "$DepsBuildDir/vlc-${Version}") -and (Test-Path "$DepsBuildDir/vlc-${Version}/include/vlc/vlc.h"))) { + Write-Step "Download..." + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Invoke-WebRequest -Uri "https://cdn-fastly.obsproject.com/downloads/vlc.zip" -UseBasicParsing -OutFile "vlc_${Version}.zip" + $ProgressPreference = "Continue" + + Write-Step "Unpack..." + # Expand-Archive -Path "vlc_${Version}.zip" + Invoke-Expression "7z x vlc_${Version}.zip -ovlc" + Move-Item -Path vlc -Destination "vlc-${Version}" + } else { + Write-Step "Found existing VLC..." + } +} + +function Install-cef { + Param( + [Parameter(Mandatory=$true)] + [String]$Version + ) + Write-Status "Setup for dependency CEF v${Version} - ${BuildArch}" + + Ensure-Directory $DepsBuildDir + $ArchSuffix = "$(if ($BuildArch -eq "64-bit") { "x64" } else { "x86" })" + + if (!((Test-Path "${DepsBuildDir}/cef_binary_${Version}_windows_${ArchSuffix}") -and (Test-Path "${DepsBuildDir}/cef_binary_${Version}_windows_${ArchSuffix}/build/libcef_dll_wrapper/Release/libcef_dll_wrapper.lib"))) { + Write-Step "Download..." + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Invoke-WebRequest -Uri "https://cdn-fastly.obsproject.com/downloads/cef_binary_${Version}_windows_${ArchSuffix}.zip" -UseBasicParsing -OutFile "cef_binary_${Version}_windows_${ArchSuffix}.zip" + $ProgressPreference = "Continue" + + Write-Step "Unpack..." + Expand-Archive -Path "cef_binary_${Version}_windows_${ArchSuffix}.zip" -Force + } else { + Write-Step "Found existing CEF framework and loader library..." + } +} + +function Install-Dependencies { + Param( + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" }) + ) + + Install-Windows-Dependencies + + $BuildDependencies = @( + @('obs-deps', $WindowsDepsVersion), + @('qt-deps', $WindowsDepsVersion), + @('vlc', $WindowsVlcVersion), + @('cef', $WindowsCefVersion) + ) + + Foreach($Dependency in ${BuildDependencies}) { + $DependencyName = $Dependency[0] + $DependencyVersion = $Dependency[1] + + $FunctionName = "Install-${DependencyName}" + Invoke-Expression "${FunctionName} -Version ${DependencyVersion}" + } + + Ensure-Directory ${CheckoutDir} +} + +function Install-Dependencies-Standalone { + $ProductName = "OBS-Studio" + $CheckoutDir = Resolve-Path -Path "$PSScriptRoot\..\.." + $DepsBuildDir = "${CheckoutDir}/../obs-build-dependencies" + $ObsBuildDir = "${CheckoutDir}/../obs-studio" + + . ${CheckoutDir}/CI/include/build_support_windows.ps1 + + Write-Status "Setup of OBS build dependencies" + Install-Dependencies +} + +function Print-Usage { + $Lines = @( + "Usage: ${_ScriptName}", + "-Help : Print this help", + "-Quiet : Suppress most build process output", + "-Verbose : Enable more verbose build process output", + "-Choco : Enable automatic dependency installation via Chocolatey - Default: off" + "-BuildArch : Build architecture to use (32-bit or 64-bit) - Default: local architecture" + ) + + $Lines | Write-Host +} + +if(!(Test-Path variable:_RunObsBuildScript)) { + $_ScriptName = "$($MyInvocation.MyCommand.Name)" + if($Help.isPresent) { + Print-Usage + exit 0 + } + + Install-Dependencies-Standalone +} diff --git a/CI/windows/02_build_obs.ps1 b/CI/windows/02_build_obs.ps1 new file mode 100644 index 000000000..0a830585b --- /dev/null +++ b/CI/windows/02_build_obs.ps1 @@ -0,0 +1,130 @@ +Param( + [Switch]$Help = $(if (Test-Path variable:Help) { $Help }), + [Switch]$Quiet = $(if (Test-Path variable:Quiet) { $Quiet }), + [Switch]$Verbose = $(if (Test-Path variable:Verbose) { $Verbose }), + [String]$BuildDirectory = $(if (Test-Path variable:BuildDirectory) { "${BuildDirectory}" } else { "build" }), + [ValidateSet("32-bit", "64-bit")] + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" } else { (Get-CimInstance CIM_OperatingSystem).OSArchitecture }), + [ValidateSet("Release", "RelWithDebInfo", "MinSizeRel", "Debug")] + [String]$BuildConfiguration = $(if (Test-Path variable:BuildConfiguration) { "${BuildConfiguration}" } else { "RelWithDebInfo" }) +) + +############################################################################## +# Windows libobs library build function +############################################################################## +# +# This script file can be included in build scripts for Windows or run +# directly +# +############################################################################## + +$ErrorActionPreference = "Stop" + +function Build-OBS { + Param( + [String]$BuildDirectory = $(if (Test-Path variable:BuildDirectory) { "${BuildDirectory}" }), + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" }), + [String]$BuildConfiguration = $(if (Test-Path variable:BuildConfiguration) { "${BuildConfiguration}" }) + ) + + $NumProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors + + if ( $NumProcessors -gt 1 ) { + $env:UseMultiToolTask = $true + $env:EnforceProcessCountAcrossBuilds = $true + } + + Write-Status "Build OBS" + + Configure-OBS + + Ensure-Directory ${CheckoutDir} + Write-Step "Build OBS targets..." + + Invoke-Expression "cmake --build $(if($BuildArch -eq "64-bit") { "build64" } else { "build32" }) --config ${BuildConfiguration}" +} + +function Configure-OBS { + Ensure-Directory ${CheckoutDir} + Write-Status "Configuration of OBS build system..." + + $NumProcessors = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors + + if ( $NumProcessors -gt 1 ) { + $env:UseMultiToolTask = $true + $env:EnforceProcessCountAcrossBuilds = $true + } + + # TODO: Clean up archive and directory naming across dependencies + $CmakePrefixPath = Resolve-Path -Path "${CheckoutDir}/../obs-build-dependencies/windows-deps-${WindowsDepsVersion}-$(if (${BuildArch} -eq "64-bit") { "x64" } else { "x86" })" + $CefDirectory = Resolve-Path -Path "${CheckoutDir}/../obs-build-dependencies/cef_binary_${WindowsCefVersion}_windows_$(if (${BuildArch} -eq "64-bit") { "x64" } else { "x86" })" + $BuildDirectoryActual = "${BuildDirectory}$(if (${BuildArch} -eq "64-bit") { "64" } else { "32" })" + $GeneratorPlatform = "$(if (${BuildArch} -eq "64-bit") { "x64" } else { "Win32" })" + + $CmakeCommand = @( + "-S . -B `"${BuildDirectoryActual}`"", + "-G `"${CmakeGenerator}`"", + "-DCMAKE_GENERATOR_PLATFORM=`"${GeneratorPlatform}`"", + "-DCMAKE_SYSTEM_VERSION=`"${CmakeSystemVersion}`"", + "-DCMAKE_PREFIX_PATH:PATH=`"${CmakePrefixPath}`"", + "-DCEF_ROOT_DIR:PATH=`"${CefDirectory}`"", + "-DENABLE_BROWSER=ON", + "-DVLC_PATH:PATH=`"${CheckoutDir}/../obs-build-dependencies/vlc-${WindowsVlcVersion}`"", + "-DENABLE_VLC=ON", + "-DCMAKE_INSTALL_PREFIX=`"${BuildDirectoryActual}/install`"", + "-DVIRTUALCAM_GUID=`"${Env:VIRTUALCAM-GUID}`"", + "-DTWITCH_CLIENTID=`"${Env:TWITCH_CLIENTID}`"", + "-DTWITCH_HASH=`"${Env:TWITCH_HASH}`"", + "-DRESTREAM_CLIENTID=`"${Env:RESTREAM_CLIENTID}`"", + "-DRESTREAM_HASH=`"${Env:RESTREAM_HASH}`"", + "-DYOUTUBE_CLIENTID=`"${Env:YOUTUBE_CLIENTID}`"", + "-DYOUTUBE_CLIENTID_HASH=`"${Env:YOUTUBE_CLIENTID_HASH}`"", + "-DYOUTUBE_SECRET=`"${Env:YOUTUBE_SECRET}`"", + "-DYOUTUBE_SECRET_HASH=`"${Env:YOUTUBE_SECRET_HASH}`"", + "-DCOPIED_DEPENDENCIES=OFF", + "-DCOPY_DEPENDENCIES=ON", + "-DBUILD_FOR_DISTRIBUTION=`"$(if (Test-Path Env:BUILD_FOR_DISTRIBUTION) { "ON" } else { "OFF" })`"", + "$(if (Test-Path Env:CI) { "-DOBS_BUILD_NUMBER=${Env:GITHUB_RUN_ID}" })", + "$(if (Test-Path Variable:$Quiet) { "-Wno-deprecated -Wno-dev --log-level=ERROR" })" + ) + + Invoke-Expression "cmake ${CmakeCommand}" + + Ensure-Directory ${CheckoutDir} +} + +function Build-OBS-Standalone { + $ProductName = "OBS-Studio" + + $CheckoutDir = Resolve-Path -Path "$PSScriptRoot\..\.." + $DepsBuildDir = "${CheckoutDir}/../obs-build-dependencies" + $ObsBuildDir = "${CheckoutDir}/../obs-studio" + + . ${CheckoutDir}/CI/include/build_support_windows.ps1 + + Build-OBS +} + +function Print-Usage { + $Lines = @( + "Usage: ${_ScriptName}", + "-Help : Print this help", + "-Quiet : Suppress most build process output", + "-Verbose : Enable more verbose build process output", + "-BuildDirectory : Directory to use for builds - Default: build64 on 64-bit systems, build32 on 32-bit systems", + "-BuildArch : Build architecture to use (32-bit or 64-bit) - Default: local architecture", + "-BuildConfiguration : Build configuration to use - Default: RelWithDebInfo" + ) + + $Lines | Write-Host +} + +if(!(Test-Path variable:_RunObsBuildScript)) { + $_ScriptName = "$($MyInvocation.MyCommand.Name)" + if($Help.isPresent) { + Print-Usage + exit 0 + } + + Build-OBS-Standalone +} diff --git a/CI/windows/03_package_obs.ps1 b/CI/windows/03_package_obs.ps1 new file mode 100644 index 000000000..7e4aa96af --- /dev/null +++ b/CI/windows/03_package_obs.ps1 @@ -0,0 +1,155 @@ +Param( + [Switch]$Help = $(if (Test-Path variable:Help) { $Help }), + [Switch]$Quiet = $(if (Test-Path variable:Quiet) { $Quiet }), + [Switch]$Verbose = $(if (Test-Path variable:Verbose) { $Verbose }), + [Switch]$BuildInstaller = $(if ($BuildInstaller.isPresent) { $BuildInstaller }), + [Switch]$CombinedArchs = $(if ($CombinedArchs.isPresent) { $CombinedArchs }), + [String]$BuildDirectory = $(if (Test-Path variable:BuildDirectory) { "${BuildDirectory}" } else { "build" }), + [ValidateSet("32-bit", "64-bit")] + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" } else { (Get-CimInstance CIM_OperatingSystem).OSArchitecture }), + [ValidateSet("Release", "RelWithDebInfo", "MinSizeRel", "Debug")] + [String]$BuildConfiguration = $(if (Test-Path variable:BuildConfiguration) { "${BuildConfiguration}" } else { "RelWithDebInfo" }) +) + +############################################################################## +# Windows OBS package function +############################################################################## +# +# This script file can be included in build scripts for Windows or run +# directly +# +############################################################################## + +$ErrorActionPreference = "Stop" + +function Package-OBS { + Param( + [String]$BuildDirectory = $(if (Test-Path variable:BuildDirectory) { "${BuildDirectory}" }), + [String]$BuildArch = $(if (Test-Path variable:BuildArch) { "${BuildArch}" }), + [String]$BuildConfiguration = $(if (Test-Path variable:BuildConfiguration) { "${BuildConfiguration}" }) + ) + + Write-Status "Package plugin ${ProductName}" + Ensure-Directory ${CheckoutDir} + + if ($CombinedArchs.isPresent) { + if (!(Test-Path env:obsInstallerTempDir)) { + $Env:obsInstallerTempDir = "${CheckoutDir}/install_temp" + } + + if (!(Test-Path ${CheckoutDir}/install_temp/bin/64bit)) { + Write-Step "Build 64-bit OBS..." + Invoke-Expression "cmake -S . -B `"${BuildDirectory}64`" -DCOPIED_DEPENDENCIES=OFF -DCOPY_DEPENDENCIES=ON" + Invoke-Expression "cmake --build `"${BuildDirectory}64`" --config `"${BuildConfiguration}`"" + } + + if (!(Test-Path ${CheckoutDir}/install_temp/bin/32bit)) { + Write-Step "Build 32-bit OBS..." + Invoke-Expression "cmake -S . -B `"${BuildDirectory}32`" -DCOPIED_DEPENDENCIES=OFF -DCOPY_DEPENDENCIES=ON" + Invoke-Expression "cmake --build `"${BuildDirectory}32`" --config `"${BuildConfiguration}`"" + } + + Write-Step "Prepare Installer run..." + Invoke-Expression "cmake -S . -B build -DINSTALLER_RUN=ON -DCMAKE_INSTALL_PREFIX=`"${CheckoutDir}/build/install`"" + Write-Step "Execute Installer run..." + Invoke-Expression "cmake --build build --config `"${BuildConfiguration}`" -t install" + + $CompressVars = @{ + Path = "${CheckoutDir}/build/install/*" + CompressionLevel = "Optimal" + DestinationPath = "${FileName}-Windows.zip" + } + + Write-Step "Creating zip archive..." + + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Compress-Archive -Force @CompressVars + $ProgressPreference = 'Continue' + + } elseif ($BuildArch -eq "64-bit") { + Write-Step "Install 64-bit OBS..." + Invoke-Expression "cmake --build `"${BuildDirectory}64`" --config ${BuildConfiguration} -t install" + + $CompressVars = @{ + Path = "${CheckoutDir}/build64/install/bin", "${CheckoutDir}/build64/install/data", "${CheckoutDir}/build64/install/obs-plugins" + CompressionLevel = "Optimal" + DestinationPath = "${FileName}-Win64.zip" + } + + Write-Step "Creating zip archive..." + + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Compress-Archive -Force @CompressVars + $ProgressPreference = 'Continue' + + } elseif ($BuildArch -eq "32-bit") { + Write-Step "Install 32-bit OBS..." + Invoke-Expression "cmake --build `"${BuildDirectory}32`" --config ${BuildConfiguration} -t install" + + $CompressVars = @{ + Path = "${CheckoutDir}/build32/install/bin", "${CheckoutDir}/build32/install/data", "${CheckoutDir}/build32/install/obs-plugins" + CompressionLevel = "Optimal" + DestinationPath = "${FileName}-Win32.zip" + } + + Write-Step "Creating zip archive..." + + $ProgressPreference = $(if ($Quiet.isPresent) { 'SilentlyContinue' } else { 'Continue' }) + Compress-Archive -Force @CompressVars + $ProgressPreference = 'Continue' + + } +} + +function Package-OBS-Standalone { + $ProductName = "OBS-Studio" + $CheckoutDir = Resolve-Path -Path "$PSScriptRoot\..\.." + + . ${CheckoutDir}/CI/include/build_support_windows.ps1 + + Write-Step "Fetch OBS tags..." + $null = git fetch origin --tags + + Ensure-Directory ${CheckoutDir} + $GitBranch = git rev-parse --abbrev-ref HEAD + $GitHash = git rev-parse --short HEAD + $ErrorActionPreference = "SilentlyContinue" + $GitTag = git describe --tags --abbrev=0 + $ErrorActionPreference = "Stop" + + if(Test-Path variable:BUILD_FOR_DISTRIBUTION) { + $VersionString = "${GitTag}" + } else { + $VersionString = "${GitTag}-${GitHash}" + } + + $FileName = "${ProductName}-${VersionString}" + + Package-OBS +} + +function Print-Usage { + $Lines = @( + "Usage: ${_ScriptName}", + "-Help : Print this help", + "-Quiet : Suppress most build process output", + "-Verbose : Enable more verbose build process output", + "-CombinedArchs : Create combined architecture package", + "-BuildDirectory : Directory to use for builds - Default: build64 on 64-bit systems, build32 on 32-bit systems", + "-BuildArch : Build architecture to use (32-bit or 64-bit) - Default: local architecture", + "-BuildConfiguration : Build configuration to use - Default: RelWithDebInfo" + ) + + $Lines | Write-Host +} + + +if(!(Test-Path variable:_RunObsBuildScript)) { + $_ScriptName = "$($MyInvocation.MyCommand.Name)" + if($Help.isPresent) { + Print-Usage + exit 0 + } + + Package-OBS-Standalone +} diff --git a/CMakeLists.txt b/CMakeLists.txt index f5aaea626..e1ec9107d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,309 +1,92 @@ -cmake_minimum_required(VERSION 3.10) +cmake_minimum_required(VERSION 3.16...3.21) -if (UNIX AND POLICY CMP0072) - # In case of both legacy and glvnd OpenGL libraries found. Prefer GLVND - cmake_policy(SET CMP0072 NEW) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/Modules") +include(VersionConfig) + +# Prohibit in-source builds +if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_SOURCE_DIR}") + message( + FATAL_ERROR + "OBS: You cannot build in a source directory (or any directory with " + "CMakeLists.txt file). Please make a build subdirectory. Feel free to " + "remove CMakeCache.txt and CMakeFiles.") endif() -project(obs-studio) - -option(DEBUG_FFMPEG_MUX "Debug FFmpeg muxer subprocess" FALSE) - +project(obs-studio VERSION ${OBS_VERSION_CANONICAL}) set_property(GLOBAL PROPERTY USE_FOLDERS ON) -if(WIN32) - cmake_minimum_required(VERSION 3.16) - - # Check for Win SDK version 10.0.20348 or above - if(MSVC) - message(STATUS "Windows API version is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") - string(REPLACE "." ";" WINAPI_VER "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") - - list(GET WINAPI_VER 0 WINAPI_VER_MAJOR) - list(GET WINAPI_VER 1 WINAPI_VER_MINOR) - list(GET WINAPI_VER 2 WINAPI_VER_BUILD) - - set(WINAPI_COMPATIBLE FALSE) - if(WINAPI_VER_MAJOR EQUAL 10) - if (WINAPI_VER_MINOR EQUAL 0) - if (WINAPI_VER_BUILD GREATER_EQUAL 20348) - set(WINAPI_COMPATIBLE TRUE) - endif() - else() - set(WINAPI_COMPATIBLE TRUE) - endif() - elseif(WINAPI_VER_MAJOR GREATER 10) - set(WINAPI_COMPATIBLE TRUE) - endif() - - if(NOT WINAPI_COMPATIBLE) - message(FATAL_ERROR "OBS requires Windows 10 SDK version 10.0.20348.0 and above to compile.\nPlease download the most recent Windows 10 SDK in order to compile.") - endif() - endif() - - if (QTDIR OR DEFINED ENV{QTDIR} OR DEFINED ENV{QTDIR32} OR DEFINED ENV{QTDIR64}) - # Qt path set by user or env var - else() - set(QTDIR "" CACHE PATH "Path to Qt (e.g. C:/Qt/5.7/msvc2015_64)") - message(WARNING "QTDIR variable is missing. Please set this variable to specify path to Qt (e.g. C:/Qt/5.7/msvc2015_64)") - endif() - if (DepsPath OR DEFINED ENV{DepsPath} OR DEFINED ENV{DepsPath32} OR DEFINED ENV{DepsPath64}) - # Dependencies path set by user or env var - else() - set(DepsPath "" CACHE PATH "Path to compiled dependencies (e.g. D:/dependencies/win64)") - message(WARNING "DepsPath variable is missing. Please set this variable to specify path to compiled dependencies (e.g. D:/dependencies/win64)") - endif() -endif() - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") -set(ENABLE_SCRIPTING TRUE CACHE BOOL "Enables scripting") -set(SCRIPTING_ENABLED OFF CACHE BOOL "Internal global cmake variable" FORCE) - +# Use target folders for MSVC/Xcode/etc. +include(DeprecationHelpers) include(ObsHelpers) -include(ObsCpack) -include(GNUInstallDirs) -include(CheckCCompilerFlag) -include(CheckCXXCompilerFlag) - -set(OBS_RELEASE_CANDIDATE_MAJOR 0) -set(OBS_RELEASE_CANDIDATE_MINOR 0) -set(OBS_RELEASE_CANDIDATE_PATCH 0) -set(OBS_RELEASE_CANDIDATE 0) -set(OBS_BETA_MAJOR 0) -set(OBS_BETA_MINOR 0) -set(OBS_BETA_PATCH 0) -set(OBS_BETA 0) - -# Must be a string in the format of "x.x.x-rcx" or "x.x.x-betax" -if(DEFINED RELEASE_CANDIDATE) - set(OBS_VERSION "${RELEASE_CANDIDATE}") - string(REPLACE "-rc" "." RC_SPLIT ${RELEASE_CANDIDATE}) - string(REPLACE "." ";" RC_SPLIT ${RC_SPLIT}) - message(WARNING "******************************************************************************\nRelease candidate detected, OBS_VERSION is now: ${OBS_VERSION}\n******************************************************************************") - list(GET RC_SPLIT 0 OBS_RELEASE_CANDIDATE_MAJOR) - list(GET RC_SPLIT 1 OBS_RELEASE_CANDIDATE_MINOR) - list(GET RC_SPLIT 2 OBS_RELEASE_CANDIDATE_PATCH) - list(GET RC_SPLIT 3 OBS_RELEASE_CANDIDATE) -elseif(DEFINED BETA) - set(OBS_VERSION "${BETA}") - string(REPLACE "-beta" "." BETA_SPLIT ${BETA}) - string(REPLACE "." ";" BETA_SPLIT ${BETA_SPLIT}) - message(WARNING "******************************************************************************\nBeta detected, OBS_VERSION is now: ${OBS_VERSION}\n******************************************************************************") - list(GET BETA_SPLIT 0 OBS_BETA_MAJOR) - list(GET BETA_SPLIT 1 OBS_BETA_MINOR) - list(GET BETA_SPLIT 2 OBS_BETA_PATCH) - list(GET BETA_SPLIT 3 OBS_BETA) -endif() - -# Binary Versioning for Windows -if(WIN32) - string(REPLACE "-" ";" UI_VERSION_SPLIT ${OBS_VERSION}) - list(GET UI_VERSION_SPLIT 0 UI_VERSION) - string(REPLACE "." ";" UI_VERSION_SEMANTIC ${UI_VERSION}) - list(GET UI_VERSION_SEMANTIC 0 UI_VERSION_MAJOR) - list(GET UI_VERSION_SEMANTIC 1 UI_VERSION_MINOR) - list(GET UI_VERSION_SEMANTIC 2 UI_VERSION_PATCH) - set(OBS_COMPANY_NAME "OBS") - set(OBS_PRODUCT_NAME "OBS Studio") - set(OBS_COMMENTS "Free and open source software for video recording and live streaming") - set(OBS_LEGAL_COPYRIGHT "(C) Hugh Bailey") - set(MODULE_DESCRIPTION "OBS Studio") - configure_file(UI/obs.rc.in ${PROJECT_BINARY_DIR}/obs.rc) -endif() - -if(MSVC AND NOT EXISTS "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user") - file(GENERATE - OUTPUT "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user" - INPUT "${CMAKE_SOURCE_DIR}/cmake/ALL_BUILD.vcxproj.user.in") -endif() +# Set default compiler flags +include(CompilerConfig) +# Allow selection of common build types via UI if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebInfo) + set(CMAKE_BUILD_TYPE + "RelWithDebInfo" + CACHE STRING + "OBS build type [Release, RelWithDebInfo, Debug, MinSizeRel]" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release RelWithDebInfo + Debug MinSizeRel) endif() -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED YES) -set(CMAKE_CXX_EXTENSIONS NO) +# Global project options +option(BUILD_FOR_DISTRIBUTION "Build for distribution (enables optimisations)" + OFF) +option(ENABLE_UI "Enable building with UI (requires Qt)" ON) +option(ENABLE_SCRIPTING "Enable scripting support" ON) +option(USE_LIBCXX "Use libc++ instead of libstdc++" ${APPLE}) +option( + BUILD_TESTS + "Build test directory (includes test sources and possibly a platform test executable)" + OFF) -if(${CMAKE_C_COMPILER_ID} MATCHES "Clang" OR ${CMAKE_CXX_COMPILER_ID} MATCHES "Clang") - set(CMAKE_COMPILER_IS_CLANG TRUE) +if(OS_WINDOWS) + option( + INSTALLER_RUN + "Build a multiarch installer (needs to run independently after both archs have compiled) (Windows)" + OFF) + +elseif(OS_MACOS) + option(ENABLE_SPARKLE_UPDATER "Enable Sparkle framework for updates (macOS)" + OFF) + +elseif(OS_POSIX) + option(LINUX_PORTABLE "Build portable version (Linux)" OFF) + option(USE_XDG "Utilize XDG Base Directory Specification (Linux)" ON) + if(OS_LINUX) + option(ENABLE_WAYLAND "Enable building with support for Wayland (Linux)" ON) + option(BUILD_FOR_PPA "Build for PPA distribution" OFF) + endif() endif() -if (MSVC_CXX_ARCHITECTURE_ID) - string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) -else () - string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) -endif () +setup_obs_project() +mark_as_advanced(BUILD_TESTS USE_LIBCXX) -if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "(i[3-6]86|x86|x64|x86_64|amd64|e2k)") - if(NOT MSVC) - set(ARCH_SIMD_FLAGS "-mmmx" "-msse" "-msse2") - endif() -elseif(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?") - set(ARCH_SIMD_DEFINES "-DNO_WARN_X86_INTRINSICS") - set(ARCH_SIMD_FLAGS "-mvsx") - add_compile_definitions(NO_WARN_X86_INTRINSICS) -else() - if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSIMDE_ENABLE_OPENMP") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DSIMDE_ENABLE_OPENMP") - CHECK_C_COMPILER_FLAG("-fopenmp-simd" C_COMPILER_SUPPORTS_OPENMP_SIMD) - if(C_COMPILER_SUPPORTS_OPENMP_SIMD) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fopenmp-simd") - endif() - CHECK_CXX_COMPILER_FLAG("-fopenmp-simd" CXX_COMPILER_SUPPORTS_OPENMP_SIMD) - if(CXX_COMPILER_SUPPORTS_OPENMP_SIMD) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp-simd") - endif() - endif() - set(ARCH_SIMD_FLAGS "") - message(STATUS "No Native SSE2 SIMD Support - Using SIMDE") +if(INSTALLER_RUN) + generate_multiarch_installer() + return() endif() -if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG) - set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing") - set(CMAKE_C_FLAGS "-Wall -Wextra -Wvla -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing") +# OBS sources and plugins +add_subdirectory(deps) +add_subdirectory(libobs-opengl) +if(OS_WINDOWS) + add_subdirectory(libobs-d3d11) + add_subdirectory(libobs-winrt) +endif() +add_subdirectory(libobs) +add_subdirectory(plugins) - option(USE_LIBC++ "Use libc++ instead of libstdc++" ${APPLE}) - if(USE_LIBC++) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - endif() -elseif(MSVC) - if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") - endif() +# OBS main app +add_subdirectory(UI) - # Disable pointless constant condition warnings - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127 /wd4201 /wd4456 /wd4457 /wd4458 /wd4459 /wd4595") +# Tests +if(ENABLE_UNIT_TESTS) + enable_testing() endif() -if(WIN32) - add_definitions(-DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS) +if(BUILD_TESTS OR ENABLE_UNIT_TESTS) + add_subdirectory(test) endif() - -if(MSVC) - add_compile_options("/MP") - set(CMAKE_C_FLAGS_DEBUG "/DDEBUG=1 /D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS_DEBUG "/DDEBUG=1 /D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}") - - # https://gitlab.kitware.com/cmake/cmake/-/issues/20812 - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} /Ob2") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Ob2") - - if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") - set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO") - endif() - - foreach(t EXE SHARED MODULE) - set(CMAKE_${t}_LINKER_FLAGS "${CMAKE_${t}_LINKER_FLAGS} /OPT:REF") - set(CMAKE_${t}_LINKER_FLAGS_DEBUG "${CMAKE_${t}_LINKER_FLAGS_DEBUG} /INCREMENTAL:NO") - set(CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${t}_LINKER_FLAGS_RELWITHDEBINFO} /INCREMENTAL:NO /OPT:ICF") - endforeach() -else() - if(MINGW) - set(CMAKE_WIDL "widl" CACHE STRING "wine IDL header file generation program") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600") - endif() - set(CMAKE_C_FLAGS_DEBUG "-DDEBUG=1 -D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}") - set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG=1 -D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}") -endif() - -if(APPLE) - set(CMAKE_MACOSX_RPATH TRUE) - set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) - list(APPEND CMAKE_INSTALL_RPATH "@loader_path/" "@executable_path/") -elseif(UNIX) - option(USE_XDG "Utilize XDG Base Directory Specification" ON) - option(ENABLE_WAYLAND "Build support for Wayland" ON) - if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) - option(ENABLE_DARRAY_TYPE_TEST "Test types of darray argument" ON) - else() - option(ENABLE_DARRAY_TYPE_TEST "Test types of darray argument" OFF) - endif() - - if(USE_XDG) - add_definitions(-DUSE_XDG) - endif() - - if(NOT UNIX_STRUCTURE) - list(APPEND CMAKE_INSTALL_RPATH "$ORIGIN") - endif() - - if(ENABLE_DARRAY_TYPE_TEST) - add_definitions(-DENABLE_DARRAY_TYPE_TEST) - endif() -endif() - -if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "e2k") - foreach(TEST_C_FLAG "-Wno-unused-parameter" "-Wno-ignored-qualifiers" "-Wno-pointer-sign" "-Wno-unused-variable" "-Wno-sign-compare" "-Wno-bad-return-value-type" "-Wno-maybe-uninitialized") - CHECK_C_COMPILER_FLAG(${TEST_C_FLAG} C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG}) - if(C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG}) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_C_FLAG}") - endif() - endforeach() - foreach(TEST_CXX_FLAG "-Wno-invalid-offsetof" "-Wno-maybe-uninitialized") - CHECK_CXX_COMPILER_FLAG(${TEST_CXX_FLAG} CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG}) - if(CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG}) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TEST_CXX_FLAG}") - endif() - endforeach() -endif() - -option(BUILD_TESTS "Build test directory (includes test sources and possibly a platform test executable)" FALSE) -mark_as_advanced(BUILD_TESTS) - -if(NOT INSTALLER_RUN) - option(ENABLE_UI "Enables the OBS user interfaces" ON) - if(DISABLE_UI OR NOT ENABLE_UI) - set(UI_ENABLED FALSE) - else() - set(UI_ENABLED TRUE) - - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() - - if(DEFINED QTDIR${_lib_suffix}) - list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_lib_suffix}}") - elseif(DEFINED QTDIR) - list(APPEND CMAKE_PREFIX_PATH "${QTDIR}") - elseif(DEFINED ENV{QTDIR${_lib_suffix}}) - list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR${_lib_suffix}}") - elseif(DEFINED ENV{QTDIR}) - list(APPEND CMAKE_PREFIX_PATH "$ENV{QTDIR}") - endif() - - find_package(Qt5Widgets REQUIRED) - endif() - - add_subdirectory(deps) - - if(WIN32) - add_subdirectory(libobs-d3d11) - add_subdirectory(libobs-winrt) - endif() - - add_subdirectory(libobs-opengl) - add_subdirectory(libobs) - add_subdirectory(plugins) - add_subdirectory(UI) - - if (ENABLE_UNIT_TESTS) - enable_testing() - endif() - - if (BUILD_TESTS OR ENABLE_UNIT_TESTS) - add_subdirectory(test) - endif() -else() - obs_generate_multiarch_installer() -endif() - -include(CopyMSVCBins) diff --git a/UI/CMakeLists.txt b/UI/CMakeLists.txt index 0530693b6..65fa52a4d 100644 --- a/UI/CMakeLists.txt +++ b/UI/CMakeLists.txt @@ -1,502 +1,413 @@ -if(DISABLE_UI) - message(STATUS "UI disabled") - return() -elseif(ENABLE_UI) - set(FIND_MODE REQUIRED) -else() - set(FIND_MODE QUIET) -endif() - -if(BROWSER_AVAILABLE_INTERNAL) - add_definitions(-DBROWSER_AVAILABLE) -endif() - add_subdirectory(obs-frontend-api) -# ---------------------------------------------------------------------------- +option(ENABLE_UI "Enable building with UI (requires Qt)" ON) +if(NOT ENABLE_UI) + message(STATUS "OBS: DISABLED OBS UI") + return() +endif() + +if(NOT QT_VERSION) + set(QT_VERSION + "5" + CACHE STRING "OBS Qt version [5, 6]" FORCE) + set_property(CACHE QT_VERSION PROPERTY STRINGS 5 6) +endif() project(obs) -set(DISABLE_UPDATE_MODULE TRUE CACHE BOOL "Disables building the update module") +# Legacy support +if(TARGET obs-browser + AND NOT TARGET OBS::browser-panels + AND BROWSER_PANEL_SUPPORT_ENABLED) + add_library(obs-browser-panels INTERFACE) + add_library(OBS::browser-panels ALIAS obs-browser-panels) -if(NOT DEFINED TWITCH_CLIENTID OR "${TWITCH_CLIENTID}" STREQUAL "" OR - NOT DEFINED TWITCH_HASH OR "${TWITCH_HASH}" STREQUAL "" OR - NOT BROWSER_AVAILABLE_INTERNAL) - set(TWITCH_ENABLED FALSE) - set(TWITCH_CLIENTID "") - set(TWITCH_HASH "0") + target_include_directories( + obs-browser-panels INTERFACE ${CMAKE_SOURCE_DIR}/plugins/obs-browser/panel) +endif() + +if(NOT DEFINED TWITCH_CLIENTID + OR "${TWITCH_CLIENTID}" STREQUAL "" + OR NOT DEFINED TWITCH_HASH + OR "${TWITCH_HASH}" STREQUAL "" + OR NOT TARGET OBS::browser-panels) + set(TWITCH_ENABLED OFF) + set(TWITCH_CLIENTID "") + set(TWITCH_HASH "0") else() - set(TWITCH_ENABLED TRUE) + set(TWITCH_ENABLED ON) endif() -if(NOT DEFINED RESTREAM_CLIENTID OR "${RESTREAM_CLIENTID}" STREQUAL "" OR - NOT DEFINED RESTREAM_HASH OR "${RESTREAM_HASH}" STREQUAL "" OR - NOT BROWSER_AVAILABLE_INTERNAL) - set(RESTREAM_ENABLED FALSE) - set(RESTREAM_CLIENTID "") - set(RESTREAM_HASH "0") +if(NOT DEFINED RESTREAM_CLIENTID + OR "${RESTREAM_CLIENTID}" STREQUAL "" + OR NOT DEFINED RESTREAM_HASH + OR "${RESTREAM_HASH}" STREQUAL "" + OR NOT TARGET OBS::browser-panels) + set(RESTREAM_ENABLED OFF) + set(RESTREAM_CLIENTID "") + set(RESTREAM_HASH "0") else() - set(RESTREAM_ENABLED TRUE) + set(RESTREAM_ENABLED ON) endif() -if(DEFINED ENV{YOUTUBE_CLIENTID} AND NOT DEFINED YOUTUBE_CLIENTID) - set(YOUTUBE_CLIENTID "$ENV{YOUTUBE_CLIENTID}") -endif() -if(DEFINED ENV{YOUTUBE_CLIENTID_HASH} AND NOT DEFINED YOUTUBE_CLIENTID_HASH) - set(YOUTUBE_CLIENTID_HASH "$ENV{YOUTUBE_CLIENTID_HASH}") -endif() -if(DEFINED ENV{YOUTUBE_SECRET} AND NOT DEFINED YOUTUBE_SECRET) - set(YOUTUBE_SECRET "$ENV{YOUTUBE_SECRET}") -endif() -if(DEFINED ENV{YOUTUBE_SECRET_HASH} AND NOT DEFINED YOUTUBE_SECRET_HASH) - set(YOUTUBE_SECRET_HASH "$ENV{YOUTUBE_SECRET_HASH}") -endif() - -if(NOT DEFINED YOUTUBE_CLIENTID OR "${YOUTUBE_CLIENTID}" STREQUAL "" OR - NOT DEFINED YOUTUBE_SECRET OR "${YOUTUBE_SECRET}" STREQUAL "" OR - NOT DEFINED YOUTUBE_CLIENTID_HASH OR "${YOUTUBE_CLIENTID_HASH}" STREQUAL "" OR - NOT DEFINED YOUTUBE_SECRET_HASH OR "${YOUTUBE_SECRET_HASH}" STREQUAL "") - set(YOUTUBE_ENABLED FALSE) +if(NOT DEFINED YOUTUBE_CLIENTID + OR "${YOUTUBE_CLIENTID}" STREQUAL "" + OR NOT DEFINED YOUTUBE_SECRET + OR "${YOUTUBE_SECRET}" STREQUAL "" + OR NOT DEFINED YOUTUBE_CLIENTID_HASH + OR "${YOUTUBE_CLIENTID_HASH}" STREQUAL "" + OR NOT DEFINED YOUTUBE_SECRET_HASH + OR "${YOUTUBE_SECRET_HASH}" STREQUAL "") + set(YOUTUBE_ENABLED OFF) else() - set(YOUTUBE_ENABLED TRUE) + set(YOUTUBE_ENABLED ON) endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/ui-config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/ui-config.h") - -set(CMAKE_INCLUDE_CURRENT_DIR TRUE) -set(CMAKE_AUTOMOC TRUE) - -find_package(Threads REQUIRED) - -find_package(Qt5Network ${FIND_MODE}) -find_package(Qt5Widgets ${FIND_MODE}) -find_package(Qt5Svg ${FIND_MODE}) -if(WIN32 AND (Qt5Widgets_VERSION VERSION_LESS 6.0.0)) - find_package(Qt5WinExtras ${FIND_MODE}) -endif() -find_package(Qt5Xml ${FIND_MODE}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ui-config.h.in + ${CMAKE_CURRENT_BINARY_DIR}/ui-config.h) find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat) +find_package(CURL REQUIRED) -if(NOT Qt5Widgets_FOUND) - if (ENABLE_UI) - message(FATAL_ERROR "Failed to find Qt5") - else() - message(STATUS "Qt5 not found - UI disabled") - return() - endif() -endif() +add_subdirectory(frontend-plugins) +add_executable(obs) +find_qt( + VERSION ${QT_VERSION} + COMPONENTS Widgets Network Svg Xml + COMPONENTS_WIN WinExtras + COMPONENTS_LINUX Gui) -include_directories(${FFMPEG_INCLUDE_DIRS}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) -include_directories(SYSTEM "obs-frontend-api") -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/libff") -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/json11") -if(BROWSER_AVAILABLE_INTERNAL) - include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/plugins/obs-browser/panel") -endif() +target_link_libraries(obs PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network) -find_package(Libcurl REQUIRED) -include_directories(${LIBCURL_INCLUDE_DIRS}) -add_definitions(${LIBCURL_DEFINITIONS}) +set_target_properties( + obs + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON + AUTOUIC_SEARCH_PATHS "forms;forms/source-toolbar") -if(WIN32) - include_directories(${BLAKE2_INCLUDE_DIR}) +target_include_directories(obs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}) - set(obs_PLATFORM_SOURCES - platform-windows.cpp - win-update/update-window.cpp - win-update/win-update.cpp - win-update/win-update-helpers.cpp - ${obs-studio_BINARY_DIR}/obs.rc) - set(obs_PLATFORM_HEADERS - win-update/update-window.hpp - win-update/win-update.hpp - win-update/win-update-helpers.hpp) - set(obs_PLATFORM_LIBRARIES - crypt32 - blake2) +target_sources(obs PRIVATE forms/obs.qrc) - if(CMAKE_SIZEOF_VOID_P EQUAL 4) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") - endif() -elseif(APPLE) - set(obs_PLATFORM_SOURCES - platform-osx.mm) +target_sources( + obs + PRIVATE auth-oauth.cpp + auth-oauth.hpp + auth-listener.cpp + auth-listener.hpp + obf.c + obf.h + obs-app.cpp + obs-app.hpp + obs-proxy-style.cpp + obs-proxy-style.hpp + api-interface.cpp + auth-base.cpp + auth-base.hpp + crash-report.cpp + crash-report.hpp + display-helpers.hpp + platform.hpp + qt-display.cpp + qt-display.hpp + qt-wrappers.cpp + qt-wrappers.hpp + ui-validation.cpp + ui-validation.hpp + ${CMAKE_SOURCE_DIR}/deps/json11/json11.cpp + ${CMAKE_SOURCE_DIR}/deps/json11/json11.hpp + ${CMAKE_SOURCE_DIR}/deps/libff/libff/ff-util.c + ${CMAKE_SOURCE_DIR}/deps/libff/libff/ff-util.h + ${CMAKE_CURRENT_BINARY_DIR}/ui-config.h) - find_package(AppKit REQUIRED) - set(obs_PLATFORM_LIBRARIES ${APPKIT_LIBRARIES}) +target_sources( + obs + PRIVATE adv-audio-control.cpp + adv-audio-control.hpp + audio-encoders.cpp + audio-encoders.hpp + balance-slider.hpp + combobox-ignorewheel.cpp + combobox-ignorewheel.hpp + clickable-label.hpp + double-slider.cpp + double-slider.hpp + horizontal-scroll-area.cpp + horizontal-scroll-area.hpp + item-widget-helpers.cpp + item-widget-helpers.hpp + context-bar-controls.cpp + context-bar-controls.hpp + expand-checkbox.hpp + focus-list.cpp + focus-list.hpp + hotkey-edit.cpp + hotkey-edit.hpp + locked-checkbox.cpp + locked-checkbox.hpp + log-viewer.cpp + log-viewer.hpp + media-controls.cpp + media-controls.hpp + media-slider.cpp + media-slider.hpp + menu-button.cpp + menu-button.hpp + mute-checkbox.hpp + properties-view.cpp + properties-view.hpp + properties-view.moc.hpp + record-button.cpp + record-button.hpp + remote-text.cpp + remote-text.hpp + scene-tree.cpp + scene-tree.hpp + screenshot-obj.hpp + slider-absoluteset-style.cpp + slider-absoluteset-style.hpp + slider-ignorewheel.cpp + slider-ignorewheel.hpp + source-label.cpp + source-label.hpp + spinbox-ignorewheel.cpp + spinbox-ignorewheel.hpp + source-tree.cpp + source-tree.hpp + url-push-button.cpp + url-push-button.hpp + undo-stack-obs.cpp + undo-stack-obs.hpp + volume-control.cpp + volume-control.hpp + vertical-scroll-area.cpp + vertical-scroll-area.hpp + visibility-checkbox.cpp + visibility-checkbox.hpp + visibility-item-widget.cpp + visibility-item-widget.hpp) - add_definitions(-fobjc-arc) +target_sources( + obs + PRIVATE window-basic-about.cpp + window-basic-about.hpp + window-basic-auto-config.cpp + window-basic-auto-config.hpp + window-basic-auto-config-test.cpp + window-basic-adv-audio.cpp + window-basic-adv-audio.hpp + window-basic-filters.cpp + window-basic-filters.hpp + window-basic-interaction.cpp + window-basic-interaction.hpp + window-basic-main.cpp + window-basic-main.hpp + window-basic-main-browser.cpp + window-basic-main-dropfiles.cpp + window-basic-main-icons.cpp + window-basic-main-outputs.cpp + window-basic-main-outputs.hpp + window-basic-main-profiles.cpp + window-basic-main-scene-collections.cpp + window-basic-main-screenshot.cpp + window-basic-main-transitions.cpp + window-basic-preview.cpp + window-basic-properties.cpp + window-basic-properties.hpp + window-basic-settings.cpp + window-basic-settings.hpp + window-basic-settings-stream.cpp + window-basic-source-select.cpp + window-basic-source-select.hpp + window-basic-stats.cpp + window-basic-stats.hpp + window-basic-status-bar.cpp + window-basic-status-bar.hpp + window-basic-transform.cpp + window-basic-transform.hpp + window-basic-preview.hpp + window-dock.cpp + window-dock.hpp + window-importer.cpp + window-importer.hpp + window-log-reply.hpp + window-main.hpp + window-missing-files.cpp + window-missing-files.hpp + window-namedialog.cpp + window-namedialog.hpp + window-log-reply.cpp + window-projector.cpp + window-projector.hpp + window-remux.cpp + window-remux.hpp) - option(ENABLE_SPARKLE_UPDATER "Enables updates via the Sparkle framework (don't forget to update the Info.plist for your .app)" OFF) - if(ENABLE_SPARKLE_UPDATER) - find_library(SPARKLE Sparkle) - include_directories(${SPARKLE}) - set(obs_PLATFORM_SOURCES - ${obs_PLATFORM_SOURCES} - sparkle-updater.mm) - set(obs_PLATFORM_LIBRARIES - ${obs_PLATFORM_LIBRARIES} - ${SPARKLE}) - add_definitions(-DUPDATE_SPARKLE=1) - endif() +target_sources( + obs + PRIVATE importers/importers.cpp importers/importers.hpp importers/classic.cpp + importers/sl.cpp importers/studio.cpp importers/xsplit.cpp) -elseif(UNIX) - find_package(Qt5Gui REQUIRED) - find_package(PythonDeps QUIET) +target_compile_features(obs PRIVATE cxx_std_17) - include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) +target_include_directories(obs PRIVATE ${CMAKE_SOURCE_DIR}/deps/json11 + ${CMAKE_SOURCE_DIR}/deps/libff) - set(obs_PLATFORM_SOURCES - platform-x11.cpp) - - set(obs_PLATFORM_LIBRARIES - ${obs_PLATFORM_LIBRARIES} - Qt5::Gui - Qt5::GuiPrivate) - - - if("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") - list(APPEND obs_PLATFORM_LIBRARIES - procstat) - endif() -endif() - -if(BROWSER_AVAILABLE_INTERNAL) - list(APPEND obs_PLATFORM_SOURCES - window-dock-browser.cpp - window-extra-browsers.cpp - ) - list(APPEND obs_PLATFORM_HEADERS - window-dock-browser.hpp - window-extra-browsers.hpp - ) - - if(TWITCH_ENABLED) - list(APPEND obs_PLATFORM_SOURCES - auth-twitch.cpp - ) - list(APPEND obs_PLATFORM_HEADERS - auth-twitch.hpp - ) - endif() - - if(RESTREAM_ENABLED) - list(APPEND obs_PLATFORM_SOURCES - auth-restream.cpp - ) - list(APPEND obs_PLATFORM_HEADERS - auth-restream.hpp - ) - endif() - -endif() - -if(YOUTUBE_ENABLED) - list(APPEND obs_PLATFORM_SOURCES - auth-youtube.cpp - youtube-api-wrappers.cpp - ) - list(APPEND obs_PLATFORM_HEADERS - auth-youtube.hpp - youtube-api-wrappers.hpp - ) -endif() - -set(obs_libffutil_SOURCES - ../deps/libff/libff/ff-util.c - ) -set(obs_libffutil_HEADERS - ../deps/libff/libff/ff-util.h - ) - -if(MSVC) - set_source_files_properties( - ../deps/libff/libff/ff-util.c - PROPERTIES COMPILE_FLAGS -Dinline=__inline - ) - set(obs_PLATFORM_LIBRARIES - ${obs_PLATFORM_LIBRARIES} - w32-pthreads) -endif() - -set(obs_SOURCES - ${obs_PLATFORM_SOURCES} - ${obs_libffutil_SOURCES} - ../deps/json11/json11.cpp - obs-app.cpp - window-dock.cpp - api-interface.cpp - window-basic-main.cpp - window-basic-stats.cpp - window-basic-filters.cpp - window-basic-settings.cpp - window-basic-interaction.cpp - window-basic-properties.cpp - window-basic-auto-config.cpp - window-basic-main-outputs.cpp - window-basic-source-select.cpp - window-basic-settings-stream.cpp - window-basic-main-screenshot.cpp - window-basic-auto-config-test.cpp - window-basic-main-scene-collections.cpp - window-basic-main-transitions.cpp - window-basic-main-dropfiles.cpp - window-basic-main-profiles.cpp - window-basic-main-browser.cpp - window-basic-main-icons.cpp - window-basic-status-bar.cpp - window-basic-adv-audio.cpp - window-basic-transform.cpp - window-basic-preview.cpp - window-basic-about.cpp - window-importer.cpp - media-controls.cpp - window-namedialog.cpp - window-log-reply.cpp - window-projector.cpp - window-remux.cpp - window-missing-files.cpp - auth-base.cpp - auth-oauth.cpp - auth-listener.cpp - obf.c - source-tree.cpp - scene-tree.cpp - properties-view.cpp - focus-list.cpp - menu-button.cpp - double-slider.cpp - slider-ignorewheel.cpp - combobox-ignorewheel.cpp - spinbox-ignorewheel.cpp - record-button.cpp - ui-validation.cpp - url-push-button.cpp - volume-control.cpp - adv-audio-control.cpp - item-widget-helpers.cpp - context-bar-controls.cpp - horizontal-scroll-area.cpp - vertical-scroll-area.cpp - visibility-item-widget.cpp - slider-absoluteset-style.cpp - qt-display.cpp - crash-report.cpp - hotkey-edit.cpp - source-label.cpp - remote-text.cpp - audio-encoders.cpp - qt-wrappers.cpp - log-viewer.cpp - obs-proxy-style.cpp - locked-checkbox.cpp - visibility-checkbox.cpp - media-slider.cpp - undo-stack-obs.cpp) - -set(obs_HEADERS - ${obs_PLATFORM_HEADERS} - ${obs_libffutil_HEADERS} - ../deps/json11/json11.hpp - obs-app.hpp - platform.hpp - window-dock.hpp - window-main.hpp - window-basic-main.hpp - window-basic-stats.hpp - window-basic-filters.hpp - window-basic-settings.hpp - window-basic-interaction.hpp - window-basic-properties.hpp - window-basic-auto-config.hpp - window-basic-main-outputs.hpp - window-basic-source-select.hpp - window-basic-about.hpp - window-basic-status-bar.hpp - window-basic-adv-audio.hpp - window-basic-transform.hpp - window-basic-preview.hpp - window-importer.hpp - media-controls.hpp - window-namedialog.hpp - window-log-reply.hpp - window-projector.hpp - window-remux.hpp - window-missing-files.hpp - auth-base.hpp - auth-oauth.hpp - auth-listener.hpp - obf.h - source-tree.hpp - scene-tree.hpp - properties-view.hpp - properties-view.moc.hpp - display-helpers.hpp - balance-slider.hpp - double-slider.hpp - slider-ignorewheel.hpp - combobox-ignorewheel.hpp - spinbox-ignorewheel.hpp - focus-list.hpp - menu-button.hpp - mute-checkbox.hpp - record-button.hpp - ui-validation.hpp - screenshot-obj.hpp - url-push-button.hpp - volume-control.hpp - adv-audio-control.hpp - item-widget-helpers.hpp - visibility-checkbox.hpp - context-bar-controls.hpp - locked-checkbox.hpp - horizontal-scroll-area.hpp - expand-checkbox.hpp - vertical-scroll-area.hpp - visibility-item-widget.hpp - slider-absoluteset-style.hpp - qt-display.hpp - crash-report.hpp - hotkey-edit.hpp - source-label.hpp - remote-text.hpp - audio-encoders.hpp - qt-wrappers.hpp - clickable-label.hpp - log-viewer.hpp - obs-proxy-style.hpp - obs-proxy-style.hpp - media-slider.hpp - undo-stack-obs.hpp) - -set(obs_importers_HEADERS - importers/importers.hpp) - -set(obs_importers_SOURCES - importers/importers.cpp - importers/classic.cpp - importers/sl.cpp - importers/studio.cpp - importers/xsplit.cpp) - -source_group("importers\\Source Files" FILES ${obs_importers_SOURCES}) -source_group("importers\\Header Files" FILES ${obs_importers_HEADERS}) - -set(obs_UI - forms/source-toolbar/browser-source-toolbar.ui - forms/source-toolbar/device-select-toolbar.ui - forms/source-toolbar/game-capture-toolbar.ui - forms/source-toolbar/image-source-toolbar.ui - forms/source-toolbar/color-source-toolbar.ui - forms/source-toolbar/text-source-toolbar.ui - forms/source-toolbar/media-controls.ui - forms/AutoConfigStartPage.ui - forms/AutoConfigVideoPage.ui - forms/AutoConfigStreamPage.ui - forms/AutoConfigTestPage.ui - forms/ColorSelect.ui - forms/OBSLogReply.ui - forms/OBSBasic.ui - forms/OBSBasicTransform.ui - forms/OBSBasicFilters.ui - forms/OBSBasicSettings.ui - forms/OBSBasicSourceSelect.ui - forms/OBSBasicInteraction.ui - forms/OBSExtraBrowsers.ui - forms/OBSUpdate.ui - forms/OBSRemux.ui - forms/OBSImporter.ui - forms/OBSMissingFiles.ui - forms/OBSAbout.ui) - -set(obs_QRC - forms/obs.qrc) - -if(YOUTUBE_ENABLED) - list(APPEND obs_SOURCES - window-youtube-actions.cpp - ) - list(APPEND obs_HEADERS - window-youtube-actions.hpp - ) - list(APPEND obs_UI - forms/OBSYoutubeActions.ui - ) -endif() - -qt5_wrap_ui(obs_UI_HEADERS ${obs_UI}) -qt5_add_resources(obs_QRC_SOURCES ${obs_QRC}) - -add_executable(obs WIN32 - obs.manifest - ${obs_SOURCES} - ${obs_HEADERS} - ${obs_importers_SOURCES} - ${obs_importers_HEADERS} - ${obs_UI_HEADERS} - ${obs_QRC_SOURCES}) - -if(WIN32) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") - else() - set(_output_suffix "32") - endif() - - set_target_properties(obs - PROPERTIES - OUTPUT_NAME "obs${_output_suffix}") - - if(Qt5Widgets_VERSION VERSION_LESS 6.0.0) - target_link_libraries(obs - Qt5::WinExtras) - endif() -endif() - -target_link_libraries(obs - libobs - Threads::Threads - Qt5::Network - Qt5::Widgets - Qt5::Svg - Qt5::Xml - obs-frontend-api - ${FFMPEG_LIBRARIES} - ${LIBCURL_LIBRARIES} - ${obs_PLATFORM_LIBRARIES}) +target_link_libraries( + obs PRIVATE CURL::libcurl FFmpeg::avcodec FFmpeg::avutil FFmpeg::avformat + OBS::libobs OBS::frontend-api) set_target_properties(obs PROPERTIES FOLDER "frontend") +if(TARGET OBS::browser-panels) + get_target_property(_PANEL_INCLUDE_DIRECTORY OBS::browser-panels + INTERFACE_INCLUDE_DIRECTORIES) + target_include_directories(obs PRIVATE ${_PANEL_INCLUDE_DIRECTORY}) + + target_compile_definitions(obs PRIVATE BROWSER_AVAILABLE) + + target_sources( + obs PRIVATE window-dock-browser.cpp window-dock-browser.hpp + window-extra-browsers.cpp window-extra-browsers.hpp) + + if(TWITCH_ENABLED) + target_sources(obs PRIVATE auth-twitch.cpp auth-twitch.hpp) + endif() + + if(RESTREAM_ENABLED) + target_sources(obs PRIVATE auth-restream.cpp auth-restream.hpp) + endif() +endif() + +if(YOUTUBE_ENABLED) + target_sources( + obs + PRIVATE auth-youtube.cpp auth-youtube.hpp youtube-api-wrappers.cpp + youtube-api-wrappers.hpp window-youtube-actions.cpp + window-youtube-actions.hpp) +endif() + +if(OS_WINDOWS) + set_target_properties(obs PROPERTIES WIN32_EXECUTABLE ON OUTPUT_NAME + "obs${_ARCH_SUFFIX}") + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs.rc.in + ${CMAKE_BINARY_DIR}/obs.rc) + + target_sources( + obs + PRIVATE obs.manifest + platform-windows.cpp + win-update/update-window.cpp + win-update/update-window.hpp + win-update/win-update.cpp + win-update/win-update.hpp + win-update/win-update-helpers.cpp + win-update/win-update-helpers.hpp + ${CMAKE_BINARY_DIR}/obs.rc) + + target_link_libraries(obs PRIVATE crypt32 OBS::blake2 Qt::WinExtras) + + target_compile_features(obs PRIVATE cxx_std_17) + + target_compile_definitions( + obs PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + + if(MSVC) + target_link_libraries(obs PRIVATE OBS::w32-pthreads) + + set_source_files_properties( + ${CMAKE_CURRENT_SOURCE_DIR}../deps/libff/libff/ff-util.c + PROPERTIES COMPILE_FLAGS -Dinline=__inline) + endif() + + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + target_link_options(obs PRIVATE /LARGEADDRESSAWARE) + endif() + + add_subdirectory(win-update/updater) + +elseif(OS_MACOS) + set_target_properties( + obs + PROPERTIES OUTPUT_NAME ${OBS_BUNDLE_NAME} + MACOSX_BUNDLE ON + MACOSX_BUNDLE_INFO_PLIST + ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Info.plist.in) + + if(XCODE) + set_target_properties( + obs + PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "${MACOSX_BUNDLE_GUI_IDENTIFIER}" + XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon + XCODE_ATTRIBUTE_PRODUCT_NAME "OBS") + + set(APP_ICON_TARGET ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Assets.xcassets) + + target_sources(obs PRIVATE ${APP_ICON_TARGET}) + set_source_files_properties(${APP_ICON_TARGET} + PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + else() + set(APP_ICON_TARGET ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/AppIcon.iconset) + set(APP_ICON_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/AppIcon.icns) + + add_custom_command( + OUTPUT ${APP_ICON_OUTPUT} COMMAND iconutil -c icns "${APP_ICON_TARGET}" + -o "${APP_ICON_OUTPUT}") + + set(MACOSX_BUNDLE_ICON_FILE AppIcon.icns) + target_sources(obs PRIVATE ${APP_ICON_OUTPUT} + ${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS) + + set_source_files_properties(${APP_ICON_OUTPUT} + PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + endif() + + find_library(APPKIT Appkit) + mark_as_advanced(APPKIT) + + target_link_libraries(obs PRIVATE ${APPKIT}) + + if(ENABLE_SPARKLE_UPDATER) + find_library(SPARKLE Sparkle) + mark_as_advanced(SPARKLE) + + target_sources(obs PRIVATE sparkle-updater.mm) + target_compile_definitions(obs PRIVATE ENABLE_SPARKLE_UPDATER) + + target_link_libraries(obs PRIVATE ${SPARKLE}) + endif() + + target_sources(obs PRIVATE platform-osx.mm) + + set_source_files_properties(platform-osx.mm PROPERTIES COMPILE_FLAGS + -fobjc-arc) + +elseif(OS_POSIX) + target_sources(obs PRIVATE platform-x11.cpp) + target_link_libraries(obs PRIVATE Qt${QT_VERSION}::GuiPrivate) + + if(TARGET obspython) + find_package(Python REQUIRED COMPONENTS Interpreter Development) + target_link_libraries(obs PRIVATE Python::Python) + target_link_options(obs PRIVATE "LINKER:-no-as-needed") + endif() + + if(NOT LINUX_PORTABLE) + add_subdirectory(xdg-data) + endif() + + if(OS_FREEBSD) + target_link_libraries(obs PRIVATE procstat) + endif() +endif() + define_graphic_modules(obs) - -install_obs_core(obs) -install_obs_data(obs data obs-studio) -install_obs_data_file(obs ../AUTHORS obs-studio/authors) - -if (UNIX AND UNIX_STRUCTURE AND NOT APPLE) - add_subdirectory(xdg-data) -endif() - -if (UNIX AND NOT APPLE) - # python symbols must be in the global symbol table - # so we link the main executable to python if we expect - # obs-scripting python support to be enabled. - # see: https://github.com/obsproject/obs-studio/issues/2222 and https://bugs.python.org/issue36721 - if(NOT DISABLE_PYTHON AND PYTHONLIBS_FOUND) - target_link_libraries(obs ${PYTHON_LIBRARIES}) - set_target_properties(obs PROPERTIES LINK_FLAGS "-Wl,--no-as-needed") - # Use this after cmake 3.13 aka we drop ubuntu 18.04. - # target_link_options(obs PRIVATE "LINKER:-no-as-needed") - endif() -endif() - -add_subdirectory(frontend-plugins) -if(WIN32) - add_subdirectory(win-update/updater) -endif() +setup_obs_app(obs) +setup_target_resources(obs obs-studio) +add_target_resource(obs ${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS + obs-studio/authors) diff --git a/UI/frontend-plugins/aja-output-ui/CMakeLists.txt b/UI/frontend-plugins/aja-output-ui/CMakeLists.txt index 70614a567..6386f61a1 100644 --- a/UI/frontend-plugins/aja-output-ui/CMakeLists.txt +++ b/UI/frontend-plugins/aja-output-ui/CMakeLists.txt @@ -1,161 +1,85 @@ project(aja-output-ui) -if(DISABLE_AJA) - message(STATUS "aja-output-ui plugin disabled") - return() +if(NOT ENABLE_AJA) + return() endif() -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - find_package(LibAJANTV2) - if (NOT LIBAJANTV2_FOUND) - message(STATUS "aja-output-ui plugin disabled (deps not found)") - return() - else() - message("aja-output-ui includes: ${LIBAJANTV2_INCLUDE_DIRS}") - message("aja-output-ui libs: ${LIBAJANTV2_LIBRARIES}") - endif() +find_package(LibAJANTV2 REQUIRED) + +add_library(aja-output-ui MODULE) +add_library(OBS::aja-output-ui ALIAS aja-output-ui) + +find_qt(VERSION ${QT_VERSION} COMPONENTS Widgets) + +set_target_properties( + aja-output-ui + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON + AUTOUIC_SEARCH_PATHS "forms") + +target_sources( + aja-output-ui + PRIVATE AJAOutputUI.h + AJAOutputUI.cpp + aja-ui-main.cpp + aja-ui-main.h + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-card-manager.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-card-manager.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-common.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-common.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-enums.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-presets.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-presets.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-props.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-props.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-routing.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-routing.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-ui-props.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-vpid-data.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-vpid-data.hpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-widget-io.cpp + ${CMAKE_SOURCE_DIR}/plugins/aja/aja-widget-io.hpp + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.cpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.cpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp) + +target_link_libraries(aja-output-ui PRIVATE OBS::libobs OBS::frontend-api + Qt::Widgets AJA::LibAJANTV2) + +if(OS_MACOS) + find_library(IOKIT_FRAMEWORK Iokit) + find_library(COREFOUNDATION_LIBRARY CoreFoundation) + find_library(APPKIT_FRAMEWORK AppKit) + + target_link_libraries(aja-output-ui PRIVATE ${IOKIT} ${COREFOUNDATION} + ${APPKIT}) +elseif(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS AJA Output UI") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + aja-output-ui.rc) + target_sources(aja-output-ui PRIVATE aja-output-ui.rc) + + target_link_libraries(aja-output-ui PRIVATE ws2_32.lib setupapi.lib Winmm.lib + netapi32.lib Shlwapi.lib) else() - message(STATUS "aja-output-ui disabled (32-bit not supported)") - return() + find_package(X11 REQUIRED) + target_link_libraries(aja-output-ui PRIVATE X11::X11 + Qt${QT_VERSION}::GuiPrivate) endif() -if(APPLE) - find_library(COCOA Cocoa) - include_directories(${COCOA}) -endif() +set_target_properties(aja-output-ui PROPERTIES FOLDER "frontend" PREFIX "") -if(UNIX AND NOT APPLE) - find_package(X11 REQUIRED) - link_libraries(${X11_LIBRARIES}) - include_directories(${X11_INCLUDE_DIR}) - - find_package(Qt5X11Extras REQUIRED) -endif() - -set(aja-output-ui_HEADERS - ${aja-output-ui_HEADERS} - ../../qt-wrappers.hpp - ../../properties-view.hpp - ../../properties-view.moc.hpp - ../../vertical-scroll-area.hpp - ../../double-slider.hpp - ../../slider-ignorewheel.hpp - ../../combobox-ignorewheel.hpp - ../../spinbox-ignorewheel.hpp - AJAOutputUI.h - aja-ui-main.h - ../../../plugins/aja/aja-card-manager.hpp - ../../../plugins/aja/aja-common.hpp - ../../../plugins/aja/aja-enums.hpp - ../../../plugins/aja/aja-presets.hpp - ../../../plugins/aja/aja-props.hpp - ../../../plugins/aja/aja-routing.hpp - ../../../plugins/aja/aja-ui-props.hpp - ../../../plugins/aja/aja-vpid-data.hpp - ../../../plugins/aja/aja-widget-io.hpp - ) - -set(aja-output-ui_SOURCES - ${aja-output-ui_SOURCES} - ../../qt-wrappers.cpp - ../../properties-view.cpp - ../../vertical-scroll-area.cpp - ../../double-slider.cpp - ../../slider-ignorewheel.cpp - ../../combobox-ignorewheel.cpp - ../../spinbox-ignorewheel.cpp - AJAOutputUI.cpp - aja-ui-main.cpp - ../../../plugins/aja/aja-card-manager.cpp - ../../../plugins/aja/aja-common.cpp - ../../../plugins/aja/aja-presets.cpp - ../../../plugins/aja/aja-props.cpp - ../../../plugins/aja/aja-routing.cpp - ../../../plugins/aja/aja-vpid-data.cpp - ../../../plugins/aja/aja-widget-io.cpp - ) - -set(aja-output-ui_UI - ${aja-output-ui_UI} - forms/output.ui) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS AJA Output UI") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in aja-output-ui.rc) - list(APPEND aja-output-ui_SOURCES - aja-output-ui.rc) -endif() - -if(APPLE) - set(aja-output-ui_PLATFORM_LIBS - ${COCOA}) -endif() - -qt5_wrap_ui(aja-output-ui_UI_HEADERS - ${aja-output-ui_UI}) - -add_library(aja-output-ui MODULE - ${aja-output-ui_HEADERS} - ${aja-output-ui_SOURCES} - ${aja-output-ui_UI_HEADERS}) - -set(aja_LIBRARIES - $,${LIBAJANTV2_DEBUG_LIBRARIES},${LIBAJANTV2_LIBRARIES}> - libobs) - -# macOS -if(APPLE) - set(aja_COMPILE_DEFS - AJAMac - AJA_MAC) - - find_library(IOKIT_FRAMEWORK Iokit) - find_library(COREFOUNDATION_LIBRARY CoreFoundation) - find_library(APPKIT_FRAMEWORK AppKit) - - list(APPEND aja_LIBRARIES - ${IOKIT_FRAMEWORK} - ${COREFOUNDATION_LIBRARY} - ${APPKIT_FRAMEWORK}) - # Windows -elseif(WIN32) - set(aja_COMPILE_DEFS - AJA_WINDOWS - _WINDOWS - WIN32 - MSWindows) - - if(CMAKE_BUILD_TYPE STREQUAL Debug) - list(APPEND aja_COMPILE_DEFS - _DEBUG) - else() - list(APPEND aja_COMPILE_DEFS - NDEBUG) - endif() - - list(APPEND aja_LIBRARIES - ws2_32.lib - setupapi.lib - Winmm.lib - netapi32.lib - Shlwapi.lib) - # Linux -elseif(UNIX AND NOT APPLE) - set(aja_COMPILE_DEFS - AJA_LINUX - AJALinux) -endif() - -target_include_directories(aja-output-ui PUBLIC - ${LIBAJANTV2_INCLUDE_DIRS}) -target_compile_definitions(aja-output-ui PUBLIC ${aja_COMPILE_DEFS}) -target_link_libraries(aja-output-ui - ${frontend-tools_PLATFORM_LIBS} - ${aja_LIBRARIES} - obs-frontend-api - Qt5::Widgets - libobs) - -set_target_properties(aja-output-ui PROPERTIES FOLDER "frontend") - -install_obs_plugin_with_data(aja-output-ui data) +setup_plugin_target(aja-output-ui) diff --git a/UI/frontend-plugins/decklink-captions/CMakeLists.txt b/UI/frontend-plugins/decklink-captions/CMakeLists.txt index a9fab317e..b478d50da 100644 --- a/UI/frontend-plugins/decklink-captions/CMakeLists.txt +++ b/UI/frontend-plugins/decklink-captions/CMakeLists.txt @@ -1,51 +1,48 @@ project(decklink-captions) -if(APPLE) - find_library(COCOA Cocoa) - include_directories(${COCOA}) +if(NOT ENABLE_DECKLINK) + return() endif() -if(UNIX AND NOT APPLE) - find_package(X11 REQUIRED) - link_libraries(${X11_LIBRARIES}) - include_directories(${X11_INCLUDE_DIR}) +add_library(decklink-captions MODULE) +add_library(OBS::decklink-captions ALIAS decklink-captions) + +find_qt(VERSION ${QT_VERSION} COMPONENTS Widgets) + +target_link_libraries(decklink-captions PRIVATE Qt::Widgets) + +set_target_properties( + decklink-captions + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON + AUTOUIC_SEARCH_PATHS "forms") + +target_compile_features(decklink-captions PRIVATE cxx_std_17) + +target_sources(decklink-captions PRIVATE decklink-captions.cpp + decklink-captions.h) + +target_link_libraries(decklink-captions PRIVATE OBS::frontend-api OBS::libobs) + +if(OS_MACOS) + find_library(COCOA Cocoa) + mark_as_advanced(COCOA) + target_link_libraries(decklink-captions PRIVATE ${COCOA}) + +elseif(OS_POSIX) + find_package(X11 REQUIRED) + mark_as_advanced(X11) + target_link_libraries(decklink-captions PRIVATE X11::X11) +elseif(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS DeckLink Captions module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + decklink-captions.rc) + + target_sources(decklink-captions PRIVATE decklink-captions.rc) endif() -set(decklink-captions_HEADERS - decklink-captions.h - ) -set(decklink-captions_SOURCES - decklink-captions.cpp - ) -set(decklink-captions_UI - forms/captions.ui - ) +set_target_properties(decklink-captions PROPERTIES FOLDER "plugins/decklink" + PREFIX "") -if(WIN32) - set(MODULE_DESCRIPTION "OBS DeckLink Captions module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in decklink-captions.rc) - list(APPEND decklink-captions_SOURCES - decklink-captions.rc) -endif() - -if(APPLE) - set(decklink-captions_PLATFORM_LIBS - ${COCOA}) -endif() - -qt5_wrap_ui(decklink-captions_UI_HEADERS - ${decklink-captions_UI}) - -add_library(decklink-captions MODULE - ${decklink-captions_HEADERS} - ${decklink-captions_SOURCES} - ${decklink-captions_UI_HEADERS} - ) -target_link_libraries(decklink-captions - ${frontend-tools_PLATFORM_LIBS} - obs-frontend-api - Qt5::Widgets - libobs) -set_target_properties(decklink-captions PROPERTIES FOLDER "plugins/decklink") - -install_obs_plugin_with_data(decklink-captions data) +setup_plugin_target(decklink-captions) diff --git a/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt index 6acd8830c..020d6b740 100644 --- a/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt +++ b/UI/frontend-plugins/decklink-output-ui/CMakeLists.txt @@ -1,72 +1,104 @@ project(decklink-output-ui) -if(APPLE) - find_library(COCOA Cocoa) - include_directories(${COCOA}) +if(NOT ENABLE_DECKLINK) + return() endif() -if(UNIX AND NOT APPLE) - find_package(X11 REQUIRED) - link_libraries(${X11_LIBRARIES}) - include_directories(${X11_INCLUDE_DIR}) +if(NOT COMMAND find_qt) + macro(find_qt) + set(oneValueArgs VERSION) + set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC + COMPONENTS_LINUX) + cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN}) + + if(OS_WINDOWS) + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN} + REQUIRED) + elseif(OS_MACOS) + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC} + REQUIRED) + else() + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX} + REQUIRED) + endif() + + foreach(_COMPONENT IN LISTS ${FIND_QT_COMPONENTS}) + if(NOT TARGET Qt::${_COMPONENT} AND TARGET + Qt${FIND_QT_VERSION}::${_COMPONENT}) + add_library(Qt::${_COMPONENT} ALIAS Qt${FIND_QT_VERSION}::${_COMPONENT}) + endif() + endforeach() + endmacro() endif() -set(decklink-ouput-ui_HEADERS - ${decklink-ouput-ui_HEADERS} - ../../qt-wrappers.hpp - ../../properties-view.hpp - ../../properties-view.moc.hpp - ../../vertical-scroll-area.hpp - ../../double-slider.hpp - ../../slider-ignorewheel.hpp - ../../combobox-ignorewheel.hpp - ../../spinbox-ignorewheel.hpp - ./DecklinkOutputUI.h - decklink-ui-main.h - ) -set(decklink-ouput-ui_SOURCES - ${decklink-ouput-ui_SOURCES} - ../../qt-wrappers.cpp - ../../properties-view.cpp - ../../vertical-scroll-area.cpp - ../../double-slider.cpp - ../../slider-ignorewheel.cpp - ../../combobox-ignorewheel.cpp - ../../spinbox-ignorewheel.cpp - ./DecklinkOutputUI.cpp - decklink-ui-main.cpp - ) -set(decklink-ouput-ui_UI - ${decklink-ouput-ui_UI} - forms/output.ui - ) +add_library(decklink-output-ui MODULE) +add_library(OBS::decklink-output-ui ALIAS decklink-output-ui) -if(WIN32) - set(MODULE_DESCRIPTION "OBS DeckLink Output UI") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in decklink-ouput-ui.rc) - list(APPEND decklink-ouput-ui_SOURCES - decklink-ouput-ui.rc) +find_qt( + VERSION ${QT_VERSION} + COMPONENTS Widgets + COMPONENTS_LINUX Gui) + +set_target_properties( + decklink-output-ui + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON + AUTOUIC_SEARCH_PATHS "forms") + +target_sources( + decklink-output-ui + PRIVATE DecklinkOutputUI.cpp + DecklinkOutputUI.h + decklink-ui-main.cpp + decklink-ui-main.h + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.cpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.cpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp) + +target_link_libraries(decklink-output-ui PRIVATE OBS::libobs OBS::frontend-api + Qt::Widgets) + +target_compile_features(decklink-output-ui PRIVATE cxx_std_17) + +set_target_properties(decklink-output-ui PROPERTIES FOLDER "frontend" PREFIX "") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Decklink Output UI") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + decklink-output-ui.rc) + + target_sources(decklink-output-ui PRIVATE decklink-output-ui.rc) + +elseif(OS_MACOS) + find_library(COCOA Cocoa) + mark_as_advanced(COCOA) + + target_link_libraries(decklink-output-ui PRIVATE ${COCOA}) + +elseif(OS_POSIX) + find_package(X11 REQUIRED) + target_link_libraries(decklink-output-ui PRIVATE X11::X11 + Qt${QT_VERSION}::GuiPrivate) endif() -if(APPLE) - set(decklink-ouput-ui_PLATFORM_LIBS - ${COCOA}) -endif() - -qt5_wrap_ui(decklink-ouput-ui_UI_HEADERS - ${decklink-ouput-ui_UI}) - -add_library(decklink-ouput-ui MODULE - ${decklink-ouput-ui_HEADERS} - ${decklink-ouput-ui_SOURCES} - ${decklink-ouput-ui_UI_HEADERS} - ) -target_link_libraries(decklink-ouput-ui - ${frontend-tools_PLATFORM_LIBS} - obs-frontend-api - Qt5::Widgets - libobs) - -set_target_properties(decklink-ouput-ui PROPERTIES FOLDER "frontend") - -install_obs_plugin_with_data(decklink-ouput-ui data) +setup_plugin_target(decklink-output-ui) diff --git a/UI/frontend-plugins/frontend-tools/CMakeLists.txt b/UI/frontend-plugins/frontend-tools/CMakeLists.txt index 46e628606..b8894ef47 100644 --- a/UI/frontend-plugins/frontend-tools/CMakeLists.txt +++ b/UI/frontend-plugins/frontend-tools/CMakeLists.txt @@ -1,128 +1,106 @@ project(frontend-tools) -if(APPLE) - find_library(COCOA Cocoa) - include_directories(${COCOA}) +add_library(frontend-tools MODULE) +add_library(OBS::frontend-tools ALIAS frontend-tools) + +find_qt( + VERSION ${QT_VERSION} + COMPONENTS Widgets + COMPONENTS_LINUX Gui) + +set_target_properties( + frontend-tools + PROPERTIES AUTOMOC ON + AUTOUIC ON + AUTORCC ON + AUTOUIC_SEARCH_PATHS "forms") + +target_sources( + frontend-tools + PRIVATE frontend-tools.c + auto-scene-switcher.hpp + auto-scene-switcher.cpp + output-timer.hpp + tool-helpers.hpp + output-timer.cpp + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/combobox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.cpp + ${CMAKE_SOURCE_DIR}/UI/double-slider.hpp + ${CMAKE_SOURCE_DIR}/UI/horizontal-scroll-area.cpp + ${CMAKE_SOURCE_DIR}/UI/horizontal-scroll-area.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.cpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.hpp + ${CMAKE_SOURCE_DIR}/UI/properties-view.moc.hpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.cpp + ${CMAKE_SOURCE_DIR}/UI/qt-wrappers.hpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/spinbox-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.cpp + ${CMAKE_SOURCE_DIR}/UI/slider-ignorewheel.hpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.hpp + ${CMAKE_SOURCE_DIR}/UI/vertical-scroll-area.cpp) + +target_compile_features(frontend-tools PRIVATE cxx_std_17) + +target_link_libraries(frontend-tools PRIVATE OBS::frontend-api OBS::libobs + Qt::Widgets) + +if(OS_POSIX AND NOT OS_MACOS) + target_link_libraries(frontend-tools PRIVATE Qt${QT_VERSION}::GuiPrivate) endif() -if(UNIX AND NOT APPLE) - find_package(X11 REQUIRED) - link_libraries(${X11_LIBRARIES}) - include_directories(${X11_INCLUDE_DIR}) +if(ENABLE_SCRIPTING AND TARGET OBS::scripting) + target_compile_definitions(frontend-tools PRIVATE ENABLE_SCRIPTING) + + target_sources(frontend-tools PRIVATE scripts.cpp scripts.hpp) + + target_link_libraries(frontend-tools PRIVATE OBS::scripting) + + if(TARGET obslua) + target_compile_definitions(frontend-tools PRIVATE LUAJIT_FOUND) + endif() + + if(TARGET obspython) + target_compile_definitions(frontend-tools PRIVATE Python_FOUND) + endif() endif() -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/obs-scripting") +set_target_properties(frontend-tools PROPERTIES FOLDER "frontend" PREFIX "") -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/frontend-tools-config.h.in" - "${CMAKE_BINARY_DIR}/config/frontend-tools-config.h") +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Frontend Tools") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + frontend-tools.rc) -set(frontend-tools_HEADERS - ${frontend-tools_HEADERS} - "${CMAKE_BINARY_DIR}/config/frontend-tools-config.h" - auto-scene-switcher.hpp - output-timer.hpp - tool-helpers.hpp - ../../properties-view.hpp - ../../properties-view.moc.hpp - ../../horizontal-scroll-area.hpp - ../../vertical-scroll-area.hpp - ../../double-slider.hpp - ../../slider-ignorewheel.hpp - ../../combobox-ignorewheel.hpp - ../../spinbox-ignorewheel.hpp - ../../qt-wrappers.hpp - ) -set(frontend-tools_SOURCES - ${frontend-tools_SOURCES} - auto-scene-switcher.cpp - frontend-tools.c - output-timer.cpp - ../../properties-view.cpp - ../../horizontal-scroll-area.cpp - ../../vertical-scroll-area.cpp - ../../double-slider.cpp - ../../slider-ignorewheel.cpp - ../../combobox-ignorewheel.cpp - ../../spinbox-ignorewheel.cpp - ../../qt-wrappers.cpp - ) -set(frontend-tools_UI - ${frontend-tools_UI} - forms/auto-scene-switcher.ui - forms/output-timer.ui - ) + target_sources( + frontend-tools + PRIVATE auto-scene-switcher-win.cpp + frontend-tools.rc + captions.cpp + captions.hpp + captions-handler.cpp + captions-handler.hpp + captions-mssapi.cpp + captions-mssapi.hpp + captions-mssapi-stream.cpp + captions-mssapi-stream.hpp) -if(SCRIPTING_ENABLED) - set(frontend-tools_HEADERS - ${frontend-tools_HEADERS} - scripts.hpp - ) - set(frontend-tools_SOURCES - ${frontend-tools_SOURCES} - scripts.cpp - ) - set(frontend-tools_UI - ${frontend-tools_UI} - forms/scripts.ui - ) - set(EXTRA_LIBS - ${EXTRA_LIBS} - obs-scripting - ) +elseif(OS_MACOS) + find_library(COCOA Cocoa) + mark_as_advanced(COCOA) + target_link_libraries(frontend-tools PRIVATE ${COCOA}) + + target_sources(frontend-tools PRIVATE auto-scene-switcher-osx.mm) + set_source_files_properties(auto-scene-switcher-osx.mm + PROPERTIES COMPILE_FLAGS -fobjc-arc) + +elseif(OS_POSIX) + find_package(X11 REQUIRED) + + target_link_libraries(frontend-tools PRIVATE X11::X11) + + target_sources(frontend-tools PRIVATE auto-scene-switcher-nix.cpp) endif() -if(WIN32) - set(MODULE_DESCRIPTION "OBS Frontend Tools") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in frontend-tools.rc) - set(frontend-tools_PLATFORM_SOURCES - auto-scene-switcher-win.cpp - frontend-tools.rc) - - set(frontend-tools_PLATFORM_SOURCES - ${frontend-tools_PLATFORM_SOURCES} - captions.cpp - captions-handler.cpp - captions-mssapi.cpp - captions-mssapi-stream.cpp) - set(frontend-tools_PLATFORM_HEADERS - captions.hpp - captions-handler.hpp - captions-mssapi.hpp - captions-mssapi-stream.hpp) - set(frontend-tools_PLATFORM_UI - forms/captions.ui) -elseif(APPLE) - set(frontend-tools_PLATFORM_SOURCES - auto-scene-switcher-osx.mm) - set_source_files_properties(auto-scene-switcher-osx.mm - PROPERTIES COMPILE_FLAGS "-fobjc-arc") - - set(frontend-tools_PLATFORM_LIBS - ${COCOA}) -else() - set(frontend-tools_PLATFORM_SOURCES - auto-scene-switcher-nix.cpp) -endif() - -qt5_wrap_ui(frontend-tools_UI_HEADERS - ${frontend-tools_UI} - ${frontend-tools_PLATFORM_UI}) - -add_library(frontend-tools MODULE - ${frontend-tools_HEADERS} - ${frontend-tools_SOURCES} - ${frontend-tools_UI_HEADERS} - ${frontend-tools_PLATFORM_SOURCES} - ${frontend-tools_PLATFORM_HEADERS} - ) -target_link_libraries(frontend-tools - ${frontend-tools_PLATFORM_LIBS} - ${EXTRA_LIBS} - obs-frontend-api - Qt5::Widgets - libobs) - -set_target_properties(frontend-tools PROPERTIES FOLDER "frontend") - -install_obs_plugin_with_data(frontend-tools data) +setup_plugin_target(frontend-tools) diff --git a/UI/frontend-plugins/frontend-tools/frontend-tools-config.h.in b/UI/frontend-plugins/frontend-tools/frontend-tools-config.h.in index c2e45d9f5..e851311de 100644 --- a/UI/frontend-plugins/frontend-tools/frontend-tools-config.h.in +++ b/UI/frontend-plugins/frontend-tools/frontend-tools-config.h.in @@ -16,6 +16,6 @@ #define OFF 0 #endif -#define ENABLE_SCRIPTING @SCRIPTING_ENABLED@ -#define COMPILE_LUA @COMPILE_LUA@ -#define COMPILE_PYTHON @COMPILE_PYTHON@ +#cmakedefine ENABLE_SCRIPTING +#cmakedefine LUAJIT_FOUND +#cmakedefine Python_FOUND diff --git a/UI/frontend-plugins/frontend-tools/frontend-tools.c b/UI/frontend-plugins/frontend-tools/frontend-tools.c index 2b9cb812e..a52d1ec8c 100644 --- a/UI/frontend-plugins/frontend-tools/frontend-tools.c +++ b/UI/frontend-plugins/frontend-tools/frontend-tools.c @@ -1,5 +1,4 @@ #include -#include "frontend-tools-config.h" OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("frontend-tools", "en-US") @@ -15,7 +14,7 @@ void FreeCaptions(); void InitOutputTimer(); void FreeOutputTimer(); -#if ENABLE_SCRIPTING +#if defined(ENABLE_SCRIPTING) void InitScripts(); void FreeScripts(); #endif @@ -27,7 +26,7 @@ bool obs_module_load(void) #endif InitSceneSwitcher(); InitOutputTimer(); -#if ENABLE_SCRIPTING +#if defined(ENABLE_SCRIPTING) InitScripts(); #endif return true; @@ -40,7 +39,7 @@ void obs_module_unload(void) #endif FreeSceneSwitcher(); FreeOutputTimer(); -#if ENABLE_SCRIPTING +#if defined(ENABLE_SCRIPTING) FreeScripts(); #endif } diff --git a/UI/frontend-plugins/frontend-tools/scripts.cpp b/UI/frontend-plugins/frontend-tools/scripts.cpp index 40eafcccb..3b37933f5 100644 --- a/UI/frontend-plugins/frontend-tools/scripts.cpp +++ b/UI/frontend-plugins/frontend-tools/scripts.cpp @@ -1,6 +1,5 @@ #include "obs-module.h" #include "scripts.hpp" -#include "frontend-tools-config.h" #include "../../properties-view.hpp" #include "../../qt-wrappers.hpp" @@ -33,7 +32,7 @@ #include "ui_scripts.h" -#if COMPILE_PYTHON && (defined(_WIN32) || defined(__APPLE__)) +#if defined(Python_FOUND) && (defined(_WIN32) || defined(__APPLE__)) #define PYTHON_UI 1 #else #define PYTHON_UI 0 diff --git a/UI/obs-app.cpp b/UI/obs-app.cpp index 1eac7f7e9..217d5f4c4 100644 --- a/UI/obs-app.cpp +++ b/UI/obs-app.cpp @@ -2064,6 +2064,12 @@ static int run_program(fstream &logFile, int argc, char *argv[]) #if __APPLE__ InstallNSApplicationSubclass(); + + if (!isInBundle()) { + blog(LOG_ERROR, + "OBS cannot be run as a standalone binary on macOS. Run the Application bundle instead."); + return ret; + } #endif #if !defined(_WIN32) && !defined(__APPLE__) && defined(USE_XDG) && \ @@ -2339,13 +2345,13 @@ static void load_debug_privilege(void) #define CONFIG_PATH BASE_PATH "/config" -#ifndef OBS_UNIX_STRUCTURE -#define OBS_UNIX_STRUCTURE 0 +#ifndef LINUX_PORTABLE +#define LINUX_PORTABLE 0 #endif int GetConfigPath(char *path, size_t size, const char *name) { - if (!OBS_UNIX_STRUCTURE && portable_mode) { + if (LINUX_PORTABLE && portable_mode) { if (name && *name) { return snprintf(path, size, CONFIG_PATH "/%s", name); } else { @@ -2358,7 +2364,7 @@ int GetConfigPath(char *path, size_t size, const char *name) char *GetConfigPathPtr(const char *name) { - if (!OBS_UNIX_STRUCTURE && portable_mode) { + if (LINUX_PORTABLE && portable_mode) { char path[512]; if (snprintf(path, sizeof(path), CONFIG_PATH "/%s", name) > 0) { @@ -2870,7 +2876,7 @@ int main(int argc, char *argv[]) } } -#if !OBS_UNIX_STRUCTURE +#if defined(LINUX_PORTABLE) if (!portable_mode) { portable_mode = os_file_exists(BASE_PATH "/portable_mode") || diff --git a/UI/obs-frontend-api/CMakeLists.txt b/UI/obs-frontend-api/CMakeLists.txt index c07348d05..26f94dd5c 100644 --- a/UI/obs-frontend-api/CMakeLists.txt +++ b/UI/obs-frontend-api/CMakeLists.txt @@ -1,41 +1,40 @@ +if(POLICY CMP0090) + cmake_policy(SET CMP0090 NEW) +endif() + project(obs-frontend-api) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +add_library(obs-frontend-api SHARED) +add_library(OBS::frontend-api ALIAS obs-frontend-api) -add_definitions(-DLIBOBS_EXPORTS) +target_sources(obs-frontend-api PRIVATE obs-frontend-api.h obs-frontend-api.cpp + obs-frontend-internal.hpp) -set(obs-frontend-api_SOURCES - obs-frontend-api.cpp) +target_link_libraries(obs-frontend-api PRIVATE OBS::libobs) -if(WIN32) - set(MODULE_DESCRIPTION "OBS Frontend API") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in ./obs-frontend-api.rc) - list(APPEND obs-frontend-api_SOURCES - obs-frontend-api.rc) +target_compile_features(obs-frontend-api PUBLIC cxx_auto_type cxx_std_17 + c_std_11) + +target_include_directories( + obs-frontend-api PUBLIC $ + $) + +set_target_properties( + obs-frontend-api + PROPERTIES FOLDER "frontend" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "0" + PUBLIC_HEADER obs-frontend-api.h) + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Frontend API") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-frontend-api.rc) + + target_sources(obs-frontend-api PRIVATE obs-frontend-api.rc) +elseif(OS_MACOS) + set_target_properties(obs-frontend-api PROPERTIES SOVERSION "1") endif() -set(obs-frontend-api_PUBLIC_HEADERS - obs-frontend-api.h) - -set(obs-frontend-api_HEADERS - obs-frontend-internal.hpp - ${obs-frontend-api_PUBLIC_HEADERS}) - -add_library(obs-frontend-api SHARED - ${obs-frontend-api_SOURCES} - ${obs-frontend-api_HEADERS}) -target_link_libraries(obs-frontend-api - libobs) -set_target_properties(obs-frontend-api PROPERTIES FOLDER "frontend") - -if(UNIX AND NOT APPLE) - set_target_properties(obs-frontend-api - PROPERTIES - OUTPUT_NAME obs-frontend-api - VERSION 0.0 - SOVERSION 0 - ) -endif() - -install_obs_core(obs-frontend-api) -install_obs_headers(${obs-frontend-api_PUBLIC_HEADERS}) +setup_binary_target(obs-frontend-api) +export_target(obs-frontend-api) diff --git a/UI/obs-frontend-api/cmake/obs-frontend-apiConfig.cmake.in b/UI/obs-frontend-api/cmake/obs-frontend-apiConfig.cmake.in new file mode 100644 index 000000000..38bbde7b3 --- /dev/null +++ b/UI/obs-frontend-api/cmake/obs-frontend-apiConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/UI/obs.rc.in b/UI/obs.rc.in index 523d41fe6..7bf7e2fe0 100644 --- a/UI/obs.rc.in +++ b/UI/obs.rc.in @@ -1,4 +1,4 @@ -IDI_ICON1 ICON DISCARDABLE "../cmake/winrc/obs-studio.ico" +IDI_ICON1 ICON DISCARDABLE "../cmake/bundle/windows/obs-studio.ico" 1 VERSIONINFO FILEVERSION ${UI_VERSION_MAJOR},${UI_VERSION_MINOR},${UI_VERSION_PATCH},0 diff --git a/UI/platform-osx.mm b/UI/platform-osx.mm index fcd37b503..751f61b17 100644 --- a/UI/platform-osx.mm +++ b/UI/platform-osx.mm @@ -37,55 +37,21 @@ bool isInBundle() bool GetDataFilePath(const char *data, string &output) { - if (isInBundle()) { - NSRunningApplication *app = - [NSRunningApplication currentApplication]; - NSURL *bundleURL = [app bundleURL]; - NSString *path = [NSString - stringWithFormat:@"Contents/Resources/data/obs-studio/%@", - [NSString stringWithUTF8String:data]]; - NSURL *dataURL = [bundleURL URLByAppendingPathComponent:path]; - output = [[dataURL path] UTF8String]; - } else { - stringstream str; - str << OBS_DATA_PATH "/obs-studio/" << data; - output = str.str(); - } + NSRunningApplication *app = [NSRunningApplication currentApplication]; + NSURL *bundleURL = [app bundleURL]; + NSString *path = [NSString + stringWithFormat:@"Contents/Resources/%@", + [NSString stringWithUTF8String:data]]; + NSURL *dataURL = [bundleURL URLByAppendingPathComponent:path]; + output = [[dataURL path] UTF8String]; return !access(output.c_str(), R_OK); } +#pragma deprecated(InitApplicationBundle) bool InitApplicationBundle() { -#ifdef OBS_OSX_BUNDLE - static bool initialized = false; - if (initialized) - return true; - - try { - NSBundle *bundle = [NSBundle mainBundle]; - if (!bundle) - throw "Could not find main bundle"; - - NSString *exe_path = [bundle executablePath]; - if (!exe_path) - throw "Could not find executable path"; - - NSString *path = [exe_path stringByDeletingLastPathComponent]; - - if (chdir([path fileSystemRepresentation])) - throw "Could not change working directory to " - "bundle path"; - - } catch (const char *error) { - blog(LOG_ERROR, "InitBundle: %s", error); - return false; - } - - return initialized = true; -#else return true; -#endif } void CheckIfAlreadyRunning(bool &already_running) diff --git a/UI/platform.hpp b/UI/platform.hpp index 9851fb918..854166bfb 100644 --- a/UI/platform.hpp +++ b/UI/platform.hpp @@ -28,7 +28,7 @@ class QWidget; bool GetDataFilePath(const char *data, std::string &path); /* Updates the working directory for OSX application bundles */ -bool InitApplicationBundle(); +bool OBS_DEPRECATED InitApplicationBundle(); std::string GetDefaultVideoSavePath(); @@ -77,6 +77,7 @@ bool IsRunningOnWine(); #ifdef __APPLE__ void EnableOSXVSync(bool enable); void EnableOSXDockIcon(bool enable); +bool isInBundle(); void InstallNSApplicationSubclass(); void disableColorSpaceConversion(QWidget *window); bool ProcessIsRosettaTranslated(); diff --git a/UI/ui-config.h.in b/UI/ui-config.h.in index 0d04fbfd5..cf84248fd 100644 --- a/UI/ui-config.h.in +++ b/UI/ui-config.h.in @@ -16,6 +16,8 @@ #define OFF 0 #endif +#cmakedefine USE_XDG + #define TWITCH_ENABLED @TWITCH_ENABLED@ #define TWITCH_CLIENTID "@TWITCH_CLIENTID@" #define TWITCH_HASH 0x@TWITCH_HASH@ diff --git a/UI/win-update/updater/CMakeLists.txt b/UI/win-update/updater/CMakeLists.txt index 9cce960af..3399a94d1 100644 --- a/UI/win-update/updater/CMakeLists.txt +++ b/UI/win-update/updater/CMakeLists.txt @@ -1,52 +1,46 @@ -if(DISABLE_UPDATE_MODULE) - return() +project(updater) + +option(ENABLE_UPDATER "Build with Windows updater" ON) + +if(NOT ENABLE_UPDATER) + message(STATUS "OBS: DISABLED Windows updater") + return() endif() if(NOT DEFINED STATIC_ZLIB_PATH OR "${STATIC_ZLIB_PATH}" STREQUAL "") - message(STATUS "STATIC_ZLIB_PATH not set, windows updater disabled") - return() + message(STATUS "STATIC_ZLIB_PATH not set, windows updater disabled") + return() endif() -project(updater) +add_executable(updater WIN32) -include_directories(${LIBLZMA_INCLUDE_DIRS}) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/json11") -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") -include_directories(${BLAKE2_INCLUDE_DIR}) +target_sources( + updater + PRIVATE updater.cpp + updater.hpp + patch.cpp + http.cpp + hash.cpp + resource.h + updater.rc + init-hook-files.c + updater.manifest + ${CMAKE_SOURCE_DIR}/UI/win-update/win-update-helpers.cpp + ${CMAKE_SOURCE_DIR}/UI/win-update/win-update-helpers.hpp + ${CMAKE_SOURCE_DIR}/deps/json11/json11.hpp + ${CMAKE_SOURCE_DIR}/deps/json11/json11.cpp) -set(updater_HEADERS - ${CMAKE_SOURCE_DIR}/deps/json11/json11.hpp - ../win-update-helpers.hpp - resource.h - updater.hpp - ) -set(updater_SOURCES - ${CMAKE_SOURCE_DIR}/deps/json11/json11.cpp - ../win-update-helpers.cpp - init-hook-files.c - updater.cpp - patch.cpp - http.cpp - hash.cpp - updater.rc - updater.manifest - ) +target_include_directories( + updater PRIVATE ${CMAKE_SOURCE_DIR}/libobs ${CMAKE_SOURCE_DIR}/UI/win-update + ${CMAKE_SOURCE_DIR}/deps/json11) + +target_compile_definitions(updater PRIVATE NOMINMAX "PSAPI_VERSION=2") -add_definitions(-DNOMINMAX -DUNICODE -D_UNICODE -DPSAPI_VERSION=2) if(MSVC) - add_compile_options($,/MTd,/MT>) + target_compile_options(updater PRIVATE $,/MTd,/MT>) endif() -add_executable(updater WIN32 - ${updater_HEADERS} - ${updater_SOURCES} - ) -target_link_libraries(updater - ${STATIC_ZLIB_PATH} - lzma - blake2 - comctl32 - shell32 - winhttp - ) +target_link_libraries(updater PRIVATE OBS::blake2 OBS::lzma ${STATIC_ZLIB_PATH} + comctl32 shell32 winhttp) + set_target_properties(updater PROPERTIES FOLDER "frontend") diff --git a/UI/win-update/updater/updater.rc b/UI/win-update/updater/updater.rc index a9e9d25b2..f3ad02bf7 100644 --- a/UI/win-update/updater/updater.rc +++ b/UI/win-update/updater/updater.rc @@ -127,7 +127,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_ICON1 ICON "../../../cmake/winrc/obs-studio.ico" +IDI_ICON1 ICON "../../../cmake/bundle/windows/obs-studio.ico" #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/UI/window-basic-about.cpp b/UI/window-basic-about.cpp index 98f893c6f..f8eb14bd5 100644 --- a/UI/window-basic-about.cpp +++ b/UI/window-basic-about.cpp @@ -131,7 +131,11 @@ void OBSAbout::ShowAuthors() QString error = "Error! File could not be read.\n\n \ Go to: https://github.com/obsproject/obs-studio/blob/master/AUTHORS"; +#ifdef __APPLE__ + if (!GetDataFilePath("AUTHORS", path)) { +#else if (!GetDataFilePath("authors/AUTHORS", path)) { +#endif ui->textBrowser->setPlainText(error); return; } diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index ce411b01e..b36c26f0e 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -170,21 +170,35 @@ static void AddExtraModulePaths() string path = base_module_dir; #if defined(__APPLE__) - obs_add_module_path((path + "/bin").c_str(), (path + "/data").c_str()); + /* System Library Search Path */ + obs_add_module_path((path + ".plugin/Contents/MacOS").c_str(), + (path + ".plugin/Contents/Resources").c_str()); - BPtr config_bin = - os_get_config_path_ptr("obs-studio/plugins/%module%/bin"); - BPtr config_data = - os_get_config_path_ptr("obs-studio/plugins/%module%/data"); + /* User Application Support Search Path */ + BPtr config_bin = os_get_config_path_ptr( + "obs-studio/plugins/%module%.plugin/Contents/MacOS"); + BPtr config_data = os_get_config_path_ptr( + "obs-studio/plugins/%module%.plugin/Contents/Resources"); obs_add_module_path(config_bin, config_data); -#elif ARCH_BITS == 64 + /* Legacy System Library Search Path */ + obs_add_module_path((path + "/bin").c_str(), (path + "/data").c_str()); + + /* Legacy User Application Support Search Path */ + BPtr config_bin_legacy = + os_get_config_path_ptr("obs-studio/plugins/%module%/bin"); + BPtr config_data_legacy = + os_get_config_path_ptr("obs-studio/plugins/%module%/data"); + obs_add_module_path(config_bin_legacy, config_data_legacy); +#else +#if ARCH_BITS == 64 obs_add_module_path((path + "/bin/64bit").c_str(), (path + "/data").c_str()); #else obs_add_module_path((path + "/bin/32bit").c_str(), (path + "/data").c_str()); #endif +#endif } extern obs_frontend_callbacks *InitializeAPIInterface(OBSBasic *main); @@ -2115,7 +2129,7 @@ void OBSBasic::ReceivedIntroJson(const QString &text) int minor = 0; sscanf(version.c_str(), "%d.%d", &major, &minor); -#if OBS_RELEASE_CANDIDATE > 0 +#if defined(OBS_RELEASE_CANDIDATE) && OBS_RELEASE_CANDIDATE > 0 if (major == OBS_RELEASE_CANDIDATE_MAJOR && minor == OBS_RELEASE_CANDIDATE_MINOR && rc == OBS_RELEASE_CANDIDATE) { @@ -2136,7 +2150,7 @@ void OBSBasic::ReceivedIntroJson(const QString &text) return; } -#if OBS_RELEASE_CANDIDATE > 0 +#if defined(OBS_RELEASE_CANDIDATE) && OBS_RELEASE_CANDIDATE > 0 uint32_t lastVersion = config_get_int(App()->GlobalConfig(), "General", "LastRCVersion"); #elif OBS_BETA > 0 @@ -2149,7 +2163,7 @@ void OBSBasic::ReceivedIntroJson(const QString &text) int current_version_increment = -1; -#if OBS_RELEASE_CANDIDATE > 0 +#if defined(OBS_RELEASE_CANDIDATE) && OBS_RELEASE_CANDIDATE > 0 if (lastVersion < OBS_RELEASE_CANDIDATE_VER) { #elif OBS_BETA > 0 if (lastVersion < OBS_BETA_VER) { @@ -2642,7 +2656,7 @@ OBSBasic::~OBSBasic() config_set_int(App()->GlobalConfig(), "General", "LastVersion", LIBOBS_API_VER); -#if OBS_RELEASE_CANDIDATE > 0 +#if defined(OBS_RELEASE_CANDIDATE) && OBS_RELEASE_CANDIDATE > 0 config_set_int(App()->GlobalConfig(), "General", "LastRCVersion", OBS_RELEASE_CANDIDATE_VER); #elif OBS_BETA > 0 @@ -3626,7 +3640,7 @@ bool OBSBasic::QueryRemoveSource(obs_source_t *source) #define UPDATE_CHECK_INTERVAL (60 * 60 * 24 * 4) /* 4 days */ -#ifdef UPDATE_SPARKLE +#if defined(ENABLE_SPARKLE_UPDATER) void init_sparkle_updater(bool update_to_undeployed); void trigger_sparkle_update(); #endif @@ -3639,7 +3653,7 @@ void OBSBasic::TimedCheckForUpdates() "EnableAutoUpdates")) return; -#ifdef UPDATE_SPARKLE +#if defined(ENABLE_SPARKLE_UPDATER) init_sparkle_updater(config_get_bool(App()->GlobalConfig(), "General", "UpdateToUndeployed")); #elif _WIN32 @@ -3664,7 +3678,7 @@ void OBSBasic::TimedCheckForUpdates() void OBSBasic::CheckForUpdates(bool manualUpdate) { -#ifdef UPDATE_SPARKLE +#if defined(ENABLE_SPARKLE_UPDATER) trigger_sparkle_update(); #elif _WIN32 ui->actionCheckForUpdates->setEnabled(false); diff --git a/UI/window-basic-settings.cpp b/UI/window-basic-settings.cpp index 6210bba8e..5f2587ac6 100644 --- a/UI/window-basic-settings.cpp +++ b/UI/window-basic-settings.cpp @@ -640,7 +640,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) delete ui->browserHWAccel; delete ui->sourcesGroup; #endif -#if defined(__APPLE__) || HAVE_PULSEAUDIO +#if defined(__APPLE__) || defined(PULSEAUDIO_FOUND) delete ui->disableAudioDucking; #endif ui->rendererLabel = nullptr; @@ -656,7 +656,7 @@ OBSBasicSettings::OBSBasicSettings(QWidget *parent) ui->browserHWAccel = nullptr; ui->sourcesGroup = nullptr; #endif -#if defined(__APPLE__) || HAVE_PULSEAUDIO +#if defined(__APPLE__) || defined(PULSEAUDIO_FOUND) ui->disableAudioDucking = nullptr; #endif #endif diff --git a/UI/xdg-data/CMakeLists.txt b/UI/xdg-data/CMakeLists.txt index 46e475e2f..b57161e6d 100644 --- a/UI/xdg-data/CMakeLists.txt +++ b/UI/xdg-data/CMakeLists.txt @@ -1,38 +1,41 @@ if(NOT DEFINED APPDATA_RELEASE_DATE) - if(EXISTS "${CMAKE_SOURCE_DIR}/.git") - execute_process(COMMAND git log --tags -1 --pretty=%cd --date=short - OUTPUT_VARIABLE APPDATA_RELEASE_DATE - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - OUTPUT_STRIP_TRAILING_WHITESPACE) - else() - file(TIMESTAMP "${CMAKE_SOURCE_DIR}/CMakeLists.txt" APPDATA_RELEASE_DATE "%Y-%m-%d") - endif() + if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + execute_process( + COMMAND git log --tags -1 --pretty=%cd --date=short + OUTPUT_VARIABLE APPDATA_RELEASE_DATE + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_STRIP_TRAILING_WHITESPACE) + else() + file(TIMESTAMP "${CMAKE_SOURCE_DIR}/CMakeLists.txt" APPDATA_RELEASE_DATE + "%Y-%m-%d") + endif() endif() -configure_file( - com.obsproject.Studio.appdata.xml.in - com.obsproject.Studio.appdata.xml) +configure_file(com.obsproject.Studio.appdata.xml.in + com.obsproject.Studio.appdata.xml) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/com.obsproject.Studio.appdata.xml - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) install(FILES com.obsproject.Studio.desktop - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) -# Icons +install( + FILES icons/obs-logo-128.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps + RENAME com.obsproject.Studio.png) -install(FILES icons/obs-logo-128.png - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps - RENAME com.obsproject.Studio.png) +install( + FILES icons/obs-logo-256.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps + RENAME com.obsproject.Studio.png) -install(FILES icons/obs-logo-256.png - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps - RENAME com.obsproject.Studio.png) +install( + FILES icons/obs-logo-512.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps + RENAME com.obsproject.Studio.png) -install(FILES icons/obs-logo-512.png - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps - RENAME com.obsproject.Studio.png) - -install(FILES icons/obs-logo-scalable.svg - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps - RENAME com.obsproject.Studio.svg) +install( + FILES icons/obs-logo-scalable.svg + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps + RENAME com.obsproject.Studio.svg) diff --git a/cmake/Modules/CompilerConfig.cmake b/cmake/Modules/CompilerConfig.cmake new file mode 100644 index 000000000..5c99daca8 --- /dev/null +++ b/cmake/Modules/CompilerConfig.cmake @@ -0,0 +1,161 @@ +include(CheckCCompilerFlag) +include(CheckCXXCompilerFlag) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Set compile options for MSVC +if(OS_WINDOWS AND MSVC) + if(NOT EXISTS "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user") + file( + GENERATE + OUTPUT "${CMAKE_BINARY_DIR}/ALL_BUILD.vcxproj.user" + INPUT "${CMAKE_SOURCE_DIR}/cmake/bundle/windows/ALL_BUILD.vcxproj.user.in" + ) + endif() + + # Check for Win SDK version 10.0.20348 or above + message( + INFO + " + OBS-Studio - Windows API version is ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}" + ) + string(REPLACE "." ";" WINAPI_VER + "${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}") + + list(GET WINAPI_VER 0 WINAPI_VER_MAJOR) + list(GET WINAPI_VER 1 WINAPI_VER_MINOR) + list(GET WINAPI_VER 2 WINAPI_VER_BUILD) + + set(WINAPI_COMPATIBLE FALSE) + if(WINAPI_VER_MAJOR EQUAL 10) + if(WINAPI_VER_MINOR EQUAL 0) + if(WINAPI_VER_BUILD GREATER_EQUAL 20348) + set(WINAPI_COMPATIBLE TRUE) + endif() + else() + set(WINAPI_COMPATIBLE TRUE) + endif() + elseif(WINAPI_VER_MAJOR GREATER 10) + set(WINAPI_COMPATIBLE TRUE) + endif() + + if(NOT WINAPI_COMPATIBLE) + message( + FATAL_ERROR + "OBS: OBS requires Windows 10 SDK version 10.0.20348.0 and above to compile.\n" + " Please download the most recent Windows 10 SDK in order to compile." + ) + endif() + + add_compile_options( + /MP + /W3 + /wd4127 + /wd4201 + /wd4456 + /wd4457 + /wd4458 + /wd4459 + /wd4595 + "$<$:/DDEBUG=1;/D_DEBUG=1>" + "$<$:/Ob2>" + /DUNICODE + /D_UNICODE + /D_CRT_SECURE_NO_WARNINGS + /D_CRT_NONSTDC_NO_WARNINGS) + + add_link_options( + "LINKER:/OPT:REF" + "$<$>:LINKER\:/SAFESEH\:NO>" + "$<$:LINKER\:/INCREMENTAL\:NO>" + "$<$:LINKER\:/INCREMENTAL\:NO;/OPT:ICF>") +else() + find_program(CCACHE_PROGRAM "ccache") + set(CCACHE_SUPPORT + ON + CACHE BOOL "Enable ccache support") + mark_as_advanced(CCACHE_PROGRAM) + if(CCACHE_PROGRAM AND CCACHE_SUPPORT) + set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_OBJC_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_OBJCXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") + set(CMAKE_CUDA_COMPILER_LAUNCHER "${CCACHE_PROGRAM}") # CMake 3.9+ + endif() + + add_compile_options( + -Wextra + -Wvla + -Wno-unused-function + -Wno-missing-field-initializers + -fno-strict-aliasing + "$<$:-Werror-implicit-function-declaration;-Wno-missing-braces>" + "$<$:-stdlib=libc++>" + "$<$:-DDEBUG=1;-D_DEBUG=1>" + "$<$:-fcolor-diagnostics>" + "$<$:-fcolor-diagnostics>") + + if(OBS_CODESIGN_LINKER) + add_link_options("LINKER:$<$:-adhoc_codesign>") + endif() + + if(MINGW) + set(CMAKE_WIDL + "widl" + CACHE INTERNAL "wine IDL header file generation program") + add_compile_definitions("_WIN32_WINNT=0x0600;WINVER=0x0600") + endif() +endif() + +if(MSVC_CXX_ARCHITECTURE_ID) + string(TOLOWER ${MSVC_CXX_ARCHITECTURE_ID} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) +else() + string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} LOWERCASE_CMAKE_SYSTEM_PROCESSOR) +endif() + +if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES + "(i[3-6]86|x86|x64|x86_64|amd64|e2k)") + if(NOT MSVC AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") + set(ARCH_SIMD_FLAGS -mmmx -msse -msse2) + endif() +elseif(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?") + set(ARCH_SIMD_DEFINES -DNO_WARN_X86_INTRINSICS) + set(ARCH_SIMD_FLAGS -mvsx) +else() + if(CMAKE_C_COMPILER_ID MATCHES "^(Apple)?Clang|GNU" + OR CMAKE_CXX_COMPILER_ID MATCHES "^(Apple)?Clang|GNU") + check_c_compiler_flag("-fopenmp-simd" C_COMPILER_SUPPORTS_OPENMP_SIMD) + check_cxx_compiler_flag("-fopenmp-simd" CXX_COMPILER_SUPPORTS_OPENMP_SIMD) + set(ARCH_SIMD_FLAGS + -DSIMDE_ENABLE_OPENMP + "$<$,$>:-fopenmp-simd>" + "$<$,$>:-fopenmp-simd>" + ) + endif() +endif() + +if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "e2k") + foreach( + TEST_C_FLAG + "-Wno-unused-parameter" + "-Wno-ignored-qualifiers" + "-Wno-pointer-sign" + "-Wno-unused-variable" + "-Wno-sign-compare" + "-Wno-bad-return-value-type" + "-Wno-maybe-uninitialized") + check_c_compiler_flag(${TEST_C_FLAG} + C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG}) + if(C_COMPILER_SUPPORTS_FLAG_${TEST_C_FLAG}) + set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} ${TEST_C_FLAG}) + endif() + endforeach() + foreach(TEST_CXX_FLAG "-Wno-invalid-offsetof" "-Wno-maybe-uninitialized") + check_cxx_compiler_flag(${TEST_CXX_FLAG} + CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG}) + if(CXX_COMPILER_SUPPORTS_FLAG_${TEST_CXX_FLAG}) + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${TEST_CXX_FLAG}) + endif() + endforeach() +endif() diff --git a/cmake/Modules/CopyMSVCBins.cmake b/cmake/Modules/CopyMSVCBins.cmake index 767da5f07..6ff2638ba 100644 --- a/cmake/Modules/CopyMSVCBins.cmake +++ b/cmake/Modules/CopyMSVCBins.cmake @@ -1,279 +1,290 @@ # Doesn't really make sense anywhere else if(NOT MSVC) - return() + return() endif() # Internal variable to avoid copying more than once if(COPIED_DEPENDENCIES) - return() + return() endif() option(COPY_DEPENDENCIES "Automatically try copying all dependencies" ON) if(NOT COPY_DEPENDENCIES) - return() + return() endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bin_suffix 64) + set(_bin_suffix 64) else() - set(_bin_suffix 32) + set(_bin_suffix 32) endif() -file(GLOB FFMPEG_BIN_FILES - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/avcodec-*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/avcodec-*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/avcodec-*.dll" +file( + GLOB + FFMPEG_BIN_FILES + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/avcodec-*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/avcodec-*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/avcodec-*.dll" + "${FFMPEG_avformat_INCLUDE_DIR}/../bin/avformat-*.dll" + "${FFMPEG_avformat_INCLUDE_DIR}/../bin${_bin_suffix}/avformat-*.dll" + "${FFMPEG_avformat_INCLUDE_DIR}/bin${_bin_suffix}/avformat-*.dll" + "${FFMPEG_avutil_INCLUDE_DIR}/../bin/avutil-*.dll" + "${FFMPEG_avutil_INCLUDE_DIR}/../bin${_bin_suffix}/avutil-*.dll" + "${FFMPEG_avutil_INCLUDE_DIR}/bin${_bin_suffix}/avutil-*.dll" + "${FFMPEG_avdevice_INCLUDE_DIR}/../bin/avdevice-*.dll" + "${FFMPEG_avdevice_INCLUDE_DIR}/../bin${_bin_suffix}/avdevice-*.dll" + "${FFMPEG_avdevice_INCLUDE_DIR}/bin${_bin_suffix}/avdevice-*.dll" + "${FFMPEG_avfilter_INCLUDE_DIR}/../bin/avfilter-*.dll" + "${FFMPEG_avfilter_INCLUDE_DIR}/../bin${_bin_suffix}/avfilter-*.dll" + "${FFMPEG_avfilter_INCLUDE_DIR}/bin${_bin_suffix}/avfilter-*.dll" + "${FFMPEG_postproc_INCLUDE_DIR}/../bin/postproc-*.dll" + "${FFMPEG_postproc_INCLUDE_DIR}/../bin${_bin_suffix}/postproc-*.dll" + "${FFMPEG_postproc_INCLUDE_DIR}/bin${_bin_suffix}/postproc-*.dll" + "${FFMPEG_swscale_INCLUDE_DIR}/../bin/swscale-*.dll" + "${FFMPEG_swscale_INCLUDE_DIR}/bin${_bin_suffix}/swscale-*.dll" + "${FFMPEG_swscale_INCLUDE_DIR}/../bin${_bin_suffix}/swscale-*.dll" + "${FFMPEG_swresample_INCLUDE_DIR}/../bin/swresample-*.dll" + "${FFMPEG_swresample_INCLUDE_DIR}/../bin${_bin_suffix}/swresample-*.dll" + "${FFMPEG_swresample_INCLUDE_DIR}/bin${_bin_suffix}/swresample-*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libopus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/opus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libopus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/opus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libogg*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libvorbis*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libogg*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libvorbis*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libvpx*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libvpx*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libsrt*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libsrt*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedcrypto*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedcrypto*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedtls*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedtls*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedx509*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedx509*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libopus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/opus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libopus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/opus*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libbz2*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/zlib*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libbz2*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/zlib*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libSvtAv1Enc.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libSvtAv1Enc.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libSvtAv1Enc.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libSvtAv1Enc.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libaom.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libaom.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libaom.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libaom.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/librist.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/librist.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/librist.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin/librist.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libbz2*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/zlib*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libbz2*.dll" + "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/zlib*.dll") - "${FFMPEG_avformat_INCLUDE_DIR}/../bin/avformat-*.dll" - "${FFMPEG_avformat_INCLUDE_DIR}/../bin${_bin_suffix}/avformat-*.dll" - "${FFMPEG_avformat_INCLUDE_DIR}/bin${_bin_suffix}/avformat-*.dll" +file( + GLOB + X264_BIN_FILES + "${X264_INCLUDE_DIR}/../bin${_bin_suffix}/libx264-*.dll" + "${X264_INCLUDE_DIR}/../bin/libx264-*.dll" + "${X264_INCLUDE_DIR}/bin/libx264-*.dll" + "${X264_INCLUDE_DIR}/bin${_bin_suffix}/libx264-*.dll") - "${FFMPEG_avutil_INCLUDE_DIR}/../bin/avutil-*.dll" - "${FFMPEG_avutil_INCLUDE_DIR}/../bin${_bin_suffix}/avutil-*.dll" - "${FFMPEG_avutil_INCLUDE_DIR}/bin${_bin_suffix}/avutil-*.dll" +file( + GLOB + FREETYPE_BIN_FILES + "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin${_bin_suffix}/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../bin${_bin_suffix}/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../bin/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/bin/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/bin${_bin_suffix}/libfreetype*-*.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin${_bin_suffix}/freetype.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin/freetype.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../bin${_bin_suffix}/freetype.dll" + "${FREETYPE_INCLUDE_DIR_ft2build}/../bin/freetype.dll") - "${FFMPEG_avdevice_INCLUDE_DIR}/../bin/avdevice-*.dll" - "${FFMPEG_avdevice_INCLUDE_DIR}/../bin${_bin_suffix}/avdevice-*.dll" - "${FFMPEG_avdevice_INCLUDE_DIR}/bin${_bin_suffix}/avdevice-*.dll" +file( + GLOB + LIBFDK_BIN_FILES + "${Libfdk_INCLUDE_DIR}/../bin${_bin_suffix}/libfdk*-*.dll" + "${Libfdk_INCLUDE_DIR}/../bin/libfdk*-*.dll" + "${Libfdk_INCLUDE_DIR}/bin/libfdk*-*.dll" + "${Libfdk_INCLUDE_DIR}/bin${_bin_suffix}/libfdk*-*.dll") - "${FFMPEG_avfilter_INCLUDE_DIR}/../bin/avfilter-*.dll" - "${FFMPEG_avfilter_INCLUDE_DIR}/../bin${_bin_suffix}/avfilter-*.dll" - "${FFMPEG_avfilter_INCLUDE_DIR}/bin${_bin_suffix}/avfilter-*.dll" +file( + GLOB + SSL_BIN_FILES + "${SSL_INCLUDE_DIR}/../bin${_bin_suffix}/ssleay32*.dll" + "${SSL_INCLUDE_DIR}/../bin${_bin_suffix}/libeay32*.dll" + "${SSL_INCLUDE_DIR}/../bin/ssleay32*.dll" + "${SSL_INCLUDE_DIR}/../bin/libeay32*.dll" + "${SSL_INCLUDE_DIR}/bin${_bin_suffix}/ssleay32*.dll" + "${SSL_INCLUDE_DIR}/bin${_bin_suffix}/libeay32*.dll" + "${SSL_INCLUDE_DIR}/bin/ssleay32*.dll" + "${SSL_INCLUDE_DIR}/bin/libeay32*.dll") - "${FFMPEG_postproc_INCLUDE_DIR}/../bin/postproc-*.dll" - "${FFMPEG_postproc_INCLUDE_DIR}/../bin${_bin_suffix}/postproc-*.dll" - "${FFMPEG_postproc_INCLUDE_DIR}/bin${_bin_suffix}/postproc-*.dll" +file( + GLOB + CURL_BIN_FILES + "${CURL_INCLUDE_DIR}/../build/Win${_bin_suffix}/VC12/DLL Release - DLL Windows SSPI/libcurl.dll" + "${CURL_INCLUDE_DIR}/../bin${_bin_suffix}/libcurl*.dll" + "${CURL_INCLUDE_DIR}/../bin${_bin_suffix}/curl*.dll" + "${CURL_INCLUDE_DIR}/../bin/libcurl*.dll" + "${CURL_INCLUDE_DIR}/../bin/curl*.dll" + "${CURL_INCLUDE_DIR}/bin${_bin_suffix}/libcurl*.dll" + "${CURL_INCLUDE_DIR}/bin${_bin_suffix}/curl*.dll" + "${CURL_INCLUDE_DIR}/bin/libcurl*.dll" + "${CURL_INCLUDE_DIR}/bin/curl*.dll") - "${FFMPEG_swscale_INCLUDE_DIR}/../bin/swscale-*.dll" - "${FFMPEG_swscale_INCLUDE_DIR}/bin${_bin_suffix}/swscale-*.dll" - "${FFMPEG_swscale_INCLUDE_DIR}/../bin${_bin_suffix}/swscale-*.dll" +file( + GLOB + LUA_BIN_FILES + "${LUAJIT_INCLUDE_DIR}/../../bin${_bin_suffix}/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/../../bin/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/../bin${_bin_suffix}/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/../bin/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/bin${_bin_suffix}/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/bin/lua*.dll" + "${LUAJIT_INCLUDE_DIR}/lua*.dll") - "${FFMPEG_swresample_INCLUDE_DIR}/../bin/swresample-*.dll" - "${FFMPEG_swresample_INCLUDE_DIR}/../bin${_bin_suffix}/swresample-*.dll" - "${FFMPEG_swresample_INCLUDE_DIR}/bin${_bin_suffix}/swresample-*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libopus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/opus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libopus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/opus*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libogg*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libvorbis*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libogg*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libvorbis*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libvpx*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libvpx*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libsrt*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libsrt*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedcrypto*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedcrypto*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedtls*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedtls*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libmbedx509*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libmbedx509*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libopus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/opus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libopus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/opus*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libbz2*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/zlib*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libbz2*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/zlib*.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libSvtAv1Enc.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libSvtAv1Enc.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libSvtAv1Enc.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libSvtAv1Enc.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libaom.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libaom.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libaom.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libaom.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/librist.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/librist.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/librist.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin/librist.dll" - - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/libbz2*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/../bin${_bin_suffix}/zlib*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/libbz2*.dll" - "${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/zlib*.dll" - ) - -file(GLOB X264_BIN_FILES - "${X264_INCLUDE_DIR}/../bin${_bin_suffix}/libx264-*.dll" - "${X264_INCLUDE_DIR}/../bin/libx264-*.dll" - "${X264_INCLUDE_DIR}/bin/libx264-*.dll" - "${X264_INCLUDE_DIR}/bin${_bin_suffix}/libx264-*.dll") - -file(GLOB FREETYPE_BIN_FILES - "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin${_bin_suffix}/libfreetype*-*.dll" - "${FREETYPE_INCLUDE_DIR_ft2build}/../../bin/libfreetype*-*.dll" - "${FREETYPE_INCLUDE_DIR_ft2build}/../bin${_bin_suffix}/libfreetype*-*.dll" - "${FREETYPE_INCLUDE_DIR_ft2build}/../bin/libfreetype*-*.dll" - "${FREETYPE_INCLUDE_DIR_ft2build}/bin/libfreetype*-*.dll" - "${FREETYPE_INCLUDE_DIR_ft2build}/bin${_bin_suffix}/libfreetype*-*.dll") - -file(GLOB LIBFDK_BIN_FILES - "${Libfdk_INCLUDE_DIR}/../bin${_bin_suffix}/libfdk*-*.dll" - "${Libfdk_INCLUDE_DIR}/../bin/libfdk*-*.dll" - "${Libfdk_INCLUDE_DIR}/bin/libfdk*-*.dll" - "${Libfdk_INCLUDE_DIR}/bin${_bin_suffix}/libfdk*-*.dll") - -file(GLOB SSL_BIN_FILES - "${SSL_INCLUDE_DIR}/../bin${_bin_suffix}/ssleay32*.dll" - "${SSL_INCLUDE_DIR}/../bin${_bin_suffix}/libeay32*.dll" - "${SSL_INCLUDE_DIR}/../bin/ssleay32*.dll" - "${SSL_INCLUDE_DIR}/../bin/libeay32*.dll" - "${SSL_INCLUDE_DIR}/bin${_bin_suffix}/ssleay32*.dll" - "${SSL_INCLUDE_DIR}/bin${_bin_suffix}/libeay32*.dll" - "${SSL_INCLUDE_DIR}/bin/ssleay32*.dll" - "${SSL_INCLUDE_DIR}/bin/libeay32*.dll") - -file(GLOB CURL_BIN_FILES - "${CURL_INCLUDE_DIR}/../build/Win${_bin_suffix}/VC12/DLL Release - DLL Windows SSPI/libcurl.dll" - "${CURL_INCLUDE_DIR}/../bin${_bin_suffix}/libcurl*.dll" - "${CURL_INCLUDE_DIR}/../bin${_bin_suffix}/curl*.dll" - "${CURL_INCLUDE_DIR}/../bin/libcurl*.dll" - "${CURL_INCLUDE_DIR}/../bin/curl*.dll" - "${CURL_INCLUDE_DIR}/bin${_bin_suffix}/libcurl*.dll" - "${CURL_INCLUDE_DIR}/bin${_bin_suffix}/curl*.dll" - "${CURL_INCLUDE_DIR}/bin/libcurl*.dll" - "${CURL_INCLUDE_DIR}/bin/curl*.dll" - ) - -file(GLOB LUA_BIN_FILES - "${LUAJIT_INCLUDE_DIR}/../../bin${_bin_suffix}/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/../../bin/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/../bin${_bin_suffix}/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/../bin/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/bin${_bin_suffix}/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/bin/lua*.dll" - "${LUAJIT_INCLUDE_DIR}/lua*.dll" - ) - -if (ZLIB_LIB) - GET_FILENAME_COMPONENT(ZLIB_BIN_PATH ${ZLIB_LIB} PATH) +if(ZLIB_LIB) + get_filename_component(ZLIB_BIN_PATH ${ZLIB_LIB} PATH) endif() -file(GLOB ZLIB_BIN_FILES - "${ZLIB_BIN_PATH}/zlib*.dll") +file(GLOB ZLIB_BIN_FILES "${ZLIB_BIN_PATH}/zlib*.dll") -if (NOT ZLIB_BIN_FILES) - file(GLOB ZLIB_BIN_FILES - "${ZLIB_INCLUDE_DIR}/../bin${_bin_suffix}/zlib*.dll" - "${ZLIB_INCLUDE_DIR}/../bin/zlib*.dll" - "${ZLIB_INCLUDE_DIR}/bin${_bin_suffix}/zlib*.dll" - "${ZLIB_INCLUDE_DIR}/bin/zlib*.dll" - ) +if(NOT ZLIB_BIN_FILES) + file( + GLOB + ZLIB_BIN_FILES + "${ZLIB_INCLUDE_DIR}/../bin${_bin_suffix}/zlib*.dll" + "${ZLIB_INCLUDE_DIR}/../bin/zlib*.dll" + "${ZLIB_INCLUDE_DIR}/bin${_bin_suffix}/zlib*.dll" + "${ZLIB_INCLUDE_DIR}/bin/zlib*.dll") endif() -file(GLOB QT_DEBUG_BIN_FILES - "${Qt5Core_DIR}/../../../bin/Qt5Cored.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Guid.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Widgetsd.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Svgd.dll" - "${Qt5Core_DIR}/../../../bin/Qt5WinExtrasd.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Xmld.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Networkd.dll" - "${Qt5Core_DIR}/../../../bin/libGLESv2d.dll" - "${Qt5Core_DIR}/../../../bin/libEGLd.dll") +file(GLOB RNNOISE_BIN_FILES + "${RNNOISE_INCLUDE_DIR}/../bin${_bin_suffix}/rnnoise*.dll" + "${RNNOISE_INCLUDE_DIR}/../bin/rnnoise*.dll") + +file( + GLOB + QT_DEBUG_BIN_FILES + "${Qt5Core_DIR}/../../../bin/Qt5Cored.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Guid.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Widgetsd.dll" + "${Qt5Core_DIR}/../../../bin/Qt5WinExtrasd.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Svgd.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Xmld.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Networkd.dll" + "${Qt5Core_DIR}/../../../bin/libGLESv2d.dll" + "${Qt5Core_DIR}/../../../bin/libEGLd.dll") file(GLOB QT_DEBUG_PLAT_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/platforms/qwindowsd.dll") + "${Qt5Core_DIR}/../../../plugins/platforms/qwindowsd.dll") file(GLOB QT_DEBUG_STYLES_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/styles/qwindowsvistastyled.dll") + "${Qt5Core_DIR}/../../../plugins/styles/qwindowsvistastyled.dll") file(GLOB QT_DEBUG_ICONENGINE_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/iconengines/qsvgicond.dll") -file(GLOB QT_DEBUG_IMAGEFORMATS_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/imageformats/qsvgd.dll" - "${Qt5Core_DIR}/../../../plugins/imageformats/qgifd.dll" - "${Qt5Core_DIR}/../../../plugins/imageformats/qjpegd.dll") + "${Qt5Core_DIR}/../../../plugins/iconengines/qsvgicond.dll") +file( + GLOB + QT_DEBUG_IMAGEFORMATS_BIN_FILES + "${Qt5Core_DIR}/../../../plugins/imageformats/qsvgd.dll" + "${Qt5Core_DIR}/../../../plugins/imageformats/qgifd.dll" + "${Qt5Core_DIR}/../../../plugins/imageformats/qjpegd.dll") - -file(GLOB QT_BIN_FILES - "${Qt5Core_DIR}/../../../bin/Qt5Core.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Gui.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Widgets.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Svg.dll" - "${Qt5Core_DIR}/../../../bin/Qt5WinExtras.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Xml.dll" - "${Qt5Core_DIR}/../../../bin/Qt5Network.dll" - "${Qt5Core_DIR}/../../../bin/libGLESv2.dll" - "${Qt5Core_DIR}/../../../bin/libEGL.dll") +file( + GLOB + QT_BIN_FILES + "${Qt5Core_DIR}/../../../bin/Qt5Core.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Gui.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Widgets.dll" + "${Qt5Core_DIR}/../../../bin/Qt5WinExtras.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Svg.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Xml.dll" + "${Qt5Core_DIR}/../../../bin/Qt5Network.dll" + "${Qt5Core_DIR}/../../../bin/libGLESv2.dll" + "${Qt5Core_DIR}/../../../bin/libEGL.dll") file(GLOB QT_PLAT_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/platforms/qwindows.dll") + "${Qt5Core_DIR}/../../../plugins/platforms/qwindows.dll") file(GLOB QT_STYLES_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/styles/qwindowsvistastyle.dll") + "${Qt5Core_DIR}/../../../plugins/styles/qwindowsvistastyle.dll") file(GLOB QT_ICONENGINE_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/iconengines/qsvgicon.dll") -file(GLOB QT_IMAGEFORMATS_BIN_FILES - "${Qt5Core_DIR}/../../../plugins/imageformats/qsvg.dll" - "${Qt5Core_DIR}/../../../plugins/imageformats/qgif.dll" - "${Qt5Core_DIR}/../../../plugins/imageformats/qjpeg.dll") + "${Qt5Core_DIR}/../../../plugins/iconengines/qsvgicon.dll") +file( + GLOB + QT_IMAGEFORMATS_BIN_FILES + "${Qt5Core_DIR}/../../../plugins/imageformats/qsvg.dll" + "${Qt5Core_DIR}/../../../plugins/imageformats/qgif.dll" + "${Qt5Core_DIR}/../../../plugins/imageformats/qjpeg.dll") -file(GLOB QT_ICU_BIN_FILES - "${Qt5Core_DIR}/../../../bin/icu*.dll") +file(GLOB QT_ICU_BIN_FILES "${Qt5Core_DIR}/../../../bin/icu*.dll") set(ALL_BASE_BIN_FILES - ${FFMPEG_BIN_FILES} - ${X264_BIN_FILES} - ${CURL_BIN_FILES} - ${LUA_BIN_FILES} - ${SSL_BIN_FILES} - ${ZLIB_BIN_FILES} - ${LIBFDK_BIN_FILES} - ${FREETYPE_BIN_FILES} - ${QT_ICU_BIN_FILES}) + ${FFMPEG_BIN_FILES} + ${X264_BIN_FILES} + ${CURL_BIN_FILES} + ${LUA_BIN_FILES} + ${SSL_BIN_FILES} + ${ZLIB_BIN_FILES} + ${LIBFDK_BIN_FILES} + ${FREETYPE_BIN_FILES} + ${RNNOISE_BIN_FILES} + ${QT_ICU_BIN_FILES}) -set(ALL_REL_BIN_FILES - ${QT_BIN_FILES}) +set(ALL_REL_BIN_FILES ${QT_BIN_FILES}) -set(ALL_DBG_BIN_FILES - ${QT_DEBUG_BIN_FILES}) +set(ALL_DBG_BIN_FILES ${QT_DEBUG_BIN_FILES}) set(ALL_PLATFORM_BIN_FILES) -set(ALL_PLATFORM_REL_BIN_FILES - ${QT_PLAT_BIN_FILES}) -set(ALL_PLATFORM_DBG_BIN_FILES - ${QT_DEBUG_PLAT_BIN_FILES}) +set(ALL_PLATFORM_REL_BIN_FILES ${QT_PLAT_BIN_FILES}) +set(ALL_PLATFORM_DBG_BIN_FILES ${QT_DEBUG_PLAT_BIN_FILES}) set(ALL_STYLES_BIN_FILES) -set(ALL_STYLES_REL_BIN_FILES - ${QT_STYLES_BIN_FILES}) -set(ALL_STYLES_DBG_BIN_FILES - ${QT_DEBUG_STYLES_BIN_FILES}) +set(ALL_STYLES_REL_BIN_FILES ${QT_STYLES_BIN_FILES}) +set(ALL_STYLES_DBG_BIN_FILES ${QT_DEBUG_STYLES_BIN_FILES}) set(ALL_ICONENGINE_BIN_FILES) -set(ALL_ICONENGINE_REL_BIN_FILES - ${QT_ICONENGINE_BIN_FILES}) -set(ALL_ICONENGINE_DBG_BIN_FILES - ${QT_DEBUG_ICONENGINE_BIN_FILES}) +set(ALL_ICONENGINE_REL_BIN_FILES ${QT_ICONENGINE_BIN_FILES}) +set(ALL_ICONENGINE_DBG_BIN_FILES ${QT_DEBUG_ICONENGINE_BIN_FILES}) set(ALL_IMAGEFORMATS_BIN_FILES) -set(ALL_IMAGEFORMATS_REL_BIN_FILES - ${QT_IMAGEFORMATS_BIN_FILES}) -set(ALL_IMAGEFORMATS_DBG_BIN_FILES - ${QT_DEBUG_IMAGEFORMATS_BIN_FILES}) +set(ALL_IMAGEFORMATS_REL_BIN_FILES ${QT_IMAGEFORMATS_BIN_FILES}) +set(ALL_IMAGEFORMATS_DBG_BIN_FILES ${QT_DEBUG_IMAGEFORMATS_BIN_FILES}) -foreach(list - ALL_BASE_BIN_FILES ALL_REL_BIN_FILES ALL_DBG_BIN_FILES - ALL_PLATFORM_BIN_FILES ALL_PLATFORM_REL_BIN_FILES ALL_PLATFORM_DBG_BIN_FILES - ALL_STYLES_BIN_FILES ALL_STYLES_REL_BIN_FILES ALL_STYLES_DBG_BIN_FILES - ALL_ICONENGINE_BIN_FILES ALL_ICONENGINE_REL_BIN_FILES ALL_ICONENGINE_DGB_BIN_FILES - ALL_IMAGEFORMATS_BIN_FILES ALL_IMAGEFORMATS_REL_BIN_FILES ALL_IMAGEFORMATS_DGB_BIN_FILES) - if(${list}) - list(REMOVE_DUPLICATES ${list}) - endif() +foreach( + list + ALL_BASE_BIN_FILES + ALL_REL_BIN_FILES + ALL_DBG_BIN_FILES + ALL_PLATFORM_BIN_FILES + ALL_PLATFORM_REL_BIN_FILES + ALL_PLATFORM_DBG_BIN_FILES + ALL_STYLES_BIN_FILES + ALL_STYLES_REL_BIN_FILES + ALL_STYLES_DBG_BIN_FILES + ALL_ICONENGINE_BIN_FILES + ALL_ICONENGINE_REL_BIN_FILES + ALL_ICONENGINE_DGB_BIN_FILES + ALL_IMAGEFORMATS_BIN_FILES + ALL_IMAGEFORMATS_REL_BIN_FILES + ALL_IMAGEFORMATS_DGB_BIN_FILES) + if(${list}) + list(REMOVE_DUPLICATES ${list}) + endif() endforeach() message(STATUS "FFmpeg files: ${FFMPEG_BIN_FILES}") message(STATUS "x264 files: ${X264_BIN_FILES}") message(STATUS "Libfdk files: ${LIBFDK_BIN_FILES}") message(STATUS "Freetype files: ${FREETYPE_BIN_FILES}") +message(STATUS "rnnoise files: ${RNNOISE_BIN_FILES}") message(STATUS "curl files: ${CURL_BIN_FILES}") message(STATUS "lua files: ${LUA_BIN_FILES}") message(STATUS "ssl files: ${SSL_BIN_FILES}") @@ -291,78 +302,166 @@ message(STATUS "QT Release Imageformat files: ${QT_IMAGEFORMATS_BIN_FILES}") message(STATUS "QT ICU files: ${QT_ICU_BIN_FILES}") foreach(BinFile ${ALL_BASE_BIN_FILES}) - message(STATUS "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/") + message( + STATUS + "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/") endforeach() foreach(BinFile ${ALL_REL_BIN_FILES}) - message(STATUS "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/") + message( + STATUS + "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/") endforeach() foreach(BinFile ${ALL_DBG_BIN_FILES}) - message(STATUS "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/") + message( + STATUS + "copying ${BinFile} to ${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/") endforeach() foreach(BinFile ${ALL_PLATFORM_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/platforms") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/platforms/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/platforms") + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/platforms/" + ) endforeach() foreach(BinFile ${ALL_PLATFORM_REL_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/platforms") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/platforms/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/platforms" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/platforms/" + ) endforeach() foreach(BinFile ${ALL_PLATFORM_DBG_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/platforms") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/platforms/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/platforms" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/platforms/" + ) endforeach() foreach(BinFile ${ALL_STYLES_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/styles") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/styles/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/styles") + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/styles/") endforeach() foreach(BinFile ${ALL_STYLES_REL_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/styles") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/styles/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/styles") + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/styles/" + ) endforeach() foreach(BinFile ${ALL_STYLES_DBG_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/styles") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/styles/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/styles") + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/styles/" + ) endforeach() foreach(BinFile ${ALL_ICONENGINE_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/iconengines") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/iconengines/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/iconengines" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/iconengines/" + ) endforeach() foreach(BinFile ${ALL_ICONENGINE_REL_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/iconengines") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/iconengines/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/iconengines" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/iconengines/" + ) endforeach() foreach(BinFile ${ALL_ICONENGINE_DBG_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/iconengines") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/iconengines/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/iconengines" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/iconengines/" + ) endforeach() foreach(BinFile ${ALL_IMAGEFORMATS_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/imageformats") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/imageformats/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/imageformats" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}/imageformats/" + ) endforeach() foreach(BinFile ${ALL_IMAGEFORMATS_REL_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/imageformats") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/imageformats/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/imageformats" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}r/imageformats/" + ) endforeach() foreach(BinFile ${ALL_IMAGEFORMATS_DBG_BIN_FILES}) - make_directory("${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/imageformats") - file(COPY "${BinFile}" DESTINATION "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/imageformats/") + make_directory( + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/imageformats" + ) + file( + COPY "${BinFile}" + DESTINATION + "${CMAKE_SOURCE_DIR}/additional_install_files/exec${_bin_suffix}d/imageformats/" + ) endforeach() -set(COPIED_DEPENDENCIES TRUE CACHE BOOL "Dependencies have been copied, set to false to copy again" FORCE) +set(COPIED_DEPENDENCIES + TRUE + CACHE BOOL "Dependencies have been copied, set to false to copy again" + FORCE) diff --git a/cmake/Modules/DeprecationHelpers.cmake b/cmake/Modules/DeprecationHelpers.cmake new file mode 100644 index 000000000..55f554046 --- /dev/null +++ b/cmake/Modules/DeprecationHelpers.cmake @@ -0,0 +1,242 @@ +function(upgrade_cmake_vars) + if(DEFINED BROWSER_LEGACY) + set(ENABLE_BROWSER_LEGACY + "${BROWSER_LEGACY}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED BROWSER_PANEL_SUPPORT_ENABLED) + set(ENABLE_BROWSER_PANELS + "${BROWSER_PANEL_SUPPORT_ENABLED}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED BUILD_BROWSER) + set(ENABLE_BROWSER + "${BUILD_BROWSER}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED BUILD_CA_ENCODER) + set(ENABLE_COREAUDIO_ENCODER + "${BUILD_CA_ENCODER}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED BUILD_VST) + set(ENABLE_VST + "${BUILD_VST}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED CHECK_FOR_SERVICE_UPDATES) + set(ENABLE_SERVICE_UPDATES + "${CHECK_FOR_SERVICE_UPDATES}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED DEBUG_FFMPEG_MUX) + set(ENABLE_FFMPEG_MUX_DEBUG + "${DEBUG_FFMPEG_MUX}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED DISABLE_IVCAM) + if(DISABLE_IVCAM) + set(ENABLE_IVCAM + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_IVCAM + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED DISABLE_PLUGINS) + if(DISABLE_PLUGINS) + set(ENABLE_PLUGINS + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_PLUGINS + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED DISABLE_PYTHON) + if(DISABLE_PYTHON) + set(ENABLE_SCRIPTING_PYTHON + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_SCRIPTING_PYTHON + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED DISABLE_LUA) + if(DISABLE_LUA) + set(ENABLE_SCRIPTING_LUA + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_SCRIPTING_LUA + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED DISABLE_SPEEXDSP) + if(DISABLE_SPEEXDSP) + set(ENABLE_SPEEXDSP + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_SPEEXDSP + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED DISABLE_UPDATE_MODULE) + if(DISABLE_UPDATE_MODULE) + set(ENABLE_UPDATER + OFF + CACHE BOOL "" FORCE) + else() + set(ENABLE_UPDATER + ON + CACHE BOOL "" FORCE) + endif() + endif() + + if(DEFINED SHARED_TEXTURE_SUPPORT_ENABLED) + set(ENABLE_BROWSER_SHARED_TEXTURE + "${SHARED_TEXTURE_SUPPORT_ENABLED}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED STATIC_MBEDTLS) + set(ENABLE_STATIC_MBEDTLS + "${STATIC_MBEDTLS}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED UNIX_STRUCTURE AND UNIX_STRUCTURE) + set(LINUX_PORTABLE + OFF + CACHE BOOL "" FORCE) + endif() + + if(DEFINED USE_QT_LOOP) + set(ENABLE_BROWSER_QT_LOOP + "${USE_QT_LOOP}" + CACHE BOOL "" FORCE) + endif() + + if(DEFINED WITH_RTMPS) + set(ENABLE_RTMPS + "${WITH_RTMPS}" + CACHE STRING "" FORCE) + endif() +endfunction() + +function(install_obs_plugin_with_data) + message( + DEPRECATION + "OBS: The install_obs_plugin_with_data command is deprecated and will be removed soon. Use 'setup_plugin_target' instead." + ) + _install_obs_plugin_with_data(${ARGV}) +endfunction() + +function(install_obs_plugin) + message( + DEPRECATION + "OBS: The install_obs_plugin command is deprecated and will be removed soon. Use 'setup_plugin_target' instead." + ) + _install_obs_plugin(${ARGV}) +endfunction() + +function(install_obs_datatarget) + message( + DEPRECATION + "OBS: The install_obs_datatarget function is deprecated and will be removed soon. Use 'setup_target_resources' instead." + ) + _install_obs_datatarget(${ARGV}) +endfunction() + +function(__deprecated_var VAR ACCESS) + if(ACCESS STREQUAL "READ_ACCESS") + message(DEPRECATION "OBS: The variable '${VAR}' is deprecated!") + endif() +endfunction() + +function(__deprecated_feature VAR ACCESS) + if(ACCESS STREQUAL "UNKNOWN_READ_ACCESS") + message( + DEPRECATION + "OBS: The feature enabled by '${VAR}' is deprecated and will soon be removed from OBS." + ) + endif() +endfunction() + +set(_DEPRECATED_VARS + zlibPath + vulkanPath + SwigPath + PythonPath + mbedtlsPath + LuajitPath + x264Path + VlcPath + VLCPath + speexPath + rnnoisePath + LibfdkPath + curlPath + JanssonPath + FFmpegPath + DepsPath + DepsPath32 + DepsPath64 + QTDIR32 + QTDIR64 + DISABLE_UI + UI_ENABLED + UNIX_STRUCTURE + UPDATE_SPARKLE + LIBOBS_PREFER_IMAGEMAGICK + DEBUG_FFMPEG_MUX + ENABLE_WINMF + USE_QT_LOOP + SHARED_TEXTURE_SUPPORT_ENABLED + BROWSER_PANEL_SUPPORT_ENABLED + BROWSER_LEGACY + BUILD_BROWSER + BUILD_CAPTIONS + BUILD_CA_ENCODER + BUILD_VST + CHECK_FOR_SERVICE_UPDATES + DISABLE_IVCAM + DISABLE_LUA + DISABLE_PLUGINS + DISABLE_PYTHON + DISABLE_SPEEXDSP + DISABLE_UPDATE_MODULE + SHARED_TEXTURE_SUPPORT_ENABLED + STATIC_MBEDTLS + UNIX_STRUCTURE + USE_QT_LOOP + WITH_RTMPS) + +foreach(_DEPRECATED_VAR IN LISTS _DEPRECATED_VARS) + variable_watch(_DEPRECATED_VAR __deprecated_var) +endforeach() + +variable_watch(FTL_FOUND __deprecated_feature) + +# Upgrade pre-existing build variables to their new variants as best as possible +upgrade_cmake_vars() diff --git a/cmake/Modules/FindAppKit.cmake b/cmake/Modules/FindAppKit.cmake deleted file mode 100644 index 1cc1e8451..000000000 --- a/cmake/Modules/FindAppKit.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# Once done these will be defined: -# -# APPKIT_FOUND -# APPKIT_LIBRARIES - -find_library(APPKIT_FRAMEWORK AppKit) - -set(APPKIT_LIBRARIES ${APPKIT_FRAMEWORK}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(AppKit DEFAULT_MSG APPKIT_FRAMEWORK) -mark_as_advanced(APPKIT_FRAMEWORK) diff --git a/cmake/Modules/FindCEF.cmake b/cmake/Modules/FindCEF.cmake new file mode 100644 index 000000000..00d020328 --- /dev/null +++ b/cmake/Modules/FindCEF.cmake @@ -0,0 +1,160 @@ +include(FindPackageHandleStandardArgs) + +set_property(CACHE CEF_ROOT_DIR PROPERTY HELPSTRING + "Path to CEF distributed build") +if(NOT DEFINED CEF_ROOT_DIR OR CEF_ROOT_DIR STREQUAL "") + message( + FATAL_ERROR + "CEF_ROOT_DIR is not set - if ENABLE_BROWSER is enabled, a CEF distribution with compiled wrapper library is required.\n" + "Please download a CEF distribution for your appropriate architecture and specify CEF_ROOT_DIR to its location" + ) +endif() + +find_path(CEF_INCLUDE_DIR "include/cef_version.h" HINTS "${CEF_ROOT_DIR}") + +if(OS_MACOS) + find_library( + CEF_LIBRARY + NAMES cef libcef cef.lib libcef.o "Chromium Embedded Framework" + NO_DEFAULT_PATH + PATHS "${CEF_ROOT_DIR}" "${CEF_ROOT_DIR}/Release") + + find_library( + CEFWRAPPER_LIBRARY + NAMES cef_dll_wrapper libcef_dll_wrapper + NO_DEFAULT_PATH + PATHS "${CEF_ROOT_DIR}/build/libcef_dll/Release" + "${CEF_ROOT_DIR}/build/libcef_dll_wrapper/Release" + "${CEF_ROOT_DIR}/build/libcef_dll" + "${CEF_ROOT_DIR}/build/libcef_dll_wrapper") + +elseif(OS_POSIX) + find_library( + CEF_LIBRARY + NAMES libcef.so "Chromium Embedded Framework" + NO_DEFAULT_PATH + PATHS "${CEF_ROOT_DIR}" "${CEF_ROOT_DIR}/Release") + + find_library( + CEFWRAPPER_LIBRARY + NAMES libcef_dll_wrapper.a + NO_DEFAULT_PATH + PATHS "${CEF_ROOT_DIR}/build/libcef_dll_wrapper" + "${CEF_ROOT_DIR}/libcef_dll_wrapper") + +else() + find_library( + CEF_LIBRARY + NAMES cef libcef cef.lib libcef.o "Chromium Embedded Framework" + PATHS "${CEF_ROOT_DIR}" "${CEF_ROOT_DIR}/Release") + + find_library( + CEFWRAPPER_LIBRARY + NAMES cef_dll_wrapper libcef_dll_wrapper + PATHS "${CEF_ROOT_DIR}/build/libcef_dll/Release" + "${CEF_ROOT_DIR}/build/libcef_dll_wrapper/Release" + "${CEF_ROOT_DIR}/build/libcef_dll" + "${CEF_ROOT_DIR}/build/libcef_dll_wrapper") + + if(OS_WINDOWS) + find_library( + CEFWRAPPER_LIBRARY_DEBUG + NAMES cef_dll_wrapper libcef_dll_wrapper + PATHS "${CEF_ROOT_DIR}/build/libcef_dll/Debug" + "${CEF_ROOT_DIR}/build/libcef_dll_wrapper/Debug") + endif() +endif() + +mark_as_advanced(CEFWRAPPER_LIBRARY CEFWRAPPER_LIBRARY_DEBUG) + +if(NOT CEF_LIBRARY) + message( + WARNING + " Could NOT find Chromium Embedded Framework library (missing: CEF_LIBRARY)" + ) + set(CEF_FOUND FALSE) + return() +endif() + +if(NOT CEFWRAPPER_LIBRARY) + message( + WARNING + " Could NOT find Chromium Embedded Framework wrapper library (missing: CEFWRAPPER_LIBRARY)" + ) + set(CEF_FOUND FALSE) + return() +endif() + +message( + STATUS + "Found Chromium Embedded Framework: ${CEF_LIBRARY};${CEF_WRAPPER_LIBRARY}") + +if(OS_WINDOWS) + set(CEF_LIBRARIES ${CEF_LIBRARY} ${CEFWRAPPER_LIBRARY}) + +elseif(OS_MACOS) + if(BROWSER_LEGACY) + set(CEF_LIBRARIES ${CEFWRAPPER_LIBRARY} ${CEF_LIBRARY}) + else() + set(CEF_LIBRARIES ${CEFWRAPPER_LIBRARY}) + endif() +else() + set(CEF_LIBRARIES ${CEF_LIBRARY} optimized ${CEFWRAPPER_LIBRARY}) + + if(CEFWRAPPER_LIBRARY_DEBUG) + list(APPEND CEF_LIBRARIES debug ${CEFWRAPPER_LIBRARY_DEBUG}) + endif() +endif() + +find_package_handle_standard_args(CEF DEFAULT_MSG CEF_LIBRARY + CEFWRAPPER_LIBRARY CEF_INCLUDE_DIR) + +mark_as_advanced(CEF_LIBRARY CEF_WRAPPER_LIBRARY CEF_LIBRARIES CEF_INCLUDE_DIR) + +if(NOT TARGET CEF::Wrapper) + if(IS_ABSOLUTE "${CEF_LIBRARIES}") + add_library(CEF::Wrapper UNKNOWN IMPORTED) + add_library(CEF::Library UNKNOWN IMPORTED) + + set_target_properties(CEF::Wrapper PROPERTIES IMPORTED_LOCATION + ${CEFWRAPPER_LIBRARY}) + + set_target_properties(CEF::Library PROPERTIES IMPORTED_LOCATION + ${CEF_LIBRARY}) + + if(DEFINED CEFWRAPPER_LIBRARY_DEBUG) + add_library(CEF::Wrapper_Debug UNKNOWN IMPORTED) + set_target_properties( + CEF::Wrapper_Debug PROPERTIES IMPORTED_LOCATION + ${CEFWRAPPER_LIBRARY_DEBUG}) + endif() + else() + add_library(CEF::Wrapper INTERFACE IMPORTED) + add_library(CEF::Library INTERFACE IMPORTED) + + set_target_properties(CEF::Wrapper PROPERTIES IMPORTED_LIBNAME + ${CEFWRAPPER_LIBRARY}) + + set_target_properties(CEF::Library PROPERTIES IMPORTED_LIBNAME + ${CEF_LIBRARY}) + + if(DEFINED CEFWRAPPER_LIBRARY_DEBUG) + add_library(CEF::Wrapper_Debug INTERFACE IMPORTED) + set_target_properties( + CEF::Wrapper_Debug PROPERTIES IMPORTED_LIBNAME + ${CEFWRAPPER_LIBRARY_DEBUG}) + endif() + endif() + + set_target_properties(CEF::Wrapper PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CEF_INCLUDE_DIR}") + + set_target_properties(CEF::Library PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CEF_INCLUDE_DIR}") + + if(DEFINED CEFWRAPPER_LIBRARY_DEBUG) + set_target_properties( + CEF::Wrapper_Debug PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${CEF_INCLUDE_DIR}") + endif() +endif() diff --git a/cmake/Modules/FindCXX11.cmake b/cmake/Modules/FindCXX11.cmake deleted file mode 100644 index a62777558..000000000 --- a/cmake/Modules/FindCXX11.cmake +++ /dev/null @@ -1,68 +0,0 @@ -# - Finds if the compiler has C++11 support -# This module can be used to detect compiler flags for using C++11, and checks -# a small subset of the language. -# -# The following variables are set: -# CXX11_FLAGS - flags to add to the CXX compiler for C++11 support -# CXX11_FOUND - true if the compiler supports C++11 -# - -if(CXX11_FLAGS) - set(CXX11_FOUND TRUE) - return() -endif() - -include(CheckCXXSourceCompiles) - -if(MSVC) - set(CXX11_FLAG_CANDIDATES - " " - ) -else() - set(CXX11_FLAG_CANDIDATES - #gcc - "-std=gnu++11" - "-std=gnu++0x" - #Gnu and Intel Linux - "-std=c++11" - "-std=c++0x" - #Microsoft Visual Studio, and everything that automatically accepts C++11 - " " - #Intel windows - "/Qstd=c++11" - "/Qstd=c++0x" - ) -endif() - -set(CXX11_TEST_SOURCE -" -int main() -{ - int n[] = {4,7,6,1,2}; - int r; - auto f = [&](int j) { r = j; }; - - for (auto i : n) - f(i); - return 0; -} -") - -foreach(FLAG ${CXX11_FLAG_CANDIDATES}) - set(SAFE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}") - set(CMAKE_REQUIRED_FLAGS "${FLAG}") - unset(CXX11_FLAG_DETECTED CACHE) - message(STATUS "Try C++11 flag = [${FLAG}]") - check_cxx_source_compiles("${CXX11_TEST_SOURCE}" CXX11_FLAG_DETECTED) - set(CMAKE_REQUIRED_FLAGS "${SAFE_CMAKE_REQUIRED_FLAGS}") - if(CXX11_FLAG_DETECTED) - set(CXX11_FLAGS_INTERNAL "${FLAG}") - break() - endif(CXX11_FLAG_DETECTED) -endforeach(FLAG ${CXX11_FLAG_CANDIDATES}) - -set(CXX11_FLAGS "${CXX11_FLAGS_INTERNAL}" CACHE STRING "C++11 Flags") - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(CXX11 DEFAULT_MSG CXX11_FLAGS) -mark_as_advanced(CXX11_FLAGS) diff --git a/cmake/Modules/FindDetours.cmake b/cmake/Modules/FindDetours.cmake index 93aaaa78f..1eb66e1c1 100644 --- a/cmake/Modules/FindDetours.cmake +++ b/cmake/Modules/FindDetours.cmake @@ -1,68 +1,75 @@ # Once done these will be defined: # -# DETOURS_FOUND -# DETOURS_INCLUDE_DIRS -# DETOURS_LIBRARIES +# * DETOURS_FOUND +# * DETOURS_INCLUDE_DIRS +# * DETOURS_LIBRARIES # # For use in OBS: # -# DETOURS_INCLUDE_DIR +# DETOURS_INCLUDE_DIR find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_DETOURS QUIET detours) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_DETOURS QUIET detours) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(DETOURS_INCLUDE_DIR - NAMES detours.h - HINTS - ENV detoursPath${_lib_suffix} - ENV detoursPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${detoursPath${_lib_suffix}} - ${detoursPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_DETOURS_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + DETOURS_INCLUDE_DIR + NAMES detours.h + HINTS ENV DETOURS_PATH ${DETOURS_PATH} ${CMAKE_SOURCE_DIR}/${DETOURS_PATH} + ${_DETOURS_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(DETOURS_LIB - NAMES ${_DETOURS_LIBRARIES} detours - HINTS - ENV detoursPath${_lib_suffix} - ENV detoursPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${detoursPath${_lib_suffix}} - ${detoursPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_DETOURS_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + DETOURS_LIB + NAMES ${_DETOURS_LIBRARIES} detours + HINTS ENV DETOURS_PATH ${DETOURS_PATH} ${CMAKE_SOURCE_DIR}/${DETOURS_PATH} + ${_DETOURS_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Detours DEFAULT_MSG DETOURS_LIB DETOURS_INCLUDE_DIR) +find_package_handle_standard_args(Detours DEFAULT_MSG DETOURS_LIB + DETOURS_INCLUDE_DIR) mark_as_advanced(DETOURS_INCLUDE_DIR DETOURS_LIB) if(DETOURS_FOUND) - set(DETOURS_INCLUDE_DIRS ${DETOURS_INCLUDE_DIR}) - set(DETOURS_LIBRARIES ${DETOURS_LIB}) + set(DETOURS_INCLUDE_DIRS ${DETOURS_INCLUDE_DIR}) + set(DETOURS_LIBRARIES ${DETOURS_LIB}) + + if(NOT TARGET Detours::Detours) + if(IS_ABSOLUTE "${DETOURS_LIBRARIES}") + add_library(Detours::Detours UNKNOWN IMPORTED) + set_target_properties(Detours::Detours PROPERTIES IMPORTED_LOCATION + "${DETOURS_LIBRARIES}") + else() + add_library(Detours::Detours INTERFACE IMPORTED) + set_target_properties(Detours::Detours PROPERTIES IMPORTED_LIBNAME + "${DETOURS_LIBRARIES}") + endif() + + set_target_properties( + Detours::Detours PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${DETOURS_INCLUDE_DIRS}") + endif() + endif() diff --git a/cmake/Modules/FindEGL.cmake b/cmake/Modules/FindEGL.cmake deleted file mode 100644 index ee27cc906..000000000 --- a/cmake/Modules/FindEGL.cmake +++ /dev/null @@ -1,53 +0,0 @@ -# - Try to Find EGL -# Once done, this will define -# -# EGL_FOUND - system has EGL installed. -# EGL_INCLUDE_DIRS - directories which contain the EGL headers. -# EGL_LIBRARIES - libraries required to link against EGL. -# EGL_DEFINITIONS - Compiler switches required for using EGL. -# -# Copyright (C) 2012 Intel Corporation. All rights reserved. -# 2020 Georges Basile Stavracas Neto -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS -# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS -# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -find_package(PkgConfig) - -pkg_check_modules(PC_EGL egl) - -if (PC_EGL_FOUND) - set(EGL_DEFINITIONS ${PC_EGL_CFLAGS_OTHER}) -endif () - -find_path(EGL_INCLUDE_DIRS NAMES EGL/egl.h - HINTS ${PC_EGL_INCLUDE_DIR} ${PC_EGL_INCLUDE_DIRS} -) - -find_library(EGL_LIBRARIES NAMES egl EGL - HINTS ${PC_EGL_LIBRARY_DIRS} -) - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(EGL DEFAULT_MSG EGL_INCLUDE_DIRS EGL_LIBRARIES) - -mark_as_advanced(EGL_INCLUDE_DIRS EGL_LIBRARIES) diff --git a/cmake/Modules/FindFFmpeg.cmake b/cmake/Modules/FindFFmpeg.cmake index 4cc7445b4..3bd89af67 100644 --- a/cmake/Modules/FindFFmpeg.cmake +++ b/cmake/Modules/FindFFmpeg.cmake @@ -1,155 +1,200 @@ # # This module defines the following variables: # -# FFMPEG_FOUND - All required components and the core library were found -# FFMPEG_INCLUDE_DIRS - Combined list of all components include dirs -# FFMPEG_LIBRARIES - Combined list of all components libraries -# FFMPEG_VERSION_STRING - Version of the first component requested +# FFMPEG_FOUND - All required components and the core library were found +# FFMPEG_INCLUDE_DIRS - Combined list of all components include dirs +# FFMPEG_LIBRARIES - Combined list of all components libraries +# FFMPEG_VERSION_STRING - Version of the first component requested # # For each requested component the following variables are defined: # -# FFMPEG__FOUND - The component was found -# FFMPEG__INCLUDE_DIRS - The components include dirs -# FFMPEG__LIBRARIES - The components libraries -# FFMPEG__VERSION_STRING - The components version string -# FFMPEG__VERSION_MAJOR - The components major version -# FFMPEG__VERSION_MINOR - The components minor version -# FFMPEG__VERSION_MICRO - The components micro version +# FFMPEG__FOUND - The component was found +# FFMPEG__INCLUDE_DIRS - The components include dirs +# FFMPEG__LIBRARIES - The components libraries +# FFMPEG__VERSION_STRING - The components version string +# FFMPEG__VERSION_MAJOR - The components major version +# FFMPEG__VERSION_MINOR - The components minor version +# FFMPEG__VERSION_MICRO - The components micro version # # is the uppercase name of the component - find_package(PkgConfig QUIET) if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() function(find_ffmpeg_library component header) - string(TOUPPER "${component}" component_u) - set(FFMPEG_${component_u}_FOUND FALSE PARENT_SCOPE) - set(FFmpeg_${component}_FOUND FALSE PARENT_SCOPE) + string(TOUPPER "${component}" component_u) + set(FFMPEG_${component_u}_FOUND + FALSE + PARENT_SCOPE) + set(FFmpeg_${component}_FOUND + FALSE + PARENT_SCOPE) - if(PKG_CONFIG_FOUND) - pkg_check_modules(PC_FFMPEG_${component} QUIET lib${component}) - endif() + if(PKG_CONFIG_FOUND) + pkg_check_modules(PC_FFMPEG_${component} QUIET lib${component}) + endif() - find_path(FFMPEG_${component}_INCLUDE_DIR - NAMES - "lib${component}/${header}" "lib${component}/version.h" - HINTS - ENV FFmpegPath${_lib_suffix} - ENV FFmpegPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${FFmpegPath${_lib_suffix}} - ${FFmpegPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${PC_FFMPEG_${component}_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES ffmpeg libav include) + find_path( + FFMPEG_${component}_INCLUDE_DIR + NAMES "lib${component}/${header}" "lib${component}/version.h" + HINTS ENV FFMPEG_PATH ${FFMPEG_PATH} ${CMAKE_SOURCE_DIR}/${FFMPEG_PATH} + ${PC_FFMPEG_${component}_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES ffmpeg libav include) - find_library(FFMPEG_${component}_LIBRARY - NAMES - "${component}" "lib${component}" - HINTS - ENV FFmpegPath${_lib_suffix} - ENV FFmpegPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${FFmpegPath${_lib_suffix}} - ${FFmpegPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${PC_FFMPEG_${component}_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) + find_library( + FFMPEG_${component}_LIBRARY + NAMES "${component}" "lib${component}" + HINTS ENV FFMPEG_PATH ${FFMPEG_PATH} ${CMAKE_SOURCE_DIR}/${FFMPEG_PATH} + ${PC_FFMPEG_${component}_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) - set(FFMPEG_${component_u}_INCLUDE_DIRS ${FFMPEG_${component}_INCLUDE_DIR} PARENT_SCOPE) - set(FFMPEG_${component_u}_LIBRARIES ${FFMPEG_${component}_LIBRARY} PARENT_SCOPE) + set(FFMPEG_${component_u}_INCLUDE_DIRS + ${FFMPEG_${component}_INCLUDE_DIR} + PARENT_SCOPE) + set(FFMPEG_${component_u}_LIBRARIES + ${FFMPEG_${component}_LIBRARY} + PARENT_SCOPE) - mark_as_advanced(FFMPEG_${component}_INCLUDE_DIR FFMPEG_${component}_LIBRARY) + mark_as_advanced(FFMPEG_${component}_INCLUDE_DIR FFMPEG_${component}_LIBRARY) - if(FFMPEG_${component}_INCLUDE_DIR AND FFMPEG_${component}_LIBRARY) - set(FFMPEG_${component_u}_FOUND TRUE PARENT_SCOPE) - set(FFmpeg_${component}_FOUND TRUE PARENT_SCOPE) + if(FFMPEG_${component}_INCLUDE_DIR AND FFMPEG_${component}_LIBRARY) + set(FFMPEG_${component_u}_FOUND + TRUE + PARENT_SCOPE) + set(FFmpeg_${component}_FOUND + TRUE + PARENT_SCOPE) - list(APPEND FFMPEG_INCLUDE_DIRS ${FFMPEG_${component}_INCLUDE_DIR}) - list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) - set(FFMPEG_INCLUDE_DIRS "${FFMPEG_INCLUDE_DIRS}" PARENT_SCOPE) + list(APPEND FFMPEG_INCLUDE_DIRS ${FFMPEG_${component}_INCLUDE_DIR}) + list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS) + set(FFMPEG_INCLUDE_DIRS + "${FFMPEG_INCLUDE_DIRS}" + PARENT_SCOPE) - list(APPEND FFMPEG_LIBRARIES ${FFMPEG_${component}_LIBRARY}) - list(REMOVE_DUPLICATES FFMPEG_LIBRARIES) - set(FFMPEG_LIBRARIES "${FFMPEG_LIBRARIES}" PARENT_SCOPE) + list(APPEND FFMPEG_LIBRARIES ${FFMPEG_${component}_LIBRARY}) + list(REMOVE_DUPLICATES FFMPEG_LIBRARIES) + set(FFMPEG_LIBRARIES + "${FFMPEG_LIBRARIES}" + PARENT_SCOPE) - set(FFMPEG_${component_u}_VERSION_STRING "unknown" PARENT_SCOPE) - set(_vfile "${FFMPEG_${component}_INCLUDE_DIR}/lib${component}/version.h") + set(FFMPEG_${component_u}_VERSION_STRING + "unknown" + PARENT_SCOPE) + set(_vfile "${FFMPEG_${component}_INCLUDE_DIR}/lib${component}/version.h") - if(EXISTS "${_vfile}") - file(STRINGS "${_vfile}" _version_parse REGEX "^.*VERSION_(MAJOR|MINOR|MICRO)[ \t]+[0-9]+[ \t]*$") - string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _major "${_version_parse}") - string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _minor "${_version_parse}") - string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" _micro "${_version_parse}") + if(EXISTS "${_vfile}") + file(STRINGS "${_vfile}" _version_parse + REGEX "^.*VERSION_(MAJOR|MINOR|MICRO)[ \t]+[0-9]+[ \t]*$") + string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" _major + "${_version_parse}") + string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" _minor + "${_version_parse}") + string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" _micro + "${_version_parse}") - set(FFMPEG_${component_u}_VERSION_MAJOR "${_major}" PARENT_SCOPE) - set(FFMPEG_${component_u}_VERSION_MINOR "${_minor}" PARENT_SCOPE) - set(FFMPEG_${component_u}_VERSION_MICRO "${_micro}" PARENT_SCOPE) + set(FFMPEG_${component_u}_VERSION_MAJOR + "${_major}" + PARENT_SCOPE) + set(FFMPEG_${component_u}_VERSION_MINOR + "${_minor}" + PARENT_SCOPE) + set(FFMPEG_${component_u}_VERSION_MICRO + "${_micro}" + PARENT_SCOPE) - set(FFMPEG_${component_u}_VERSION_STRING "${_major}.${_minor}.${_micro}" PARENT_SCOPE) - else() - message(STATUS "Failed parsing FFmpeg ${component} version") - endif() - endif() + set(FFMPEG_${component_u}_VERSION_STRING + "${_major}.${_minor}.${_micro}" + PARENT_SCOPE) + else() + message(STATUS "Failed parsing FFmpeg ${component} version") + endif() + endif() endfunction() set(FFMPEG_INCLUDE_DIRS) set(FFMPEG_LIBRARIES) if(NOT FFmpeg_FIND_COMPONENTS) - message(FATAL_ERROR "No FFmpeg components requested") + message(FATAL_ERROR "No FFmpeg components requested") endif() list(GET FFmpeg_FIND_COMPONENTS 0 _first_comp) string(TOUPPER "${_first_comp}" _first_comp) foreach(component ${FFmpeg_FIND_COMPONENTS}) - if(component STREQUAL "avcodec") - find_ffmpeg_library("${component}" "avcodec.h") - elseif(component STREQUAL "avdevice") - find_ffmpeg_library("${component}" "avdevice.h") - elseif(component STREQUAL "avfilter") - find_ffmpeg_library("${component}" "avfilter.h") - elseif(component STREQUAL "avformat") - find_ffmpeg_library("${component}" "avformat.h") - elseif(component STREQUAL "avresample") - find_ffmpeg_library("${component}" "avresample.h") - elseif(component STREQUAL "avutil") - find_ffmpeg_library("${component}" "avutil.h") - elseif(component STREQUAL "postproc") - find_ffmpeg_library("${component}" "postprocess.h") - elseif(component STREQUAL "swresample") - find_ffmpeg_library("${component}" "swresample.h") - elseif(component STREQUAL "swscale") - find_ffmpeg_library("${component}" "swscale.h") - else() - message(FATAL_ERROR "Unknown FFmpeg component requested: ${component}") - endif() + if(component STREQUAL "avcodec") + find_ffmpeg_library("${component}" "avcodec.h") + elseif(component STREQUAL "avdevice") + find_ffmpeg_library("${component}" "avdevice.h") + elseif(component STREQUAL "avfilter") + find_ffmpeg_library("${component}" "avfilter.h") + elseif(component STREQUAL "avformat") + find_ffmpeg_library("${component}" "avformat.h") + elseif(component STREQUAL "avresample") + find_ffmpeg_library("${component}" "avresample.h") + elseif(component STREQUAL "avutil") + find_ffmpeg_library("${component}" "avutil.h") + elseif(component STREQUAL "postproc") + find_ffmpeg_library("${component}" "postprocess.h") + elseif(component STREQUAL "swresample") + find_ffmpeg_library("${component}" "swresample.h") + elseif(component STREQUAL "swscale") + find_ffmpeg_library("${component}" "swscale.h") + else() + message(FATAL_ERROR "Unknown FFmpeg component requested: ${component}") + endif() endforeach() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(FFmpeg - FOUND_VAR FFMPEG_FOUND - REQUIRED_VARS FFMPEG_${_first_comp}_LIBRARIES FFMPEG_${_first_comp}_INCLUDE_DIRS - VERSION_VAR FFMPEG_${_first_comp}_VERSION_STRING - HANDLE_COMPONENTS) +find_package_handle_standard_args( + FFmpeg + FOUND_VAR FFMPEG_FOUND + REQUIRED_VARS FFMPEG_${_first_comp}_LIBRARIES + FFMPEG_${_first_comp}_INCLUDE_DIRS + VERSION_VAR FFMPEG_${_first_comp}_VERSION_STRING + HANDLE_COMPONENTS) + +if(FFMPEG_FOUND) + foreach(component ${FFmpeg_FIND_COMPONENTS}) + if(NOT TARGET FFmpeg::${component}) + string(TOUPPER ${component} component_u) + if(FFMPEG_${component_u}_FOUND) + if(IS_ABSOLUTE "${FFMPEG_${component_u}_LIBRARIES}") + add_library(FFmpeg::${component} UNKNOWN IMPORTED) + set_target_properties( + FFmpeg::${component} + PROPERTIES IMPORTED_LOCATION "${FFMPEG_${component_u}_LIBRARIES}") + else() + add_library(FFmpeg::${component} INTERFACE IMPORTED) + set_target_properties( + FFmpeg::${component} + PROPERTIES IMPORTED_LIBNAME "${FFMPEG_${component_u}_LIBRARIES}") + endif() + + set_target_properties( + FFmpeg::${component} + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${FFMPEG_${component_u}_INCLUDE_DIRS}") + endif() + endif() + endforeach() +endif() diff --git a/cmake/Modules/FindFontconfig.cmake b/cmake/Modules/FindFontconfig.cmake deleted file mode 100644 index 205a9f51b..000000000 --- a/cmake/Modules/FindFontconfig.cmake +++ /dev/null @@ -1,34 +0,0 @@ -# Once done these will be defined: -# -# FONTCONFIG_FOUND -# FONTCONFIG_INCLUDE_DIRS -# FONTCONFIG_LIBRARIES - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_FONTCONFIG QUIET fontconfig) -endif() - -find_path(FONTCONFIG_INCLUDE_DIR - NAMES fontconfig/fontconfig.h - HINTS - ${_FONTCONFIG_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include) - -find_library(FONTCONFIG_LIB - NAMES fontconfig - HINTS - ${_FONTCONFIG_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Fontconfig DEFAULT_MSG FONTCONFIG_LIB - FONTCONFIG_INCLUDE_DIR) -mark_as_advanced(FONTCONFIG_INCLUDE_DIR FONTCONFIG_LIB) - -if(FONTCONFIG_FOUND) - set(FONTCONFIG_INCLUDE_DIRS ${FONTCONFIG_INCLUDE_DIR}) - set(FONTCONFIG_LIBRARIES "${FONTCONFIG_LIB}") -endif() diff --git a/cmake/Modules/FindFreetype.cmake b/cmake/Modules/FindFreetype.cmake deleted file mode 100644 index f1223f69a..000000000 --- a/cmake/Modules/FindFreetype.cmake +++ /dev/null @@ -1,94 +0,0 @@ -# Once done these will be defined: -# -# FREETYPE_FOUND -# FREETYPE_INCLUDE_DIRS -# FREETYPE_LIBRARIES - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_FREETYPE QUIET freetype2) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -find_path(FREETYPE_INCLUDE_DIR_ft2build - NAMES - ft2build.h - HINTS - ENV FreetypePath${_lib_suffix} - ENV FreetypePath - ENV FREETYPE_DIR - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${FreetypePath${_lib_suffix}} - ${FreetypePath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_FREETYPE_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - freetype2 include/freetype2 include) - -find_path(FREETYPE_INCLUDE_DIR_freetype2 - NAMES - freetype/config/ftheader.h - config/ftheader.h - HINTS - ENV FreetypePath${_lib_suffix} - ENV FreetypePath - ENV FREETYPE_DIR - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${FreetypePath${_lib_suffix}} - ${FreetypePath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_FREETYPE_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - freetype2 include/freetype2 include) - -find_library(FREETYPE_LIB - NAMES ${_FREETYPE_LIBRARIES} freetype libfreetype - HINTS - ENV FreetypePath${_lib_suffix} - ENV FreetypePath - ENV FREETYPE_DIR - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${FreetypePath${_lib_suffix}} - ${FreetypePath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_FREETYPE_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) - -if(FREETYPE_INCLUDE_DIR_ft2build AND FREETYPE_INCLUDE_DIR_freetype2) - set(FREETYPE_INCLUDE_DIR "${FREETYPE_INCLUDE_DIR_ft2build};${FREETYPE_INCLUDE_DIR_freetype2}") - list(REMOVE_DUPLICATES FREETYPE_INCLUDE_DIR) -else() - unset(FREETYPE_INCLUDE_DIR) -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Freetype DEFAULT_MSG FREETYPE_LIB FREETYPE_INCLUDE_DIR_ft2build FREETYPE_INCLUDE_DIR_freetype2) -mark_as_advanced(FREETYPE_INCLUDE_DIR FREETYPE_INCLUDE_DIR_ft2build FREETYPE_INCLUDE_DIR_freetype2 FREETYPE_LIB) - -if(FREETYPE_FOUND) - set(FREETYPE_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIR}) - set(FREETYPE_LIBRARIES ${FREETYPE_LIB}) -endif() diff --git a/cmake/Modules/FindGio.cmake b/cmake/Modules/FindGio.cmake index d857ec69b..8abcfc0a0 100644 --- a/cmake/Modules/FindGio.cmake +++ b/cmake/Modules/FindGio.cmake @@ -1,27 +1,53 @@ -# - Try to find Gio -# Once done this will define +# * Try to find Gio Once done this will define # -# GIO_FOUND - system has Gio -# GIO_INCLUDE_DIRS - the Gio include directory -# GIO_LIBRARIES - the libraries needed to use Gio -# GIO_DEFINITIONS - Compiler switches required for using Gio +# GIO_FOUND - system has Gio GIO_INCLUDE_DIRS - the Gio include directory +# GIO_LIBRARIES - the libraries needed to use Gio GIO_DEFINITIONS - Compiler +# switches required for using Gio -# Use pkg-config to get the directories and then use these values -# in the find_path() and find_library() calls -find_package(PkgConfig) -pkg_check_modules(PC_GIO gio-2.0 gio-unix-2.0) +# Use pkg-config to get the directories and then use these values in the +# find_path() and find_library() calls -set(GIO_DEFINITIONS ${PC_GIO_CFLAGS}) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_GIO gio-2.0 gio-unix-2.0) +endif() -find_path(GIO_INCLUDE_DIRS gio.h PATHS ${PC_GIO_INCLUDEDIR} ${PC_GIO_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/gio/) -find_library(GIO_LIBRARIES NAMES gio-2.0 libgio-2.0 gio-unix-2.0 PATHS ${PC_GIO_LIBDIR} ${PC_GIO_LIBRARY_DIRS}) -mark_as_advanced(GIO_INCLUDE_DIRS GIO_LIBRARIES) +find_path( + GIO_INCLUDE_DIR + NAMES gio.h + HINTS ${_GIO_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES glib-2.0/gio/) + +find_library( + GIO_LIB + NAMES ${_GIO_LIBRARIES} gio-2.0 libgio-2.0 gio-unix-2.0 + HINTS ${_GIO_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Gio REQUIRED_VARS GIO_LIBRARIES GIO_INCLUDE_DIRS) +find_package_handle_standard_args(Gio REQUIRED_VARS GIO_LIB GIO_INCLUDE_DIR) +mark_as_advanced(GIO_INCLUDE_DIR GIO_LIB) if(GIO_FOUND) - set(HAVE_DBUS "1") -else() - set(HAVE_DBUS "0") + set(GIO_INCLUDE_DIRS ${GIO_INCLUDE_DIR}) + set(GIO_LIBRARIES ${GIO_LIB}) + + if(NOT TARGET GIO::GIO) + if(IS_ABSOLUTE "${GIO_LIBRARIES}") + add_library(GIO::GIO UNKNOWN IMPORTED) + set_target_properties(GIO::GIO PROPERTIES IMPORTED_LOCATION + "${GIO_LIBRARIES}") + else() + add_library(GIO::GIO INTERFACE IMPORTED) + set_target_properties(GIO::GIO PROPERTIES IMPORTED_LIBNAME + "${GIO_LIBRARIES}") + endif() + + # Special case for gio, as both the + set_target_properties(GIO::GIO PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${_GIO_INCLUDE_DIRS}") + + target_compile_options(GIO::GIO INTERFACE ${_GIO_CFLAGS}) + endif() endif() diff --git a/cmake/Modules/FindIconv.cmake b/cmake/Modules/FindIconv.cmake deleted file mode 100644 index 7a2c9a218..000000000 --- a/cmake/Modules/FindIconv.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# Once done these will be defined: -# -# ICONV_FOUND -# ICONV_INCLUDE_DIRS -# ICONV_LIBRARIES - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_ICONV QUIET iconv) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -find_path(ICONV_INCLUDE_DIR - NAMES iconv.h - HINTS - ENV IconvPath${_lib_suffix} - ENV IconvPath - ${_ICONV_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include) - -find_library(ICONV_LIB - NAMES ${_ICONV_LIBRARIES} iconv libiconv - HINTS - ${_ICONV_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Iconv DEFAULT_MSG ICONV_LIB ICONV_INCLUDE_DIR) -mark_as_advanced(ICONV_INCLUDE_DIR ICONV_LIB) - -if(ICONV_FOUND) - set(ICONV_INCLUDE_DIRS ${ICONV_INCLUDE_DIR}) - set(ICONV_LIBRARIES ${ICONV_LIB}) -endif() diff --git a/cmake/Modules/FindJack.cmake b/cmake/Modules/FindJack.cmake index aaaa55294..80a49b47f 100644 --- a/cmake/Modules/FindJack.cmake +++ b/cmake/Modules/FindJack.cmake @@ -1,82 +1,78 @@ -# - Try to find jack-2.6 -# Once done this will define +# * Try to find jack-2.6 Once done this will define # -# JACK_FOUND - system has jack -# JACK_INCLUDE_DIRS - the jack include directory -# JACK_LIBRARIES - Link these to use jack -# JACK_DEFINITIONS - Compiler switches required for using jack +# JACK_FOUND - system has jack JACK_INCLUDE_DIRS - the jack include directory +# JACK_LIBRARIES - Link these to use jack JACK_DEFINITIONS - Compiler switches +# required for using jack # -# Copyright (c) 2008 Andreas Schneider -# Modified for other libraries by Lasse Kärkkäinen +# Copyright (c) 2008 Andreas Schneider Modified for other +# libraries by Lasse Kärkkäinen # -# Redistribution and use is allowed according to the terms of the New -# BSD license. -# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# Redistribution and use is allowed according to the terms of the New BSD +# license. For details see the accompanying COPYING-CMAKE-SCRIPTS file. # -if (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) +if(JACK_LIBRARIES AND JACK_INCLUDE_DIRS) # in cache already set(JACK_FOUND TRUE) -else (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) - # use pkg-config to get the directories and then use these values - # in the FIND_PATH() and FIND_LIBRARY() calls - if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) +else(JACK_LIBRARIES AND JACK_INCLUDE_DIRS) + # use pkg-config to get the directories and then use these values in the + # FIND_PATH() and FIND_LIBRARY() calls + if(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) include(UsePkgConfig) pkgconfig(jack _JACK_INCLUDEDIR _JACK_LIBDIR _JACK_LDFLAGS _JACK_CFLAGS) - else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + else(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) find_package(PkgConfig) - if (PKG_CONFIG_FOUND) + if(PKG_CONFIG_FOUND) pkg_check_modules(_JACK jack) - endif (PKG_CONFIG_FOUND) - endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) - find_path(JACK_INCLUDE_DIR - NAMES - jack/jack.h - PATHS - ${_JACK_INCLUDE_DIRS} - /usr/include - /usr/local/include - /opt/local/include - /sw/include - ) + endif(PKG_CONFIG_FOUND) + endif(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4) + find_path( + JACK_INCLUDE_DIR + NAMES jack/jack.h + PATHS ${_JACK_INCLUDE_DIRS} /usr/include /usr/local/include + /opt/local/include /sw/include) - find_library(JACK_LIBRARY - NAMES - jack - PATHS - ${_JACK_LIBRARY_DIRS} - /usr/lib - /usr/local/lib - /opt/local/lib - /sw/lib - ) + find_library( + JACK_LIBRARY + NAMES jack + PATHS ${_JACK_LIBRARY_DIRS} /usr/lib /usr/local/lib /opt/local/lib /sw/lib) - if (JACK_LIBRARY AND JACK_INCLUDE_DIR) + if(JACK_LIBRARY AND JACK_INCLUDE_DIR) set(JACK_FOUND TRUE) - set(JACK_INCLUDE_DIRS - ${JACK_INCLUDE_DIR} - ) + set(JACK_INCLUDE_DIRS ${JACK_INCLUDE_DIR}) - set(JACK_LIBRARIES - ${JACK_LIBRARIES} - ${JACK_LIBRARY} - ) + set(JACK_LIBRARIES ${JACK_LIBRARIES} ${JACK_LIBRARY}) - endif (JACK_LIBRARY AND JACK_INCLUDE_DIR) + endif(JACK_LIBRARY AND JACK_INCLUDE_DIR) - if (JACK_FOUND) - if (NOT JACK_FIND_QUIETLY) + if(JACK_FOUND) + if(NOT JACK_FIND_QUIETLY) message(STATUS "Found jack: ${JACK_LIBRARY}") - endif (NOT JACK_FIND_QUIETLY) - else (JACK_FOUND) - if (JACK_FIND_REQUIRED) - message(FATAL_ERROR "Could not find JACK") - endif (JACK_FIND_REQUIRED) - endif (JACK_FOUND) + endif(NOT JACK_FIND_QUIETLY) - # show the JACK_INCLUDE_DIRS and JACK_LIBRARIES variables only in the advanced view + if(NOT TARGET Jack::Jack) + if(IS_ABSOLUTE "${JACK_LIBRARIES}") + add_library(Jack::Jack UNKNOWN IMPORTED) + set_target_properties(Jack::Jack PROPERTIES IMPORTED_LOCATION + "${JACK_LIBRARIES}") + else() + add_library(Jack::Jack INTERFACE IMPORTED) + set_target_properties(Jack::Jack PROPERTIES IMPORTED_LIBNAME + "${JACK_LIBRARIES}") + endif() + + set_target_properties(Jack::Jack PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${JACK_INCLUDE_DIRS}") + endif() + else(JACK_FOUND) + if(JACK_FIND_REQUIRED) + message(FATAL_ERROR "Could not find JACK") + endif(JACK_FIND_REQUIRED) + endif(JACK_FOUND) + + # show the JACK_INCLUDE_DIRS and JACK_LIBRARIES variables only in the advanced + # view mark_as_advanced(JACK_INCLUDE_DIRS JACK_LIBRARIES) -endif (JACK_LIBRARIES AND JACK_INCLUDE_DIRS) - +endif(JACK_LIBRARIES AND JACK_INCLUDE_DIRS) diff --git a/cmake/Modules/FindJansson.cmake b/cmake/Modules/FindJansson.cmake index 8e9b3543a..d310b084f 100644 --- a/cmake/Modules/FindJansson.cmake +++ b/cmake/Modules/FindJansson.cmake @@ -1,84 +1,87 @@ # Once done these will be defined: # -# JANSSON_FOUND -# JANSSON_INCLUDE_DIRS -# JANSSON_LIBRARIES -# JANSSON_VERSION +# JANSSON_FOUND JANSSON_INCLUDE_DIRS JANSSON_LIBRARIES JANSSON_VERSION find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_JANSSON QUIET jansson) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_JANSSON QUIET jansson) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(Jansson_INCLUDE_DIR - NAMES jansson.h - HINTS - ENV JanssonPath${_lib_suffix} - ENV JanssonPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${JanssonPath${_lib_suffix}} - ${JanssonPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_JANSSON_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include) +find_path( + Jansson_INCLUDE_DIR + NAMES jansson.h + HINTS ENV JANSSON_PATH ${JANSSON_PATH} ${CMAKE_SOURCE_DIR}/${JANSSON_PATH} + ${_JANSSON_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include) -find_library(Jansson_LIB - NAMES ${_JANSSON_LIBRARIES} jansson libjansson - HINTS - ENV JanssonPath${_lib_suffix} - ENV JanssonPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${JanssonPath${_lib_suffix}} - ${JanssonPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_JANSSON_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + Jansson_LIB + NAMES ${_JANSSON_LIBRARIES} jansson libjansson + HINTS ENV JANSSON_PATH ${JANSSON_PATH} ${CMAKE_SOURCE_DIR}/${JANSSON_PATH} + ${_JANSSON_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) if(JANSSON_VERSION) - set(_JANSSON_VERSION_STRING "${JANSSON_VERSION}") + set(_JANSSON_VERSION_STRING "${JANSSON_VERSION}") elseif(_JANSSON_FOUND AND _JANSSON_VERSION) - set(_JANSSON_VERSION_STRING "${_JANSSON_VERSION}") + set(_JANSSON_VERSION_STRING "${_JANSSON_VERSION}") elseif(EXISTS "${Jansson_INCLUDE_DIR}/jansson.h") - file(STRINGS "${Jansson_INCLUDE_DIR}/jansson.h" _jansson_version_parse - REGEX "#define[ \t]+JANSSON_VERSION[ \t]+.+") - string(REGEX REPLACE - ".*#define[ \t]+JANSSON_VERSION[ \t]+\"(.+)\".*" "\\1" - _JANSSON_VERSION_STRING "${_jansson_version_parse}") + file(STRINGS "${Jansson_INCLUDE_DIR}/jansson.h" _jansson_version_parse + REGEX "#define[ \t]+JANSSON_VERSION[ \t]+.+") + string(REGEX REPLACE ".*#define[ \t]+JANSSON_VERSION[ \t]+\"(.+)\".*" "\\1" + _JANSSON_VERSION_STRING "${_jansson_version_parse}") else() - if(NOT Jansson_FIND_QUIETLY) - message(WARNING "Failed to find Jansson version") - endif() - set(_JANSSON_VERSION_STRING "unknown") + if(NOT Jansson_FIND_QUIETLY) + message(WARNING "Failed to find Jansson version") + endif() + set(_JANSSON_VERSION_STRING "unknown") endif() include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Jansson - FOUND_VAR JANSSON_FOUND - REQUIRED_VARS Jansson_LIB Jansson_INCLUDE_DIR - VERSION_VAR _JANSSON_VERSION_STRING) +find_package_handle_standard_args( + Jansson + FOUND_VAR JANSSON_FOUND + REQUIRED_VARS Jansson_LIB Jansson_INCLUDE_DIR + VERSION_VAR _JANSSON_VERSION_STRING) mark_as_advanced(Jansson_INCLUDE_DIR Jansson_LIB) if(JANSSON_FOUND) - set(JANSSON_INCLUDE_DIRS ${Jansson_INCLUDE_DIR}) - set(JANSSON_LIBRARIES ${Jansson_LIB}) - set(JANSSON_VERSION ${_JANSSON_VERSION_STRING}) + set(JANSSON_INCLUDE_DIRS ${Jansson_INCLUDE_DIR}) + set(JANSSON_LIBRARIES ${Jansson_LIB}) + set(JANSSON_VERSION ${_JANSSON_VERSION_STRING}) + + if(NOT TARGET Jansson::Jansson) + if(IS_ABSOLUTE "${JANSSON_LIBRARIES}") + add_library(Jansson::Jansson UNKNOWN IMPORTED GLOBAL) + set_target_properties(Jansson::Jansson PROPERTIES IMPORTED_LOCATION + "${JANSSON_LIBRARIES}") + else() + add_library(Jansson::Jansson INTERFACE IMPORTED GLOBAL) + set_target_properties(Jansson::Jansson PROPERTIES IMPORTED_LIBNAME + "${JANSSON_LIBRARIES}") + endif() + + set_target_properties( + Jansson::Jansson PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${JANSSON_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibAJANTV2.cmake b/cmake/Modules/FindLibAJANTV2.cmake index 9bfbcef15..feb15b5e5 100644 --- a/cmake/Modules/FindLibAJANTV2.cmake +++ b/cmake/Modules/FindLibAJANTV2.cmake @@ -1,113 +1,151 @@ # Once done these will be defined: # -# LIBAJANTV2_FOUND -# LIBAJANTV2_INCLUDE_DIRS -# LIBAJANTV2_LIBRARIES +# LIBAJANTV2_FOUND LIBAJANTV2_INCLUDE_DIRS LIBAJANTV2_LIBRARIES # find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_AJA QUIET ajantv2) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_AJA QUIET ajantv2) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(AJA_LIBRARIES_INCLUDE_DIR - NAMES ajalibraries - HINTS - ENV AJASDKPath${_lib_suffix} - ENV AJASDKPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${AJASDKPath${_lib_suffix}} - ${AJASDKPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_AJA_NTV2_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + AJA_LIBRARIES_INCLUDE_DIR + NAMES ajalibraries + HINTS ENV + AJASDKPath${_lib_suffix} + ENV + AJASDKPath + ENV + DepsPath${_lib_suffix} + ENV + DepsPath + ${AJASDKPath${_lib_suffix}} + ${AJASDKPath} + ${DepsPath${_lib_suffix}} + ${DepsPath} + ${_AJA_NTV2_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(AJA_NTV2_LIB - NAMES ${_AJA_NTV2_LIBRARIES} ajantv2 libajantv2 - HINTS - ENV AJASDKPath${_lib_suffix} - ENV AJASDKPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${AJASDKPath${_lib_suffix}} - ${AJASDKPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_AJA_NTV2_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + AJA_NTV2_LIB + NAMES ${_AJA_NTV2_LIBRARIES} ajantv2 libajantv2 + HINTS ENV + AJASDKPath${_lib_suffix} + ENV + AJASDKPath + ENV + DepsPath${_lib_suffix} + ENV + DepsPath + ${AJASDKPath${_lib_suffix}} + ${AJASDKPath} + ${DepsPath${_lib_suffix}} + ${DepsPath} + ${_AJA_NTV2_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) -find_library(AJA_NTV2_DEBUG_LIB - NAMES ajantv2d libajantv2d - HINTS - ENV AJASDKPath${_lib_suffix} - ENV AJASDKPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${AJASDKPath${_lib_suffix}} - ${AJASDKPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_AJA_NTV2_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + AJA_NTV2_DEBUG_LIB + NAMES ajantv2d libajantv2d + HINTS ENV + AJASDKPath${_lib_suffix} + ENV + AJASDKPath + ENV + DepsPath${_lib_suffix} + ENV + DepsPath + ${AJASDKPath${_lib_suffix}} + ${AJASDKPath} + ${DepsPath${_lib_suffix}} + ${DepsPath} + ${_AJA_NTV2_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(LibAJANTV2 DEFAULT_MSG AJA_LIBRARIES_INCLUDE_DIR AJA_NTV2_LIB) +find_package_handle_standard_args(LibAJANTV2 DEFAULT_MSG + AJA_LIBRARIES_INCLUDE_DIR AJA_NTV2_LIB) mark_as_advanced(AJA_LIBRARIES_INCLUDE_DIR AJA_NTV2_LIB) if(LIBAJANTV2_FOUND) - set(AJA_LIBRARIES_INCLUDE_DIR - ${AJA_LIBRARIES_INCLUDE_DIR}/ajalibraries) - set(AJA_LIBRARIES_INCLUDE_DIRS - ${AJA_LIBRARIES_INCLUDE_DIR} - ${AJA_LIBRARIES_INCLUDE_DIR}/ajaanc - ${AJA_LIBRARIES_INCLUDE_DIR}/ajabase - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2 - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/includes - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/src) - if (WIN32) - set(AJA_LIBRARIES_INCLUDE_DIRS - ${AJA_LIBRARIES_INCLUDE_DIRS} - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/src/win) - elseif (APPLE) - set(AJA_LIBRARIES_INCLUDE_DIRS - ${AJA_LIBRARIES_INCLUDE_DIRS} - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/src/mac) - elseif(UNIX AND NOT APPLE) - set(AJA_LIBRARIES_INCLUDE_DIRS - ${AJA_LIBRARIES_INCLUDE_DIRS} - ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/src/lin) - endif() + set(AJA_LIBRARIES_INCLUDE_DIR ${AJA_LIBRARIES_INCLUDE_DIR}/ajalibraries) + set(AJA_LIBRARIES_INCLUDE_DIRS + ${AJA_LIBRARIES_INCLUDE_DIR} ${AJA_LIBRARIES_INCLUDE_DIR}/ajaanc + ${AJA_LIBRARIES_INCLUDE_DIR}/ajabase ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2 + ${AJA_LIBRARIES_INCLUDE_DIR}/ajantv2/includes) - set(LIBAJANTV2_LIBRARIES ${AJA_NTV2_LIB}) - if(AJA_NTV2_DEBUG_LIB STREQUAL "AJA_NTV2_DEBUG_LIB-NOTFOUND") - set(AJA_NTV2_DEBUG_LIB ${AJA_NTV2_LIB}) - endif() - set(LIBAJANTV2_DEBUG_LIBRARIES ${AJA_NTV2_DEBUG_LIB}) - set(LIBAJANTV2_INCLUDE_DIRS ${AJA_LIBRARIES_INCLUDE_DIRS}) + set(LIBAJANTV2_LIBRARIES ${AJA_NTV2_LIB}) + if(AJA_NTV2_DEBUG_LIB STREQUAL "AJA_NTV2_DEBUG_LIB-NOTFOUND") + set(AJA_NTV2_DEBUG_LIB ${AJA_NTV2_LIB}) + mark_as_advanced(AJA_NTV2_DEBUG_LIB) + endif() + set(LIBAJANTV2_DEBUG_LIBRARIES ${AJA_NTV2_DEBUG_LIB}) + set(LIBAJANTV2_INCLUDE_DIRS ${AJA_LIBRARIES_INCLUDE_DIRS}) + + if(NOT TARGET AJA::LibAJANTV2) + if(IS_ABSOLUTE "${LIBAJANTV2_LIBRARIES}") + add_library(AJA::LibAJANTV2 UNKNOWN IMPORTED) + set_target_properties( + AJA::LibAJANTV2 PROPERTIES IMPORTED_LOCATION "${LIBAJANTV2_LIBRARIES}") + + if(DEFINED LIBAJANTV2_DEBUG_LIBRARIES) + set_target_properties( + AJA::LibAJANTV2 PROPERTIES IMPORTED_LOCATION_DEBUG + "${LIBAJANTV2_DEBUG_LIBRARIES}") + endif() + else() + add_library(AJA::LibAJANTV2 INTERFACE IMPORTED) + set_target_properties( + AJA::LibAJANTV2 PROPERTIES IMPORTED_LIBNAME "${LIBAJANTV2_LIBRARIES}") + + if(DEFINED LIBAJANTV2_DEBUG_LIBRARIES) + set_target_properties( + AJA::LibAJANTV2 PROPERTIES IMPORTED_LIBNAME_DEBUG + "${LIBAJANTV2_DEBUG_LIBRARIES}") + endif() + endif() + + set_target_properties( + AJA::LibAJANTV2 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBAJANTV2_INCLUDE_DIRS}") + + target_compile_definitions( + AJA::LibAJANTV2 + INTERFACE "$<$:AJA_WINDOWS;_WINDOWS;WIN32;MSWindows>" + "$<$,$>:_DEBUG;_NDEBUG>" + "$<$:AJAMac;AJA_MAC>" + "$<$:AJA_LINUX;AJALinux>") + endif() endif() diff --git a/cmake/Modules/FindLibVLC.cmake b/cmake/Modules/FindLibVLC.cmake index 7360e179d..38791cf00 100644 --- a/cmake/Modules/FindLibVLC.cmake +++ b/cmake/Modules/FindLibVLC.cmake @@ -1,59 +1,46 @@ # Once done these will be defined: # -# LIBVLC_FOUND -# LIBVLC_INCLUDE_DIRS -# LIBVLC_LIBRARIES +# LIBVLC_FOUND LIBVLC_INCLUDE_DIRS LIBVLC_LIBRARIES # find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_VLC QUIET libvlc) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_VLC QUIET libvlc) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(VLC_INCLUDE_DIR - NAMES libvlc.h - HINTS - ENV VLCPath${_lib_suffix} - ENV VLCPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${VLCPath${_lib_suffix}} - ${VLCPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_VLC_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - vlc include/vlc include) +find_path( + VLC_INCLUDE_DIR + NAMES libvlc.h + HINTS ENV VLC_PATH ${VLC_PATH} ${CMAKE_SOURCE_DIR}/${VLC_PATH} + ${_VLC_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES vlc include/vlc include) -find_library(VLC_LIB - NAMES ${_VLC_LIBRARIES} VLC libVLC - HINTS - ENV VLCPath${_lib_suffix} - ENV VLCPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${VLCPath${_lib_suffix}} - ${VLCPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_VLC_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + VLC_LIB + NAMES ${_VLC_LIBRARIES} VLC libVLC + HINTS ENV VLC_PATH ${VLC_PATH} ${CMAKE_SOURCE_DIR}/${VLC_PATH} + ${_VLC_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) # OBS doesnt depend on linking, so we dont include VLC_LIB here as required. @@ -61,6 +48,12 @@ find_package_handle_standard_args(LibVLC DEFAULT_MSG VLC_INCLUDE_DIR) mark_as_advanced(VLC_INCLUDE_DIR VLC_LIB) if(LIBVLC_FOUND) - set(LIBVLC_LIBRARIES ${VLC_LIB}) - set(LIBVLC_INCLUDE_DIRS ${VLC_INCLUDE_DIR}) + set(LIBVLC_LIBRARIES ${VLC_LIB}) + set(LIBVLC_INCLUDE_DIRS ${VLC_INCLUDE_DIR}) + + if(NOT TARGET VLC::LibVLC) + add_library(VLC::LibVLC INTERFACE IMPORTED) + set_target_properties(VLC::LibVLC PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBVLC_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibcurl.cmake b/cmake/Modules/FindLibcurl.cmake deleted file mode 100644 index b4b5a3b88..000000000 --- a/cmake/Modules/FindLibcurl.cmake +++ /dev/null @@ -1,86 +0,0 @@ -# Once done these will be defined: -# -# LIBCURL_FOUND -# LIBCURL_INCLUDE_DIRS -# LIBCURL_LIBRARIES -# -# For use in OBS: -# -# CURL_INCLUDE_DIR - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_CURL QUIET curl libcurl) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -find_path(CURL_INCLUDE_DIR - NAMES curl/curl.h - HINTS - ENV curlPath${_lib_suffix} - ENV curlPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${curlPath${_lib_suffix}} - ${curlPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_CURL_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) - -if(APPLE) - find_library(CURL_LIB - NAMES ${_CURL_LIBRARIES} curl libcurl - HINTS - ENV curlPath${_lib_suffix} - ENV curlPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${curlPath${_lib_suffix}} - ${curlPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_CURL_LIBRARY_DIRS} - ) -else() - find_library(CURL_LIB - NAMES ${_CURL_LIBRARIES} curl libcurl - HINTS - ENV curlPath${_lib_suffix} - ENV curlPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${curlPath${_lib_suffix}} - ${curlPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_CURL_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin - "build/Win${_lib_suffix}/VC12/DLL Release - DLL Windows SSPI" - "../build/Win${_lib_suffix}/VC12/DLL Release - DLL Windows SSPI") -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libcurl DEFAULT_MSG CURL_LIB CURL_INCLUDE_DIR) -mark_as_advanced(CURL_INCLUDE_DIR CURL_LIB) - -if(LIBCURL_FOUND) - set(LIBCURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR}) - set(LIBCURL_LIBRARIES ${CURL_LIB}) -endif() diff --git a/cmake/Modules/FindLibdrm.cmake b/cmake/Modules/FindLibdrm.cmake index 60f7d8662..b23d8ffdc 100644 --- a/cmake/Modules/FindLibdrm.cmake +++ b/cmake/Modules/FindLibdrm.cmake @@ -1,33 +1,37 @@ # Once done these will be defined: # -# LIBDRM_FOUND -# LIBDRM_INCLUDE_DIRS -# LIBDRM_LIBRARIES +# LIBDRM_FOUND LIBDRM_INCLUDE_DIRS LIBDRM_LIBRARIES find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_LIBDRM QUIET libdrm) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_LIBDRM QUIET libdrm) endif() -find_path(LIBDRM_INCLUDE_DIR - NAMES libdrm/drm_fourcc.h - HINTS - ${_LIBDRM_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include) +find_path( + LIBDRM_INCLUDE_DIR + NAMES libdrm/drm_fourcc.h + HINTS ${_LIBDRM_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include) -find_library(LIBDRM_LIB - NAMES drm libdrm - HINTS - ${_LIBDRM_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib) +find_library( + LIBDRM_LIB + NAMES drm libdrm + HINTS ${_LIBDRM_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libdrm DEFAULT_MSG LIBDRM_LIB LIBDRM_INCLUDE_DIR) +find_package_handle_standard_args(Libdrm DEFAULT_MSG LIBDRM_LIB + LIBDRM_INCLUDE_DIR) mark_as_advanced(LIBDRM_INCLUDE_DIR LIBDRM_LIB) if(LIBDRM_FOUND) - set(LIBDRM_INCLUDE_DIRS ${LIBDRM_INCLUDE_DIR}) - set(LIBDRM_LIBRARIES ${LIBDRM_LIB}) + set(LIBDRM_INCLUDE_DIRS ${LIBDRM_INCLUDE_DIR}) + set(LIBDRM_LIBRARIES ${LIBDRM_LIB}) + + if(NOT TARGET Libdrm::Libdrm) + add_library(Libdrm::Libdrm INTERFACE IMPORTED) + set_target_properties( + Libdrm::Libdrm PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBDRM_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibfdk.cmake b/cmake/Modules/FindLibfdk.cmake index 20544e91a..924ed90f8 100644 --- a/cmake/Modules/FindLibfdk.cmake +++ b/cmake/Modules/FindLibfdk.cmake @@ -1,68 +1,73 @@ # Once done these will be defined: # -# LIBFDK_FOUND -# LIBFDK_INCLUDE_DIRS -# LIBFDK_LIBRARIES +# LIBFDK_FOUND LIBFDK_INCLUDE_DIRS LIBFDK_LIBRARIES # -# For use in OBS: +# For use in OBS: # -# Libfdk_INCLUDE_DIR +# Libfdk_INCLUDE_DIR find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_LIBFDK QUIET fdk-aac) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_LIBFDK fdk-aac) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(Libfdk_INCLUDE_DIR - NAMES fdk-aac/aacenc_lib.h - HINTS - ENV LibfdkPath${_lib_suffix} - ENV LibfdkPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${LibfdkPath${_lib_suffix}} - ${LibfdkPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_LIBFDK_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + Libfdk_INCLUDE_DIR + NAMES fdk-aac/aacenc_lib.h + HINTS ENV LIBFDK_PATH ${LIBFDK_PATH} ${CMAKE_SOURCE_DIR}/${LIBFDK_PATH} + ${_LIBFDK_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(Libfdk_LIB - NAMES ${_LIBFDK_LIBRARIES} fdk-aac libfdk-aac - HINTS - ENV LibfdkPath${_lib_suffix} - ENV LibfdkPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${LibfdkPath${_lib_suffix}} - ${LibfdkPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_LIBFDK_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + Libfdk_LIB + NAMES ${_LIBFDK_LIBRARIES} fdk-aac libfdk-aac + HINTS ENV LIBFDK_PATH ${LIBFDK_PATH} ${CMAKE_SOURCE_DIR}/${LIBFDK_PATH} + ${_LIBFDK_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libfdk DEFAULT_MSG Libfdk_LIB Libfdk_INCLUDE_DIR) +find_package_handle_standard_args(Libfdk DEFAULT_MSG Libfdk_LIB + Libfdk_INCLUDE_DIR) mark_as_advanced(Libfdk_INCLUDE_DIR Libfdk_LIB) if(LIBFDK_FOUND) - set(LIBFDK_INCLUDE_DIRS ${Libfdk_INCLUDE_DIR}) - set(LIBFDK_LIBRARIES ${Libfdk_LIB}) + set(LIBFDK_INCLUDE_DIRS ${Libfdk_INCLUDE_DIR}) + set(LIBFDK_LIBRARIES ${Libfdk_LIB}) + + if(NOT TARGET LibFDK::LibFDK) + if(IS_ABSOLUTE "${LIBFDK_LIBRARIES}") + add_library(LibFDK::LibFDK UNKNOWN IMPORTED) + set_target_properties(LibFDK::LibFDK PROPERTIES IMPORTED_LOCATION + "${LIBFDK_LIBRARIES}") + else() + add_library(LibFDK::LibFDK INTERFACE IMPORTED) + set_target_properties(LibFDK::LibFDK PROPERTIES IMPORTED_LIBNAME + "${LIBFDK_LIBRARIES}") + endif() + + set_target_properties( + LibFDK::LibFDK PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBFDK_INCLUDE_DIRS}") + endif() + endif() diff --git a/cmake/Modules/FindLibpci.cmake b/cmake/Modules/FindLibpci.cmake index 63fd5873b..09b0f26e9 100644 --- a/cmake/Modules/FindLibpci.cmake +++ b/cmake/Modules/FindLibpci.cmake @@ -1,10 +1,9 @@ -# * Try to find Libpci -# Once done this will define +# * Try to find Libpci Once done this will define # -# LIBPCI_FOUND - system has Libpci -# LIBPCI_INCLUDE_DIRS - the Libpci include directory -# LIBPCI_LIBRARIES - the libraries needed to use Libpci -# LIBPCI_DEFINITIONS - Compiler switches required for using Libpci +# * LIBPCI_FOUND - system has Libpci +# * LIBPCI_INCLUDE_DIRS - the Libpci include directory +# * LIBPCI_LIBRARIES - the libraries needed to use Libpci +# * LIBPCI_DEFINITIONS - Compiler switches required for using Libpci # Use pkg-config to get the directories and then use these values in the # find_path() and find_library() calls @@ -28,7 +27,8 @@ find_library( PATHS /usr/lib /usr/local/lib /opt/local/lib) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libpci REQUIRED_VARS LIBPCI_LIB LIBPCI_INCLUDE_DIR) +find_package_handle_standard_args(Libpci REQUIRED_VARS LIBPCI_LIB + LIBPCI_INCLUDE_DIR) mark_as_advanced(LIBPCI_INCLUDE_DIR LIBPCI_LIB) if(LIBPCI_FOUND) @@ -39,11 +39,11 @@ if(LIBPCI_FOUND) if(IS_ABSOLUTE "${LIBPCI_LIBRARIES}") add_library(LIBPCI::LIBPCI UNKNOWN IMPORTED) set_target_properties(LIBPCI::LIBPCI PROPERTIES IMPORTED_LOCATION - "${LIBPCI_LIBRARIES}") + "${LIBPCI_LIBRARIES}") else() add_library(LIBPCI::LIBPCI INTERFACE IMPORTED) set_target_properties(LIBPCI::LIBPCI PROPERTIES IMPORTED_LIBNAME - "${LIBPCI_LIBRARIES}") + "${LIBPCI_LIBRARIES}") endif() endif() endif() diff --git a/cmake/Modules/FindLibrnnoise.cmake b/cmake/Modules/FindLibrnnoise.cmake index ed2d5e250..dac39c731 100644 --- a/cmake/Modules/FindLibrnnoise.cmake +++ b/cmake/Modules/FindLibrnnoise.cmake @@ -1,68 +1,74 @@ # Once done these will be defined: # -# LIBRNNOISE_FOUND -# LIBRNNOISE_INCLUDE_DIRS -# LIBRNNOISE_LIBRARIES +# LIBRNNOISE_FOUND LIBRNNOISE_INCLUDE_DIRS LIBRNNOISE_LIBRARIES # # For use in OBS: # -# RNNOISE_INCLUDE_DIR +# RNNOISE_INCLUDE_DIR find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_RNNOISE QUIET rnnoise) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_RNNOISE QUIET rnnoise) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(RNNOISE_INCLUDE_DIR - NAMES rnnoise.h - HINTS - ENV rnnoisePath${_lib_suffix} - ENV rnnoisePath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${rnnoisePath${_lib_suffix}} - ${rnnoisePath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_RNNOISE_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + RNNOISE_INCLUDE_DIR + NAMES rnnoise.h + HINTS ENV RNNOISE_PATH ${RNNOISE_PATH} ${CMAKE_SOURCE_DIR}/${RNNOISE_PATH} + ${_RNNOISE_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(RNNOISE_LIB - NAMES ${_RNNOISE_LIBRARIES} rnnoise - HINTS - ENV rnnoisePath${_lib_suffix} - ENV rnnoisePath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${rnnoisePath${_lib_suffix}} - ${rnnoisePath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_RNNOISE_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + RNNOISE_LIB + NAMES ${_RNNOISE_LIBRARIES} rnnoise + HINTS ENV RNNOISE_PATH ${RNNOISE_PATH} ${CMAKE_SOURCE_DIR}/${RNNOISE_PATH} + ${_RNNOISE_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Librnnoise DEFAULT_MSG RNNOISE_LIB RNNOISE_INCLUDE_DIR) +find_package_handle_standard_args(Librnnoise DEFAULT_MSG RNNOISE_LIB + RNNOISE_INCLUDE_DIR) mark_as_advanced(RNNOISE_INCLUDE_DIR RNNOISE_LIB) if(LIBRNNOISE_FOUND) - set(LIBRNNOISE_INCLUDE_DIRS ${RNNOISE_INCLUDE_DIR}) - set(LIBRNNOISE_LIBRARIES ${RNNOISE_LIB}) + set(LIBRNNOISE_INCLUDE_DIRS ${RNNOISE_INCLUDE_DIR}) + set(LIBRNNOISE_LIBRARIES ${RNNOISE_LIB}) + + if(NOT TARGET Librnnoise::Librnnoise) + if(IS_ABSOLUTE "${LIBRNNOISE_LIBRARIES}") + add_library(Librnnoise::Librnnoise UNKNOWN IMPORTED) + set_target_properties( + Librnnoise::Librnnoise PROPERTIES IMPORTED_LOCATION + "${LIBRNNOISE_LIBRARIES}") + else() + add_library(Librnnoise::Librnnoise INTERFACE IMPORTED) + set_target_properties( + Librnnoise::Librnnoise PROPERTIES IMPORTED_LIBNAME + "${LIBRNNOISE_LIBRARIES}") + endif() + + set_target_properties( + Librnnoise::Librnnoise PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBRNNOISE_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibspeexdsp.cmake b/cmake/Modules/FindLibspeexdsp.cmake index be1d97265..447a0c4c4 100644 --- a/cmake/Modules/FindLibspeexdsp.cmake +++ b/cmake/Modules/FindLibspeexdsp.cmake @@ -1,68 +1,74 @@ # Once done these will be defined: # -# LIBSPEEXDSP_FOUND -# LIBSPEEXDSP_INCLUDE_DIRS -# LIBSPEEXDSP_LIBRARIES +# LIBSPEEXDSP_FOUND LIBSPEEXDSP_INCLUDE_DIRS LIBSPEEXDSP_LIBRARIES # # For use in OBS: # -# SPEEXDSP_INCLUDE_DIR +# SPEEXDSP_INCLUDE_DIR find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_SPEEXDSP QUIET speexdsp libspeexdsp) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_SPEEXDSP QUIET speexdsp libspeexdsp) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(SPEEXDSP_INCLUDE_DIR - NAMES speex/speex_preprocess.h - HINTS - ENV speexPath${_lib_suffix} - ENV speexPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${speexPath${_lib_suffix}} - ${speexPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_SPEEXDSP_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + SPEEXDSP_INCLUDE_DIR + NAMES speex/speex_preprocess.h + HINTS ENV SPEEX_PATH ${SPEEX_PATH} ${CMAKE_SOURCE_DIR}/${SPEEX_PATH} + ${_SPEEXDSP_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(SPEEXDSP_LIB - NAMES ${_SPEEXDSP_LIBRARIES} speexdsp libspeexdsp - HINTS - ENV speexPath${_lib_suffix} - ENV speexPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${speexPath${_lib_suffix}} - ${speexPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_SPEEXDSP_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + SPEEXDSP_LIB + NAMES ${_SPEEXDSP_LIBRARIES} speexdsp libspeexdsp + HINTS ENV SPEEX_PATH ${SPEEX_PATH} ${CMAKE_SOURCE_DIR}/${SPEEX_PATH} + ${_SPEEXDSP_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libspeexdsp DEFAULT_MSG SPEEXDSP_LIB SPEEXDSP_INCLUDE_DIR) +find_package_handle_standard_args(Libspeexdsp DEFAULT_MSG SPEEXDSP_LIB + SPEEXDSP_INCLUDE_DIR) mark_as_advanced(SPEEXDSP_INCLUDE_DIR SPEEXDSP_LIB) if(LIBSPEEXDSP_FOUND) - set(LIBSPEEXDSP_INCLUDE_DIRS ${SPEEXDSP_INCLUDE_DIR}) - set(LIBSPEEXDSP_LIBRARIES ${SPEEXDSP_LIB}) + set(LIBSPEEXDSP_INCLUDE_DIRS ${SPEEXDSP_INCLUDE_DIR}) + set(LIBSPEEXDSP_LIBRARIES ${SPEEXDSP_LIB}) + + if(NOT TARGET LibspeexDSP::LibspeexDSP) + if(IS_ABSOLUTE "${LIBSPEEXDSP_LIBRARIES}") + add_library(LibspeexDSP::LibspeexDSP UNKNOWN IMPORTED) + set_target_properties( + LibspeexDSP::LibspeexDSP PROPERTIES IMPORTED_LOCATION + "${LIBSPEEXDSP_LIBRARIES}") + else() + add_library(LibspeexDSP::LibspeexDSP INTERFACE IMPORTED) + set_target_properties( + LibspeexDSP::LibspeexDSP PROPERTIES IMPORTED_LIBNAME + "${LIBSPEEXDSP_LIBRARIES}") + endif() + + set_target_properties( + LibspeexDSP::LibspeexDSP PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBSPEEXDSP_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibsysinfo.cmake b/cmake/Modules/FindLibsysinfo.cmake deleted file mode 100644 index b1b176e8c..000000000 --- a/cmake/Modules/FindLibsysinfo.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# Once done these will be defined: -# -# SYSINFO_FOUND -# SYSINFO_INCLUDE_DIRS -# SYSINFO_LIBRARIES - -find_path(SYSINFO_INCLUDE_DIR - NAMES sys/sysinfo.h - PATHS - /usr/include /usr/local/include /opt/local/include) - -find_library(SYSINFO_LIB - NAMES sysinfo libsysinfo - PATHS - /usr/lib /usr/local/lib /opt/local/lib) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(sysinfo DEFAULT_MSG SYSINFO_LIB SYSINFO_INCLUDE_DIR) -mark_as_advanced(SYSINFO_INCLUDE_DIR SYSINFO_LIB) - -if(SYSINFO_FOUND) - set(SYSINFO_INCLUDE_DIRS ${SYSINFO_INCLUDE_DIR}) - set(SYSINFO_LIBRARIES ${SYSINFO_LIB}) -endif() diff --git a/cmake/Modules/FindLibv4l2.cmake b/cmake/Modules/FindLibv4l2.cmake index e2b76dd76..d3721298e 100644 --- a/cmake/Modules/FindLibv4l2.cmake +++ b/cmake/Modules/FindLibv4l2.cmake @@ -1,33 +1,45 @@ # Once done these will be defined: # -# LIBV4L2_FOUND -# LIBV4L2_INCLUDE_DIRS -# LIBV4L2_LIBRARIES +# LIBV4L2_FOUND LIBV4L2_INCLUDE_DIRS LIBV4L2_LIBRARIES find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_V4L2 QUIET v4l-utils) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_V4L2 QUIET v4l-utils) endif() -find_path(V4L2_INCLUDE_DIR - NAMES libv4l2.h - HINTS - ${_V4L2_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include) +find_path( + V4L2_INCLUDE_DIR + NAMES libv4l2.h + HINTS ${_V4L2_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include) -find_library(V4L2_LIB - NAMES v4l2 - HINTS - ${_V4L2_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib) +find_library( + V4L2_LIB + NAMES v4l2 + HINTS ${_V4L2_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Libv4l2 DEFAULT_MSG V4L2_LIB V4L2_INCLUDE_DIR) mark_as_advanced(V4L2_INCLUDE_DIR V4L2_LIB) if(LIBV4L2_FOUND) - set(LIBV4L2_INCLUDE_DIRS ${V4L2_INCLUDE_DIR}) - set(LIBV4L2_LIBRARIES ${V4L2_LIB}) + set(LIBV4L2_INCLUDE_DIRS ${V4L2_INCLUDE_DIR}) + set(LIBV4L2_LIBRARIES ${V4L2_LIB}) + + if(NOT TARGET LIB4L2::LIB4L2) + if(IS_ABSOLUTE "${LIBV4L2_LIBRARIES}") + add_library(LIB4L2::LIB4L2 UNKNOWN IMPORTED) + set_target_properties(LIB4L2::LIB4L2 PROPERTIES IMPORTED_LOCATION + "${LIBV4L2_LIBRARIES}") + else() + add_library(LIB4L2::LIB4L2 INTERFACE IMPORTED) + set_target_properties(LIB4L2::LIB4L2 PROPERTIES IMPORTED_LIBNAME + "${LIBV4L2_LIBRARIES}") + endif() + + set_target_properties( + LIB4L2::LIB4L2 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBV4L2_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLibx264.cmake b/cmake/Modules/FindLibx264.cmake index a968b3452..8d78585fe 100644 --- a/cmake/Modules/FindLibx264.cmake +++ b/cmake/Modules/FindLibx264.cmake @@ -1,68 +1,71 @@ # Once done these will be defined: # -# LIBX264_FOUND -# LIBX264_INCLUDE_DIRS -# LIBX264_LIBRARIES +# LIBX264_FOUND LIBX264_INCLUDE_DIRS LIBX264_LIBRARIES # -# For use in OBS: +# For use in OBS: # -# X264_INCLUDE_DIR +# X264_INCLUDE_DIR find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_X264 QUIET x264) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_X264 QUIET x264) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() -find_path(X264_INCLUDE_DIR - NAMES x264.h - HINTS - ENV x264Path${_lib_suffix} - ENV x264Path - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${x264Path${_lib_suffix}} - ${x264Path} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_X264_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + X264_INCLUDE_DIR + NAMES x264.h + HINTS ENV X264_PATH ${X264_PATH} ${CMAKE_SOURCE_DIR}/${X264_PATH} + ${_X264_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(X264_LIB - NAMES ${_X264_LIBRARIES} x264 libx264 - HINTS - ENV x264Path${_lib_suffix} - ENV x264Path - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${x264Path${_lib_suffix}} - ${x264Path} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_X264_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + X264_LIB + NAMES ${_X264_LIBRARIES} x264 libx264 + HINTS ENV X264_PATH ${X264_PATH} ${CMAKE_SOURCE_DIR}/${X264_PATH} + ${_X264_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Libx264 DEFAULT_MSG X264_LIB X264_INCLUDE_DIR) mark_as_advanced(X264_INCLUDE_DIR X264_LIB) if(LIBX264_FOUND) - set(LIBX264_INCLUDE_DIRS ${X264_INCLUDE_DIR}) - set(LIBX264_LIBRARIES ${X264_LIB}) + set(LIBX264_INCLUDE_DIRS ${X264_INCLUDE_DIR}) + set(LIBX264_LIBRARIES ${X264_LIB}) + + if(NOT TARGET LIBX264::LIBX264) + if(IS_ABSOLUTE "${LIBX264_LIBRARIES}") + add_library(LIBX264::LIBX264 UNKNOWN IMPORTED) + set_target_properties(LIBX264::LIBX264 PROPERTIES IMPORTED_LOCATION + "${LIBX264_LIBRARIES}") + else() + add_library(LIBX264::LIBX264 INTERFACE IMPORTED) + set_target_properties(LIBX264::LIBX264 PROPERTIES IMPORTED_LIBNAME + "${LIBX264_LIBRARIES}") + endif() + + set_target_properties( + LIBX264::LIBX264 PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LIBX264_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindLuajit.cmake b/cmake/Modules/FindLuajit.cmake index ddd094803..ccce574d7 100644 --- a/cmake/Modules/FindLuajit.cmake +++ b/cmake/Modules/FindLuajit.cmake @@ -1,88 +1,92 @@ # Once done these will be defined: # -# LUAJIT_FOUND -# LUAJIT_INCLUDE_DIRS -# LUAJIT_LIBRARIES +# LUAJIT_FOUND LUAJIT_INCLUDE_DIRS LUAJIT_LIBRARIES # -# For use in OBS: +# For use in OBS: # -# LUAJIT_INCLUDE_DIR +# LUAJIT_INCLUDE_DIR -IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(_LIB_SUFFIX 64) -ELSE() - SET(_LIB_SUFFIX 32) -ENDIF() +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_LIB_SUFFIX 64) +else() + set(_LIB_SUFFIX 32) +endif() -FIND_PATH(LUAJIT_INCLUDE_DIR - NAMES lua.h lualib.h - HINTS - ENV LuajitPath${_LIB_SUFFIX} - ENV LuajitPath - ENV DepsPath${_LIB_SUFFIX} - ENV DepsPath - ${LuajitPath${_LIB_SUFFIX}} - ${LuajitPath} - ${DepsPath${_LIB_SUFFIX}} - ${DepsPath} - ${_LUAJIT_INCLUDE_DIRS} - PATHS - /usr/include - /usr/local/include - /opt/local/include - /opt/local - /sw/include - ~/Library/Frameworks - /Library/Frameworks - PATH_SUFFIXES - include - luajit - luajit/src - include/luajit - include/luajit/src - luajit-2.0 - include/luajit-2.0 - luajit2.0 - include/luajit2.0 - luajit-2.1 - include/luajit-2.1 - luajit2.1 - include/luajit2.1 - ) +find_path( + LUAJIT_INCLUDE_DIR + NAMES lua.h lualib.h + HINTS ENV LUAJIT_PATH ${LUAJIT_PATH} ${CMAKE_SOURCE_DIR}/${LUAJIT_PATH} + ${_LUAJIT_INCLUDE_DIRS} + PATHS /usr/include + /usr/local/include + /opt/local/include + /opt/local + /sw/include + ~/Library/Frameworks + /Library/Frameworks + PATH_SUFFIXES + include + luajit + luajit/src + include/luajit + include/luajit/src + luajit-2.0 + include/luajit-2.0 + luajit2.0 + include/luajit2.0 + luajit-2.1 + include/luajit-2.1 + luajit2.1 + include/luajit2.1) -find_library(LUAJIT_LIB - NAMES ${_LUAJIT_LIBRARIES} luajit luajit-51 luajit-5.1 lua51 - HINTS - ENV LuajitPath${_lib_suffix} - ENV LuajitPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${LuajitPath${_lib_suffix}} - ${LuajitPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_LUAJIT_LIBRARY_DIRS} - PATHS - /usr/lib - /usr/local/lib - /opt/local/lib - /opt/local - /sw/lib - ~/Library/Frameworks - /Library/Frameworks - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + LUAJIT_LIB + NAMES ${_LUAJIT_LIBRARIES} luajit luajit-51 luajit-5.1 lua51 + HINTS ENV LUAJIT_PATH ${LUAJIT_PATH} ${CMAKE_SOURCE_DIR}/${LUAJIT_PATH} + ${_LUAJIT_LIBRARY_DIRS} + PATHS /usr/lib + /usr/local/lib + /opt/local/lib + /opt/local + /sw/lib + ~/Library/Frameworks + /Library/Frameworks + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Luajit DEFAULT_MSG LUAJIT_LIB LUAJIT_INCLUDE_DIR) +find_package_handle_standard_args(Luajit DEFAULT_MSG LUAJIT_LIB + LUAJIT_INCLUDE_DIR) mark_as_advanced(LUAJIT_INCLUDE_DIR LUAJIT_LIB) if(LUAJIT_FOUND) - set(LUAJIT_INCLUDE_DIRS ${LUAJIT_INCLUDE_DIR}) - set(LUAJIT_LIBRARIES ${LUAJIT_LIB}) + set(LUAJIT_INCLUDE_DIRS ${LUAJIT_INCLUDE_DIR}) + set(LUAJIT_LIBRARIES ${LUAJIT_LIB}) + + if(NOT TARGET Luajit::Luajit) + if(IS_ABSOLUTE "${LUAJIT_LIBRARIES}") + add_library(Luajit::Luajit UNKNOWN IMPORTED) + set_target_properties(Luajit::Luajit PROPERTIES IMPORTED_LOCATION + "${LUAJIT_LIBRARIES}") + else() + add_library(Luajit::Luajit INTERFACE IMPORTED) + set_target_properties(Luajit::Luajit PROPERTIES IMPORTED_LIBNAME + "${LUAJIT_LIBRARIES}") + endif() + + set_target_properties( + Luajit::Luajit PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${LUAJIT_INCLUDE_DIRS}") + endif() endif() diff --git a/cmake/Modules/FindMbedTLS.cmake b/cmake/Modules/FindMbedTLS.cmake index 0ac264120..efcc1eb39 100644 --- a/cmake/Modules/FindMbedTLS.cmake +++ b/cmake/Modules/FindMbedTLS.cmake @@ -1,137 +1,173 @@ # Once done these will be defined: # -# MBEDTLS_FOUND -# MBEDTLS_INCLUDE_DIRS -# MBEDTLS_LIBRARIES +# * MBEDTLS_FOUND +# * MBEDTLS_INCLUDE_DIRS +# * MBEDTLS_LIBRARIES # find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_MBEDTLS QUIET mbedtls) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_MBEDTLS QUIET mbedtls) endif() if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) + set(_lib_suffix 64) else() - set(_lib_suffix 32) + set(_lib_suffix 32) endif() # If we're on MacOS or Linux, please try to statically-link mbedtls. -if(STATIC_MBEDTLS AND (APPLE OR UNIX)) - set(_MBEDTLS_LIBRARIES libmbedtls.a) - set(_MBEDCRYPTO_LIBRARIES libmbedcrypto.a) - set(_MBEDX509_LIBRARIES libmbedx509.a) +if(ENABLE_STATIC_MBEDTLS AND (APPLE OR UNIX)) + set(_MBEDTLS_LIBRARIES libmbedtls.a) + set(_MBEDCRYPTO_LIBRARIES libmbedcrypto.a) + set(_MBEDX509_LIBRARIES libmbedx509.a) endif() -find_path(MBEDTLS_INCLUDE_DIR - NAMES mbedtls/ssl.h - HINTS - ENV mbedtlsPath${_lib_suffix} - ENV mbedtlsPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${mbedtlsPath${_lib_suffix}} - ${mbedtlsPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_MBEDTLS_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) +find_path( + MBEDTLS_INCLUDE_DIR + NAMES mbedtls/ssl.h + HINTS ENV MBEDTLS_PATH ${MBEDTLS_PATH} ${CMAKE_SOURCE_DIR}/${MBEDTLS_PATH} + ${_MBEDTLS_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include /sw/include + PATH_SUFFIXES include) -find_library(MBEDTLS_LIB - NAMES ${_MBEDTLS_LIBRARIES} mbedtls libmbedtls - HINTS - ENV mbedtlsPath${_lib_suffix} - ENV mbedtlsPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${mbedtlsPath${_lib_suffix}} - ${mbedtlsPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_MBEDTLS_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + MBEDTLS_LIB + NAMES ${_MBEDTLS_LIBRARIES} mbedtls libmbedtls + HINTS ENV MBEDTLS_PATH ${MBEDTLS_PATH} ${CMAKE_SOURCE_DIR}/${MBEDTLS_PATH} + ${_MBEDTLS_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) -find_library(MBEDCRYPTO_LIB - NAMES ${_MBEDCRYPTO_LIBRARIES} mbedcrypto libmbedcrypto - HINTS - ENV mbedcryptoPath${_lib_suffix} - ENV mbedcryptoPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${mbedcryptoPath${_lib_suffix}} - ${mbedcryptoPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_MBEDCRYPTO_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + MBEDCRYPTO_LIB + NAMES ${_MBEDCRYPTO_LIBRARIES} mbedcrypto libmbedcrypto + HINTS ENV MBEDCRYPTO_PATH ${MBEDCRYPTO_PATH} + ${CMAKE_SOURCE_DIR}/${MBEDCRYPTO_PATH} ${_MBEDCRYPTO_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) -find_library(MBEDX509_LIB - NAMES ${_MBEDX509_LIBRARIES} mbedx509 libmbedx509 - HINTS - ENV mbedx509Path${_lib_suffix} - ENV mbedx509Path - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${mbedx509Path${_lib_suffix}} - ${mbedx509Path} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_MBEDX509_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) +find_library( + MBEDX509_LIB + NAMES ${_MBEDX509_LIBRARIES} mbedx509 libmbedx509 + HINTS ENV MBEDX509_PATH ${MBEDX509_PATH} ${CMAKE_SOURCE_DIR}/${MBEDX509_PATH} + ${_MBEDX509_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) -# Sometimes mbedtls is split between three libs, and sometimes it isn't. -# If it isn't, let's check if the symbols we need are all in MBEDTLS_LIB. -if(MBEDTLS_LIB AND NOT MBEDCRYPTO_LIB AND NOT MBEDX509_LIB) - set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIB}) - set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIR}) - check_symbol_exists(mbedtls_x509_crt_init "mbedtls/x509_crt.h" MBEDTLS_INCLUDES_X509) - check_symbol_exists(mbedtls_sha256_init "mbedtls/sha256.h" MBEDTLS_INCLUDES_CRYPTO) - unset(CMAKE_REQUIRED_INCLUDES) - unset(CMAKE_REQUIRED_LIBRARIES) +# Sometimes mbedtls is split between three libs, and sometimes it isn't. If it +# isn't, let's check if the symbols we need are all in MBEDTLS_LIB. +if(MBEDTLS_LIB + AND NOT MBEDCRYPTO_LIB + AND NOT MBEDX509_LIB) + set(CMAKE_REQUIRED_LIBRARIES ${MBEDTLS_LIB}) + set(CMAKE_REQUIRED_INCLUDES ${MBEDTLS_INCLUDE_DIR}) + check_symbol_exists(mbedtls_x509_crt_init "mbedtls/x509_crt.h" + MBEDTLS_INCLUDES_X509) + check_symbol_exists(mbedtls_sha256_init "mbedtls/sha256.h" + MBEDTLS_INCLUDES_CRYPTO) + unset(CMAKE_REQUIRED_INCLUDES) + unset(CMAKE_REQUIRED_LIBRARIES) endif() # If we find all three libraries, then go ahead. -if(MBEDTLS_LIB AND MBEDCRYPTO_LIB AND MBEDX509_LIB) - set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) - set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB} ${MBEDCRYPTO_LIB} ${MBEDX509_LIB}) +if(MBEDTLS_LIB + AND MBEDCRYPTO_LIB + AND MBEDX509_LIB) + set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) + set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB} ${MBEDCRYPTO_LIB} ${MBEDX509_LIB}) -# Otherwise, if we find MBEDTLS_LIB, and it has both CRYPTO and x509 -# within the single lib (i.e. a windows build environment), then also -# feel free to go ahead. -elseif(MBEDTLS_LIB AND MBEDTLS_INCLUDES_CRYPTO AND MBEDTLS_INCLUDES_X509) - set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) - set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB}) + foreach(component TLS CRYPTO X509) + if(NOT TARGET Mbedtls::${component} AND MBED${component}_LIB) + if(IS_ABSOLUTE "${MBED${component}_LIB}") + add_library(Mbedtls::${component} UNKNOWN IMPORTED) + set_target_properties( + Mbedtls::${component} PROPERTIES IMPORTED_LOCATION + "${MBED${component}_LIB}") + else() + add_library(Mbedtls::${component} INTERFACE IMPORTED) + set_target_properties( + Mbedtls::${component} PROPERTIES IMPORTED_LIBNAME + "${MBED${component}_LIB}") + endif() + + set_target_properties( + Mbedtls::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${MBED${component}_INCLUDE_DIR}") + endif() + endforeach() + + if(NOT TARGET Mbedtls::Mbedtls) + add_library(Mbedtls::Mbedtls INTERFACE IMPORTED) + target_link_libraries(Mbedtls::Mbedtls + INTERFACE Mbedtls::TLS Mbedtls::CRYPTO Mbedtls::X509) + endif() + + # Otherwise, if we find MBEDTLS_LIB, and it has both CRYPTO and x509 within + # the single lib (i.e. a windows build environment), then also feel free to go + # ahead. +elseif( + MBEDTLS_LIB + AND MBEDTLS_INCLUDES_CRYPTO + AND MBEDTLS_INCLUDES_X509) + set(MBEDTLS_INCLUDE_DIRS ${MBEDTLS_INCLUDE_DIR}) + set(MBEDTLS_LIBRARIES ${MBEDTLS_LIB}) + + if(NOT TARGET Mbedtls::Mbedtls) + if(IS_ABSOLUTE "${MBED${component}_LIB}") + add_library(Mbedtls::${component} UNKNOWN IMPORTED) + set_target_properties(Mbedtls::${component} + PROPERTIES IMPORTED_LOCATION "${MBEDTLS_LIBRARIES}") + else() + add_library(Mbedtls::${component} INTERFACE IMPORTED) + set_target_properties(Mbedtls::${component} + PROPERTIES IMPORTED_LIBNAME "${MBEDTLS_LIBRARIES}") + endif() + + set_target_properties( + Mbedtls::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${MBEDTLS_INCLUDE_DIRS}") + endif() endif() # Now we've accounted for the 3-vs-1 library case: include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_LIBRARIES MBEDTLS_INCLUDE_DIRS) +find_package_handle_standard_args(MbedTLS DEFAULT_MSG MBEDTLS_LIBRARIES + MBEDTLS_INCLUDE_DIRS) mark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIB MBEDCRYPTO_LIB MBEDX509_LIB) - diff --git a/cmake/Modules/FindOSS.cmake b/cmake/Modules/FindOSS.cmake index 9717ce2e7..e0121c6d3 100644 --- a/cmake/Modules/FindOSS.cmake +++ b/cmake/Modules/FindOSS.cmake @@ -1,33 +1,36 @@ # Try to find OSS on a *nix system # -# OSS_FOUND - True if OSS is available -# OSS_INCLUDE_DIR - Include directory of OSS header -# OSS_HEADER_NAME - OSS header file name +# OSS_FOUND - True if OSS is available OSS_INCLUDE_DIR - Include +# directory of OSS header OSS_HEADER_NAME - OSS header file name # -IF (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") - set(OSS_HEADER_NAME "sys/soundcard.h") -ELSEIF (CMAKE_SYSTEM_NAME MATCHES "DragonFly") - set(OSS_HEADER_NAME "sys/soundcard.h") -ENDIF() +if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD") + set(OSS_HEADER_NAME "sys/soundcard.h") +elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly") + set(OSS_HEADER_NAME "sys/soundcard.h") +endif() -find_path(OSS_INCLUDE_DIR "${OSS_HEADER_NAME}" - "/usr/include" - "/usr/local/include" -) +find_path(OSS_INCLUDE_DIR "${OSS_HEADER_NAME}" "/usr/include" + "/usr/local/include") -if (OSS_INCLUDE_DIR) - set(OSS_FOUND True) -else (OSS_INCLUDE_DIR) - set(OSS_FOUND) -endif (OSS_INCLUDE_DIR) +if(OSS_INCLUDE_DIR) + set(OSS_FOUND True) +else(OSS_INCLUDE_DIR) + set(OSS_FOUND) +endif(OSS_INCLUDE_DIR) -if (OSS_FOUND) - message(STATUS "Found OSS header: ${OSS_INCLUDE_DIR}/${OSS_HEADER_NAME}") -else (OSS_FOUND) - if (OSS_FIND_REQUIRED) - message(FATAL_ERROR "Could not find OSS header file") - endif (OSS_FIND_REQUIRED) -endif (OSS_FOUND) +if(OSS_FOUND) + message(STATUS "Found OSS header: ${OSS_INCLUDE_DIR}/${OSS_HEADER_NAME}") +else(OSS_FOUND) + if(OSS_FIND_REQUIRED) + message(FATAL_ERROR "Could not find OSS header file") + endif(OSS_FIND_REQUIRED) +endif(OSS_FOUND) mark_as_advanced(OSS_FOUND OSS_INCLUDE_DIR OSS_HEADER_NAME) + +if(OSS_FOUND AND NOT TARGET OSS::OSS) + add_library(OSS::OSS INTERFACE IMPORTED) + set_target_properties(OSS::OSS PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${OSS_INCLUDE_DIR}") +endif() diff --git a/cmake/Modules/FindPipeWire.cmake b/cmake/Modules/FindPipeWire.cmake index 79215fac8..6fa848895 100644 --- a/cmake/Modules/FindPipeWire.cmake +++ b/cmake/Modules/FindPipeWire.cmake @@ -1,65 +1,56 @@ -#.rst: -# FindPipeWire +# .rst: FindPipeWire # ------- # # Try to find PipeWire on a Unix system. # # This will define the following variables: # -# ``PIPEWIRE_FOUND`` -# True if (the requested version of) PipeWire is available -# ``PIPEWIRE_VERSION`` -# The version of PipeWire -# ``PIPEWIRE_LIBRARIES`` -# This can be passed to target_link_libraries() instead of the ``PipeWire::PipeWire`` -# target -# ``PIPEWIRE_INCLUDE_DIRS`` -# This should be passed to target_include_directories() if the target is not -# used for linking -# ``PIPEWIRE_DEFINITIONS`` -# This should be passed to target_compile_options() if the target is not -# used for linking +# ``PIPEWIRE_FOUND`` True if (the requested version of) PipeWire is available +# ``PIPEWIRE_VERSION`` The version of PipeWire ``PIPEWIRE_LIBRARIES`` This can +# be passed to target_link_libraries() instead of the ``PipeWire::PipeWire`` +# target ``PIPEWIRE_INCLUDE_DIRS`` This should be passed to +# target_include_directories() if the target is not used for linking +# ``PIPEWIRE_DEFINITIONS`` This should be passed to target_compile_options() if +# the target is not used for linking # -# If ``PIPEWIRE_FOUND`` is TRUE, it will also define the following imported target: +# If ``PIPEWIRE_FOUND`` is TRUE, it will also define the following imported +# target: # -# ``PipeWire::PipeWire`` -# The PipeWire library +# ``PipeWire::PipeWire`` The PipeWire library # # In general we recommend using the imported target, as it is easier to use. # Bear in mind, however, that if the target is in the link interface of an # exported library, it must be made available by the package config file. -#============================================================================= -# Copyright 2014 Alex Merry -# Copyright 2014 Martin Gräßlin -# Copyright 2018-2020 Jan Grulich +# ============================================================================= +# Copyright 2014 Alex Merry Copyright 2014 Martin Gräßlin +# Copyright 2018-2020 Jan Grulich # # Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: +# modification, are permitted provided that the following conditions are met: # -# 1. Redistributions of source code must retain the copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. +# 1. Redistributions of source code must retain the copyright notice, this list +# of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the copyright notice, this +# list of conditions and the following disclaimer in the documentation and/or +# other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#============================================================================= +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# ============================================================================= -# Use pkg-config to get the directories and then use these values -# in the FIND_PATH() and FIND_LIBRARY() calls +# Use pkg-config to get the directories and then use these values in the +# FIND_PATH() and FIND_LIBRARY() calls find_package(PkgConfig QUIET) pkg_search_module(PKG_PIPEWIRE QUIET libpipewire-0.3) @@ -68,54 +59,42 @@ pkg_search_module(PKG_SPA QUIET libspa-0.2) set(PIPEWIRE_DEFINITIONS "${PKG_PIPEWIRE_CFLAGS}" "${PKG_SPA_CFLAGS}") set(PIPEWIRE_VERSION "${PKG_PIPEWIRE_VERSION}") -find_path(PIPEWIRE_INCLUDE_DIRS - NAMES - pipewire/pipewire.h - HINTS - ${PKG_PIPEWIRE_INCLUDE_DIRS} - ${PKG_PIPEWIRE_INCLUDE_DIRS}/pipewire-0.3 -) +find_path( + PIPEWIRE_INCLUDE_DIRS + NAMES pipewire/pipewire.h + HINTS ${PKG_PIPEWIRE_INCLUDE_DIRS} ${PKG_PIPEWIRE_INCLUDE_DIRS}/pipewire-0.3) -find_path(SPA_INCLUDE_DIRS - NAMES - spa/param/props.h - HINTS - ${PKG_SPA_INCLUDE_DIRS} - ${PKG_SPA_INCLUDE_DIRS}/spa-0.2 -) +find_path( + SPA_INCLUDE_DIRS + NAMES spa/param/props.h + HINTS ${PKG_SPA_INCLUDE_DIRS} ${PKG_SPA_INCLUDE_DIRS}/spa-0.2) -find_library(PIPEWIRE_LIBRARIES - NAMES - pipewire-0.3 - HINTS - ${PKG_PIPEWIRE_LIBRARY_DIRS} -) +find_library( + PIPEWIRE_LIBRARIES + NAMES pipewire-0.3 + HINTS ${PKG_PIPEWIRE_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PipeWire - FOUND_VAR - PIPEWIRE_FOUND - REQUIRED_VARS - PIPEWIRE_LIBRARIES - PIPEWIRE_INCLUDE_DIRS - SPA_INCLUDE_DIRS - VERSION_VAR - PIPEWIRE_VERSION -) +find_package_handle_standard_args( + PipeWire + FOUND_VAR PIPEWIRE_FOUND + REQUIRED_VARS PIPEWIRE_LIBRARIES PIPEWIRE_INCLUDE_DIRS SPA_INCLUDE_DIRS + VERSION_VAR PIPEWIRE_VERSION) if(PIPEWIRE_FOUND AND NOT TARGET PipeWire::PipeWire) - add_library(PipeWire::PipeWire UNKNOWN IMPORTED) - set_target_properties(PipeWire::PipeWire PROPERTIES - IMPORTED_LOCATION "${PIPEWIRE_LIBRARIES}" - INTERFACE_COMPILE_OPTIONS "${PIPEWIRE_DEFINITIONS}" - INTERFACE_INCLUDE_DIRECTORIES "${PIPEWIRE_INCLUDE_DIRS};${SPA_INCLUDE_DIRS}" - ) + add_library(PipeWire::PipeWire UNKNOWN IMPORTED) + set_target_properties( + PipeWire::PipeWire + PROPERTIES IMPORTED_LOCATION "${PIPEWIRE_LIBRARIES}" + INTERFACE_COMPILE_OPTIONS "${PIPEWIRE_DEFINITIONS}" + INTERFACE_INCLUDE_DIRECTORIES + "${PIPEWIRE_INCLUDE_DIRS};${SPA_INCLUDE_DIRS}") endif() mark_as_advanced(PIPEWIRE_LIBRARIES PIPEWIRE_INCLUDE_DIRS) include(FeatureSummary) -set_package_properties(PipeWire PROPERTIES - URL "https://www.pipewire.org" - DESCRIPTION "PipeWire - multimedia processing" -) +set_package_properties( + PipeWire PROPERTIES + URL "https://www.pipewire.org" + DESCRIPTION "PipeWire - multimedia processing") diff --git a/cmake/Modules/FindPythonDeps.cmake b/cmake/Modules/FindPythonDeps.cmake deleted file mode 100644 index 8d1a53b3c..000000000 --- a/cmake/Modules/FindPythonDeps.cmake +++ /dev/null @@ -1,68 +0,0 @@ -# Once done these will be defined: -# -# PYTHON_FOUND -# PYTHON_INCLUDE_DIRS -# PYTHON_LIBRARIES -# -# For use in OBS: -# -# PYTHON_INCLUDE_DIR - -if(NOT WIN32) - set(Python_ADDITIONAL_VERSIONS 3.4) - find_package(PythonLibs QUIET 3.4) - return() -endif() - -IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(_LIB_SUFFIX 64) -ELSE() - SET(_LIB_SUFFIX 32) -ENDIF() - -FIND_PATH(PYTHON_INCLUDE_DIR - NAMES Python.h - HINTS - ENV PythonPath${_LIB_SUFFIX} - ENV PythonPath - ENV DepsPath${_LIB_SUFFIX} - ENV DepsPath - ${PythonPath${_LIB_SUFFIX}} - ${PythonPath} - ${DepsPath${_LIB_SUFFIX}} - ${DepsPath} - ${_PYTHON_INCLUDE_DIRS} - PATH_SUFFIXES - include - include/python - ) - -find_library(PYTHON_LIB - NAMES ${_PYTHON_LIBRARIES} python36 - HINTS - ENV PythonPath${_lib_suffix} - ENV PythonPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${PythonPath${_lib_suffix}} - ${PythonPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_PYTHON_LIBRARY_DIRS} - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Python DEFAULT_MSG PYTHON_LIB PYTHON_INCLUDE_DIR) -mark_as_advanced(PYTHON_INCLUDE_DIR PYTHON_LIB) - -if(PYTHON_FOUND) - set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR}) - set(PYTHON_LIBRARIES ${PYTHON_LIB}) - set(PYTHONLIBS_FOUND TRUE) -endif() diff --git a/cmake/Modules/FindPythonWindows.cmake b/cmake/Modules/FindPythonWindows.cmake new file mode 100644 index 000000000..be67b8cf3 --- /dev/null +++ b/cmake/Modules/FindPythonWindows.cmake @@ -0,0 +1,65 @@ +# Once done these will be defined: +# +# PYTHON_FOUND PYTHON_INCLUDE_DIRS PYTHON_LIBRARIES +# +# For use in OBS: +# +# PYTHON_INCLUDE_DIR + +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_LIB_SUFFIX 64) +else() + set(_LIB_SUFFIX 32) +endif() + +find_path( + PYTHON_INCLUDE_DIR + NAMES Python.h + HINTS ${_PYTHON_INCLUDE_DIRS} + PATH_SUFFIXES include include/python) + +find_library( + PYTHON_LIB + NAMES ${_PYTHON_LIBRARIES} python36 + HINTS ${_PYTHON_LIBRARY_DIRS} + PATH_SUFFIXES + lib${_lib_suffix} + lib + libs${_lib_suffix} + libs + bin${_lib_suffix} + bin + ../lib${_lib_suffix} + ../lib + ../libs${_lib_suffix} + ../libs + ../bin${_lib_suffix} + ../bin) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(PythonWindows DEFAULT_MSG PYTHON_LIB + PYTHON_INCLUDE_DIR) +mark_as_advanced(PYTHON_INCLUDE_DIR PYTHON_LIB) + +if(PYTHONWINDOWS_FOUND) + set(Python_FOUND TRUE) + set(Python_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR}) + set(Python_LIBRARIES ${PYTHON_LIB}) + set(PYTHONLIBS_FOUND TRUE) + + if(NOT TARGET Python::Python) + if(IS_ABSOLUTE "${Python_LIBRARIES}") + add_library(Python::Python UNKNOWN IMPORTED) + set_target_properties(Python::Python PROPERTIES IMPORTED_LOCATION + "${Python_LIBRARIES}") + else() + add_library(Python::Python INTERFACE IMPORTED) + set_target_properties(Python::Python PROPERTIES IMPORTED_LIBNAME + "${Python_LIBRARIES}") + endif() + + set_target_properties( + Python::Python PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${Python_INCLUDE_DIRS}") + endif() +endif() diff --git a/cmake/Modules/FindRSSDK.cmake b/cmake/Modules/FindRSSDK.cmake index bd008dbcb..59e570f05 100644 --- a/cmake/Modules/FindRSSDK.cmake +++ b/cmake/Modules/FindRSSDK.cmake @@ -1,40 +1,49 @@ # Once done these will be defined: # -# RSSDK_FOUND -# RSSDK_INCLUDE_DIRS -# RSSDK_LIBRARIES +# RSSDK_FOUND RSSDK_INCLUDE_DIRS RSSDK_LIBRARIES # # For use in OBS: # -# RSSDK_INCLUDE_DIR +# RSSDK_INCLUDE_DIR if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_RSSDK_lib_dir "x64") + set(_RSSDK_lib_dir "x64") else() - set(_RSSDK_lib_dir "Win32") + set(_RSSDK_lib_dir "Win32") endif() -find_path(RSSDK_INCLUDE_DIR - NAMES pxcsession.h - HINTS - ENV RSSDK_DIR - PATH_SUFFIXES - include) +find_path( + RSSDK_INCLUDE_DIR + NAMES pxcsession.h + HINTS ENV RSSDK_DIR + PATH_SUFFIXES include) -find_library(RSSDK_LIB - NAMES libpxc - HINTS - ENV RSSDK_DIR - PATH_SUFFIXES - lib/${_RSSDK_lib_dir} - ) +find_library( + RSSDK_LIB + NAMES libpxc + HINTS ENV RSSDK_DIR + PATH_SUFFIXES lib/${_RSSDK_lib_dir}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(RSSDK DEFAULT_MSG RSSDK_LIB RSSDK_INCLUDE_DIR) mark_as_advanced(RSSDK_INCLUDE_DIR RSSDK_LIB) if(RSSDK_FOUND) - set(RSSDK_INCLUDE_DIRS ${RSSDK_INCLUDE_DIR}) - set(RSSDK_LIBRARIES ${RSSDK_LIB}) -endif() + set(RSSDK_INCLUDE_DIRS ${RSSDK_INCLUDE_DIR}) + set(RSSDK_LIBRARIES ${RSSDK_LIB}) + if(NOT TARGET RSS::SDK) + if(IS_ABSOLUTE "${RSSDK_LIBRARIES}") + add_library(RSS:SDK UNKNOWN IMPORTED) + set_target_properties(RSS:SDK PROPERTIES IMPORTED_LOCATION + "${RSSDK_LIBRARIES}") + else() + add_library(RSS:SDK INTERFACE IMPORTED) + set_target_properties(RSS:SDK PROPERTIES IMPORTED_LIBNAME + "${RSSDK_LIBRARIES}") + endif() + + set_target_properties(RSS:SDK PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${RSSDK_INCLUDE_DIRS}") + endif() +endif() diff --git a/cmake/Modules/FindSndio.cmake b/cmake/Modules/FindSndio.cmake index 4c206614d..5478a9c49 100644 --- a/cmake/Modules/FindSndio.cmake +++ b/cmake/Modules/FindSndio.cmake @@ -45,12 +45,10 @@ find_path(Sndio_INCLUDE_DIR sndio.h) find_library(Sndio_LIBRARY sndio) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Sndio +find_package_handle_standard_args( + Sndio FOUND_VAR Sndio_FOUND - REQUIRED_VARS - Sndio_LIBRARY - Sndio_INCLUDE_DIR -) + REQUIRED_VARS Sndio_LIBRARY Sndio_INCLUDE_DIR) if(Sndio_FOUND) set(Sndio_LIBRARIES ${Sndio_LIBRARY}) @@ -59,13 +57,10 @@ endif() if(Sndio_FOUND AND NOT TARGET Sndio::Sndio) add_library(Sndio::Sndio UNKNOWN IMPORTED) - set_target_properties(Sndio::Sndio PROPERTIES - IMPORTED_LOCATION "${Sndio_LIBRARY}" - INTERFACE_INCLUDE_DIRECTORIES "${Sndio_INCLUDE_DIR}" - ) + set_target_properties( + Sndio::Sndio + PROPERTIES IMPORTED_LOCATION "${Sndio_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${Sndio_INCLUDE_DIR}") endif() -mark_as_advanced( - Sndio_INCLUDE_DIR - Sndio_LIBRARY -) +mark_as_advanced(Sndio_INCLUDE_DIR Sndio_LIBRARY) diff --git a/cmake/Modules/FindSwigDeps.cmake b/cmake/Modules/FindSwigDeps.cmake deleted file mode 100644 index 10d6fa64e..000000000 --- a/cmake/Modules/FindSwigDeps.cmake +++ /dev/null @@ -1,49 +0,0 @@ -if(DEFINED SWIGDIR) - list(APPEND CMAKE_PREFIX_PATH "${SWIGDIR}") -elseif(DEFINED ENV{SWIGDIR}) - list(APPEND CMAKE_PREFIX_PATH "$ENV{SWIGDIR}") -endif() - -if(WIN32) - IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(_LIB_SUFFIX 64) - ELSE() - SET(_LIB_SUFFIX 32) - ENDIF() - - FIND_PATH(SWIG_DIR - NAMES swigrun.i - HINTS - ENV SwigPath${_LIB_SUFFIX} - ENV SwigPath - ENV DepsPath${_LIB_SUFFIX} - ENV DepsPath - ${SwigPath${_LIB_SUFFIX}} - ${SwigPath} - ${DepsPath${_LIB_SUFFIX}} - ${DepsPath} - ${_PYTHON_INCLUDE_DIRS} - PATH_SUFFIXES - ../swig/Lib - swig/Lib - ) - - find_program(SWIG_EXECUTABLE - NAMES swig - HINTS - ENV SwigPath${_LIB_SUFFIX} - ENV SwigPath - ENV DepsPath${_LIB_SUFFIX} - ENV DepsPath - ${SwigPath${_LIB_SUFFIX}} - ${SwigPath} - ${DepsPath${_LIB_SUFFIX}} - ${DepsPath} - ${_PYTHON_INCLUDE_DIRS} - PATH_SUFFIXES - ../swig - swig - ) -endif() - -find_package(SWIG QUIET 2) diff --git a/cmake/Modules/FindSwigWindows.cmake b/cmake/Modules/FindSwigWindows.cmake new file mode 100644 index 000000000..95b135dda --- /dev/null +++ b/cmake/Modules/FindSwigWindows.cmake @@ -0,0 +1,19 @@ +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_LIB_SUFFIX 64) +else() + set(_LIB_SUFFIX 32) +endif() + +find_path( + SWIG_DIR + NAMES swigrun.i + HINTS ENV SWIG_PATH ${SWIG_PATH} ${CMAKE_SOURCE_DIR}/${SWIG_PATH} + PATH_SUFFIXES ../swig/Lib swig/Lib) + +find_program( + SWIG_EXECUTABLE + NAMES swig + HINTS ENV SWIG_PATH ${SWIG_PATH} ${CMAKE_SOURCE_DIR}/${SWIG_PATH} + PATH_SUFFIXES ../swig swig) + +find_package(SWIG QUIET 2) diff --git a/cmake/Modules/FindSysinfo.cmake b/cmake/Modules/FindSysinfo.cmake new file mode 100644 index 000000000..4447b0149 --- /dev/null +++ b/cmake/Modules/FindSysinfo.cmake @@ -0,0 +1,39 @@ +# Once done these will be defined: +# +# SYSINFO_FOUND SYSINFO_INCLUDE_DIRS SYSINFO_LIBRARIES + +find_path( + SYSINFO_INCLUDE_DIR + NAMES sys/sysinfo.h + PATHS /usr/include /usr/local/include /opt/local/include) + +find_library( + SYSINFO_LIB + NAMES sysinfo libsysinfo + PATHS /usr/lib /usr/local/lib /opt/local/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Sysinfo DEFAULT_MSG SYSINFO_LIB + SYSINFO_INCLUDE_DIR) +mark_as_advanced(SYSINFO_INCLUDE_DIR SYSINFO_LIB) + +if(SYSINFO_FOUND) + set(SYSINFO_INCLUDE_DIRS ${SYSINFO_INCLUDE_DIR}) + set(SYSINFO_LIBRARIES ${SYSINFO_LIB}) + + if(NOT TARGET Sysinfo::Sysinfo) + if(IS_ABSOLUTE "${SYSINFO_LIBRARIES}") + add_library(Sysinfo::Sysinfo UNKNOWN IMPORTED) + set_target_properties(Sysinfo::Sysinfo PROPERTIES IMPORTED_LOCATION + "${SYSINFO_LIBRARIES}") + else() + add_library(Sysinfo::Sysinfo INTERFACE IMPORTED) + set_target_properties(Sysinfo::Sysinfo PROPERTIES IMPORTED_LIBNAME + "${SYSINFO_LIBRARIES}") + endif() + + set_target_properties( + Sysinfo::Sysinfo PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${SYSINFO_INCLUDE_DIRS}") + endif() +endif() diff --git a/cmake/Modules/FindUDev.cmake b/cmake/Modules/FindUDev.cmake deleted file mode 100644 index 5e07e6659..000000000 --- a/cmake/Modules/FindUDev.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Once done these will be defined: -# -# UDEV_FOUND -# UDEV_INCLUDE_DIRS -# UDEV_LIBRARIES - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_UDEV QUIET libudev) -endif() - -find_path(UDEV_INCLUDE_DIR - NAMES libudev.h - HINTS - ${_UDEV_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include) - -find_library(UDEV_LIB - NAMES udev libudev - HINTS - ${_UDEV_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(UDev DEFAULT_MSG UDEV_LIB UDEV_INCLUDE_DIR) -mark_as_advanced(UDEV_INCLUDE_DIR UDEV_LIB) - -if(UDEV_FOUND) - set(UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR}) - set(UDEV_LIBRARIES ${UDEV_LIB}) -endif() diff --git a/cmake/Modules/FindUdev.cmake b/cmake/Modules/FindUdev.cmake new file mode 100644 index 000000000..153614b47 --- /dev/null +++ b/cmake/Modules/FindUdev.cmake @@ -0,0 +1,44 @@ +# Once done these will be defined: +# +# UDEV_FOUND UDEV_INCLUDE_DIRS UDEV_LIBRARIES + +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(_UDEV QUIET libudev) +endif() + +find_path( + UDEV_INCLUDE_DIR + NAMES libudev.h + HINTS ${_UDEV_INCLUDE_DIRS} + PATHS /usr/include /usr/local/include /opt/local/include) + +find_library( + UDEV_LIB + NAMES udev libudev + HINTS ${_UDEV_LIBRARY_DIRS} + PATHS /usr/lib /usr/local/lib /opt/local/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Udev DEFAULT_MSG UDEV_LIB UDEV_INCLUDE_DIR) +mark_as_advanced(UDEV_INCLUDE_DIR UDEV_LIB) + +if(UDEV_FOUND) + set(UDEV_INCLUDE_DIRS ${UDEV_INCLUDE_DIR}) + set(UDEV_LIBRARIES ${UDEV_LIB}) + + if(NOT TARGET Udev::Udev) + if(IS_ABSOLUTE "${UDEV_LIBRARIES}") + add_library(Udev::Udev UNKNOWN IMPORTED) + set_target_properties(Udev::Udev PROPERTIES IMPORTED_LOCATION + "${UDEV_LIBRARIES}") + else() + add_library(Udev::Udev INTERFACE IMPORTED) + set_target_properties(Udev::Udev PROPERTIES IMPORTED_LIBNAME + "${UDEV_LIBRARIES}") + endif() + + set_target_properties(Udev::Udev PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${UDEV_INCLUDE_DIRS}") + endif() +endif() diff --git a/cmake/Modules/FindVulkan.cmake b/cmake/Modules/FindVulkan.cmake deleted file mode 100644 index a9d222754..000000000 --- a/cmake/Modules/FindVulkan.cmake +++ /dev/null @@ -1,70 +0,0 @@ -# Once done these will be defined: -# -# VULKAN_FOUND -# VULKAN_INCLUDE_DIRS -# VULKAN_LIBRARIES -# -# For use in OBS: -# -# VULKAN_INCLUDE_DIR - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_VULKAN QUIET vulkan) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -find_path(VULKAN_INCLUDE_DIR - NAMES vulkan/vulkan.h - HINTS - ENV vulkanPath${_lib_suffix} - ENV vulkanPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ENV VULKAN_SDK - ${vulkanPath${_lib_suffix}} - ${vulkanPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_VULKAN_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) - -find_library(VULKAN_LIB - NAMES ${_VULKAN_LIBRARIES} vulkan-1 vulkan libvulkan - HINTS - ENV vulkanPath${_lib_suffix} - ENV vulkanPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ENV VULKAN_SDK - ${vulkanPath${_lib_suffix}} - ${vulkanPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_VULKAN_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Vulkan DEFAULT_MSG VULKAN_LIB VULKAN_INCLUDE_DIR) -mark_as_advanced(VULKAN_INCLUDE_DIR VULKAN_LIB) - -if(VULKAN_FOUND) - set(VULKAN_INCLUDE_DIRS ${VULKAN_INCLUDE_DIR}) - set(VULKAN_LIBRARIES ${VULKAN_LIB}) -endif() diff --git a/cmake/Modules/FindWayland.cmake b/cmake/Modules/FindWayland.cmake index 377f0545c..31983a8a7 100644 --- a/cmake/Modules/FindWayland.cmake +++ b/cmake/Modules/FindWayland.cmake @@ -2,77 +2,131 @@ # # This will define: # -# WAYLAND_FOUND - True if Wayland is found -# WAYLAND_LIBRARIES - Link these to use Wayland -# WAYLAND_INCLUDE_DIRS - Include directory for Wayland -# WAYLAND_DEFINITIONS - Compiler flags for using Wayland +# WAYLAND_FOUND - True if Wayland is found WAYLAND_LIBRARIES - Link +# these to use Wayland WAYLAND_INCLUDE_DIRS - Include directory for Wayland +# WAYLAND_DEFINITIONS - Compiler flags for using Wayland # # In addition the following more fine grained variables will be defined: # -# Wayland_Client_FOUND WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES -# Wayland_Server_FOUND WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES -# Wayland_EGL_FOUND WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES -# Wayland_Cursor_FOUND WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES +# Wayland_Client_FOUND WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES +# Wayland_Server_FOUND WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES +# Wayland_EGL_FOUND WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES +# Wayland_Cursor_FOUND WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES # -# Copyright (c) 2013 Martin Gräßlin -# 2020 Georges Basile Stavracas Neto +# Copyright (c) 2013 Martin Gräßlin 2020 Georges Basile +# Stavracas Neto # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. -IF (NOT WIN32) +# Use pkg-config to get the directories and then use these values in the +# find_path() and find_library() calls +find_package(PkgConfig) +pkg_check_modules(PKG_WAYLAND QUIET wayland-client wayland-server wayland-egl + wayland-cursor) - # Use pkg-config to get the directories and then use these values - # in the find_path() and find_library() calls - find_package(PkgConfig) - PKG_CHECK_MODULES(PKG_WAYLAND QUIET wayland-client wayland-server wayland-egl wayland-cursor) +set(WAYLAND_DEFINITIONS ${PKG_WAYLAND_CFLAGS}) - set(WAYLAND_DEFINITIONS ${PKG_WAYLAND_CFLAGS}) +find_path( + WAYLAND_CLIENT_INCLUDE_DIRS + NAMES wayland-client.h + HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) +find_library( + WAYLAND_CLIENT_LIBRARIES + NAMES wayland-client + HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) +if(WAYLAND_CLIENT_INCLUDE_DIRS AND WAYLAND_CLIENT_LIBRARIES) + set(Wayland_Client_FOUND TRUE) +else() + set(Wayland_Client_FOUND FALSE) +endif() +mark_as_advanced(WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES) - find_path(WAYLAND_CLIENT_INCLUDE_DIRS NAMES wayland-client.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) - find_library(WAYLAND_CLIENT_LIBRARIES NAMES wayland-client HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) - if(WAYLAND_CLIENT_INCLUDE_DIRS AND WAYLAND_CLIENT_LIBRARIES) - set(Wayland_Client_FOUND TRUE) - else() - set(Wayland_Client_FOUND FALSE) +find_path( + WAYLAND_CURSOR_INCLUDE_DIRS + NAMES wayland-cursor.h + HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) +find_library( + WAYLAND_CURSOR_LIBRARIES + NAMES wayland-cursor + HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) +if(WAYLAND_CURSOR_INCLUDE_DIRS AND WAYLAND_CURSOR_LIBRARIES) + set(Wayland_Cursor_FOUND TRUE) +else() + set(Wayland_Cursor_FOUND FALSE) +endif() +mark_as_advanced(WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES) + +find_path( + WAYLAND_EGL_INCLUDE_DIRS + NAMES wayland-egl.h + HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) +find_library( + WAYLAND_EGL_LIBRARIES + NAMES wayland-egl + HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) +if(WAYLAND_EGL_INCLUDE_DIRS AND WAYLAND_EGL_LIBRARIES) + set(Wayland_EGL_FOUND TRUE) +else() + set(Wayland_EGL_FOUND FALSE) +endif() +mark_as_advanced(WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES) + +find_path( + WAYLAND_SERVER_INCLUDE_DIRS + NAMES wayland-server.h + HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) +find_library( + WAYLAND_SERVER_LIBRARIES + NAMES wayland-server + HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) +if(WAYLAND_SERVER_INCLUDE_DIRS AND WAYLAND_SERVER_LIBRARIES) + set(Wayland_Server_FOUND TRUE) +else() + set(Wayland_Server_FOUND FALSE) +endif() +mark_as_advanced(WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES) + +set(WAYLAND_INCLUDE_DIRS + ${WAYLAND_CLIENT_INCLUDE_DIRS} ${WAYLAND_SERVER_INCLUDE_DIRS} + ${WAYLAND_EGL_INCLUDE_DIRS} ${WAYLAND_CURSOR_INCLUDE_DIRS}) +set(WAYLAND_LIBRARIES ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_SERVER_LIBRARIES} + ${WAYLAND_EGL_LIBRARIES} ${WAYLAND_CURSOR_LIBRARIES}) +mark_as_advanced(WAYLAND_INCLUDE_DIRS WAYLAND_LIBRARIES) + +list(REMOVE_DUPLICATES WAYLAND_INCLUDE_DIRS) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args( + Wayland + REQUIRED_VARS WAYLAND_LIBRARIES WAYLAND_INCLUDE_DIRS + HANDLE_COMPONENTS) + +foreach(component "Client" "Server" "EGL" "Cursor") + if(NOT TARGET Wayland::${component}) + string(TOUPPER ${component} component_u) + if(Wayland_${component}_FOUND) + if(IS_ABSOLUTE "${WAYLAND_${component_u}_LIBRARIES}") + add_library(Wayland::${component} UNKNOWN IMPORTED) + set_target_properties( + Wayland::${component} + PROPERTIES IMPORTED_LOCATION "${WAYLAND_${component_u}_LIBRARIES}") + else() + add_library(Wayland::${component} INTERFACE IMPORTED) + set_target_properties( + Wayland::${component} + PROPERTIES IMPORTED_LIBNAME "${WAYLAND_${component_u}_LIBRARIES}") + endif() + + set_target_properties( + Wayland::${component} + PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${WAYLAND_${component_u}_INCLUDE_DIRS}") + + set_target_properties( + Wayland::${component} PROPERTIES INTERFACE_COMPILE_DEFINITIONS + "${WAYLAND_DEFINITIONS}") + endif() endif() - mark_as_advanced(WAYLAND_CLIENT_INCLUDE_DIRS WAYLAND_CLIENT_LIBRARIES) - - find_path(WAYLAND_CURSOR_INCLUDE_DIRS NAMES wayland-cursor.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) - find_library(WAYLAND_CURSOR_LIBRARIES NAMES wayland-cursor HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) - if(WAYLAND_CURSOR_INCLUDE_DIRS AND WAYLAND_CURSOR_LIBRARIES) - set(Wayland_Cursor_FOUND TRUE) - else() - set(Wayland_Cursor_FOUND FALSE) - endif() - mark_as_advanced(WAYLAND_CURSOR_INCLUDE_DIRS WAYLAND_CURSOR_LIBRARIES) - - find_path(WAYLAND_EGL_INCLUDE_DIRS NAMES wayland-egl.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) - find_library(WAYLAND_EGL_LIBRARIES NAMES wayland-egl HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) - if(WAYLAND_EGL_INCLUDE_DIRS AND WAYLAND_EGL_LIBRARIES) - set(Wayland_EGL_FOUND TRUE) - else() - set(Wayland_EGL_FOUND FALSE) - endif() - mark_as_advanced(WAYLAND_EGL_INCLUDE_DIRS WAYLAND_EGL_LIBRARIES) - - find_path(WAYLAND_SERVER_INCLUDE_DIRS NAMES wayland-server.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) - find_library(WAYLAND_SERVER_LIBRARIES NAMES wayland-server HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) - if(WAYLAND_SERVER_INCLUDE_DIRS AND WAYLAND_SERVER_LIBRARIES) - set(Wayland_Server_FOUND TRUE) - else() - set(Wayland_Server_FOUND FALSE) - endif() - mark_as_advanced(WAYLAND_SERVER_INCLUDE_DIRS WAYLAND_SERVER_LIBRARIES) - - set(WAYLAND_INCLUDE_DIRS ${WAYLAND_CLIENT_INCLUDE_DIRS} ${WAYLAND_SERVER_INCLUDE_DIRS} ${WAYLAND_EGL_INCLUDE_DIRS} ${WAYLAND_CURSOR_INCLUDE_DIRS}) - set(WAYLAND_LIBRARIES ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_SERVER_LIBRARIES} ${WAYLAND_EGL_LIBRARIES} ${WAYLAND_CURSOR_LIBRARIES}) - mark_as_advanced(WAYLAND_INCLUDE_DIRS WAYLAND_LIBRARIES) - - list(REMOVE_DUPLICATES WAYLAND_INCLUDE_DIRS) - - include(FindPackageHandleStandardArgs) - - find_package_handle_standard_args(Wayland REQUIRED_VARS WAYLAND_LIBRARIES WAYLAND_INCLUDE_DIRS HANDLE_COMPONENTS) - -ENDIF () +endforeach() diff --git a/cmake/Modules/FindX11_XCB.cmake b/cmake/Modules/FindX11_XCB.cmake index 7611b0888..a88d89b5e 100644 --- a/cmake/Modules/FindX11_XCB.cmake +++ b/cmake/Modules/FindX11_XCB.cmake @@ -1,31 +1,45 @@ -# - Try to find libX11-xcb -# Once done this will define +# * Try to find libX11-xcb Once done this will define # -# X11_XCB_FOUND - system has libX11-xcb -# X11_XCB_LIBRARIES - Link these to use libX11-xcb -# X11_XCB_INCLUDE_DIR - the libX11-xcb include dir +# X11_XCB_FOUND - system has libX11-xcb X11_XCB_LIBRARIES - Link these to use +# libX11-xcb X11_XCB_INCLUDE_DIR - the libX11-xcb include dir # X11_XCB_DEFINITIONS - compiler switches required for using libX11-xcb -# Copyright (c) 2011 Fredrik Höglund -# Copyright (c) 2008 Helio Chissini de Castro, -# Copyright (c) 2007 Matthias Kretz, +# Copyright (c) 2011 Fredrik Höglund Copyright (c) 2008 Helio +# Chissini de Castro, Copyright (c) 2007 Matthias Kretz, +# # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. -IF (NOT WIN32) - # use pkg-config to get the directories and then use these values - # in the FIND_PATH() and FIND_LIBRARY() calls - FIND_PACKAGE(PkgConfig) - PKG_CHECK_MODULES(PKG_X11_XCB QUIET x11-xcb) +if(NOT WIN32) + # use pkg-config to get the directories and then use these values in the + # FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PKG_X11_XCB QUIET x11-xcb) - SET(X11_XCB_DEFINITIONS ${PKG_X11_XCB_CFLAGS}) + set(X11_XCB_DEFINITIONS ${PKG_X11_XCB_CFLAGS}) - FIND_PATH(X11_XCB_INCLUDE_DIR NAMES X11/Xlib-xcb.h HINTS ${PKG_X11_XCB_INCLUDE_DIRS}) - FIND_LIBRARY(X11_XCB_LIBRARIES NAMES X11-xcb HINTS ${PKG_X11_XCB_LIBRARY_DIRS}) + find_path( + X11_XCB_INCLUDE_DIR + NAMES X11/Xlib-xcb.h + HINTS ${PKG_X11_XCB_INCLUDE_DIRS}) + find_library( + X11_XCB_LIBRARIES + NAMES X11-xcb + HINTS ${PKG_X11_XCB_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(X11_XCB DEFAULT_MSG X11_XCB_LIBRARIES X11_XCB_INCLUDE_DIR) + find_package_handle_standard_args(X11_XCB DEFAULT_MSG X11_XCB_LIBRARIES + X11_XCB_INCLUDE_DIR) - MARK_AS_ADVANCED(X11_XCB_INCLUDE_DIR X11_XCB_LIBRARIES) -ENDIF (NOT WIN32) + mark_as_advanced(X11_XCB_INCLUDE_DIR X11_XCB_LIBRARIES) + + if(X11_XCB_FOUND AND NOT TARGET X11::X11_xcb) + add_library(X11::X11_xcb UNKNOWN IMPORTED) + set_target_properties( + X11::X11_xcb + PROPERTIES IMPORTED_LOCATION "${X11_XCB_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${X11_XCB_INCLUDE_DIR}" + INTERFACE_LINK_LIBRARIES "XCB::XCB;X11::X11") + endif() +endif() diff --git a/cmake/Modules/FindXCB.cmake b/cmake/Modules/FindXCB.cmake index 2c05484ce..5ad6db226 100644 --- a/cmake/Modules/FindXCB.cmake +++ b/cmake/Modules/FindXCB.cmake @@ -2,241 +2,271 @@ # # This will define: # -# XCB_FOUND - True if xcb is available -# XCB_LIBRARIES - Link these to use xcb -# XCB_INCLUDE_DIRS - Include directory for xcb -# XCB_DEFINITIONS - Compiler flags for using xcb +# XCB_FOUND - True if xcb is available XCB_LIBRARIES - Link these to +# use xcb XCB_INCLUDE_DIRS - Include directory for xcb XCB_DEFINITIONS - +# Compiler flags for using xcb # # In addition the following more fine grained variables will be defined: # -# XCB_XCB_FOUND XCB_XCB_INCLUDE_DIR XCB_XCB_LIBRARY -# XCB_UTIL_FOUND XCB_UTIL_INCLUDE_DIR XCB_UTIL_LIBRARY -# XCB_COMPOSITE_FOUND XCB_COMPOSITE_INCLUDE_DIR XCB_COMPOSITE_LIBRARY -# XCB_DAMAGE_FOUND XCB_DAMAGE_INCLUDE_DIR XCB_DAMAGE_LIBRARY -# XCB_XFIXES_FOUND XCB_XFIXES_INCLUDE_DIR XCB_XFIXES_LIBRARY -# XCB_RENDER_FOUND XCB_RENDER_INCLUDE_DIR XCB_RENDER_LIBRARY -# XCB_RANDR_FOUND XCB_RANDR_INCLUDE_DIR XCB_RANDR_LIBRARY -# XCB_SHAPE_FOUND XCB_SHAPE_INCLUDE_DIR XCB_SHAPE_LIBRARY -# XCB_DRI2_FOUND XCB_DRI2_INCLUDE_DIR XCB_DRI2_LIBRARY -# XCB_GLX_FOUND XCB_GLX_INCLUDE_DIR XCB_GLX_LIBRARY -# XCB_SHM_FOUND XCB_SHM_INCLUDE_DIR XCB_SHM_LIBRARY -# XCB_XV_FOUND XCB_XV_INCLUDE_DIR XCB_XV_LIBRARY -# XCB_XINPUT_FOUND XCB_XINPUT_INCLUDE_DIR XCB_XINPUT_LIBRARY -# XCB_SYNC_FOUND XCB_SYNC_INCLUDE_DIR XCB_SYNC_LIBRARY -# XCB_XTEST_FOUND XCB_XTEST_INCLUDE_DIR XCB_XTEST_LIBRARY -# XCB_ICCCM_FOUND XCB_ICCCM_INCLUDE_DIR XCB_ICCCM_LIBRARY -# XCB_EWMH_FOUND XCB_EWMH_INCLUDE_DIR XCB_EWMH_LIBRARY -# XCB_IMAGE_FOUND XCB_IMAGE_INCLUDE_DIR XCB_IMAGE_LIBRARY -# XCB_RENDERUTIL_FOUND XCB_RENDERUTIL_INCLUDE_DIR XCB_RENDERUTIL_LIBRARY -# XCB_KEYSYMS_FOUND XCB_KEYSYMS_INCLUDE_DIR XCB_KEYSYMS_LIBRARY +# XCB_XCB_FOUND XCB_XCB_INCLUDE_DIR XCB_XCB_LIBRARY XCB_UTIL_FOUND +# XCB_UTIL_INCLUDE_DIR XCB_UTIL_LIBRARY XCB_COMPOSITE_FOUND +# XCB_COMPOSITE_INCLUDE_DIR XCB_COMPOSITE_LIBRARY XCB_DAMAGE_FOUND +# XCB_DAMAGE_INCLUDE_DIR XCB_DAMAGE_LIBRARY XCB_XFIXES_FOUND +# XCB_XFIXES_INCLUDE_DIR XCB_XFIXES_LIBRARY XCB_RENDER_FOUND +# XCB_RENDER_INCLUDE_DIR XCB_RENDER_LIBRARY XCB_RANDR_FOUND +# XCB_RANDR_INCLUDE_DIR XCB_RANDR_LIBRARY XCB_SHAPE_FOUND +# XCB_SHAPE_INCLUDE_DIR XCB_SHAPE_LIBRARY XCB_DRI2_FOUND +# XCB_DRI2_INCLUDE_DIR XCB_DRI2_LIBRARY XCB_GLX_FOUND XCB_GLX_INCLUDE_DIR +# XCB_GLX_LIBRARY XCB_SHM_FOUND XCB_SHM_INCLUDE_DIR XCB_SHM_LIBRARY +# XCB_XV_FOUND XCB_XV_INCLUDE_DIR XCB_XV_LIBRARY XCB_XINPUT_FOUND +# XCB_XINPUT_INCLUDE_DIR XCB_XINPUT_LIBRARY XCB_SYNC_FOUND +# XCB_SYNC_INCLUDE_DIR XCB_SYNC_LIBRARY XCB_XTEST_FOUND +# XCB_XTEST_INCLUDE_DIR XCB_XTEST_LIBRARY XCB_ICCCM_FOUND +# XCB_ICCCM_INCLUDE_DIR XCB_ICCCM_LIBRARY XCB_EWMH_FOUND +# XCB_EWMH_INCLUDE_DIR XCB_EWMH_LIBRARY XCB_IMAGE_FOUND +# XCB_IMAGE_INCLUDE_DIR XCB_IMAGE_LIBRARY XCB_RENDERUTIL_FOUND +# XCB_RENDERUTIL_INCLUDE_DIR XCB_RENDERUTIL_LIBRARY XCB_KEYSYMS_FOUND +# XCB_KEYSYMS_INCLUDE_DIR XCB_KEYSYMS_LIBRARY # -# Copyright (c) 2011 Fredrik Höglund -# Copyright (c) 2013 Martin Gräßlin +# Copyright (c) 2011 Fredrik Höglund Copyright (c) 2013 Martin +# Gräßlin # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. -set(knownComponents XCB - COMPOSITE - DAMAGE - DRI2 - EWMH - GLX - ICCCM - IMAGE - KEYSYMS - RANDR - RENDER - RENDERUTIL - SHAPE - SHM - SYNC - UTIL - XFIXES - XTEST - XV - XINPUT - XINERAMA) +set(knownComponents + XCB + COMPOSITE + DAMAGE + DRI2 + EWMH + GLX + ICCCM + IMAGE + KEYSYMS + RANDR + RENDER + RENDERUTIL + SHAPE + SHM + SYNC + UTIL + XFIXES + XTEST + XV + XINPUT + XINERAMA) unset(unknownComponents) set(pkgConfigModules) set(requiredComponents) -if (XCB_FIND_COMPONENTS) +if(XCB_FIND_COMPONENTS) set(comps ${XCB_FIND_COMPONENTS}) else() set(comps ${knownComponents}) endif() -# iterate through the list of requested components, and check that we know them all. -# If not, fail. +# iterate through the list of requested components, and check that we know them +# all. If not, fail. foreach(comp ${comps}) - list(FIND knownComponents ${comp} index ) - if("${index}" STREQUAL "-1") - list(APPEND unknownComponents "${comp}") - else() - if("${comp}" STREQUAL "XCB") - list(APPEND pkgConfigModules "xcb") - elseif("${comp}" STREQUAL "COMPOSITE") - list(APPEND pkgConfigModules "xcb-composite") - elseif("${comp}" STREQUAL "DAMAGE") - list(APPEND pkgConfigModules "xcb-damage") - elseif("${comp}" STREQUAL "DRI2") - list(APPEND pkgConfigModules "xcb-dri2") - elseif("${comp}" STREQUAL "EWMH") - list(APPEND pkgConfigModules "xcb-ewmh") - elseif("${comp}" STREQUAL "GLX") - list(APPEND pkgConfigModules "xcb-glx") - elseif("${comp}" STREQUAL "ICCCM") - list(APPEND pkgConfigModules "xcb-icccm") - elseif("${comp}" STREQUAL "IMAGE") - list(APPEND pkgConfigModules "xcb-image") - elseif("${comp}" STREQUAL "KEYSYMS") - list(APPEND pkgConfigModules "xcb-keysyms") - elseif("${comp}" STREQUAL "RANDR") - list(APPEND pkgConfigModules "xcb-randr") - elseif("${comp}" STREQUAL "RENDER") - list(APPEND pkgConfigModules "xcb-render") - elseif("${comp}" STREQUAL "RENDERUTIL") - list(APPEND pkgConfigModules "xcb-renderutil") - elseif("${comp}" STREQUAL "SHAPE") - list(APPEND pkgConfigModules "xcb-shape") - elseif("${comp}" STREQUAL "SHM") - list(APPEND pkgConfigModules "xcb-shm") - elseif("${comp}" STREQUAL "SYNC") - list(APPEND pkgConfigModules "xcb-sync") - elseif("${comp}" STREQUAL "UTIL") - list(APPEND pkgConfigModules "xcb-util") - elseif("${comp}" STREQUAL "XFIXES") - list(APPEND pkgConfigModules "xcb-xfixes") - elseif("${comp}" STREQUAL "XTEST") - list(APPEND pkgConfigModules "xcb-xtest") - elseif("${comp}" STREQUAL "XV") - list(APPEND pkgConfigModules "xcb-xv") - elseif("${comp}" STREQUAL "XINPUT") - list(APPEND pkgConfigModules "xcb-xinput") - elseif("${comp}" STREQUAL "XINERAMA") - list(APPEND pkgConfigModules "xcb-xinerama") - endif() + list(FIND knownComponents ${comp} index) + if("${index}" STREQUAL "-1") + list(APPEND unknownComponents "${comp}") + else() + if("${comp}" STREQUAL "XCB") + list(APPEND pkgConfigModules "xcb") + elseif("${comp}" STREQUAL "COMPOSITE") + list(APPEND pkgConfigModules "xcb-composite") + elseif("${comp}" STREQUAL "DAMAGE") + list(APPEND pkgConfigModules "xcb-damage") + elseif("${comp}" STREQUAL "DRI2") + list(APPEND pkgConfigModules "xcb-dri2") + elseif("${comp}" STREQUAL "EWMH") + list(APPEND pkgConfigModules "xcb-ewmh") + elseif("${comp}" STREQUAL "GLX") + list(APPEND pkgConfigModules "xcb-glx") + elseif("${comp}" STREQUAL "ICCCM") + list(APPEND pkgConfigModules "xcb-icccm") + elseif("${comp}" STREQUAL "IMAGE") + list(APPEND pkgConfigModules "xcb-image") + elseif("${comp}" STREQUAL "KEYSYMS") + list(APPEND pkgConfigModules "xcb-keysyms") + elseif("${comp}" STREQUAL "RANDR") + list(APPEND pkgConfigModules "xcb-randr") + elseif("${comp}" STREQUAL "RENDER") + list(APPEND pkgConfigModules "xcb-render") + elseif("${comp}" STREQUAL "RENDERUTIL") + list(APPEND pkgConfigModules "xcb-renderutil") + elseif("${comp}" STREQUAL "SHAPE") + list(APPEND pkgConfigModules "xcb-shape") + elseif("${comp}" STREQUAL "SHM") + list(APPEND pkgConfigModules "xcb-shm") + elseif("${comp}" STREQUAL "SYNC") + list(APPEND pkgConfigModules "xcb-sync") + elseif("${comp}" STREQUAL "UTIL") + list(APPEND pkgConfigModules "xcb-util") + elseif("${comp}" STREQUAL "XFIXES") + list(APPEND pkgConfigModules "xcb-xfixes") + elseif("${comp}" STREQUAL "XTEST") + list(APPEND pkgConfigModules "xcb-xtest") + elseif("${comp}" STREQUAL "XV") + list(APPEND pkgConfigModules "xcb-xv") + elseif("${comp}" STREQUAL "XINPUT") + list(APPEND pkgConfigModules "xcb-xinput") + elseif("${comp}" STREQUAL "XINERAMA") + list(APPEND pkgConfigModules "xcb-xinerama") endif() + endif() endforeach() - if(DEFINED unknownComponents) - set(msgType STATUS) - if(XCB_FIND_REQUIRED) - set(msgType FATAL_ERROR) - endif() - if(NOT XCB_FIND_QUIETLY) - message(${msgType} "XCB: requested unknown components ${unknownComponents}") - endif() - return() + set(msgType STATUS) + if(XCB_FIND_REQUIRED) + set(msgType FATAL_ERROR) + endif() + if(NOT XCB_FIND_QUIETLY) + message(${msgType} "XCB: requested unknown components ${unknownComponents}") + endif() + return() endif() macro(_XCB_HANDLE_COMPONENT _comp) - set(_header ) - set(_lib ) - if("${_comp}" STREQUAL "XCB") - set(_header "xcb/xcb.h") - set(_lib "xcb") - elseif("${_comp}" STREQUAL "COMPOSITE") - set(_header "xcb/composite.h") - set(_lib "xcb-composite") - elseif("${_comp}" STREQUAL "DAMAGE") - set(_header "xcb/damage.h") - set(_lib "xcb-damage") - elseif("${_comp}" STREQUAL "DRI2") - set(_header "xcb/dri2.h") - set(_lib "xcb-dri2") - elseif("${_comp}" STREQUAL "EWMH") - set(_header "xcb/xcb_ewmh.h") - set(_lib "xcb-ewmh") - elseif("${_comp}" STREQUAL "GLX") - set(_header "xcb/glx.h") - set(_lib "xcb-glx") - elseif("${_comp}" STREQUAL "ICCCM") - set(_header "xcb/xcb_icccm.h") - set(_lib "xcb-icccm") - elseif("${_comp}" STREQUAL "IMAGE") - set(_header "xcb/xcb_image.h") - set(_lib "xcb-image") - elseif("${_comp}" STREQUAL "KEYSYMS") - set(_header "xcb/xcb_keysyms.h") - set(_lib "xcb-keysyms") - elseif("${_comp}" STREQUAL "RANDR") - set(_header "xcb/randr.h") - set(_lib "xcb-randr") - elseif("${_comp}" STREQUAL "RENDER") - set(_header "xcb/render.h") - set(_lib "xcb-render") - elseif("${_comp}" STREQUAL "RENDERUTIL") - set(_header "xcb/xcb_renderutil.h") - set(_lib "xcb-render-util") - elseif("${_comp}" STREQUAL "SHAPE") - set(_header "xcb/shape.h") - set(_lib "xcb-shape") - elseif("${_comp}" STREQUAL "SHM") - set(_header "xcb/shm.h") - set(_lib "xcb-shm") - elseif("${_comp}" STREQUAL "SYNC") - set(_header "xcb/sync.h") - set(_lib "xcb-sync") - elseif("${_comp}" STREQUAL "UTIL") - set(_header "xcb/xcb_util.h") - set(_lib "xcb-util") - elseif("${_comp}" STREQUAL "XFIXES") - set(_header "xcb/xfixes.h") - set(_lib "xcb-xfixes") - elseif("${_comp}" STREQUAL "XTEST") - set(_header "xcb/xtest.h") - set(_lib "xcb-xtest") - elseif("${_comp}" STREQUAL "XV") - set(_header "xcb/xv.h") - set(_lib "xcb-xv") - elseif("${_comp}" STREQUAL "XINPUT") - set(_header "xcb/xinput.h") - set(_lib "xcb-xinput") - elseif("${_comp}" STREQUAL "XINERAMA") - set(_header "xcb/xinerama.h") - set(_lib "xcb-xinerama") - endif() + set(_header) + set(_lib) + if("${_comp}" STREQUAL "XCB") + set(_header "xcb/xcb.h") + set(_lib "xcb") + elseif("${_comp}" STREQUAL "COMPOSITE") + set(_header "xcb/composite.h") + set(_lib "xcb-composite") + elseif("${_comp}" STREQUAL "DAMAGE") + set(_header "xcb/damage.h") + set(_lib "xcb-damage") + elseif("${_comp}" STREQUAL "DRI2") + set(_header "xcb/dri2.h") + set(_lib "xcb-dri2") + elseif("${_comp}" STREQUAL "EWMH") + set(_header "xcb/xcb_ewmh.h") + set(_lib "xcb-ewmh") + elseif("${_comp}" STREQUAL "GLX") + set(_header "xcb/glx.h") + set(_lib "xcb-glx") + elseif("${_comp}" STREQUAL "ICCCM") + set(_header "xcb/xcb_icccm.h") + set(_lib "xcb-icccm") + elseif("${_comp}" STREQUAL "IMAGE") + set(_header "xcb/xcb_image.h") + set(_lib "xcb-image") + elseif("${_comp}" STREQUAL "KEYSYMS") + set(_header "xcb/xcb_keysyms.h") + set(_lib "xcb-keysyms") + elseif("${_comp}" STREQUAL "RANDR") + set(_header "xcb/randr.h") + set(_lib "xcb-randr") + elseif("${_comp}" STREQUAL "RENDER") + set(_header "xcb/render.h") + set(_lib "xcb-render") + elseif("${_comp}" STREQUAL "RENDERUTIL") + set(_header "xcb/xcb_renderutil.h") + set(_lib "xcb-render-util") + elseif("${_comp}" STREQUAL "SHAPE") + set(_header "xcb/shape.h") + set(_lib "xcb-shape") + elseif("${_comp}" STREQUAL "SHM") + set(_header "xcb/shm.h") + set(_lib "xcb-shm") + elseif("${_comp}" STREQUAL "SYNC") + set(_header "xcb/sync.h") + set(_lib "xcb-sync") + elseif("${_comp}" STREQUAL "UTIL") + set(_header "xcb/xcb_util.h") + set(_lib "xcb-util") + elseif("${_comp}" STREQUAL "XFIXES") + set(_header "xcb/xfixes.h") + set(_lib "xcb-xfixes") + elseif("${_comp}" STREQUAL "XTEST") + set(_header "xcb/xtest.h") + set(_lib "xcb-xtest") + elseif("${_comp}" STREQUAL "XV") + set(_header "xcb/xv.h") + set(_lib "xcb-xv") + elseif("${_comp}" STREQUAL "XINPUT") + set(_header "xcb/xinput.h") + set(_lib "xcb-xinput") + elseif("${_comp}" STREQUAL "XINERAMA") + set(_header "xcb/xinerama.h") + set(_lib "xcb-xinerama") + endif() - find_path(XCB_${_comp}_INCLUDE_DIR NAMES ${_header} HINTS ${PKG_XCB_INCLUDE_DIRS}) - find_library(XCB_${_comp}_LIBRARY NAMES ${_lib} HINTS ${PKG_XCB_LIBRARY_DIRS}) - mark_as_advanced(XCB_${_comp}_LIBRARY XCB_${_comp}_INCLUDE_DIR) + find_path( + XCB_${_comp}_INCLUDE_DIR + NAMES ${_header} + HINTS ${PKG_XCB_INCLUDE_DIRS}) + find_library( + XCB_${_comp}_LIBRARY + NAMES ${_lib} + HINTS ${PKG_XCB_LIBRARY_DIRS}) + mark_as_advanced(XCB_${_comp}_LIBRARY XCB_${_comp}_INCLUDE_DIR) - if(XCB_${_comp}_INCLUDE_DIR AND XCB_${_comp}_LIBRARY) - set(XCB_${_comp}_FOUND TRUE) - list(APPEND XCB_INCLUDE_DIRS ${XCB_${_comp}_INCLUDE_DIR}) - list(APPEND XCB_LIBRARIES ${XCB_${_comp}_LIBRARY}) - if (NOT XCB_FIND_QUIETLY) - message(STATUS "XCB[${_comp}]: Found component ${_comp}") - endif() + if(XCB_${_comp}_INCLUDE_DIR AND XCB_${_comp}_LIBRARY) + set(XCB_${_comp}_FOUND TRUE) + list(APPEND XCB_INCLUDE_DIRS ${XCB_${_comp}_INCLUDE_DIR}) + list(APPEND XCB_LIBRARIES ${XCB_${_comp}_LIBRARY}) + if(NOT XCB_FIND_QUIETLY) + message(STATUS "XCB[${_comp}]: Found component ${_comp}") endif() + endif() endmacro() -IF (NOT WIN32) - # Use pkg-config to get the directories and then use these values - # in the FIND_PATH() and FIND_LIBRARY() calls - find_package(PkgConfig) - pkg_check_modules(PKG_XCB QUIET ${pkgConfigModules}) +if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + # Use pkg-config to get the directories and then use these values in the + # FIND_PATH() and FIND_LIBRARY() calls + find_package(PkgConfig) + pkg_check_modules(PKG_XCB QUIET ${pkgConfigModules}) - set(XCB_DEFINITIONS ${PKG_XCB_CFLAGS}) + set(XCB_DEFINITIONS ${PKG_XCB_CFLAGS}) - foreach(comp ${comps}) - _xcb_handle_component(${comp}) - endforeach() + foreach(comp ${comps}) + _xcb_handle_component(${comp}) + endforeach() - if(XCB_INCLUDE_DIRS) - list(REMOVE_DUPLICATES XCB_INCLUDE_DIRS) + if(XCB_INCLUDE_DIRS) + list(REMOVE_DUPLICATES XCB_INCLUDE_DIRS) + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args( + XCB + REQUIRED_VARS XCB_LIBRARIES XCB_INCLUDE_DIRS + HANDLE_COMPONENTS) + + # compatibility for old variable naming + set(XCB_INCLUDE_DIR ${XCB_INCLUDE_DIRS}) +endif() + +if(XCB_FOUND AND NOT TARGET XCB::XCB) + foreach(component ${comps}) + if(NOT TARGET XCB::${component}) + string(TOUPPER ${component} component_u) + if(XCB_${component_u}_FOUND) + if(IS_ABSOLUTE "${XCB_${component_u}_LIBRARY}") + add_library(XCB::${component} UNKNOWN IMPORTED) + set_target_properties( + XCB::${component} PROPERTIES IMPORTED_LOCATION + "${XCB_${component_u}_LIBRARY}") + else() + add_library(XCB::${component} INTERFACE IMPORTED) + set_target_properties( + XCB::${component} PROPERTIES IMPORTED_LIBNAME + "${XCB_${component_u}_LIBRARY}") + endif() + + set_target_properties( + XCB::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES + "${XCB_${component_u}_INCLUDE_DIR}") + endif() endif() - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(XCB - REQUIRED_VARS XCB_LIBRARIES XCB_INCLUDE_DIRS - HANDLE_COMPONENTS) - - # compatibility for old variable naming - set(XCB_INCLUDE_DIR ${XCB_INCLUDE_DIRS}) -ENDIF (NOT WIN32) + endforeach() +endif() diff --git a/cmake/Modules/FindXkbcommon.cmake b/cmake/Modules/FindXkbcommon.cmake index dabb0c5e8..763d688c0 100644 --- a/cmake/Modules/FindXkbcommon.cmake +++ b/cmake/Modules/FindXkbcommon.cmake @@ -29,9 +29,20 @@ if(XKBCOMMON_FOUND) set(XKBCOMMON_LIBRARIES ${XKBCOMMON_LIB}) if(NOT TARGET Xkbcommon::Xkbcommon) - add_library(Xkbcommon::Xkbcommon INTERFACE IMPORTED) + if(IS_ABSOLUTE "${XKBCOMMON_LIBRARIES}") + add_library(Xkbcommon::Xkbcommon UNKNOWN IMPORTED) + set_target_properties( + Xkbcommon::Xkbcommon PROPERTIES IMPORTED_LOCATION + "${XKBCOMMON_LIBRARIES}") + else() + add_library(Xkbcommon::Xkbcommon INTERFACE IMPORTED) + set_target_properties( + Xkbcommon::Xkbcommon PROPERTIES IMPORTED_LIBNAME + "${XKBCOMMON_LIBRARIES}") + endif() + set_target_properties( Xkbcommon::Xkbcommon PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - "${XKBCOMMON_INCLUDE_DIRS}") + "${XKBCOMMON_INCLUDE_DIRS}") endif() endif() diff --git a/cmake/Modules/FindZLIB.cmake b/cmake/Modules/FindZLIB.cmake deleted file mode 100644 index ec58bae11..000000000 --- a/cmake/Modules/FindZLIB.cmake +++ /dev/null @@ -1,65 +0,0 @@ -# Once done these will be defined: -# -# ZLIB_FOUND -# ZLIB_INCLUDE_DIRS -# ZLIB_LIBRARIES -# - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_ZLIB QUIET zlib) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -find_path(ZLIB_INCLUDE_DIR - NAMES zlib.h - HINTS - ENV zlibPath${_lib_suffix} - ENV zlibPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${zlibPath${_lib_suffix}} - ${zlibPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_ZLIB_INCLUDE_DIRS} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - include) - -find_library(ZLIB_LIB - NAMES ${_ZLIB_LIBRARIES} z zlib zdll zlib1 zlibd zlibd1 libzlib libz - HINTS - ENV zlibPath${_lib_suffix} - ENV zlibPath - ENV DepsPath${_lib_suffix} - ENV DepsPath - ${zlibPath${_lib_suffix}} - ${zlibPath} - ${DepsPath${_lib_suffix}} - ${DepsPath} - ${_ZLIB_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(ZLIB DEFAULT_MSG ZLIB_LIB ZLIB_INCLUDE_DIR) -mark_as_advanced(ZLIB_INCLUDE_DIR ZLIB_LIB) - -if(ZLIB_FOUND) - set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR}) - set(ZLIB_LIBRARIES ${ZLIB_LIB}) -endif() diff --git a/cmake/Modules/IDLFileHelper.cmake b/cmake/Modules/IDLFileHelper.cmake index 059a08c97..1c38cb63f 100644 --- a/cmake/Modules/IDLFileHelper.cmake +++ b/cmake/Modules/IDLFileHelper.cmake @@ -1,81 +1,78 @@ macro(add_idl_files_base generated_files with_tlb) - foreach(filename ${ARGN}) - get_filename_component(file_we ${filename} NAME_WE) - get_filename_component(file_path ${filename} PATH) + foreach(filename ${ARGN}) + get_filename_component(file_we ${filename} NAME_WE) + get_filename_component(file_path ${filename} PATH) - set(file_c ${file_we}_i.c) - set(file_h ${file_we}.h) - set(bin_file_h ${CMAKE_CURRENT_BINARY_DIR}/${file_h}) - set(bin_file_c ${CMAKE_CURRENT_BINARY_DIR}/${file_c}) + set(file_c ${file_we}_i.c) + set(file_h ${file_we}.h) + set(bin_file_h ${CMAKE_CURRENT_BINARY_DIR}/${file_h}) + set(bin_file_c ${CMAKE_CURRENT_BINARY_DIR}/${file_c}) - if(MSVC) - if(${with_tlb}) - set(file_tlb ${file_we}.tlb) - set(bin_file_tlb ${CMAKE_CURRENT_BINARY_DIR}/${file_tlb}) - set(tlb_opt "") - else() - set(tlb_opt "/notlb") - endif() + if(MSVC) + if(${with_tlb}) + set(file_tlb ${file_we}.tlb) + set(bin_file_tlb ${CMAKE_CURRENT_BINARY_DIR}/${file_tlb}) + set(tlb_opt "") + else() + set(tlb_opt "/notlb") + endif() - add_custom_command( - OUTPUT ${bin_file_h} ${bin_file_c} - DEPENDS ${filename} - COMMAND midl /h ${file_h} /iid ${file_c} ${tlb_opt} ${CMAKE_CURRENT_SOURCE_DIR}/${filename} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - else() - execute_process(COMMAND echo - COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E - - ERROR_VARIABLE cpp_inc_output - OUTPUT_QUIET - ERROR_STRIP_TRAILING_WHITESPACE) + add_custom_command( + OUTPUT ${bin_file_h} ${bin_file_c} + DEPENDS ${filename} + COMMAND + midl /h ${file_h} /iid ${file_c} ${tlb_opt} + $,/win64,/win32> + ${CMAKE_CURRENT_SOURCE_DIR}/${filename} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + else() + execute_process( + COMMAND echo + COMMAND ${CMAKE_C_COMPILER} -v -x c++ -E - + ERROR_VARIABLE cpp_inc_output + OUTPUT_QUIET ERROR_STRIP_TRAILING_WHITESPACE) - string(REPLACE ";" " " include_dirs ${cpp_inc_output}) - string(REPLACE "\n" ";" include_dirs ${cpp_inc_output}) + string(REPLACE ";" " " include_dirs ${cpp_inc_output}) + string(REPLACE "\n" ";" include_dirs ${cpp_inc_output}) - set(include_params) - foreach(include_dir ${include_dirs}) - string(SUBSTRING ${include_dir} 0 1 first_char) - if(${first_char} STREQUAL " ") - string(LENGTH "${include_dir}" include_dir_len) - math(EXPR include_dir_len "${include_dir_len} - 1") - string(SUBSTRING ${include_dir} 1 ${include_dir_len} include_dir) - set(include_params "-I\"${include_dir}\" ${include_params}") - endif() - endforeach() + set(include_params) + foreach(include_dir ${include_dirs}) + string(SUBSTRING ${include_dir} 0 1 first_char) + if(${first_char} STREQUAL " ") + string(LENGTH "${include_dir}" include_dir_len) + math(EXPR include_dir_len "${include_dir_len} - 1") + string(SUBSTRING ${include_dir} 1 ${include_dir_len} include_dir) + set(include_params "-I\"${include_dir}\" ${include_params}") + endif() + endforeach() - if(WIN32) - separate_arguments(include_params WINDOWS_COMMAND ${include_params}) - endif() + if(WIN32) + separate_arguments(include_params WINDOWS_COMMAND ${include_params}) + endif() - add_custom_command( - OUTPUT ${file_h} - DEPENDS ${filename} - COMMAND ${CMAKE_WIDL} ${include_params} -h -o ${file_h} ${CMAKE_CURRENT_SOURCE_DIR}/${filename} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + add_custom_command( + OUTPUT ${file_h} + DEPENDS ${filename} + COMMAND ${CMAKE_WIDL} ${include_params} -h -o ${file_h} + ${CMAKE_CURRENT_SOURCE_DIR}/${filename} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - file(WRITE ${bin_file_c} "#include \n#include <${file_h}>\n") - endif() + file(WRITE ${bin_file_c} "#include \n#include <${file_h}>\n") + endif() - set_source_files_properties( - ${bin_file_h} - ${bin_file_c} - PROPERTIES - GENERATED TRUE) + set_source_files_properties(${bin_file_h} ${bin_file_c} PROPERTIES GENERATED + TRUE) - set(${generated_files} ${${generated_file}} - ${bin_file_h} - ${bin_file_c}) + set(${generated_files} ${${generated_file}} ${bin_file_h} ${bin_file_c}) - set_source_files_properties(${filename} - PROPERTIES - HEADER_FILE_ONLY TRUE) - endforeach(filename ${ARGN}) + set_source_files_properties(${filename} PROPERTIES HEADER_FILE_ONLY TRUE) + endforeach(filename ${ARGN}) endmacro(add_idl_files_base) macro(add_idl_files generated_files) - add_idl_files_base(${generated_files} FALSE ${ARGN}) + add_idl_files_base(${generated_files} FALSE ${ARGN}) endmacro(add_idl_files) macro(add_idl_files_with_tlb generated_files) - add_idl_files_base(${generated_files} TRUE ${ARGN}) + add_idl_files_base(${generated_files} TRUE ${ARGN}) endmacro(add_idl_files_with_tlb) diff --git a/cmake/Modules/ObsCpack.cmake b/cmake/Modules/ObsCpack.cmake deleted file mode 100644 index c2f00806a..000000000 --- a/cmake/Modules/ObsCpack.cmake +++ /dev/null @@ -1,94 +0,0 @@ - -if(APPLE AND NOT CPACK_GENERATOR) - set(CPACK_GENERATOR "Bundle") -elseif(WIN32 AND NOT CPACK_GENERATOR) - set(CPACK_GENERATOR "WIX" "ZIP") -endif() - -set(CPACK_PACKAGE_NAME "OBS") -set(CPACK_PACKAGE_VENDOR "obsproject.com") -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "OBS - Live video and audio streaming and recording software") -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/UI/data/license/gplv2.txt") - -set(CPACK_PACKAGE_VERSION_MAJOR "0") -set(CPACK_PACKAGE_VERSION_MINOR "0") -set(CPACK_PACKAGE_VERSION_PATCH "1") -set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") - -if(NOT DEFINED OBS_VERSION_OVERRIDE) - if(EXISTS "${CMAKE_SOURCE_DIR}/.git") - execute_process(COMMAND git describe --always --tags --dirty=-modified - OUTPUT_VARIABLE OBS_VERSION - WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" - OUTPUT_STRIP_TRAILING_WHITESPACE) - else() - set(OBS_VERSION "${CPACK_PACKAGE_VERSION}") - endif() -else() - set(OBS_VERSION "${OBS_VERSION_OVERRIDE}") -endif() - -if("${OBS_VERSION}" STREQUAL "") - message(FATAL_ERROR "Failed to configure OBS_VERSION. Either set OBS_VERSION_OVERRIDE or ensure `git describe` succeeds.") -endif() -MESSAGE(STATUS "OBS_VERSION: ${OBS_VERSION}") - -if(INSTALLER_RUN) - set(CPACK_PACKAGE_EXECUTABLES - "obs32" "OBS Studio (32bit)" - "obs64" "OBS Studio (64bit)") - set(CPACK_CREATE_DESKTOP_LINKS - "obs32" - "obs64") -else() - if(WIN32) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") - else() - set(_output_suffix "32") - endif() - else() - set(_output_suffix "") - endif() - - set(CPACK_PACKAGE_EXECUTABLES "obs${_output_suffix}" "OBS Studio") - set(CPACK_CREATE_DESKTOP_LINKS "obs${_output_suffix}") -endif() - -set(CPACK_BUNDLE_NAME "OBS") -set(CPACK_BUNDLE_PLIST "${CMAKE_SOURCE_DIR}/cmake/osxbundle/Info.plist") -set(CPACK_BUNDLE_ICON "${CMAKE_SOURCE_DIR}/cmake/osxbundle/obs.icns") -set(CPACK_BUNDLE_STARTUP_COMMAND "${CMAKE_SOURCE_DIR}/cmake/osxbundle/obslaunch.sh") - -set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/cmake/Modules/WIX.template.in") - -if(INSTALLER_RUN) - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "OBSStudio") - set(CPACK_WIX_UPGRADE_GUID "1f59ff79-2a3c-43c1-b2b2-033a5e6342eb") - set(CPACK_WIX_PRODUCT_GUID "0c7bec2a-4f07-41b2-9dff-d64b09c9c384") - set(CPACK_PACKAGE_FILE_NAME "obs-studio-${OBS_VERSION}") -elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - if(WIN32) - set(CPACK_PACKAGE_NAME "OBS Studio (64bit)") - endif() - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "OBSStudio64") - set(CPACK_WIX_UPGRADE_GUID "44c72510-2e8e-489c-8bc0-2011a9631b0b") - set(CPACK_WIX_PRODUCT_GUID "ca5bf4fe-7b38-4003-9455-de249d03caac") - set(CPACK_PACKAGE_FILE_NAME "obs-studio-x64-${OBS_VERSION}") -else() - if(WIN32) - set(CPACK_PACKAGE_NAME "OBS Studio (32bit)") - endif() - set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "OBSStudio32") - set(CPACK_WIX_UPGRADE_GUID "a26acea4-6190-4470-9fb9-f6d32f3ba030") - set(CPACK_WIX_PRODUCT_GUID "8e24982d-b0ab-4f66-9c90-f726f3b64682") - set(CPACK_PACKAGE_FILE_NAME "obs-studio-x86-${OBS_VERSION}") -endif() - -set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}") - -if(UNIX_STRUCTURE) - set(CPACK_SET_DESTDIR TRUE) -endif() - -include(CPack) diff --git a/cmake/Modules/ObsDefaults_Linux.cmake b/cmake/Modules/ObsDefaults_Linux.cmake new file mode 100644 index 000000000..a00c56944 --- /dev/null +++ b/cmake/Modules/ObsDefaults_Linux.cmake @@ -0,0 +1,180 @@ +# Enable modern cmake policies +if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) +endif() + +if(POLICY CMP0072) + cmake_policy(SET CMP0072 NEW) +endif() + +if(POLICY CMP0095) + cmake_policy(SET CMP0095 NEW) +endif() + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND LINUX_PORTABLE) + set(CMAKE_INSTALL_PREFIX + "${CMAKE_BINARY_DIR}/install" + CACHE STRING "Directory to install OBS after building" FORCE) +endif() + +macro(setup_obs_project) + #[[ + POSIX directory setup (portable) + CMAKE_BINARY_DIR + └ rundir + └ CONFIG + └ bin + └ ARCH + └ data + └ libobs + └ obs-plugins + └ PLUGIN + └ obs-scripting + └ ARCH + └ obs-studio + └ obs-plugins + └ ARCH + + POSIX directory setup (non-portable) + /usr/local/ + └ bin + └ include + └ obs + └ libs + └ cmake + └ obs-plugins + └ obs-scripting + └ share + └ obs + └ libobs + └ obs-plugins + └ obs-studio + ]] + + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_ARCH_SUFFIX 64) + else() + set(_ARCH_SUFFIX 32) + endif() + + if(NOT OBS_MULTIARCH_SUFFIX AND DEFINED ENV{OBS_MULTIARCH_SUFFIX}) + set(OBS_MULTIARCH_SUFFIX "$ENV{OBS_MULTIARCH_SUFFIX}") + endif() + + set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") + + if(NOT LINUX_PORTABLE) + set(OBS_EXECUTABLE_DESTINATION "${CMAKE_INSTALL_BINDIR}") + set(OBS_INCLUDE_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/obs") + set(OBS_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}") + set(OBS_PLUGIN_DESTINATION "${OBS_LIBRARY_DESTINATION}/obs-plugins") + set(OBS_SCRIPT_PLUGIN_DESTINATION + "${OBS_LIBRARY_DESTINATION}/obs-scripting") + set(OBS_DATA_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/obs") + set(OBS_CMAKE_DESTINATION "${OBS_LIBRARY_DESTINATION}/cmake") + + set(OBS_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/") + set(OBS_DATA_PATH "${OBS_DATA_DESTINATION}") + + set(OBS_SCRIPT_PLUGIN_PATH + "${CMAKE_INSTALL_PREFIX}/${OBS_SCRIPT_PLUGIN_DESTINATION}") + set(CMAKE_INSTALL_RPATH + "${CMAKE_INSTALL_PREFIX}/${OBS_LIBRARY_DESTINATION}") + else() + set(OBS_EXECUTABLE_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_INCLUDE_DESTINATION "include") + set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit") + set(OBS_SCRIPT_PLUGIN_DESTINATION "data/obs-scripting/${_ARCH_SUFFIX}bit") + set(OBS_DATA_DESTINATION "data") + set(OBS_CMAKE_DESTINATION "cmake") + + set(OBS_INSTALL_PREFIX "") + set(OBS_DATA_PATH "../../${OBS_DATA_DESTINATION}") + + set(OBS_SCRIPT_PLUGIN_PATH "../../${OBS_SCRIPT_PLUGIN_DESTINATION}") + set(CMAKE_INSTALL_RPATH + "$ORIGIN/" "${CMAKE_INSTALL_PREFIX}/${OBS_LIBRARY_DESTINATION}") + endif() + + if(BUILD_FOR_PPA) + set_option(ENABLE_LIBFDK ON) + set_option(ENABLE_JACK ON) + set_option(ENABLE_RTMPS ON) + endif() + + if(BUILD_FOR_DISTRIBUTION OR DEFINED ENV{CI}) + set_option(ENABLE_RTMPS ON) + endif() + + set(CPACK_PACKAGE_NAME "obs-studio") + set(CPACK_PACKAGE_VENDOR "${OBS_WEBSITE}") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${OBS_COMPANY_NAME}") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${OBS_COMMENTS}") + set(CPACK_RESOURCE_FILE_LICENSE + "${CMAKE_SOURCE_DIR}/UI/data/license/gplv2.txt") + set(CPACK_PACKAGE_VERSION "${OBS_VERSION_CANONICAL}-${OBS_BUILD_NUMBER}") + set(CPACK_STRIP_FILES "bin/obs" "bin/obs-ffmpeg-mux") + set(CPACK_SOURCE_STRIP_FILES "") + set(CPACK_PACKAGE_EXECUTABLES "obs") + + if(OS_LINUX AND NOT LINUX_PORTABLE) + set(CPACK_GENERATOR "DEB") + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + set(CPACK_SET_DESTDIR ON) + elseif(OS_FREEBSD) + option(ENABLE_CPACK_GENERATOR + "Enable FreeBSD CPack generator (experimental)" OFF) + + if(ENABLE_CPACK_GENERATOR) + set(CPACK_GENERATOR "FreeBSD") + endif() + + set(CPACK_FREEBSD_PACKAGE_DEPS + "audio/fdk-aac" + "audio/jack" + "audio/pulseaudio" + "audio/sndio" + "audio/speexdsp" + "devel/cmake" + "devel/dbus" + "devel/jansson" + "devel/libsysinfo" + "devel/libudev-devd" + "devel/ninja" + "devel/pkgconf" + "devel/qt5-buildtools" + "devel/qt5-core" + "devel/qt5-qmake" + "devel/swig" + "ftp/curl" + "graphics/mesa-libs" + "graphics/qt5-imageformats" + "graphics/qt5-svg" + "lang/lua52" + "lang/luajit" + "lang/python37" + "multimedia/ffmpeg" + "multimedia/libv4l" + "multimedia/libx264" + "multimedia/v4l_compat" + "multimedia/vlc" + "print/freetype2" + "security/mbedtls" + "textproc/qt5-xml" + "x11/xorgproto" + "x11/libICE" + "x11/libSM" + "x11/libX11" + "x11/libxcb" + "x11/libXcomposite" + "x11/libXext" + "x11/libXfixes" + "x11/libXinerama" + "x11/libXrandr" + "x11-fonts/fontconfig" + "x11-toolkits/qt5-gui" + "x11-toolkits/qt5-widgets") + endif() + include(CPack) +endmacro() diff --git a/cmake/Modules/ObsDefaults_Windows.cmake b/cmake/Modules/ObsDefaults_Windows.cmake new file mode 100644 index 000000000..193a36852 --- /dev/null +++ b/cmake/Modules/ObsDefaults_Windows.cmake @@ -0,0 +1,166 @@ +cmake_minimum_required(VERSION 3.20) + +# Enable modern cmake policies +if(POLICY CMP0009) + cmake_policy(SET CMP0009 NEW) +endif() + +if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) +endif() + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX + "${CMAKE_BINARY_DIR}/rundir" + CACHE STRING "Directory to install OBS after building" FORCE) +endif() + +# Enable building Windows modules with file descriptors +# https://github.com/obsproject/obs-studio/commit/51be039cf82fc347587d16b48f74e65e86bee301 +set(MODULE_DESCRIPTION "OBS Studio") + +macro(setup_obs_project) + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_ARCH_SUFFIX 64) + else() + set(_ARCH_SUFFIX 32) + endif() + + set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") + + set(OBS_EXECUTABLE_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_EXECUTABLE32_DESTINATION "bin/32bit") + set(OBS_EXECUTABLE64_DESTINATION "bin/64bit") + set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_LIBRARY32_DESTINATION "bin/32bit") + set(OBS_LIBRARY64_DESTINATION "bin/64bit") + + set(OBS_EXECUTABLE_EXPORT_DESTINATION "bin") + set(OBS_LIBRARY_EXPORT_DESTINATION "bin") + + set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit") + set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit") + set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit") + + set(OBS_INCLUDE_DESTINATION "include") + set(OBS_CMAKE_DESTINATION "cmake") + set(OBS_DATA_DESTINATION "data") + set(OBS_DATA_PATH "../../${OBS_DATA_DESTINATION}") + set(OBS_INSTALL_PREFIX "") + + set(OBS_SCRIPT_PLUGIN_DESTINATION + "${OBS_DATA_DESTINATION}/obs-scripting/${_ARCH_SUFFIX}bit") + set(OBS_SCRIPT_PLUGIN_PATH "../../${OBS_SCRIPT_PLUGIN_DESTINATION}") + + string(REPLACE "-" ";" UI_VERSION_SPLIT ${OBS_VERSION}) + list(GET UI_VERSION_SPLIT 0 UI_VERSION) + string(REPLACE "." ";" UI_VERSION_SEMANTIC ${UI_VERSION}) + list(GET UI_VERSION_SEMANTIC 0 UI_VERSION_MAJOR) + list(GET UI_VERSION_SEMANTIC 1 UI_VERSION_MINOR) + list(GET UI_VERSION_SEMANTIC 2 UI_VERSION_PATCH) + + if(INSTALLER_RUN + AND NOT DEFINED ENV{OBS_InstallerTempDir} + AND NOT DEFINED ENV{obsInstallerTempDir}) + message( + FATAL_ERROR + "Environment variable obsInstallerTempDir is needed for multiarch installer generation" + ) + endif() + + if(DEFINED ENV{OBS_DepsPath${_ARCH_SUFFIX}}) + set(DepsPath${_ARCH_SUFFIX} "$ENV{OBS_DepsPath${_ARCH_SUFFIX}}") + elseif(DEFINED ENV{OBS_DepsPath}) + set(DepsPath "$ENV{DepsPath}") + elseif(DEFINED ENV{DepsPath${_ARCH_SUFFIX}}) + set(DepsPath${_ARCH_SUFFIX} "$ENV{DepsPath${_ARCH_SUFFIX}}") + elseif(DEFINED ENV{DepsPath}) + set(DepsPath "$ENV{DepsPath}") + endif() + + if(DEFINED ENV{OBS_QTDIR${_ARCH_SUFFIX}}) + set(QTDIR${_ARCH_SUFFIX} "$ENV{OBS_QTDIR${_ARCH_SUFFIX}}") + elseif(DEFINED ENV{OBS_QTDIR}) + set(QTDIR "$ENV{OBS_QTDIR}") + elseif(DEFINED ENV{QTDIR${_ARCH_SUFFIX}}) + set(QTDIR${_ARCH_SUFFIX} "$ENV{QTDIR${_ARCH_SUFFIX}}") + elseif(DEFINED ENV{QTDIR}) + set(QTDIR "$ENV{QTDIR}") + endif() + + if(DEFINED DepsPath${_ARCH_SUFFIX}) + list(APPEND CMAKE_PREFIX_PATH "${DepsPath${_ARCH_SUFFIX}}" + "${DepsPath${_ARCH_SUFFIX}}/bin") + elseif(DEFINED DepsPath) + list(APPEND CMAKE_PREFIX_PATH "${DepsPath}" "${DepsPath}/bin") + elseif(NOT DEFINED CMAKE_PREFIX_PATH) + message( + WARNING + "No CMAKE_PREFIX_PATH set: OBS requires pre-built dependencies for building on Windows." + "Please download the appropriate obs-deps package for your architecture and set CMAKE_PREFIX_PATH " + "to the base directory and 'bin' directory inside it:\n" + "CMAKE_PREFIX_PATH=\"\"\n" + "Download pre-built OBS dependencies at https://github.com/obsproject/obs-deps/releases\n" + ) + endif() + + if(DEFINED QTDIR${_ARCH_SUFFIX}) + list(APPEND CMAKE_PREFIX_PATH "${QTDIR${_ARCH_SUFFIX}}") + elseif(DEFINED QTDIR) + list(APPEND CMAKE_PREFIX_PATH "${QTDIR}") + endif() + + if(DEFINED ENV{VLCPath}) + set(VLCPath "$ENV{VLCPath}") + elseif(DEFINED ENV{OBS_VLCPath}) + set(VLCPath "$ENV{OBS_VLCPath}") + endif() + + if(DEFINED VLCPath) + set(VLC_PATH "${VLCPath}") + endif() + + if(DEFINED ENV{CEF_ROOT_DIR}) + set(CEF_ROOT_DIR "$ENV{CEF_ROOT_DIR}") + elseif(DEFINED ENV{OBS_CEF_ROOT_DIR}) + set(CEF_ROOT_DIR "$ENV{OBS_CEF_ROOT_DIR}") + endif() + + if(DEFINED ENV{OBS_InstallerTempDir}) + file(TO_CMAKE_PATH "$ENV{OBS_InstallerTempDir}" _INSTALLER_TEMP_DIR) + elseif(DEFINED ENV{obsInstallerTempDir}) + file(TO_CMAKE_PATH "$ENV{obsInstallerTempDir}" _INSTALLER_TEMP_DIR) + endif() + + set(ENV{OBS_InstallerTempDir} "${_INSTALLER_TEMP_DIR}") + unset(_INSTALLER_TEMP_DIR) + + if(DEFINED ENV{OBS_AdditionalInstallFiles}) + file(TO_CMAKE_PATH "$ENV{OBS_AdditionalInstallFiles}" _ADDITIONAL_FILES) + elseif(DEFINED ENV{obsAdditionalInstallFiles}) + file(TO_CMAKE_PATH "$ENV{obsAdditionalInstallFiles}" _ADDITIONAL_FILES) + else() + set(_ADDITIONAL_FILES "${CMAKE_SOURCE_DIR}/additional_install_files") + endif() + + set(ENV{OBS_AdditionalInstallFiles} "${_ADDITIONAL_FILES}") + unset(_ADDITIONAL_FILES) + + list(APPEND CMAKE_INCLUDE_PATH + "$ENV{OBS_AdditionalInstallFiles}/include${_ARCH_SUFFIX}" + "$ENV{OBS_AdditionalInstallFiles}/include") + + list( + APPEND + CMAKE_LIBRARY_PATH + "$ENV{OBS_AdditionalInstallFiles}/lib${_ARCH_SUFFIX}" + "$ENV{OBS_AdditionalInstallFiles}/lib" + "$ENV{OBS_AdditionalInstallFiles}/libs${_ARCH_SUFFIX}" + "$ENV{OBS_AdditionalInstallFiles}/libs" + "$ENV{OBS_AdditionalInstallFiles}/bin${_ARCH_SUFFIX}" + "$ENV{OBS_AdditionalInstallFiles}/bin") + + if(BUILD_FOR_DISTRIBUTION OR DEFINED ENV{CI}) + set_option(ENABLE_RTMPS ON) + endif() +endmacro() diff --git a/cmake/Modules/ObsDefaults_macOS.cmake b/cmake/Modules/ObsDefaults_macOS.cmake new file mode 100644 index 000000000..7eb397afe --- /dev/null +++ b/cmake/Modules/ObsDefaults_macOS.cmake @@ -0,0 +1,168 @@ +cmake_minimum_required(VERSION 3.20) + +# Enable modern cmake policies +if(POLICY CMP0009) + cmake_policy(SET CMP0009 NEW) +endif() + +if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) +endif() + +if(POLICY CMP0025) + cmake_policy(SET CMP0025 NEW) +endif() + +# Build options +set(CMAKE_OSX_ARCHITECTURES + "x86_64" + CACHE STRING "OBS build architecture for macOS - x86_64 required at least") +set_property(CACHE CMAKE_OSX_ARCHITECTURES PROPERTY STRINGS x86_64 arm64 + "x86_64;arm64") + +set(CMAKE_OSX_DEPLOYMENT_TARGET + "10.13" + CACHE STRING "OBS deployment target for macOS - 10.13+ required") +set_property(CACHE CMAKE_OSX_DEPLOYMENT_TARGET PROPERTY STRINGS 10.13 10.14 + 10.15 11 12) + +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX + "${CMAKE_BINARY_DIR}/rundir" + CACHE STRING "Directory to install OBS after building" FORCE) +endif() + +if(NOT DEFINED CMAKE_PREFIX_PATH) + message( + WARNING + "No CMAKE_PREFIX_PATH set: OBS supplies pre-built dependencies for building on macOS.\n" + "While OBS can be built using packages installed via Homebrew, pre-built dependencies " + "contain beneficial patches and fixes for use within OBS and is the suggested source " + "of these dependencies.\n" + "You can download the appropriate obs-deps package for your " + "architecture and set CMAKE_PREFIX_PATH to this directory:\n" + "CMAKE_PREFIX_PATH=\"\"\n" + "Download pre-built OBS dependencies at https://github.com/obsproject/obs-deps/releases\n" + ) +endif() + +macro(setup_obs_project) + # Set code signing options + set(OBS_BUNDLE_CODESIGN_IDENTITY + "-" + CACHE STRING "OBS code signing identity for macOS") + set(OBS_CODESIGN_ENTITLEMENTS + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/entitlements.plist" + CACHE INTERNAL "Path to codesign entitlements plist") + set(OBS_CODESIGN_LINKER + ON + CACHE BOOL "Enable linker code-signing on macOS (macOS 11+ required)") + + # Xcode configuration + if(XCODE) + # Tell Xcode to pretend the linker signed binaries so that editing with + # install_name_tool preserves ad-hoc signatures. This option is supported by + # codesign on macOS 11 or higher. See CMake Issue 21854: + # https://gitlab.kitware.com/cmake/cmake/-/issues/21854 + + set(CMAKE_XCODE_GENERATE_SCHEME ON) + if(OBS_CODESIGN_LINKER) + set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed") + endif() + endif() + + # Set default options for bundling on macOS + set(CMAKE_MACOSX_RPATH ON) + set(CMAKE_SKIP_BUILD_RPATH OFF) + set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF) + set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks/") + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) + + # Set bundle parameters for cmake's automatic plist generation + set(MACOSX_BUNDLE_EXECUTABLE_NAME "OBS") + set(MACOSX_BUNDLE_BUNDLE_NAME "${OBS_PRODUCT_NAME}") + set(MACOSX_BUNDLE_BUNDLE_VERSION "${OBS_BUILD_NUMBER}") + set(MACOSX_BUNDLE_COPYRIGHT "${OBS_LEGAL_COPYRIGHT}") + set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.obsproject.obs-studio") + set(MACOSX_BUNDLE_ICON_FILE "AppIcon") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${OBS_VERSION_CANONICAL}") + string(TIMESTAMP CURRENT_YEAR "%Y") + + # Set paths for distribution bundling + set(OBS_BUNDLE_NAME "OBS") + set(OBS_EXECUTABLE_DESTINATION "${CMAKE_INSTALL_BINDIR}") + set(OBS_INCLUDE_DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/obs") + set(OBS_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}") + set(OBS_CMAKE_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake") + + if(BUILD_FOR_DISTRIBUTION) + set_option(CMAKE_BUILD_TYPE "Release") + set(CPACK_PACKAGE_VERSION "${OBS_VERSION_CANONICAL}") + else() + set(CPACK_PACKAGE_VERSION "${OBS_VERSION_CANONICAL}-${OBS_BUILD_NUMBER}") + endif() + + if(BUILD_FOR_DISTRIBUTION OR DEFINED ENV{CI}) + set_option(ENABLE_SPARKLE_UPDATER ON) + set_option(ENABLE_RTMPS ON) + endif() + + set(CPACK_PACKAGE_NAME "OBS") + set(CPACK_PACKAGE_VENDOR "${OBS_WEBSITE}") + set(CPACK_GENERATOR "DragNDrop") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${OBS_COMMENTS}") + + if(CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64") + set(CPACK_ARCH_SUFFIX "Intel") + elseif(CMAKE_OSX_ARCHITECTURES STREQUAL "arm64") + set(CPACK_ARCH_SUFFIX "Apple") + else() + set(CPACK_ARCH_SUFFIX "Universal") + endif() + + set(CPACK_PACKAGE_FILE_NAME + "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-macOS-${CPACK_ARCH_SUFFIX}" + ) + + set(CPACK_COMPONENTS_ALL obs_app obs_frameworks obs_plugins + obs_scripting_plugins obs_resources) + set(CPACK_COMPONENT_OBS_APP_DISPLAY_NAME "OBS Studio") + set(CPACK_COMPONENT_OBS_FRAMEWORKS_DISPLAY_NAME "OBS Frameworks") + set(CPACK_COMPONENT_OBS_PLUGINS_DISPLAY_NAME "OBS Plugins") + set(CPACK_COMPONENT_OBS_SCRIPTING_PLUGINS_DISPLAY_NAME + "OBS Scripting Plugins") + set(CPACK_COMPONENT_OBS_RESOURCES_DISPLAY_NAME "OBS Resources") + + set(CPACK_DMG_BACKGROUND_IMAGE + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/background.tiff") + set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/AppIcon.icns") + get_filename_component(CPACK_DMG_BACKGROUND_FILENAME + ${CPACK_DMG_BACKGROUND_IMAGE} NAME) + set(CPACK_DMG_FORMAT "UDZO") + set(CPACK_DMG_DS_STORE_SETUP_SCRIPT "${CMAKE_BINARY_DIR}/package.applescript") + + set(_DMG_WINDOW_X "100") + set(_DMG_WINDOW_Y "100") + set(_DMG_WINDOW_WIDTH "540") + set(_DMG_WINDOW_HEIGHT "380") + set(_DMG_ICON_SIZE "96") + set(_DMG_TEXT_SIZE "16") + set(_DMG_OBS_X "124") + set(_DMG_OBS_Y "180") + set(_DMG_APP_LINK_X "416") + set(_DMG_APP_LINK_Y "180") + + configure_file("${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/package.applescript.in" + "${CMAKE_BINARY_DIR}/package.applescript" @ONLY) + + include(CPack) + + if(ENABLE_UI) + install( + CODE " + set(_BUNDLENAME \"$.app\") + if(EXISTS \"\${CMAKE_INSTALL_PREFIX}/\${_BUNDLENAME}\") + file(REMOVE_RECURSE \"\${CMAKE_INSTALL_PREFIX}/\${_BUNDLENAME}\") + endif()") + endif() +endmacro() diff --git a/cmake/Modules/ObsHelpers.cmake b/cmake/Modules/ObsHelpers.cmake index a40a6356e..e0483840b 100644 --- a/cmake/Modules/ObsHelpers.cmake +++ b/cmake/Modules/ObsHelpers.cmake @@ -1,587 +1,445 @@ -set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) +# Set OS-specific constants in non-deprecated way +include(GNUInstallDirs) +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + include(ObsDefaults_macOS) + set(OS_MACOS ON) + set(OS_POSIX ON) +elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|FreeBSD|OpenBSD") + include(ObsDefaults_Linux) + set(OS_POSIX ON) + string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U) + set(OS_${_SYSTEM_NAME_U} ON) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows") + include(ObsDefaults_Windows) + set(OS_WINDOWS ON) + set(OS_POSIX OFF) endif() -if(WIN32 OR APPLE) - set(_struct_def FALSE) -else() - set(_struct_def TRUE) -endif() +# Create global property to hold list of activated modules +set_property(GLOBAL PROPERTY OBS_MODULE_LIST "") -option(INSTALLER_RUN "Build a multiarch installer, needs to run indenepdently after both archs have compiled" FALSE) -option(UNIX_STRUCTURE "Build with standard unix filesystem structure" ${_struct_def}) -if(APPLE) - option(BUILD_REDISTRIBUTABLE "Fix rpath of external libraries" FALSE) -endif() +# ############################################################################## +# GLOBAL HELPER FUNCTIONS # +# ############################################################################## -if(INSTALLER_RUN AND NOT DEFINED ENV{obsInstallerTempDir}) - message(FATAL_ERROR "Environment variable obsInstallerTempDir is needed for multiarch installer generation") -endif() +# Helper function to set up runtime or library targets +function(setup_binary_target target) + # Set up installation paths for program install + install( + TARGETS ${target} + RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION} + COMPONENT ${target}_Runtime + LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION} + COMPONENT ${target}_Runtime + NAMELINK_COMPONENT ${target}_Development + ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION} + COMPONENT ${target}_Development + PUBLIC_HEADER DESTINATION ${OBS_INCLUDE_DESTINATION}) -if(DEFINED ENV{obsInstallerTempDir}) - file(TO_CMAKE_PATH "$ENV{obsInstallerTempDir}" ENV{obsInstallerTempDir}) -endif() + # Set up installation paths for development rundir + install( + TARGETS ${target} + RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION} COMPONENT obs_rundir + LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_rundir + PUBLIC_HEADER DESTINATION ${OBS_INCLUDE_DESTINATION} EXCLUDE_FROM_ALL) -if(DEFINED ENV{obsAdditionalInstallFiles}) - file(TO_CMAKE_PATH "$ENV{obsAdditionalInstallFiles}" ENV{obsAdditionalInstallFiles}) -else() - set(ENV{obsAdditionalInstallFiles} "${CMAKE_SOURCE_DIR}/additional_install_files") -endif() - -list(APPEND CMAKE_INCLUDE_PATH - "$ENV{obsAdditionalInstallFiles}/include${_lib_suffix}" - "$ENV{obsAdditionalInstallFiles}/include") - -list(APPEND CMAKE_LIBRARY_PATH - "$ENV{obsAdditionalInstallFiles}/lib${_lib_suffix}" - "$ENV{obsAdditionalInstallFiles}/lib" - "$ENV{obsAdditionalInstallFiles}/libs${_lib_suffix}" - "$ENV{obsAdditionalInstallFiles}/libs" - "$ENV{obsAdditionalInstallFiles}/bin${_lib_suffix}" - "$ENV{obsAdditionalInstallFiles}/bin") - -if(NOT UNIX_STRUCTURE) - set(OBS_DATA_DESTINATION "data") - if(APPLE) - set(OBS_EXECUTABLE_DESTINATION "bin") - set(OBS_EXECUTABLE32_DESTINATION "bin") - set(OBS_EXECUTABLE64_DESTINATION "bin") - set(OBS_LIBRARY_DESTINATION "bin") - set(OBS_LIBRARY32_DESTINATION "bin") - set(OBS_LIBRARY64_DESTINATION "bin") - set(OBS_PLUGIN_DESTINATION "obs-plugins") - set(OBS_PLUGIN32_DESTINATION "obs-plugins") - set(OBS_PLUGIN64_DESTINATION "obs-plugins") - - set(OBS_DATA_PATH "../${OBS_DATA_DESTINATION}") - set(OBS_INSTALL_PREFIX "") - set(OBS_RELATIVE_PREFIX "../") - - set(OBS_SCRIPT_PLUGIN_DESTINATION "${OBS_DATA_DESTINATION}/obs-scripting") - else() - set(OBS_EXECUTABLE_DESTINATION "bin/${_lib_suffix}bit") - set(OBS_EXECUTABLE32_DESTINATION "bin/32bit") - set(OBS_EXECUTABLE64_DESTINATION "bin/64bit") - set(OBS_LIBRARY_DESTINATION "bin/${_lib_suffix}bit") - set(OBS_LIBRARY32_DESTINATION "bin/32bit") - set(OBS_LIBRARY64_DESTINATION "bin/64bit") - set(OBS_PLUGIN_DESTINATION "obs-plugins/${_lib_suffix}bit") - set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit") - set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit") - - set(OBS_DATA_PATH "../../${OBS_DATA_DESTINATION}") - set(OBS_INSTALL_PREFIX "") - set(OBS_RELATIVE_PREFIX "../../") - - set(OBS_SCRIPT_PLUGIN_DESTINATION "${OBS_DATA_DESTINATION}/obs-scripting/${_lib_suffix}bit") - endif() - set(OBS_CMAKE_DESTINATION "cmake") - set(OBS_INCLUDE_DESTINATION "include") - set(OBS_UNIX_STRUCTURE "0") - - set(OBS_SCRIPT_PLUGIN_PATH "${OBS_RELATIVE_PREFIX}${OBS_SCRIPT_PLUGIN_DESTINATION}") -else() - if(NOT OBS_MULTIARCH_SUFFIX AND DEFINED ENV{OBS_MULTIARCH_SUFFIX}) - set(OBS_MULTIARCH_SUFFIX "$ENV{OBS_MULTIARCH_SUFFIX}") - endif() - - set(OBS_EXECUTABLE_DESTINATION "bin") - set(OBS_EXECUTABLE32_DESTINATION "bin32") - set(OBS_EXECUTABLE64_DESTINATION "bin64") - set(OBS_LIBRARY_DESTINATION "lib${OBS_MULTIARCH_SUFFIX}") - set(OBS_LIBRARY32_DESTINATION "lib32") - set(OBS_LIBRARY64_DESTINATION "lib64") - set(OBS_PLUGIN_DESTINATION "${OBS_LIBRARY_DESTINATION}/obs-plugins") - set(OBS_PLUGIN32_DESTINATION "${OBS_LIBRARY32_DESTINATION}/obs-plugins") - set(OBS_PLUGIN64_DESTINATION "${OBS_LIBRARY64_DESTINATION}/obs-plugins") - set(OBS_DATA_DESTINATION "share/obs") - set(OBS_CMAKE_DESTINATION "${OBS_LIBRARY_DESTINATION}/cmake") - set(OBS_INCLUDE_DESTINATION "include/obs") - - set(OBS_DATA_PATH "${OBS_DATA_DESTINATION}") - set(OBS_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/") - set(OBS_RELATIVE_PREFIX "../") - set(OBS_UNIX_STRUCTURE "1") - - set(OBS_SCRIPT_PLUGIN_DESTINATION "${OBS_LIBRARY_DESTINATION}/obs-scripting") - set(OBS_SCRIPT_PLUGIN_PATH "${OBS_INSTALL_PREFIX}${OBS_SCRIPT_PLUGIN_DESTINATION}") -endif() - -function(obs_generate_multiarch_installer) - install(DIRECTORY "$ENV{obsInstallerTempDir}/" - DESTINATION "." - USE_SOURCE_PERMISSIONS) endfunction() -function(obs_helper_copy_dir target target_configs source dest) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" - "-DCONFIG=$" - "-DTARGET_CONFIGS=${target_configs}" - "-DINPUT=${source}" - "-DOUTPUT=${dest}" - -P "${CMAKE_SOURCE_DIR}/cmake/copy_helper.cmake" - VERBATIM) +# Helper function to set up OBS plugin targets +function(setup_plugin_target target) + set_target_properties(${target} PROPERTIES PREFIX "") + + install( + TARGETS ${target} + RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION} COMPONENT ${target}_Runtime + LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime + NAMELINK_COMPONENT ${target}_Development) + + install( + TARGETS ${target} + RUNTIME DESTINATION ${OBS_PLUGIN_DESTINATION} COMPONENT obs_rundir + LIBRARY DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + setup_target_resources("${target}" "obs-plugins/${target}") + set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "${target}") + message(STATUS "OBS: ENABLED ${target}") endfunction() -function(obs_install_additional maintarget) - set(addfdir "${CMAKE_SOURCE_DIR}/additional_install_files") - if(DEFINED ENV{obsAdditionalInstallFiles}) - set(addfdir "$ENV{obsAdditionalInstallFiles}") - endif() +# Helper function to set up OBS scripting plugin targets +function(setup_script_plugin_target target) + set_target_properties(${target} PROPERTIES PREFIX "") - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) - else() - set(_lib_suffix 32) - endif() + install( + TARGETS ${target} + LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime + NAMELINK_COMPONENT ${target}_Development) - install(DIRECTORY "${addfdir}/misc/" - DESTINATION "." - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/data/" - DESTINATION "${OBS_DATA_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) + install( + TARGETS ${target} + LIBRARY DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) - if(INSTALLER_RUN) - install(DIRECTORY "${addfdir}/libs32/" - DESTINATION "${OBS_LIBRARY32_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec32/" - DESTINATION "${OBS_EXECUTABLE32_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/libs64/" - DESTINATION "${OBS_LIBRARY64_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec64/" - DESTINATION "${OBS_EXECUTABLE64_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) + if(${target} STREQUAL "obspython") + install( + FILES "$/$.py" + DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime) - install(DIRECTORY "${addfdir}/libs32d/" - DESTINATION "${OBS_LIBRARY32_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec32d/" - DESTINATION "${OBS_EXECUTABLE32_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/libs64d/" - DESTINATION "${OBS_LIBRARY64_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec64d/" - DESTINATION "${OBS_EXECUTABLE64_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - - install(DIRECTORY "${addfdir}/libs32r/" - DESTINATION "${OBS_LIBRARY32_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec32r/" - DESTINATION "${OBS_EXECUTABLE32_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/libs64r/" - DESTINATION "${OBS_LIBRARY64_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec64r/" - DESTINATION "${OBS_EXECUTABLE64_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - else() - install(DIRECTORY "${addfdir}/libs${_lib_suffix}/" - DESTINATION "${OBS_LIBRARY_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec${_lib_suffix}/" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}" - USE_SOURCE_PERMISSIONS - PATTERN ".gitignore" EXCLUDE) - - install(DIRECTORY "${addfdir}/libs${_lib_suffix}d/" - DESTINATION "${OBS_LIBRARY_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec${_lib_suffix}d/" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Debug - PATTERN ".gitignore" EXCLUDE) - - install(DIRECTORY "${addfdir}/libs${_lib_suffix}r/" - DESTINATION "${OBS_LIBRARY_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - install(DIRECTORY "${addfdir}/exec${_lib_suffix}r/" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}" - USE_SOURCE_PERMISSIONS - CONFIGURATIONS Release RelWithDebInfo MinSizeRel - PATTERN ".gitignore" EXCLUDE) - endif() - - obs_helper_copy_dir(${maintarget} ALL - "${addfdir}/misc/" - "${CMAKE_BINARY_DIR}/rundir/$/") - obs_helper_copy_dir(${maintarget} ALL - "${addfdir}/data/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_DATA_DESTINATION}/") - obs_helper_copy_dir(${maintarget} ALL - "${addfdir}/libs${_lib_suffix}/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_LIBRARY_DESTINATION}/") - obs_helper_copy_dir(${maintarget} ALL - "${addfdir}/exec${_lib_suffix}/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_EXECUTABLE_DESTINATION}/") - - obs_helper_copy_dir(${maintarget} "Release;MinSizeRel;RelWithDebInfo" - "${addfdir}/exec${_lib_suffix}r/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_EXECUTABLE_DESTINATION}/") - obs_helper_copy_dir(${maintarget} "Debug" - "${addfdir}/exec${_lib_suffix}d/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_EXECUTABLE_DESTINATION}/") - obs_helper_copy_dir(${maintarget} "Release;MinSizeRel;RelWithDebInfo" - "${addfdir}/libs${_lib_suffix}r/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_LIBRARY_DESTINATION}/") - obs_helper_copy_dir(${maintarget} "Debug" - "${addfdir}/libs${_lib_suffix}d/" - "${CMAKE_BINARY_DIR}/rundir/$/${OBS_LIBRARY_DESTINATION}/") + install( + FILES "$/$.py" + DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + set_property(GLOBAL APPEND PROPERTY OBS_SCRIPTING_MODULE_LIST "${target}") + message(STATUS "OBS: ENABLED ${target}") endfunction() -function(export_obs_core target exportname) - install(TARGETS ${target} - EXPORT "${exportname}Target" - LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}" - ARCHIVE DESTINATION "${OBS_LIBRARY_DESTINATION}" - RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}") +# Helper function to set up target resources (e.g. L10N files) +function(setup_target_resources target destination) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data") + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/ + DESTINATION ${OBS_DATA_DESTINATION}/${destination} + USE_SOURCE_PERMISSIONS + COMPONENT ${target}_Runtime) - export(TARGETS ${target} FILE "${CMAKE_CURRENT_BINARY_DIR}/${exportname}Target.cmake") - export(PACKAGE "${exportname}") - - set(CONF_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}") - set(CONF_PLUGIN_DEST "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/${_lib_suffix}bit") - set(CONF_PLUGIN_DEST32 "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/32bit") - set(CONF_PLUGIN_DEST64 "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/obs-plugins/64bit") - set(CONF_PLUGIN_DATA_DEST "${CMAKE_BINARY_DIR}/rundir/${CMAKE_BUILD_TYPE}/data/obs-plugins") - configure_file("${exportname}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${exportname}Config.cmake" @ONLY) - - file(RELATIVE_PATH _pdir "${CMAKE_INSTALL_PREFIX}/${OBS_CMAKE_DESTINATION}/${exportname}" "${CMAKE_INSTALL_PREFIX}") - set(CONF_INCLUDE_DIRS "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_INCLUDE_DESTINATION}") - set(CONF_PLUGIN_DEST "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN_DESTINATION}") - set(CONF_PLUGIN_DEST32 "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN32_DESTINATION}") - set(CONF_PLUGIN_DEST64 "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_PLUGIN64_DESTINATION}") - set(CONF_PLUGIN_DATA_DEST "\${CMAKE_CURRENT_LIST_DIR}/${_pdir}${OBS_DATA_DESTINATION}/obs-plugins") - configure_file("${exportname}Config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${exportname}Config.cmake" @ONLY) - - set(_pdir) - - configure_file("${exportname}ConfigVersion.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/${exportname}ConfigVersion.cmake" @ONLY) - - install(FILES - "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${exportname}Config.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/${exportname}ConfigVersion.cmake" - DESTINATION "${OBS_CMAKE_DESTINATION}/${exportname}") - - install(EXPORT "${exportname}Target" - DESTINATION "${OBS_CMAKE_DESTINATION}/${exportname}") + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/ + DESTINATION ${OBS_DATA_DESTINATION}/${destination} + USE_SOURCE_PERMISSIONS + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() endfunction() -function(install_obs_headers) - foreach(hdr ${ARGN}) - if(IS_ABSOLUTE "${hdr}") - set(subdir) - else() - get_filename_component(subdir "${hdr}" DIRECTORY) - if(subdir) - set(subdir "/${subdir}") - endif() - endif() - install(FILES "${hdr}" DESTINATION "${OBS_INCLUDE_DESTINATION}${subdir}") - endforeach() +# Helper function to set up specific resource files for targets +function(add_target_resource target resource destination) + install( + FILES ${resource} + DESTINATION ${OBS_DATA_DESTINATION}/${destination} + COMPONENT ${target}_Runtime) + + install( + FILES ${resource} + DESTINATION + ${OBS_OUTPUT_DIR}/$/${OBS_DATA_DESTINATION}/${destination} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) endfunction() -function(obs_debug_copy_helper target dest) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" - "-DCONFIG=$" - "-DFNAME=$" - "-DINPUT=$" - "-DOUTPUT=${dest}" - -P "${CMAKE_SOURCE_DIR}/cmake/copy_on_debug_helper.cmake" - VERBATIM) +# Helper function to set up OBS app target +function(setup_obs_app target) + setup_binary_target(${target}) + + get_property(OBS_MODULE_LIST GLOBAL PROPERTY OBS_MODULE_LIST) + list(LENGTH OBS_MODULE_LIST _LEN) + if(_LEN GREATER 0) + add_dependencies(${target} ${OBS_MODULE_LIST}) + endif() + + get_property(OBS_SCRIPTING_MODULE_LIST GLOBAL + PROPERTY OBS_SCRIPTING_MODULE_LIST) + list(LENGTH OBS_SCRIPTING_MODULE_LIST _LEN) + if(_LEN GREATER 0) + add_dependencies(${target} ${OBS_SCRIPTING_MODULE_LIST}) + endif() + + # detect outdated obs-browser submodule + if(NOT TARGET OBS::browser AND TARGET obs-browser) + target_compile_features(obs-browser-page PRIVATE cxx_std_17) + + add_library(OBS::browser ALIAS obs-browser) + + if(NOT TARGET OBS::browser-panels AND BROWSER_PANEL_SUPPORT_ENABLED) + add_library(OBS::browser-panels ALIAS obs-browser) + endif() + endif() + + if(TARGET OBS::browser) + setup_target_browser(${target}) + endif() + + if(TARGET OBS::ffmpeg-mux) + add_dependencies(${target} OBS::ffmpeg-mux) + endif() + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND "${CMAKE_COMMAND}" --install .. --config $ --prefix + ${OBS_OUTPUT_DIR}/$ --component obs_rundir + COMMENT "Installing OBS rundir" + VERBATIM) endfunction() -function(install_obs_pdb ttype target) - if(NOT MSVC) - return() - endif() +# Helper function to do additional setup for browser source plugin +function(setup_target_browser target) + install( + DIRECTORY ${CEF_ROOT_DIR}/Resources/ + DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime) - if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit") - else() - set(_bit_suffix "32bit") - endif() + install( + DIRECTORY ${CEF_ROOT_DIR}/Release/ + DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime) - obs_debug_copy_helper(${target} "${CMAKE_CURRENT_BINARY_DIR}/pdbs") + install( + DIRECTORY ${CEF_ROOT_DIR}/Resources/ + DESTINATION ${OBS_OUTPUT_DIR}/$/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) - if("${ttype}" STREQUAL "PLUGIN") - obs_debug_copy_helper(${target} "${OBS_OUTPUT_DIR}/$/obs-plugins/${_bit_suffix}") - - if(DEFINED ENV{obsInstallerTempDir}) - obs_debug_copy_helper(${target} "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}") - endif() - - install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/" - DESTINATION "${OBS_PLUGIN_DESTINATION}" - CONFIGURATIONS Debug RelWithDebInfo) - else() - obs_debug_copy_helper(${target} "${OBS_OUTPUT_DIR}/$/bin/${_bit_suffix}") - - if(DEFINED ENV{obsInstallerTempDir}) - obs_debug_copy_helper(${target} "$ENV{obsInstallerTempDir}/${OBS_EXECUTABLE_DESTINATION}") - endif() - - install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}" - CONFIGURATIONS Debug RelWithDebInfo) - endif() + install( + DIRECTORY ${CEF_ROOT_DIR}/Release/ + DESTINATION ${OBS_OUTPUT_DIR}/$/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) endfunction() -function(install_obs_core target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() +# Helper function to export target to build and install tree. Allows usage of +# `find_package(libobs)` by other build trees +function(export_target target) + set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF) - if("${ARGV1}" STREQUAL "EXPORT") - export_obs_core("${target}" "${ARGV2}") - else() - install(TARGETS ${target} - LIBRARY DESTINATION "${OBS_LIBRARY_DESTINATION}" - RUNTIME DESTINATION "${OBS_EXECUTABLE_DESTINATION}") - endif() + install( + TARGETS ${target} + EXPORT ${target}Targets + RUNTIME DESTINATION ${OBS_EXECUTABLE_DESTINATION} COMPONENT obs_libraries + LIBRARY DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_libraries + ARCHIVE DESTINATION ${OBS_LIBRARY_DESTINATION} COMPONENT obs_libraries + INCLUDES + DESTINATION ${OBS_INCLUDE_DESTINATION} + PUBLIC_HEADER + DESTINATION ${OBS_INCLUDE_DESTINATION} + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${OBS_OUTPUT_DIR}/$/bin/${_bit_suffix}$" - VERBATIM) + include(GenerateExportHeader) + generate_export_header(${target} EXPORT_FILE_NAME + ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h) - if(DEFINED ENV{obsInstallerTempDir}) - get_property(target_type TARGET ${target} PROPERTY TYPE) - if("${target_type}" STREQUAL "EXECUTABLE") - set(tmp_target_dir "${OBS_EXECUTABLE_DESTINATION}") - else() - set(tmp_target_dir "${OBS_LIBRARY_DESTINATION}") - endif() + target_sources(${target} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "$ENV{obsInstallerTempDir}/${tmp_target_dir}/$" - VERBATIM) - endif() + set(TARGETS_EXPORT_NAME "${target}Targets") + include(CMakePackageConfigHelpers) + configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${target}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake + INSTALL_DESTINATION ${OBS_CMAKE_DESTINATION}/${target} + PATH_VARS OBS_PLUGIN_DESTINATION OBS_DATA_DESTINATION) - install_obs_pdb(CORE ${target}) + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + VERSION ${OBS_VERSION_CANONICAL} + COMPATIBILITY SameMajorVersion) + + export( + EXPORT ${target}Targets + FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGETS_EXPORT_NAME}.cmake + NAMESPACE OBS::) + + export(PACKAGE "${target}") + + install( + EXPORT ${TARGETS_EXPORT_NAME} + FILE ${TARGETS_EXPORT_NAME}.cmake + NAMESPACE OBS:: + DESTINATION ${OBS_CMAKE_DESTINATION}/${target} + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + DESTINATION ${OBS_CMAKE_DESTINATION}/${target} + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) endfunction() -function(install_obs_bin target mode) - foreach(bin ${ARGN}) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() +# Helper function to install header files +function(install_headers target) + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" + DESTINATION ${OBS_INCLUDE_DESTINATION} + COMPONENT obs_libraries + EXCLUDE_FROM_ALL FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + PATTERN "cmake" EXCLUDE + PATTERN "pkgconfig" EXCLUDE + PATTERN "data" EXCLUDE) - if(NOT IS_ABSOLUTE "${bin}") - set(bin "${CMAKE_CURRENT_SOURCE_DIR}/${bin}") - endif() - - get_filename_component(fname "${bin}" NAME) - - if(NOT "${mode}" MATCHES "INSTALL_ONLY") - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${bin}" - "${OBS_OUTPUT_DIR}/$/bin/${_bit_suffix}${fname}" - VERBATIM) - endif() - - install(FILES "${bin}" - DESTINATION "${OBS_EXECUTABLE_DESTINATION}") - - if(DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${bin}" - "$ENV{obsInstallerTempDir}/${OBS_EXECUTABLE_DESTINATION}/${fname}" - VERBATIM) - endif() - endforeach() -endfunction() - -function(install_obs_plugin target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() - - set_target_properties(${target} PROPERTIES - PREFIX "") - - install(TARGETS ${target} - LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}" - RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}") - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${OBS_OUTPUT_DIR}/$/obs-plugins/${_bit_suffix}$" - VERBATIM) - - if(DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" "$ENV{obsInstallerTempDir}/${OBS_PLUGIN_DESTINATION}/$" - VERBATIM) - endif() - - install_obs_pdb(PLUGIN ${target}) -endfunction() - -function(install_obs_data target datadir datadest) - install(DIRECTORY ${datadir}/ - DESTINATION "${OBS_DATA_DESTINATION}/${datadest}" - USE_SOURCE_PERMISSIONS) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "${OBS_OUTPUT_DIR}/$/data/${datadest}" - VERBATIM) - - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_CURRENT_SOURCE_DIR}/${datadir}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}" - VERBATIM) - endif() -endfunction() - -function(install_obs_data_from_abs_path target datadir datadest) - install(DIRECTORY ${datadir}/ - DESTINATION "${OBS_DATA_DESTINATION}/${datadest}" - USE_SOURCE_PERMISSIONS) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${datadir}" "${OBS_OUTPUT_DIR}/$/data/${datadest}" - VERBATIM) - - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${datadir}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}" - VERBATIM) - endif() -endfunction() - -function(install_obs_data_file target datafile datadest) - install(FILES ${datafile} - DESTINATION "${OBS_DATA_DESTINATION}/${datadest}") - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E make_directory - "${OBS_OUTPUT_DIR}/$/data/${datadest}" - VERBATIM) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${CMAKE_CURRENT_SOURCE_DIR}/${datafile}" "${OBS_OUTPUT_DIR}/$/data/${datadest}" - VERBATIM) - - if(CMAKE_SIZEOF_VOID_P EQUAL 8 AND DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E make_directory - "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}" - VERBATIM) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${CMAKE_CURRENT_SOURCE_DIR}/${datafile}" "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}" - VERBATIM) - endif() -endfunction() - -function(install_obs_datatarget target datadest) - install(TARGETS ${target} - LIBRARY DESTINATION "${OBS_DATA_DESTINATION}/${datadest}" - RUNTIME DESTINATION "${OBS_DATA_DESTINATION}/${datadest}") - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${OBS_OUTPUT_DIR}/$/data/${datadest}/$" - VERBATIM) - - if(DEFINED ENV{obsInstallerTempDir}) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "$ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${datadest}/$" - VERBATIM) - endif() - - if(MSVC) - obs_debug_copy_helper(${target} "${OBS_OUTPUT_DIR}/$/data/${datadest}") - endif() -endfunction() - -function(install_obs_plugin_with_data target datadir) - install_obs_plugin(${target}) - install_obs_data(${target} "${datadir}" "obs-plugins/${target}") + if(NOT EXISTS "${OBS_INCLUDE_DESTINATION}/obsconfig.h") + install( + FILES "${CMAKE_BINARY_DIR}/config/obsconfig.h" + DESTINATION "${OBS_INCLUDE_DESTINATION}" + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) + endif() endfunction() +# Helper function to define available graphics modules for targets function(define_graphic_modules target) - foreach(dl_lib opengl d3d9 d3d11) - string(TOUPPER ${dl_lib} dl_lib_upper) - if(TARGET libobs-${dl_lib}) - if(UNIX AND UNIX_STRUCTURE) - target_compile_definitions(${target} - PRIVATE - DL_${dl_lib_upper}="$" - ) - else() - target_compile_definitions(${target} - PRIVATE - DL_${dl_lib_upper}="$" - ) - endif() - else() - target_compile_definitions(${target} - PRIVATE - DL_${dl_lib_upper}="" - ) - endif() - endforeach() + foreach(_GRAPHICS_API metal d3d11 opengl d3d9) + string(TOUPPER ${_GRAPHICS_API} _GRAPHICS_API_u) + if(TARGET OBS::libobs-${_GRAPHICS_API}) + if(OS_POSIX AND NOT LINUX_PORTABLE) + target_compile_definitions( + ${target} + PRIVATE + DL_${_GRAPHICS_API_u}="$" + ) + else() + target_compile_definitions( + ${target} + PRIVATE + DL_${_GRAPHICS_API_u}="$") + endif() + add_dependencies(${target} OBS::libobs-${_GRAPHICS_API}) + else() + target_compile_definitions(${target} PRIVATE DL_${_GRAPHICS_API_u}="") + endif() + endforeach() +endfunction() + +macro(find_qt) + set(oneValueArgs VERSION) + set(multiValueArgs COMPONENTS COMPONENTS_WIN COMPONENTS_MAC COMPONENTS_LINUX) + cmake_parse_arguments(FIND_QT "" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN}) + + if(OS_WINDOWS) + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_WIN} + REQUIRED) + elseif(OS_MACOS) + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_MAC} + REQUIRED) + else() + find_package( + Qt${FIND_QT_VERSION} + COMPONENTS ${FIND_QT_COMPONENTS} ${FIND_QT_COMPONENTS_LINUX} + REQUIRED) + endif() + + foreach(_COMPONENT IN LISTS FIND_QT_COMPONENTS FIND_QT_COMPONENTS_WIN + FIND_QT_COMPONENTS_MAC FIND_QT_COMPONENTS_LINUX) + if(NOT TARGET Qt::${_COMPONENT} AND TARGET + Qt${FIND_QT_VERSION}::${_COMPONENT}) + + add_library(Qt::${_COMPONENT} INTERFACE IMPORTED) + set_target_properties( + Qt::${_COMPONENT} PROPERTIES INTERFACE_LINK_LIBRARIES + "Qt${FIND_QT_VERSION}::${_COMPONENT}") + endif() + endforeach() +endmacro() + +# Idea adapted from: https://github.com/edsiper/cmake-options +macro(set_option option value) + set(${option} + ${value} + CACHE INTERNAL "") +endmacro() + +if(OS_WINDOWS) + include(ObsHelpers_Windows) +elseif(OS_MACOS) + include(ObsHelpers_macOS) +elseif(OS_POSIX) + include(ObsHelpers_Linux) +endif() + +# ############################################################################## +# LEGACY FALLBACKS # +# ############################################################################## + +# Helper function to install OBS plugin with associated resource directory +function(_install_obs_plugin_with_data target source) + setup_plugin_target(${target}) + + if(NOT ${source} STREQUAL "data" + AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${source}" + AND NOT OS_MACOS) + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/ + DESTINATION ${OBS_DATA_DESTINATION}/obs-plugins/${target} + USE_SOURCE_PERMISSIONS + COMPONENT ${target}_Runtime) + + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/ + DESTINATION + ${OBS_OUTPUT_DIR}/$/${OBS_DATA_DESTINATION}/obs-plugins/${target} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(OS_WINDOWS AND DEFINED ENV{obsInstallerTempDir}) + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${source}/ + DESTINATION + $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/obs-plugins/${target} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + endif() +endfunction() + +# Helper function to install OBS plugin +function(_install_obs_plugin target) + setup_plugin_target(${target}) +endfunction() + +# Helper function to install data for a target only +function(_install_obs_datatarget target destination) + install( + TARGETS ${target} + LIBRARY DESTINATION ${OBS_DATA_DESTINATION}/${destination} + COMPONENT ${target}_Runtime + NAMELINK_COMPONENT ${target}_Development + RUNTIME DESTINATION ${OBS_DATA_DESTINATION}/${destination} + COMPONENT ${target}_Runtime) + + install( + TARGETS ${target} + LIBRARY + DESTINATION + ${OBS_OUTPUT_DIR}/$/${OBS_DATA_DESTINATION}/${destination} + COMPONENT obs_rundir + RUNTIME + DESTINATION + ${OBS_OUTPUT_DIR}/$/${OBS_DATA_DESTINATION}/${destination} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(OS_WINDOWS) + if(MSVC) + add_target_resource(${target} "$" + "${destination}") + endif() + + if(DEFINED ENV{obsInstallerTempDir}) + install( + TARGETS ${target} + RUNTIME + DESTINATION + $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$ + LIBRARY + DESTINATION + $ENV{obsInstallerTempDir}/${OBS_DATA_DESTINATION}/${destination}/$ + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + endif() endfunction() diff --git a/cmake/Modules/ObsHelpers_Linux.cmake b/cmake/Modules/ObsHelpers_Linux.cmake new file mode 100644 index 000000000..e1b0e5106 --- /dev/null +++ b/cmake/Modules/ObsHelpers_Linux.cmake @@ -0,0 +1,63 @@ +# Helper function to set up runtime or library targets +function(setup_binary_target target) + set_target_properties( + ${target} + PROPERTIES + BUILD_RPATH + "${OBS_OUTPUT_DIR}/$/${OBS_EXECUTABLE_DESTINATION}$<$:/${_ARCH_SUFFIX}bit>" + ) + + _setup_binary_target(${target}) +endfunction() + +# Helper function to export target to build and install tree Allows usage of +# `find_package(libobs)` by other build trees +function(export_target target) + _export_target(${ARGV}) + + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig") + export_target_pkgconf(${target}) + endif() +endfunction() + +# Helper function to build pkgconfig file for target +function(export_target_pkgconf target) + get_target_property(_TARGET_DEPENDENCIES ${target} INTERFACE_LINK_LIBRARIES) + get_target_property(_TARGET_DEFINITIONS ${target} + INTERFACE_COMPILE_DEFINITIONS) + get_target_property(_TARGET_OPTIONS ${target} INTERFACE_LINK_OPTIONS) + + foreach(_LIBRARY IN LISTS _TARGET_DEPENDENCIES) + get_target_property(_LINK_LIBRARY ${_LIBRARY} INTERFACE_LINK_LIBRARIES) + get_target_property(_LINK_DEFINITIONS ${_LIBRARY} + INTERFACE_COMPILE_DEFINITIONS) + list(APPEND _LINKED_LIBRARIES "${_LINK_LIBRARY}") + + if(NOT "${_LINK_DEFINITIONS}" STREQUAL "_LINK_DEFINITIONS-NOTFOUND") + list(APPEND _LINKED_DEFINITIONS "${_LINK_DEFINITIONS}") + endif() + endforeach() + + string(REPLACE ";" " " _LINKED_LIBRARIES "${_LINKED_LIBRARIES}") + string(REPLACE ";" " " _LINKED_DEFINITIONS "${_LINKED_DEFINITIONS}") + + if(NOT "${_TARGET_DEFINITIONS}" STREQUAL "_TARGET_DEFINITIONS-NOTFOUND") + list(JOIN _TARGET_DEFINITIONS "-D" _TARGET_DEFINITIONS) + set(_TARGET_DEFINITIONS "-D${_TARGET_DEFINITIONS}") + else() + set(_TARGET_DEFINITIONS "") + endif() + + if(NOT "${_TARGET_OPTIONS}" STREQUAL "_TARGET_OPTIONS-NOTFOUND") + list(JOIN _TARGET_OPTIONS "-" _TARGET_OPTIONS) + set(_TARGET_OPTIONS "-${_TARGET_OPTIONS}") + else() + set(_TARGET_OPTIONS "") + endif() + + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pkgconfig/${target}.pc.in" + "${target}.pc" @ONLY) + + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${target}.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +endfunction() diff --git a/cmake/Modules/ObsHelpers_Windows.cmake b/cmake/Modules/ObsHelpers_Windows.cmake new file mode 100644 index 000000000..36dcfba61 --- /dev/null +++ b/cmake/Modules/ObsHelpers_Windows.cmake @@ -0,0 +1,400 @@ +# Helper function to set up runtime or library targets +function(setup_binary_target target) + _setup_binary_target(${ARGV}) + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + TARGETS ${target} + RUNTIME + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_EXECUTABLE_DESTINATION} + COMPONENT obs_rundir + LIBRARY DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_LIBRARY_DESTINATION} + COMPONENT obs_rundir + PUBLIC_HEADER + DESTINATION ${OBS_INCLUDE_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION + $ENV{OBS_InstallerTempDir}/$,EXECUTABLE>,${OBS_EXECUTABLE_DESTINATION},${OBS_LIBRARY_DESTINATION}> + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + endif() + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION + $,EXECUTABLE>,${OBS_EXECUTABLE_DESTINATION},${OBS_LIBRARY_DESTINATION}> + COMPONENT ${target}_Runtime + OPTIONAL) + + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION + $,EXECUTABLE>,${OBS_EXECUTABLE_DESTINATION},${OBS_LIBRARY_DESTINATION}> + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + + if(${target} STREQUAL "libobs") + setup_libobs_target(${target}) + endif() +endfunction() + +# Helper function to set up OBS plugin targets +function(setup_plugin_target target) + _setup_plugin_target(${ARGV}) + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime + OPTIONAL) + + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + TARGETS ${target} + RUNTIME DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + LIBRARY DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + endif() +endfunction() + +# Helper function to set up OBS scripting plugin targets +function(setup_script_plugin_target target) + _setup_script_plugin_target(${ARGV}) + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION ${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + TARGETS ${target} + RUNTIME + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + LIBRARY + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(MSVC) + install( + FILES $ + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + + if(${target} STREQUAL "obspython" AND ${_ARCH_SUFFIX} EQUAL 64) + install( + FILES + "$/$.py" + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_SCRIPT_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + endif() +endfunction() + +# Helper function to set up target resources (e.g. L10N files) +function(setup_target_resources target destination) + _setup_target_resources(${ARGV}) + + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data") + if(${_ARCH_SUFFIX} EQUAL 64 AND DEFINED ENV{OBS_InstallerTempDir}) + + install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data/ + DESTINATION + $ENV{OBS_InstallerTempDir}/${OBS_DATA_DESTINATION}/${destination} + USE_SOURCE_PERMISSIONS + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + endif() +endfunction() + +# Helper function to set up specific resource files for targets +function(add_target_resource target resource destination) + _add_target_resource(${ARGV}) + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + FILES ${resource} + DESTINATION + $ENV{OBS_InstallerTempDir}/${OBS_DATA_DESTINATION}/${destination} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() +endfunction() + +# Helper function to set up OBS app target +function(setup_obs_app target) + # detect outdated obs-browser submodule + if(NOT TARGET OBS::browser AND TARGET obs-browser) + if(MSVC) + target_compile_options(obs-browser PRIVATE $,/MTd,/MT>) + + target_compile_options(obs-browser-page + PRIVATE $,/MTd,/MT>) + endif() + + target_link_options(obs-browser PRIVATE "LINKER:/IGNORE:4099") + + target_link_options(obs-browser-page PRIVATE "LINKER:/IGNORE:4099" + "LINKER:/SUBSYSTEM:WINDOWS") + endif() + + _setup_obs_app(${ARGV}) + + if(MSVC) + include(CopyMSVCBins) + endif() +endfunction() + +# Helper function to export target to build and install tree. Allows usage of +# `find_package(libobs)` by other build trees +function(export_target target) + set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF) + + install( + TARGETS ${target} + EXPORT ${target}Targets + RUNTIME DESTINATION "${OBS_EXECUTABLE_EXPORT_DESTINATION}" + COMPONENT obs_libraries + LIBRARY DESTINATION "${OBS_LIBRARY_EXPORT_DESTINATION}" + COMPONENT obs_libraries + ARCHIVE DESTINATION "${OBS_LIBRARY_EXPORT_DESTINATION}" + COMPONENT obs_libraries + INCLUDES + DESTINATION "${OBS_INCLUDE_DESTINATION}" + PUBLIC_HEADER DESTINATION "${OBS_INCLUDE_DESTINATION}" + COMPONENT obs_libraries) + + if(MSVC) + install( + DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pdbs/" + DESTINATION "${OBS_EXECUTABLE_EXPORT_DESTINATION}" + CONFIGURATIONS Debug RelWithDebInfo + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) + endif() + + include(GenerateExportHeader) + generate_export_header(${target} EXPORT_FILE_NAME + "${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h") + + target_sources(${target} + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h") + + set(TARGETS_EXPORT_NAME "${target}Targets") + include(CMakePackageConfigHelpers) + configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${target}Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake" + INSTALL_DESTINATION ${OBS_CMAKE_DESTINATION} + PATH_VARS OBS_PLUGIN_DESTINATION OBS_DATA_DESTINATION) + + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + VERSION ${OBS_VERSION_CANONICAL} + COMPATIBILITY SameMajorVersion) + + export( + EXPORT ${target}Targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGETS_EXPORT_NAME}.cmake" + NAMESPACE OBS::) + + export(PACKAGE "${target}") + + install( + EXPORT ${TARGETS_EXPORT_NAME} + FILE ${TARGETS_EXPORT_NAME}.cmake + NAMESPACE OBS:: + DESTINATION ${OBS_CMAKE_DESTINATION} + COMPONENT obs_libraries) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + DESTINATION ${OBS_CMAKE_DESTINATION} + COMPONENT obs_libraries) +endfunction() + +# Helper function to do additional setup for browser source plugin +function(setup_target_browser target) + install( + DIRECTORY ${CEF_ROOT_DIR}/Resources/ + DESTINATION ${OBS_PLUGIN_DESTINATION} + COMPONENT ${target}_Runtime) + + install( + DIRECTORY ${CEF_ROOT_DIR}/Resources/ + DESTINATION ${OBS_OUTPUT_DIR}/$/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + DIRECTORY ${CEF_ROOT_DIR}/Resources/ + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_PLUGIN_DESTINATION} + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + + set(_ADDITIONAL_BROWSER_FILES + "libcef.dll" + "libEGL.dll" + "libGLESv2.dll" + "snapshot_blob.bin" + "v8_context_snapshot.bin" + "natives_blob.bin" + "chrome_elf.dll") + + foreach(_ADDITIONAL_BROWSER_FILE IN LISTS _ADDITIONAL_BROWSER_FILES) + list(REMOVE_ITEM _ADDITIONAL_BROWSER_FILES "${_ADDITIONAL_BROWSER_FILE}") + if(EXISTS "${CEF_ROOT_DIR}/Release/${_ADDITIONAL_BROWSER_FILE}") + list(APPEND _ADDITIONAL_BROWSER_FILES + "${CEF_ROOT_DIR}/Release/${_ADDITIONAL_BROWSER_FILE}") + endif() + endforeach() + + install( + FILES ${_ADDITIONAL_BROWSER_FILES} + DESTINATION ${OBS_PLUGIN_DESTINATION}/ + COMPONENT ${target}_Runtime) + + install( + FILES ${_ADDITIONAL_BROWSER_FILES} + DESTINATION ${OBS_OUTPUT_DIR}/$/${OBS_PLUGIN_DESTINATION}/ + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(DEFINED ENV{OBS_InstallerTempDir}) + install( + FILES ${_ADDITIONAL_BROWSER_FILES} + DESTINATION $ENV{OBS_InstallerTempDir}/${OBS_PLUGIN_DESTINATION}/ + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() +endfunction() + +# Helper function to gather external libraries depended-on by libobs +function(setup_libobs_target target) + set(_ADDITIONAL_FILES "${CMAKE_SOURCE_DIR}/additional_install_files") + + if(DEFINED ENV{OBS_AdditionalInstallFiles}) + set(_ADDITIONAL_FILES "$ENV{OBS_AdditionalInstallFiles}") + endif() + + if(NOT INSTALLER_RUN) + list(APPEND _LIBOBS_FIXUPS "misc:." "data:${OBS_DATA_DESTINATION}" + "libs${_ARCH_SUFFIX}:${OBS_LIBRARY_DESTINATION}" + "exec${_ARCH_SUFFIX}:${OBS_EXECUTABLE_DESTINATION}") + else() + list( + APPEND + _LIBOBS_FIXUPS + "misc:." + "data:${OBS_DATA_DESTINATION}" + "libs32:${OBS_LIBRARY32_DESTINATION}" + "libs64:${OBS_LIBRARY64_DESTINATION}" + "exec32:${OBS_EXECUTABLE32_DESTINATION}" + "exec64:${OBS_EXECUTABLE64_DESTINATION}") + endif() + + foreach(_FIXUP IN LISTS _LIBOBS_FIXUPS) + string(REPLACE ":" ";" _FIXUP ${_FIXUP}) + list(GET _FIXUP 0 _SOURCE) + list(GET _FIXUP 1 _DESTINATION) + + install( + DIRECTORY ${_ADDITIONAL_FILES}/${_SOURCE}/ + DESTINATION ${_DESTINATION} + USE_SOURCE_PERMISSIONS + COMPONENT ${target}_Runtime + PATTERN ".gitignore" EXCLUDE) + + install( + DIRECTORY ${_ADDITIONAL_FILES}/${_SOURCE}/ + DESTINATION ${_DESTINATION} + USE_SOURCE_PERMISSIONS + COMPONENT obs_rundir + EXCLUDE_FROM_ALL + PATTERN ".gitignore" EXCLUDE) + + if(_SOURCE MATCHES "(libs|exec)(32|64)?") + install( + DIRECTORY ${_ADDITIONAL_FILES}/${_SOURCE}$,d,r>/ + DESTINATION ${_DESTINATION} + USE_SOURCE_PERMISSIONS + COMPONENT ${target}_Runtime + PATTERN ".gitignore" EXCLUDE) + + install( + DIRECTORY ${_ADDITIONAL_FILES}/${_SOURCE}$,d,r>/ + DESTINATION ${_DESTINATION} + USE_SOURCE_PERMISSIONS + COMPONENT obs_rundir + EXCLUDE_FROM_ALL + PATTERN ".gitignore" EXCLUDE) + endif() + endforeach() +endfunction() + +# Helper function to compile artifacts for multi-architecture installer +function(generate_multiarch_installer) + if(NOT DEFINED ENV{OBS_InstallerTempDir} AND NOT DEFINED + ENV{obsInstallerTempDir}) + message( + FATAL_ERROR + "Function generate_multiarch_installer requires environment variable 'OBS_InstallerTempDir' to be set" + ) + endif() + + add_custom_target(installer_files ALL) + + setup_libobs_target(installer_files) + + install( + DIRECTORY "$ENV{OBS_InstallerTempDir}/" + DESTINATION "." + USE_SOURCE_PERMISSIONS) +endfunction() diff --git a/cmake/Modules/ObsHelpers_macOS.cmake b/cmake/Modules/ObsHelpers_macOS.cmake new file mode 100644 index 000000000..1e4dfa44c --- /dev/null +++ b/cmake/Modules/ObsHelpers_macOS.cmake @@ -0,0 +1,489 @@ +# Helper function to set up runtime or library targets +function(setup_binary_target target) + set_target_properties( + ${target} + PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "com.obsproject.${target}" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "${OBS_BUNDLE_CODESIGN_IDENTITY}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/entitlements.plist") + + set(MACOSX_PLUGIN_BUNDLE_NAME + "${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_GUI_IDENTIFIER + "com.obsproject.${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_BUNDLE_VERSION + "${MACOSX_BUNDLE_BUNDLE_VERSION}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_SHORT_VERSION_STRING + "${MACOSX_BUNDLE_SHORT_VERSION_STRING}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_EXECUTABLE_NAME + "${target}" + PARENT_SCOPE) + + if(${target} STREQUAL libobs) + setup_framework_target(${target}) + set_property(GLOBAL APPEND PROPERTY OBS_FRAMEWORK_LIST "${target}") + elseif(NOT ${target} STREQUAL obs-ffmpeg-mux AND NOT ${target} STREQUAL + mac-dal-plugin) + set_property(GLOBAL APPEND PROPERTY OBS_FRAMEWORK_LIST "${target}") + endif() +endfunction() + +# Helper function to set-up framework targets on macOS +function(setup_framework_target target) + set_target_properties( + ${target} + PROPERTIES FRAMEWORK ON + FRAMEWORK_VERSION A + OUTPUT_NAME "${target}" + MACOSX_FRAMEWORK_IDENTIFIER "com.obsproject.${target}" + MACOSX_FRAMEWORK_INFO_PLIST + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Plugin-Info.plist.in" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "com.obsproject.${target}") + + install( + TARGETS ${target} + EXPORT "${target}Targets" + FRAMEWORK DESTINATION "Frameworks" COMPONENT obs_libraries + INCLUDES + DESTINATION Frameworks/$.framework/Headers + PUBLIC_HEADER + DESTINATION + Frameworks/$.framework/Headers + EXCLUDE_FROM_ALL) +endfunction() + +# Helper function to set up OBS plugin targets +function(setup_plugin_target target) + set(MACOSX_PLUGIN_BUNDLE_NAME + "${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_GUI_IDENTIFIER + "com.obsproject.${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_BUNDLE_VERSION + "${MACOSX_BUNDLE_BUNDLE_VERSION}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_SHORT_VERSION_STRING + "${MACOSX_BUNDLE_SHORT_VERSION_STRING}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_EXECUTABLE_NAME + "${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_BUNDLE_TYPE + "BNDL" + PARENT_SCOPE) + + set_target_properties( + ${target} + PROPERTIES BUNDLE ON + BUNDLE_EXTENSION "plugin" + OUTPUT_NAME "${target}" + MACOSX_BUNDLE_INFO_PLIST + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Plugin-Info.plist.in" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "com.obsproject.${target}" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "${OBS_BUNDLE_CODESIGN_IDENTITY}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/entitlements.plist") + + set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "${target}") + message(STATUS "OBS: ENABLED ${target}") + + install_bundle_resources(${target}) +endfunction() + +# Helper function to set up OBS scripting plugin targets +function(setup_script_plugin_target target) + set_target_properties( + ${target} + PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "com.obsproject.${target}" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "${OBS_BUNDLE_CODESIGN_IDENTITY}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/entitlements.plist") + + set_property(GLOBAL APPEND PROPERTY OBS_SCRIPTING_MODULE_LIST "${target}") + message(STATUS "OBS: ENABLED ${target}") +endfunction() + +# Helper function to set up target resources (e.g. L10N files) +function(setup_target_resources target destination) + install_bundle_resources(${target}) +endfunction() + +# Helper function to set up plugin resources inside plugin bundle +function(install_bundle_resources target) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data") + file(GLOB_RECURSE _DATA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/data/*") + foreach(_DATA_FILE IN LISTS _DATA_FILES) + file(RELATIVE_PATH _RELATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/data/ + ${_DATA_FILE}) + get_filename_component(_RELATIVE_PATH "${_RELATIVE_PATH}" PATH) + target_sources(${target} PRIVATE ${_DATA_FILE}) + set_source_files_properties( + ${_DATA_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION + "Resources/${_RELATIVE_PATH}") + string(REPLACE "\\" "\\\\" _GROUP_NAME "${_RELATIVE_PATH}") + source_group("Resources\\${_GROUP_NAME}" FILES ${_DATA_FILE}) + endforeach() + endif() +endfunction() + +# Helper function to set up specific resource files for targets +function(add_target_resource target resource destination) + target_sources(${target} PRIVATE ${resource}) + set_source_files_properties(${resource} PROPERTIES MACOSX_PACKAGE_LOCATION + Resources) +endfunction() + +# Helper function to set up OBS app target +function(setup_obs_app target) + set_target_properties( + ${target} + PROPERTIES BUILD_WITH_INSTALL_RPATH OFF + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY + "${OBS_BUNDLE_CODESIGN_IDENTITY}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/entitlements.plist" + XCODE_SCHEME_ENVIRONMENT "PYTHONDONTWRITEBYTECODE=1") + + install(TARGETS ${target} BUNDLE DESTINATION "." COMPONENT obs_app) + + # detect outdated obs-browser submodule + if(TARGET obs-browser-page OR TARGET obs-browser-page_gpu) + add_library(OBS::browser ALIAS obs-browser) + endif() + + if(TARGET OBS::browser) + setup_target_browser(${target}) + endif() + + setup_obs_frameworks(${target}) + setup_obs_modules(${target}) + setup_obs_bundle(${target}) +endfunction() + +# Helper function to do additional setup for browser source plugin +function(setup_target_browser target) + get_filename_component(_CEF_FRAMEWORK_NAME "${CEF_LIBRARY}" NAME) + + install( + DIRECTORY "${CEF_LIBRARY}" + DESTINATION "Frameworks" + USE_SOURCE_PERMISSIONS + COMPONENT obs_browser_dev + EXCLUDE_FROM_ALL) + + foreach(_CEF_LIBRARY IN ITEMS "libEGL" "libswiftshader_libEGL" "libGLESv2" + "libswiftshader_libGLESv2" "libvk_swiftshader") + set(_COMMAND + "/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" $<$:--options linker-signed > \\\"\${CMAKE_INSTALL_PREFIX}/Frameworks/${_CEF_FRAMEWORK_NAME}/Libraries/${_CEF_LIBRARY}.dylib\\\"" + ) + list(APPEND _CEF_CODESIGN_COMMANDS + "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")") + endforeach() + + set(_COMMAND + "/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" $<$:--options linker-signed > --deep \\\"\${CMAKE_INSTALL_PREFIX}/Frameworks/${_CEF_FRAMEWORK_NAME}/Chromium Embedded Framework\\\"" + ) + + list(APPEND _CEF_CODESIGN_COMMANDS + "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")") + string(REPLACE ";" "\n " _CEF_CODESIGN_COMMANDS "${_CEF_CODESIGN_COMMANDS}") + install( + CODE "${_CEF_CODESIGN_COMMANDS}" + COMPONENT obs_browser_dev + EXCLUDE_FROM_ALL) + + foreach(_SUFFIX IN ITEMS "_gpu" "_plugin" "_renderer" "") + if(TARGET obs-browser-page${_SUFFIX}) + add_executable(OBS::browser-helper${_SUFFIX} ALIAS + obs-browser-page${_SUFFIX}) + target_compile_features(obs-browser-page${_SUFFIX} PRIVATE cxx_std_17) + endif() + + if(TARGET OBS::browser-helper${_SUFFIX}) + add_dependencies(${target} OBS::browser-helper${_SUFFIX}) + + install( + DIRECTORY "$" + DESTINATION "Frameworks" + USE_SOURCE_PERMISSIONS + COMPONENT obs_browser_dev + EXCLUDE_FROM_ALL) + + set(_COMMAND + "/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" $<$:--options linker-signed > \\\"\${CMAKE_INSTALL_PREFIX}/Frameworks/$.app\\\"" + ) + + install( + CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")" + COMPONENT obs_browser_dev + EXCLUDE_FROM_ALL) + endif() + endforeach() + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND "${CMAKE_COMMAND}" --install . --config $ --prefix + $ --component obs_browser_dev + COMMENT "Installing Chromium Embedded Framework for development" + VERBATIM) +endfunction() + +# Helper function to set-up OBS frameworks for macOS bundling +function(setup_obs_frameworks target) + get_property(OBS_FRAMEWORK_LIST GLOBAL PROPERTY OBS_FRAMEWORK_LIST) + install( + TARGETS ${OBS_FRAMEWORK_LIST} + RUNTIME + DESTINATION "$.app/Contents/Frameworks/" + COMPONENT obs_frameworks + LIBRARY + DESTINATION "$.app/Contents/Frameworks/" + COMPONENT obs_frameworks + FRAMEWORK + DESTINATION "$.app/Contents/Frameworks/" + COMPONENT obs_frameworks + PUBLIC_HEADER DESTINATION "${OBS_INCLUDE_DESTINATION}" + COMPONENT obs_libraries) +endfunction() + +# Helper function to set-up OBS plugins and helper binaries for macOS bundling +function(setup_obs_modules target) + + get_property(OBS_MODULE_LIST GLOBAL PROPERTY OBS_MODULE_LIST) + add_dependencies(${target} ${OBS_MODULE_LIST}) + + install( + TARGETS ${OBS_MODULE_LIST} + LIBRARY DESTINATION "PlugIns" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + + install( + TARGETS ${OBS_MODULE_LIST} + LIBRARY DESTINATION $.app/Contents/PlugIns + COMPONENT obs_plugins + NAMELINK_COMPONENT ${target}_Development) + + get_property(OBS_SCRIPTING_MODULE_LIST GLOBAL + PROPERTY OBS_SCRIPTING_MODULE_LIST) + add_dependencies(${target} ${OBS_SCRIPTING_MODULE_LIST}) + + install( + TARGETS ${OBS_SCRIPTING_MODULE_LIST} + LIBRARY DESTINATION "PlugIns" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + + if(TARGET obspython) + install( + FILES "$/obspython.py" + DESTINATION "PlugIns" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + + set(_COMMAND + "/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" $<$:--options linker-signed > \\\"\${CMAKE_INSTALL_PREFIX}/PlugIns/obspython.py\\\"" + ) + + install( + CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + endif() + + install(TARGETS ${OBS_SCRIPTING_MODULE_LIST} + LIBRARY DESTINATION $.app/Contents/PlugIns + COMPONENT obs_scripting_plugins) + + if(TARGET obs-ffmpeg-mux) + add_dependencies(${target} obs-ffmpeg-mux) + + install( + TARGETS obs-ffmpeg-mux + RUNTIME DESTINATION "MacOS" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + + set(_COMMAND + "/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" $<$:--options linker-signed > \\\"\${CMAKE_INSTALL_PREFIX}/MacOS/$\\\"" + ) + + install( + CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + + install(TARGETS obs-ffmpeg-mux + RUNTIME DESTINATION $.app/Contents/MacOS + COMPONENT obs_plugins) + endif() + + if(TARGET mac-dal-plugin) + add_dependencies(${target} mac-dal-plugin) + + install( + TARGETS mac-dal-plugin + LIBRARY DESTINATION "Resources" + COMPONENT obs_plugin_dev + EXCLUDE_FROM_ALL) + endif() + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND "${CMAKE_COMMAND}" --install .. --config $ --prefix + $ --component obs_plugin_dev + COMMENT "Installing OBS plugins for development" + VERBATIM) +endfunction() + +# Helper function to finalize macOS app bundles +function(setup_obs_bundle target) + install( + CODE " + set(_DEPENDENCY_PREFIX \"${CMAKE_PREFIX_PATH}\") + set(_BUILD_FOR_DISTRIBUTION \"${BUILD_FOR_DISTRIBUTION}\") + set(_BUNDLENAME \"$.app\") + set(_BUNDLER_COMMAND \"${CMAKE_SOURCE_DIR}/cmake/bundle/macos/dylibbundler\") + set(_CODESIGN_IDENTITY \"${OBS_BUNDLE_CODESIGN_IDENTITY}\") + set(_CODESIGN_ENTITLEMENTS \"${CMAKE_SOURCE_DIR}/cmake/bundle/macOS\")" + COMPONENT obs_resources) + + if(ENABLE_SPARKLE_UPDATER) + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + /bin/sh -c + "plutil -replace SUFeedURL -string https://obsproject.com/osx_update/stable/updates_${CMAKE_OSX_ARCHITECTURES}.xml \"$/Info.plist\"" + VERBATIM) + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + /bin/sh -c + "plutil -replace SUPublicDSAKeyFile -string OBSPublicDSAKey.pem \"$/Info.plist\"" + VERBATIM) + + target_sources( + ${target} + PRIVATE "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/OBSPublicDSAKey.pem") + set_source_files_properties( + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/OBSPublicDSAKey.pem" + PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") + source_group( + "Resources" + FILES "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/OBSPublicDSAKey.pem") + + install( + DIRECTORY ${SPARKLE} + DESTINATION $.app/Contents/Frameworks + COMPONENT obs_frameworks) + endif() + + install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/bundleutils.cmake" + COMPONENT obs_resources) +endfunction() + +# Helper function to export target to build and install tree Allows usage of +# `find_package(libobs)` by other build trees +function(export_target target) + get_target_property(_IS_FRAMEWORK ${target} FRAMEWORK) + + set(OBS_PLUGIN_DESTINATION "") + set(OBS_DATA_DESTINATION "") + + if(_IS_FRAMEWORK) + export_framework_target(${target}) + else() + _export_target(${ARGV}) + endif() + set_target_properties( + ${target} PROPERTIES PUBLIC_HEADER + "${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h") +endfunction() + +# Helper function to export macOS framework targets +function(export_framework_target) + set(CMAKE_EXPORT_PACKAGE_REGISTRY OFF) + + include(GenerateExportHeader) + generate_export_header(${target} EXPORT_FILE_NAME + "${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h") + + target_sources(${target} + PRIVATE "${CMAKE_CURRENT_BINARY_DIR}/${target}_EXPORT.h") + + set(TARGETS_EXPORT_NAME "${target}Targets") + include(CMakePackageConfigHelpers) + configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/cmake/${target}Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake" + INSTALL_DESTINATION Frameworks/${target}.framework/Resources/cmake + PATH_VARS OBS_PLUGIN_DESTINATION OBS_DATA_DESTINATION) + + write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + VERSION ${OBS_VERSION_CANONICAL} + COMPATIBILITY SameMajorVersion) + + export( + EXPORT ${target}Targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${TARGETS_EXPORT_NAME}.cmake" + NAMESPACE OBS::) + + export(PACKAGE "${target}") + + install( + EXPORT ${TARGETS_EXPORT_NAME} + FILE ${TARGETS_EXPORT_NAME}.cmake + NAMESPACE OBS:: + DESTINATION Frameworks/${target}.framework/Resources/cmake + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) + + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${target}Config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/${target}ConfigVersion.cmake + DESTINATION + Frameworks/$.framework/Resources/cmake + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) +endfunction() + +# Helper function to install header files +function(install_headers target) + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/" + DESTINATION + $>,Frameworks/$.framework/Headers,${OBS_INCLUDE_DESTINATION}> + COMPONENT obs_libraries + EXCLUDE_FROM_ALL FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + PATTERN "cmake" EXCLUDE + PATTERN "pkgconfig" EXCLUDE + PATTERN "data" EXCLUDE) + + install( + FILES "${CMAKE_BINARY_DIR}/config/obsconfig.h" + DESTINATION + $>,Frameworks/$.framework/Headers,${OBS_INCLUDE_DESTINATION}> + COMPONENT obs_libraries + EXCLUDE_FROM_ALL) +endfunction() diff --git a/cmake/Modules/VersionConfig.cmake b/cmake/Modules/VersionConfig.cmake new file mode 100644 index 000000000..78a9146ca --- /dev/null +++ b/cmake/Modules/VersionConfig.cmake @@ -0,0 +1,103 @@ +set(OBS_COMPANY_NAME "OBS Project") +set(OBS_PRODUCT_NAME "OBS Studio") +set(OBS_WEBSITE "https://www.obsproject.com") +set(OBS_COMMENTS + "Free and open source software for video recording and live streaming") +set(OBS_LEGAL_COPYRIGHT "(C) Hugh Bailey") + +# Configure default version strings +set(_OBS_DEFAULT_VERSION "0" "0" "1") +set(_OBS_RELEASE_CANDIDATE "0" "0" "0" "0") +set(_OBS_BETA "0" "0" "0" "0") + +# Set full and canonical OBS version from current git tag or manual override +if(NOT DEFINED OBS_VERSION_OVERRIDE) + # Set release candidate version information Must be a string in the format of + # "x.x.x-rcx" + if(DEFINED RELEASE_CANDIDATE) + string(REPLACE "-rc" "." _OBS_RELEASE_CANDIDATE ${RELEASE_CANDIDATE}) + string(REPLACE "." ";" _OBS_VERSION ${RELEASE_CANDIDATE}) + string(REPLACE "." ";" _OBS_RELEASE_CANDIDATE ${_OBS_RELEASE_CANDIDATE}) + list(GET _OBS_RELEASE_CANDIDATE 0 1 2 _OBS_VERSION_CANONICAL) + # Set beta version information Must be a string in the format of + # "x.x.x-betax" + elseif(DEFINED BETA) + string(REPLACE "-beta" "." _OBS_BETA ${BETA}) + string(REPLACE "." ";" _OBS_VERSION ${BETA}) + string(REPLACE "." ";" _OBS_BETA ${_OBS_BETA}) + list(GET _OBS_BETA 0 1 2 _OBS_VERSION_CANONICAL) + elseif(EXISTS "${CMAKE_SOURCE_DIR}/.git") + execute_process( + COMMAND git describe --always --tags --dirty=-modified + OUTPUT_VARIABLE _OBS_VERSION + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE _OBS_VERSION_RESULT + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT _OBS_VERSION_RESULT EQUAL 0) + set(_OBS_VERSION "${_OBS_DEFAULT_VERSION}") + endif() + string(REPLACE "-" "." _CANONICAL_SPLIT ${_OBS_VERSION}) + string(REPLACE "." ";" _CANONICAL_SPLIT ${_CANONICAL_SPLIT}) + list(GET _CANONICAL_SPLIT 0 1 2 _OBS_VERSION_CANONICAL) + string(REPLACE "." ";" _OBS_VERSION ${_OBS_VERSION}) + else() + set(_OBS_VERSION ${_OBS_DEFAULT_VERSION}) + set(_OBS_VERSION_CANONICAL ${_OBS_DEFAULT_VERSION}) + endif() +else() + string(REPLACE "." ";" _OBS_VERSION "${OBS_VERSION_OVERRIDE}") + string(REPLACE "-" ";" _OBS_VERSION_CANONICAL "${OBS_VERSION_OVERRIDE}") + list(GET _OBS_VERSION_CANONICAL 0 _OBS_VERSION_CANONICAL) + string(REPLACE "." ";" _OBS_VERSION_CANONICAL "${_OBS_VERSION_CANONICAL}") +endif() + +list(GET _OBS_VERSION_CANONICAL 0 OBS_VERSION_MAJOR) +list(GET _OBS_VERSION_CANONICAL 1 OBS_VERSION_MINOR) +list(GET _OBS_VERSION_CANONICAL 2 OBS_VERSION_PATCH) +list(GET _OBS_RELEASE_CANDIDATE 0 OBS_RELEASE_CANDIDATE_MAJOR) +list(GET _OBS_RELEASE_CANDIDATE 1 OBS_RELEASE_CANDIDATE_MINOR) +list(GET _OBS_RELEASE_CANDIDATE 2 OBS_RELEASE_CANDIDATE_PATCH) +list(GET _OBS_RELEASE_CANDIDATE 3 OBS_RELEASE_CANDIDATE) +list(GET _OBS_BETA 0 OBS_BETA_MAJOR) +list(GET _OBS_BETA 1 OBS_BETA_MINOR) +list(GET _OBS_BETA 2 OBS_BETA_PATCH) +list(GET _OBS_BETA 3 OBS_BETA) + +string(REPLACE ";" "." OBS_VERSION_CANONICAL "${_OBS_VERSION_CANONICAL}") +string(REPLACE ";" "." OBS_VERSION "${_OBS_VERSION}") + +if(OBS_RELEASE_CANDIDATE GREATER 0) + message( + AUTHOR_WARNING + "******************************************************************************\n" + " + OBS-Studio - Release candidate detected, OBS_VERSION is now: ${OBS_VERSION}\n" + "******************************************************************************" + ) +elseif(OBS_BETA GREATER 0) + message( + AUTHOR_WARNING + "******************************************************************************\n" + " + OBS-Studio - Beta detected, OBS_VERSION is now: ${OBS_VERSION}\n" + "******************************************************************************" + ) +endif() + +# Define build number cache file +set(BUILD_NUMBER_CACHE + ${CMAKE_SOURCE_DIR}/cmake/.CMakeBuildNumber + CACHE INTERNAL "OBS build number cache file") + +# Read build number from cache file or manual override +if(NOT DEFINED OBS_BUILD_NUMBER AND EXISTS ${BUILD_NUMBER_CACHE}) + file(READ ${BUILD_NUMBER_CACHE} OBS_BUILD_NUMBER) + math(EXPR OBS_BUILD_NUMBER "${OBS_BUILD_NUMBER}+1") +elseif(NOT DEFINED OBS_BUILD_NUMBER) + set(OBS_BUILD_NUMBER "1") +endif() +file(WRITE ${BUILD_NUMBER_CACHE} "${OBS_BUILD_NUMBER}") + +message( + STATUS + "OBS: Application Version: ${OBS_VERSION} - Build Number: ${OBS_BUILD_NUMBER}" +) diff --git a/cmake/Modules/WIX.template.in b/cmake/Modules/WIX.template.in deleted file mode 100644 index 2eaa1965d..000000000 --- a/cmake/Modules/WIX.template.in +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - ProductIcon.ico - - - - - - - - - - - - - - - - diff --git a/CI/scripts/macos/app/AppIcon.icns b/cmake/bundle/macOS/AppIcon.icns similarity index 99% rename from CI/scripts/macos/app/AppIcon.icns rename to cmake/bundle/macOS/AppIcon.icns index b4cf117ed..2f742868f 100644 Binary files a/CI/scripts/macos/app/AppIcon.icns and b/cmake/bundle/macOS/AppIcon.icns differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_128x128.png b/cmake/bundle/macOS/AppIcon.iconset/icon_128x128.png new file mode 100644 index 000000000..9e3f1c345 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_128x128.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_128x128@2x.png b/cmake/bundle/macOS/AppIcon.iconset/icon_128x128@2x.png new file mode 100644 index 000000000..029dff2d6 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_128x128@2x.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_16x16.png b/cmake/bundle/macOS/AppIcon.iconset/icon_16x16.png new file mode 100644 index 000000000..77be12380 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_16x16.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_16x16@2x.png b/cmake/bundle/macOS/AppIcon.iconset/icon_16x16@2x.png new file mode 100644 index 000000000..97f34d8a6 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_16x16@2x.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_256x256.png b/cmake/bundle/macOS/AppIcon.iconset/icon_256x256.png new file mode 100644 index 000000000..2b264dde0 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_256x256.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_256x256@2x.png b/cmake/bundle/macOS/AppIcon.iconset/icon_256x256@2x.png new file mode 100644 index 000000000..bbe8f7d94 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_256x256@2x.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_32x32.png b/cmake/bundle/macOS/AppIcon.iconset/icon_32x32.png new file mode 100644 index 000000000..d04efcd37 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_32x32.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_32x32@2x.png b/cmake/bundle/macOS/AppIcon.iconset/icon_32x32@2x.png new file mode 100644 index 000000000..f542313e0 Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_32x32@2x.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_512x512.png b/cmake/bundle/macOS/AppIcon.iconset/icon_512x512.png new file mode 100644 index 000000000..920f8d8dc Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_512x512.png differ diff --git a/cmake/bundle/macOS/AppIcon.iconset/icon_512x512@2x.png b/cmake/bundle/macOS/AppIcon.iconset/icon_512x512@2x.png new file mode 100644 index 000000000..8dbac08ae Binary files /dev/null and b/cmake/bundle/macOS/AppIcon.iconset/icon_512x512@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..64dc11ee7 --- /dev/null +++ b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "filename" : "icon_16x16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "icon_16x16@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "icon_32x32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "icon_32x32@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "icon_128x128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "icon_128x128@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "icon_256x256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "icon_256x256@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "icon_512x512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "icon_512x512@2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128.png new file mode 100644 index 000000000..9e3f1c345 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png new file mode 100644 index 000000000..029dff2d6 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16.png new file mode 100644 index 000000000..77be12380 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png new file mode 100644 index 000000000..97f34d8a6 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256.png new file mode 100644 index 000000000..2b264dde0 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png new file mode 100644 index 000000000..bbe8f7d94 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32.png new file mode 100644 index 000000000..d04efcd37 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png new file mode 100644 index 000000000..f542313e0 Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512.png new file mode 100644 index 000000000..920f8d8dc Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png new file mode 100644 index 000000000..8dbac08ae Binary files /dev/null and b/cmake/bundle/macOS/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png differ diff --git a/cmake/bundle/macOS/Assets.xcassets/Contents.json b/cmake/bundle/macOS/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/cmake/bundle/macOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/cmake/bundle/macOS/Info.plist.in b/cmake/bundle/macOS/Info.plist.in new file mode 100644 index 000000000..18d4e6402 --- /dev/null +++ b/cmake/bundle/macOS/Info.plist.in @@ -0,0 +1,34 @@ + + + + + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + NSHighResolutionCapable + + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + LSAppNapIsDisabled + + NSCameraUsageDescription + OBS needs to access the camera to enable camera sources to work. + NSMicrophoneUsageDescription + OBS needs to access the microphone to enable audio input. + NSHumanReadableCopyright + (c) 2012-${CURRENT_YEAR} Hugh Bailey + + diff --git a/CI/scripts/macos/app/OBSPublicDSAKey.pem b/cmake/bundle/macOS/OBSPublicDSAKey.pem similarity index 100% rename from CI/scripts/macos/app/OBSPublicDSAKey.pem rename to cmake/bundle/macOS/OBSPublicDSAKey.pem diff --git a/cmake/bundle/macOS/Plugin-Info.plist.in b/cmake/bundle/macOS/Plugin-Info.plist.in new file mode 100644 index 000000000..be3690b75 --- /dev/null +++ b/cmake/bundle/macOS/Plugin-Info.plist.in @@ -0,0 +1,28 @@ + + + + + CFBundleName + ${MACOSX_PLUGIN_BUNDLE_NAME} + CFBundleIdentifier + ${MACOSX_PLUGIN_GUI_IDENTIFIER} + CFBundleVersion + ${MACOSX_PLUGIN_BUNDLE_VERSION} + CFBundleShortVersionString + ${MACOSX_PLUGIN_SHORT_VERSION_STRING} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleExecutable + ${MACOSX_PLUGIN_EXECUTABLE_NAME} + CFBundlePackageType + ${MACOSX_PLUGIN_BUNDLE_TYPE} + CFBundleSupportedPlatforms + + MacOSX + + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + (c) 2012-${CURRENT_YEAR} Hugh Bailey + + diff --git a/cmake/bundle/macOS/Virtualcam-Info.plist.in b/cmake/bundle/macOS/Virtualcam-Info.plist.in new file mode 100644 index 000000000..fdbfa72a4 --- /dev/null +++ b/cmake/bundle/macOS/Virtualcam-Info.plist.in @@ -0,0 +1,44 @@ + + + + + CFBundleName + ${MACOSX_PLUGIN_BUNDLE_NAME} + CFBundleIdentifier + ${MACOSX_PLUGIN_GUI_IDENTIFIER} + CFBundleVersion + ${MACOSX_PLUGIN_BUNDLE_VERSION} + CFBundleShortVersionString + ${MACOSX_PLUGIN_SHORT_VERSION_STRING} + CFBundleExecutable + obs-mac-virtualcam + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + ${MACOSX_PLUGIN_BUNDLE_TYPE} + CFBundleSupportedPlatforms + + MacOSX + + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + (c) 2012-${CURRENT_YEAR} Hugh Bailey + CFPlugInFactories + + 7E950B8C-5E49-4B9E-B7D0-B3608A08E8F6 + PlugInMain + + CFPlugInTypes + + 30010C1C-93BF-11D8-8B5B-000A95AF9C6A + + 7E950B8C-5E49-4B9E-B7D0-B3608A08E8F6 + + + CMIOHardwareAssistantServiceNames + + com.obsproject.obs-mac-virtualcam.server + + + diff --git a/CI/scripts/macos/package/background.tiff b/cmake/bundle/macOS/background.tiff similarity index 100% rename from CI/scripts/macos/package/background.tiff rename to cmake/bundle/macOS/background.tiff diff --git a/cmake/bundle/macOS/bundleutils.cmake b/cmake/bundle/macOS/bundleutils.cmake new file mode 100644 index 000000000..99a93981c --- /dev/null +++ b/cmake/bundle/macOS/bundleutils.cmake @@ -0,0 +1,187 @@ +if(POLICY CMP0007) + cmake_policy(SET CMP0007 NEW) +endif() +if(POLICY CMP0009) + cmake_policy(SET CMP0009 NEW) +endif() +if(POLICY CMP0011) + cmake_policy(SET CMP0011 NEW) +endif() + +# Add additional search paths for dylibbundler +list(APPEND _FIXUP_BUNDLES + "-s \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks\"") +list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/lib\"") +list(APPEND _FIXUP_BUNDLES "-s \"${CMAKE_INSTALL_PREFIX}/Frameworks\"") + +foreach(_PREFIX_PATH IN LISTS _DEPENDENCY_PREFIX) + list(APPEND _FIXUP_BUNDLES "-s \"${_PREFIX_PATH}/lib\"") + file(GLOB _DYLIBS "${_PREFIX_PATH}/lib/*.dylib") + file( + COPY ${_DYLIBS} + DESTINATION ${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks + FOLLOW_SYMLINK_CHAIN) + unset(_DYLIBS) +endforeach() + +# Unlinked modules need to be supplied manually to dylibbundler + +# Find all modules (plugin and standalone) +file(GLOB _OBS_PLUGINS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.plugin") +file(GLOB _OBS_SCRIPTING_PLUGINS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.so") + +# Add modules to fixups +foreach(_OBS_PLUGIN IN LISTS _OBS_PLUGINS) + get_filename_component(PLUGIN_NAME "${_OBS_PLUGIN}" NAME_WLE) + list(APPEND _FIXUP_BUNDLES + "-x \"${_OBS_PLUGIN}/Contents/MacOS/${PLUGIN_NAME}\"") +endforeach() + +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux") + list( + APPEND + _FIXUP_BUNDLES + "-x \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux\"" + ) +endif() + +# Add scripting modules to fixups +foreach(_OBS_PLUGIN IN LISTS _OBS_SCRIPTING_PLUGINS) + list(APPEND _FIXUP_BUNDLES "-x \"${_OBS_PLUGIN}\"") +endforeach() + +# Run dylibbbundler +if(DEFINED ENV{VERBOSE}) + set(_VERBOSE_FLAG "--verbose") +endif() + +if(DEFINED ENV{QUIET}) + set(_QUIET_FLAG "OUTPUT_QUIET") +endif() + +list(REMOVE_DUPLICATES _FIXUP_BUNDLES) +string(REPLACE ";" " " _FIXUP_BUNDLES "${_FIXUP_BUNDLES}") +message(STATUS "OBS: Bundle linked libraries and dependencies") +execute_process( + COMMAND + /bin/sh -c + "${_BUNDLER_COMMAND} -a \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}\" -cd -of -q -f ${_FIXUP_BUNDLES} ${_VERBOSE_FLAG}" + ${_QUIET_FLAG}) + +# Find all dylibs, frameworks and other code elements inside bundle +file(GLOB _DYLIBS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.dylib") +file(GLOB _FRAMEWORKS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/*.framework") +file(GLOB_RECURSE _QT_PLUGINS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/*.dylib") + +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux") + list(APPEND _OTHER_BINARIES + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/MacOS/obs-ffmpeg-mux") +endif() + +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/obspython.py") + list(APPEND _OTHER_BINARIES + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/obspython.py") +endif() + +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin" +) + list( + APPEND + _OTHER_BINARIES + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Resources/obs-mac-virtualcam.plugin" + ) +endif() + +# Create libobs symlink for legacy plugin support +execute_process( + COMMAND + /bin/sh -c + "cd \"${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks\" && ln -fs libobs.framework/Versions/Current/libobs libobs.0.dylib && ln -fsv libobs.framework/Versions/Current/libobs libobs.dylib" + ${_QUIET_FLAG}) + +# Python potentially leaves __pycache__ directories inside the bundle which will +# break codesigning +if(EXISTS "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__") + file(REMOVE_RECURSE + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/PlugIns/__pycache__") +endif() + +# Codesign all binaries inside-out +message(STATUS "OBS: Codesign dependencies") +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework" +) + execute_process( + COMMAND + /usr/bin/codesign --remove-signature + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app" + ${_VERBOSE_FLAG} ${_QUIET_FLAG}) + execute_process( + COMMAND + /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --deep --options + runtime + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app" + ${_VERBOSE_FLAG} ${_QUIET_FLAG}) +endif() +if(EXISTS + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/Chromium Embedded Framework.framework" +) + set(CEF_HELPER_OUTPUT_NAME "OBS Helper") + set(CEF_HELPER_APP_SUFFIXES ":" " (GPU):.gpu" " (Plugin):.plugin" + " (Renderer):.renderer") + + foreach(_SUFFIXES ${CEF_HELPER_APP_SUFFIXES}) + string(REPLACE ":" ";" _SUFFIXES ${_SUFFIXES}) + list(GET _SUFFIXES 0 _NAME_SUFFIX) + list(GET _SUFFIXES 1 _PLIST_SUFFIX) + + set(_HELPER_OUTPUT_NAME "${CEF_HELPER_OUTPUT_NAME}${_NAME_SUFFIX}") + set(_HELPER_ENTITLEMENT_PLIST "entitlements-helper${_PLIST_SUFFIX}.plist") + + execute_process( + COMMAND + /usr/bin/codesign --remove-signature + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app" + ${_VERBOSE_FLAG} ${_QUIET_FLAG}) + execute_process( + COMMAND + /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --deep + --options runtime --entitlements + "${_CODESIGN_ENTITLEMENTS}/entitlements-helper${_PLIST_SUFFIX}.plist" + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}/Contents/Frameworks/OBS Helper${_NAME_SUFFIX}.app" + ${_VERBOSE_FLAG} ${_QUIET_FLAG}) + endforeach() +endif() +foreach(_DEPENDENCY IN LISTS _OTHER_BINARIES _DYLIBS _FRAMEWORKS _OBS_PLUGINS + _OBS_SCRIPTING_PLUGINS _QT_PLUGINS) + if(NOT IS_SYMLINK "${_DEPENDENCY}") + execute_process(COMMAND /usr/bin/codesign --remove-signature + "${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG}) + execute_process( + COMMAND + /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options + runtime --entitlements "${_CODESIGN_ENTITLEMENTS}/entitlements.plist" + "${_DEPENDENCY}" ${_VERBOSE_FLAG} ${_QUIET_FLAG}) + endif() +endforeach() + +# Codesign main app +message(STATUS "OBS: Codesign main app") +execute_process( + COMMAND + /usr/bin/codesign --remove-signature + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG} ${_QUIET_FLAG}) +execute_process( + COMMAND + /usr/bin/codesign --force --sign "${_CODESIGN_IDENTITY}" --options runtime + --entitlements "${_CODESIGN_ENTITLEMENTS}/entitlements.plist" + "${CMAKE_INSTALL_PREFIX}/${_BUNDLENAME}" ${_VERBOSE_FLAG} ${_QUIET_FLAG}) diff --git a/cmake/bundle/macOS/dylibbundler b/cmake/bundle/macOS/dylibbundler new file mode 100755 index 000000000..20f9836ad Binary files /dev/null and b/cmake/bundle/macOS/dylibbundler differ diff --git a/CI/scripts/macos/helpers/helper-gpu-entitlements.plist b/cmake/bundle/macOS/entitlements-helper.gpu.plist similarity index 73% rename from CI/scripts/macos/helpers/helper-gpu-entitlements.plist rename to cmake/bundle/macOS/entitlements-helper.gpu.plist index ac08c81b7..a7a497451 100644 --- a/CI/scripts/macos/helpers/helper-gpu-entitlements.plist +++ b/cmake/bundle/macOS/entitlements-helper.gpu.plist @@ -2,7 +2,9 @@ + com.apple.security.cs.disable-library-validation + com.apple.security.cs.allow-jit - \ No newline at end of file + diff --git a/CI/scripts/macos/helpers/helper-entitlements.plist b/cmake/bundle/macOS/entitlements-helper.plist similarity index 97% rename from CI/scripts/macos/helpers/helper-entitlements.plist rename to cmake/bundle/macOS/entitlements-helper.plist index 22d3b9cc5..4228cf176 100644 --- a/CI/scripts/macos/helpers/helper-entitlements.plist +++ b/cmake/bundle/macOS/entitlements-helper.plist @@ -9,4 +9,4 @@ com.apple.security.cs.allow-jit - \ No newline at end of file + diff --git a/CI/scripts/macos/helpers/helper-plugin-entitlements.plist b/cmake/bundle/macOS/entitlements-helper.plugin.plist similarity index 97% rename from CI/scripts/macos/helpers/helper-plugin-entitlements.plist rename to cmake/bundle/macOS/entitlements-helper.plugin.plist index d56643431..7cd9df032 100644 --- a/CI/scripts/macos/helpers/helper-plugin-entitlements.plist +++ b/cmake/bundle/macOS/entitlements-helper.plugin.plist @@ -7,4 +7,4 @@ com.apple.security.cs.disable-library-validation - \ No newline at end of file + diff --git a/CI/scripts/macos/helpers/helper-renderer-entitlements.plist b/cmake/bundle/macOS/entitlements-helper.renderer.plist similarity index 73% rename from CI/scripts/macos/helpers/helper-renderer-entitlements.plist rename to cmake/bundle/macOS/entitlements-helper.renderer.plist index ac08c81b7..777b3abd9 100644 --- a/CI/scripts/macos/helpers/helper-renderer-entitlements.plist +++ b/cmake/bundle/macOS/entitlements-helper.renderer.plist @@ -4,5 +4,7 @@ com.apple.security.cs.allow-jit + com.apple.security.cs.disable-library-validation + - \ No newline at end of file + diff --git a/CI/scripts/macos/app/entitlements.plist b/cmake/bundle/macOS/entitlements.plist similarity index 100% rename from CI/scripts/macos/app/entitlements.plist rename to cmake/bundle/macOS/entitlements.plist diff --git a/cmake/bundle/macOS/package.applescript.in b/cmake/bundle/macOS/package.applescript.in new file mode 100644 index 000000000..4f424df78 --- /dev/null +++ b/cmake/bundle/macOS/package.applescript.in @@ -0,0 +1,66 @@ +on run (volumeName) + tell application "Finder" + tell disk (volumeName as string) + open + + set theXOrigin to @_DMG_WINDOW_X@ + set theYOrigin to @_DMG_WINDOW_Y@ + set theWidth to @_DMG_WINDOW_WIDTH@ + set theHeight to @_DMG_WINDOW_HEIGHT@ + + set theBottomRightX to (theXOrigin + theWidth) + set theBottomRightY to (theYOrigin + theHeight) + set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" + + tell container window + set current view to icon view + set toolbar visible to false + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + set statusbar visible to false + set position of every item to {theBottomRightX + 100, 100} + end tell + + set opts to the icon view options of container window + tell opts + set icon size to @_DMG_ICON_SIZE@ + set text size to @_DMG_TEXT_SIZE@ + set arrangement to not arranged + end tell + set background picture of opts to file ".background:@CPACK_DMG_BACKGROUND_FILENAME@" + set position of item "@CPACK_PACKAGE_NAME@.app" to {@_DMG_OBS_X@, @_DMG_OBS_Y@} + set position of item "Applications" to {@_DMG_APP_LINK_X@, @_DMG_APP_LINK_Y@} + close + open + -- Force saving of the size + delay 1 + + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} + end tell + end tell + + delay 1 + + tell disk (volumeName as string) + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + end tell + end tell + + --give the finder some time to write the .DS_Store file + delay 3 + + set waitTime to 0 + set ejectMe to false + repeat while ejectMe is false + delay 1 + set waitTime to waitTime + 1 + + if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true + end repeat + log "waited " & waitTime & " seconds for .DS_STORE to be created." + end tell +end run diff --git a/cmake/ALL_BUILD.vcxproj.user.in b/cmake/bundle/windows/ALL_BUILD.vcxproj.user.in similarity index 100% rename from cmake/ALL_BUILD.vcxproj.user.in rename to cmake/bundle/windows/ALL_BUILD.vcxproj.user.in diff --git a/cmake/winrc/obs-module.rc.in b/cmake/bundle/windows/obs-module.rc.in similarity index 100% rename from cmake/winrc/obs-module.rc.in rename to cmake/bundle/windows/obs-module.rc.in diff --git a/cmake/winrc/obs-studio.ico b/cmake/bundle/windows/obs-studio.ico similarity index 100% rename from cmake/winrc/obs-studio.ico rename to cmake/bundle/windows/obs-studio.ico diff --git a/cmake/copy_helper.cmake b/cmake/copy_helper.cmake deleted file mode 100644 index d76e821ea..000000000 --- a/cmake/copy_helper.cmake +++ /dev/null @@ -1,17 +0,0 @@ - -if(NOT EXISTS "${INPUT}") - return() -endif() - -set(_do_pass FALSE) -foreach(target ${TARGET_CONFIGS}) - if(target STREQUAL "${CONFIG}" OR target STREQUAL "ALL") - set(_do_pass TRUE) - endif() -endforeach() - -if(NOT _do_pass) - return() -endif() - -file(COPY "${INPUT}" DESTINATION "${OUTPUT}") diff --git a/cmake/copy_on_debug_helper.cmake b/cmake/copy_on_debug_helper.cmake deleted file mode 100644 index dc28b9eac..000000000 --- a/cmake/copy_on_debug_helper.cmake +++ /dev/null @@ -1,7 +0,0 @@ -string(REGEX REPLACE "\\.(dll|exe)$" ".pdb" FNAME "${FNAME}") - -if(CONFIG STREQUAL Debug OR CONFIG STREQUAL RelWithDebInfo) - file(COPY "${INPUT}/${FNAME}" DESTINATION "${OUTPUT}") -elseif(EXISTS "${OUTPUT}/${FNAME}") - file(REMOVE "${OUTPUT}/${FNAME}") -endif() diff --git a/cmake/external/FindLibobs.cmake b/cmake/external/FindLibobs.cmake deleted file mode 100644 index ab0a3deaf..000000000 --- a/cmake/external/FindLibobs.cmake +++ /dev/null @@ -1,107 +0,0 @@ -# This module can be copied and used by external plugins for OBS -# -# Once done these will be defined: -# -# LIBOBS_FOUND -# LIBOBS_INCLUDE_DIRS -# LIBOBS_LIBRARIES - -find_package(PkgConfig QUIET) -if (PKG_CONFIG_FOUND) - pkg_check_modules(_OBS QUIET obs libobs) -endif() - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_lib_suffix 64) -else() - set(_lib_suffix 32) -endif() - -if(DEFINED CMAKE_BUILD_TYPE) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(_build_type_base "debug") - else() - set(_build_type_base "release") - endif() -endif() - -find_path(LIBOBS_INCLUDE_DIR - NAMES obs.h - HINTS - ENV obsPath${_lib_suffix} - ENV obsPath - ${obsPath} - PATHS - /usr/include /usr/local/include /opt/local/include /sw/include - PATH_SUFFIXES - libobs - ) - -function(find_obs_lib base_name repo_build_path lib_name) - string(TOUPPER "${base_name}" base_name_u) - - if(DEFINED _build_type_base) - set(_build_type_${repo_build_path} "${_build_type_base}/${repo_build_path}") - set(_build_type_${repo_build_path}${_lib_suffix} "${_build_type_base}${_lib_suffix}/${repo_build_path}") - endif() - - find_library(${base_name_u}_LIB - NAMES ${_${base_name_u}_LIBRARIES} ${lib_name} lib${lib_name} - HINTS - ENV obsPath${_lib_suffix} - ENV obsPath - ${obsPath} - ${_${base_name_u}_LIBRARY_DIRS} - PATHS - /usr/lib /usr/local/lib /opt/local/lib /sw/lib - PATH_SUFFIXES - lib${_lib_suffix} lib - libs${_lib_suffix} libs - bin${_lib_suffix} bin - ../lib${_lib_suffix} ../lib - ../libs${_lib_suffix} ../libs - ../bin${_lib_suffix} ../bin - # base repo non-msvc-specific search paths - ${_build_type_${repo_build_path}} - ${_build_type_${repo_build_path}${_lib_suffix}} - build/${repo_build_path} - build${_lib_suffix}/${repo_build_path} - # base repo msvc-specific search paths on windows - build${_lib_suffix}/${repo_build_path}/Debug - build${_lib_suffix}/${repo_build_path}/RelWithDebInfo - build/${repo_build_path}/Debug - build/${repo_build_path}/RelWithDebInfo - ) -endfunction() - -find_obs_lib(LIBOBS libobs obs) - -if(MSVC) - find_obs_lib(W32_PTHREADS deps/w32-pthreads w32-pthreads) -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Libobs DEFAULT_MSG LIBOBS_LIB LIBOBS_INCLUDE_DIR) -mark_as_advanced(LIBOBS_INCLUDE_DIR LIBOBS_LIB) - -if(LIBOBS_FOUND) - if(MSVC) - if (NOT DEFINED W32_PTHREADS_LIB) - message(FATAL_ERROR "Could not find the w32-pthreads library" ) - endif() - - set(W32_PTHREADS_INCLUDE_DIR ${LIBOBS_INCLUDE_DIR}/../deps/w32-pthreads) - endif() - - set(LIBOBS_INCLUDE_DIRS ${LIBOBS_INCLUDE_DIR} ${W32_PTHREADS_INCLUDE_DIR}) - set(LIBOBS_LIBRARIES ${LIBOBS_LIB} ${W32_PTHREADS_LIB}) - include(${LIBOBS_INCLUDE_DIR}/../cmake/external/ObsPluginHelpers.cmake) - - # allows external plugins to easily use/share common dependencies that are often included with libobs (such as FFmpeg) - if(NOT DEFINED INCLUDED_LIBOBS_CMAKE_MODULES) - set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${LIBOBS_INCLUDE_DIR}/../cmake/Modules/") - set(INCLUDED_LIBOBS_CMAKE_MODULES true) - endif() -else() - message(FATAL_ERROR "Could not find the libobs library" ) -endif() diff --git a/cmake/external/ObsPluginHelpers.cmake b/cmake/external/ObsPluginHelpers.cmake index b0651dc3b..60bf9eb75 100644 --- a/cmake/external/ObsPluginHelpers.cmake +++ b/cmake/external/ObsPluginHelpers.cmake @@ -1,163 +1,373 @@ -# Functions for generating external plugins +if(POLICY CMP0087) + cmake_policy(SET CMP0087 NEW) +endif() -set(EXTERNAL_PLUGIN_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") +set(OBS_STANDALONE_PLUGIN_DIR "${CMAKE_SOURCE_DIR}/release") -# Fix XCode includes to ignore warnings on system includes -function(target_include_directories_system _target) - if(XCODE) - foreach(_arg ${ARGN}) - if("${_arg}" STREQUAL "PRIVATE" OR "${_arg}" STREQUAL "PUBLIC" OR "${_arg}" STREQUAL "INTERFACE") - set(_scope ${_arg}) - else() - target_compile_options(${_target} ${_scope} -isystem${_arg}) - endif() - endforeach() - else() - target_include_directories(${_target} SYSTEM ${_scope} ${ARGN}) +include(GNUInstallDirs) +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") + set(OS_MACOS ON) + set(OS_POSIX ON) +elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux|FreeBSD|OpenBSD") + set(OS_POSIX ON) + string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U) + set(OS_${_SYSTEM_NAME_U} ON) +elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + set(OS_WINDOWS ON) + set(OS_POSIX OFF) +endif() + +# Old-Style plugin detected, find "modern" libobs variant instead and set global +# include directories to fix "bad" plugin behavior +if(DEFINED LIBOBS_INCLUDE_DIR AND NOT TARGET OBS::libobs) + message( + DEPRECATION + "You are using an outdated method of adding 'libobs' to your project. Refer to the updated wiki on how to build and export 'libobs' and use it in your plugin projects." + ) + find_package(libobs REQUIRED) + if(TARGET OBS::libobs) + set_target_properties(OBS::libobs PROPERTIES IMPORTED_GLOBAL TRUE) + message(STATUS "OBS: Using modern libobs target") + + add_library(libobs ALIAS OBS::libobs) + if(OS_WINDOWS) + add_library(w32-pthreads ALIAS OBS::w32-pthreads) + endif() endif() -endfunction() +endif() -function(install_external_plugin_data_internal target source_dir target_dir) - install(DIRECTORY ${source_dir}/ - DESTINATION "${target}/${target_dir}" - USE_SOURCE_PERMISSIONS) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}" "${EXTERNAL_PLUGIN_OUTPUT_DIR}/$/${target}/${target_dir}" - VERBATIM) -endfunction() +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND (OS_WINDOWS OR OS_MACOS)) + set(CMAKE_INSTALL_PREFIX + "${OBS_STANDALONE_PLUGIN_DIR}" + CACHE STRING "Directory to install OBS plugin after building" FORCE) +endif() -# Installs data -# 'target' is the destination target project being installed to -# 'data_loc' specifies the directory of the data -function(install_external_plugin_data target data_loc) - install_external_plugin_data_internal(${target} ${data_loc} "data") -endfunction() +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE + "RelWithDebInfo" + CACHE STRING + "OBS build type [Release, RelWithDebInfo, Debug, MinSizeRel]" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release RelWithDebInfo + Debug MinSizeRel) +endif() -# Installs data in an architecture-specific data directory on windows/linux (data/32bit or data/64bit). Does not apply for mac. -# 'target' is the destination target project being installed to -# 'data_loc' specifies the directory of the data being installed -function(install_external_plugin_arch_data target data_loc) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "/64bit") - else() - set(_bit_suffix "/32bit") - endif() +file(RELATIVE_PATH RELATIVE_INSTALL_PATH "${CMAKE_SOURCE_DIR}" + "${CMAKE_INSTALL_PREFIX}") +file(RELATIVE_PATH RELATIVE_BUILD_PATH "${CMAKE_SOURCE_DIR}" + "${CMAKE_BINARY_DIR}") - install_external_plugin_data_internal(${target} ${data_loc} "data${_bit_suffix}") -endfunction() +# Set up OS-specific environment and helper functions +if(OS_MACOS) + if(NOT CMAKE_OSX_ARCHITECTURES) + set(CMAKE_OSX_ARCHITECTURES + "x86_64" + CACHE + STRING + "OBS plugin build architecture for macOS - x86_64 required at least" + FORCE) + endif() -# Installs data in the target's bin directory -# 'target' is the destination target project being installed to -# 'data_loc' specifies the directory of the data being installed -function(install_external_plugin_data_to_bin target data_loc) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "/64bit") - else() - set(_bit_suffix "/32bit") - endif() + if(NOT CMAKE_OSX_DEPLOYMENT_TARGET) + set(CMAKE_OSX_DEPLOYMENT_TARGET + "10.13" + CACHE STRING "OBS plugin deployment target for macOS - 10.13+ required" + FORCE) + endif() - install_external_plugin_data_internal(${target} ${data_loc} "bin${_bit_suffix}") -endfunction() + if(NOT DEFINED OBS_CODESIGN_LINKER) + set(OBS_CODESIGN_LINKER + ON + CACHE BOOL "Enable linker code-signing on macOS (macOS 11+ required" + FORCE) + endif() -# Installs an additional binary to a target -# 'target' is the destination target project being installed to -# 'additional_target' specifies the additional binary -function(install_external_plugin_additional target additional_target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() + if(NOT DEFINED OBS_BUNDLE_CODESIGN_IDENTITY) + set(OBS_BUNDLE_CODESIGN_IDENTITY + "-" + CACHE STRING "Codesign identity for macOS" FORCE) + endif() - set_target_properties(${additional_target} PROPERTIES - PREFIX "") + # Xcode configuration + if(XCODE) + # Tell Xcode to pretend the linker signed binaries so that editing with + # install_name_tool preserves ad-hoc signatures. This option is supported by + # `codesign` on macOS 11 or higher. + # + # See CMake Issue 21854: + # (https://gitlab.kitware.com/cmake/cmake/-/issues/21854). - install(TARGETS ${additional_target} - LIBRARY DESTINATION "bin" - RUNTIME DESTINATION "bin") - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${EXTERNAL_PLUGIN_OUTPUT_DIR}/$/${target}/bin/${_bit_suffix}$" - VERBATIM) -endfunction() + set(CMAKE_XCODE_GENERATE_SCHEME ON) + if(OBS_CODESIGN_LINKER) + set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed") + endif() + endif() -# Installs the binary of the target -# 'target' is the target project being installed -function(install_external_plugin target) - install_external_plugin_additional(${target} ${target}) -endfunction() + # Set default options for bundling on macOS + set(CMAKE_MACOSX_RPATH ON) + set(CMAKE_SKIP_BUILD_RPATH OFF) + set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF) + set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks/") + set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF) -# Installs the binary and data of the target -# 'target' is the destination target project being installed to -function(install_external_plugin_with_data target data_loc) - install_external_plugin(${target}) - install_external_plugin_data(${target} ${data_loc}) -endfunction() + function(setup_plugin_target target) + if(NOT DEFINED MACOSX_PLUGIN_GUI_IDENTIFIER) + message( + FATAL_ERROR + "No 'MACOSX_PLUGIN_GUI_IDENTIFIER' set, but is required to build plugin bundles on macOS - example: 'com.yourname.pluginname'" + ) + endif() -# Installs an additional binary to the data of a target -# 'target' is the destination target project being installed to -# 'additional_target' specifies the additional binary -function(install_external_plugin_bin_to_data target additional_target) - install(TARGETS ${additional_target} - LIBRARY DESTINATION "data" - RUNTIME DESTINATION "data") - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${EXTERNAL_PLUGIN_OUTPUT_DIR}/$/${target}/data/$" - VERBATIM) -endfunction() + if(NOT DEFINED MACOSX_PLUGIN_BUNDLE_VERSION) + message( + FATAL_ERROR + "No 'MACOSX_PLUGIN_BUNDLE_VERSION' set, but is required to build plugin bundles on macOS - example: '25'" + ) + endif() -# Installs an additional binary in an architecture-specific data directory on windows/linux (data/32bit or data/64bit). Does not apply for mac. -# 'target' is the destination target project being installed to -# 'additional_target' specifies the additional binary -function(install_external_plugin_bin_to_arch_data target additional_target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "/64bit") - else() - set(_bit_suffix "/32bit") - endif() + if(NOT DEFINED MACOSX_PLUGIN_SHORT_VERSION_STRING) + message( + FATAL_ERROR + "No 'MACOSX_PLUGIN_SHORT_VERSION_STRING' set, but is required to build plugin bundles on macOS - example: '1.0.2'" + ) + endif() - install(TARGETS ${additional_target} - LIBRARY DESTINATION "data${_bit_suffix}" - RUNTIME DESTINATION "data${_bit_suffix}") - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${EXTERNAL_PLUGIN_OUTPUT_DIR}/$/${target}/data${_bit_suffix}/$" - VERBATIM) -endfunction() + set(MACOSX_PLUGIN_BUNDLE_NAME + "${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_BUNDLE_VERSION + "${MACOSX_BUNDLE_BUNDLE_VERSION}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_SHORT_VERSION_STRING + "${MACOSX_BUNDLE_SHORT_VERSION_STRING}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_EXECUTABLE_NAME + "${target}" + PARENT_SCOPE) + set(MACOSX_PLUGIN_BUNDLE_TYPE + "BNDL" + PARENT_SCOPE) -# Installs an additional file in an architecture-specific data directory on windows/linux (data/32bit or data/64bit). Does not apply for mac. -# 'target' is the destination target project being installed to -# 'additional_target' specifies the additional binary -function(install_external_plugin_data_file_to_arch_data target additional_target file_target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "/64bit") - else() - set(_bit_suffix "/32bit") - endif() + install( + TARGETS ${target} + LIBRARY DESTINATION "." + COMPONENT obs_plugins + NAMELINK_COMPONENT ${target}_Development) - get_filename_component(file_target_name ${file_target} NAME) + set(_COMMAND + "${CMAKE_INSTALL_NAME_TOOL} \\ + -change ${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets @rpath/QtWidgets.framework/Versions/5/QtWidgets \\ + -change ${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore @rpath/QtCore.framework/Versions/5/QtCore \\ + -change ${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui @rpath/QtGui.framework/Versions/5/QtGui \\ + \\\"\${CMAKE_INSTALL_PREFIX}/${target}.plugin/Contents/MacOS/${target}\\\"" + ) + install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")" + COMPONENT obs_plugins) - install(TARGETS ${additional_target} - LIBRARY DESTINATION "data${_bit_suffix}" - RUNTIME DESTINATION "data${_bit_suffix}") - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${file_target}" - "${EXTERNAL_PLUGIN_OUTPUT_DIR}/$/${target}/data${_bit_suffix}/${file_target_name}" - VERBATIM) -endfunction() + if(NOT XCODE) + set(_COMMAND + "/usr/bin/codesign --force \\ + --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" \\ + --options runtime \\ + --entitlements \\\"${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/entitlements.plist\\\" \\ + \\\"${CMAKE_INSTALL_PREFIX}/${target}.plugin\\\"") + install(CODE "execute_process(COMMAND /bin/sh -c \"${_COMMAND}\")" + COMPONENT obs_plugins) + endif() + + set_target_properties( + ${target} + PROPERTIES + BUNDLE ON + BUNDLE_EXTENSION "plugin" + OUTPUT_NAME ${target} + MACOSX_BUNDLE_INFO_PLIST + "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/Plugin-Info.plist.in" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER + "${MACOSX_PLUGIN_GUI_IDENTIFIER}" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${OBS_BUNDLE_CODESIGN_IDENTITY}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS + "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/entitlements.plist") + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + /bin/sh -c + "codesign --force --sign \"-\" $<$:--options linker-signed >\"$\"" + COMMENT "Codesigning ${target}" + VERBATIM) + + install_bundle_resources(${target}) + endfunction() + + function(install_bundle_resources target) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data") + file(GLOB_RECURSE _DATA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/data/*") + foreach(_DATA_FILE IN LISTS _DATA_FILES) + file(RELATIVE_PATH _RELATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/data/ + ${_DATA_FILE}) + get_filename_component(_RELATIVE_PATH "${_RELATIVE_PATH}" PATH) + target_sources(${target} PRIVATE ${_DATA_FILE}) + set_source_files_properties( + ${_DATA_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION + "Resources/${_RELATIVE_PATH}") + string(REPLACE "\\" "\\\\" _GROUP_NAME "${_RELATIVE_PATH}") + source_group("Resources\\${_GROUP_NAME}" FILES ${_DATA_FILE}) + endforeach() + endif() + endfunction() +else() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(_ARCH_SUFFIX 64) + else() + set(_ARCH_SUFFIX 32) + endif() + set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir") + + if(OS_POSIX) + option(LINUX_PORTABLE "Build portable version (Linux)" OFF) + if(NOT LINUX_PORTABLE) + set(OBS_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}") + set(OBS_PLUGIN_DESTINATION "${OBS_LIBRARY_DESTINATION}/obs-plugins") + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") + set(OBS_DATA_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/obs") + else() + set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit") + set(CMAKE_INSTALL_RPATH + "$ORIGIN/" "${CMAKE_INSTALL_PREFIX}/${OBS_LIBRARY_DESTINATION}") + set(OBS_DATA_DESTINATION "data") + endif() + + if(OS_LINUX) + set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${LINUX_MAINTAINER_EMAIL}") + set(CPACK_PACKAGE_VERSION "${CMAKE_PROJECT_VERSION}") + + set(CPACK_GENERATOR "DEB") + set(CPACK_DEBIAN_PACKAGE_DEPENDS + "obs-studio (>= 27.0.0), libqt5core5a (>= 5.9.0~beta), libqt5gui5 (>= 5.3.0), libqt5widgets5 (>= 5.7.0)" + ) + + if(NOT LINUX_PORTABLE) + set(CPACK_SET_DESTDIR ON) + endif() + include(CPack) + endif() + else() + set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit") + set(OBS_LIBRARY32_DESTINATION "bin/32bit") + set(OBS_LIBRARY64_DESTINATION "bin/64bit") + set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit") + set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit") + set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit") + + set(OBS_DATA_DESTINATION "data") + endif() + + function(setup_plugin_target target) + set_target_properties(${target} PROPERTIES PREFIX "") + + install( + TARGETS ${target} + RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}" + COMPONENT ${target}_Runtime + LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}" + COMPONENT ${target}_Runtime + NAMELINK_COMPONENT ${target}_Development) + + install( + FILES "$" + DESTINATION "$/${OBS_PLUGIN_DESTINATION}" + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + + if(OS_WINDOWS) + install( + FILES "$" + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION "$/${OBS_PLUGIN_DESTINATION}" + COMPONENT obs_rundir + OPTIONAL EXCLUDE_FROM_ALL) + endif() + + if(MSVC) + target_link_options( + ${target} + PRIVATE + "LINKER:/OPT:REF" + "$<$>:LINKER\:/SAFESEH\:NO>" + "$<$:LINKER\:/INCREMENTAL:NO>" + "$<$:LINKER\:/INCREMENTAL:NO>") + endif() + + setup_target_resources("${target}" "obs-plugins/${target}") + + if(OS_WINDOWS AND DEFINED OBS_BUILD_DIR) + setup_target_for_testing(${target}) + endif() + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -DCMAKE_INSTALL_PREFIX=${OBS_OUTPUT_DIR} + -DCMAKE_INSTALL_COMPONENT=obs_rundir + -DCMAKE_INSTALL_CONFIG_NAME=$ -P + ${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake + COMMENT "Installing to plugin rundir" + VERBATIM) + endfunction() + + function(setup_target_resources target destination) + if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data") + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/" + DESTINATION "${OBS_DATA_DESTINATION}/${destination}" + USE_SOURCE_PERMISSIONS + COMPONENT obs_plugins) + + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data" + DESTINATION "$/${OBS_DATA_DESTINATION}/${destination}" + USE_SOURCE_PERMISSIONS + COMPONENT obs_rundir + EXCLUDE_FROM_ALL) + endif() + endfunction() + + if(OS_WINDOWS) + function(setup_target_for_testing target) + install( + FILES "$" + DESTINATION "$/${OBS_PLUGIN_DESTINATION}" + COMPONENT obs_testing + EXCLUDE_FROM_ALL) + + install( + FILES "$" + CONFIGURATIONS "RelWithDebInfo" "Debug" + DESTINATION "$/${OBS_PLUGIN_DESTINATION}" + COMPONENT obs_testing + OPTIONAL EXCLUDE_FROM_ALL) + + install( + DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data" + DESTINATION "$/${OBS_DATA_DESTINATION}/${destination}" + USE_SOURCE_PERMISSIONS + COMPONENT obs_testing + EXCLUDE_FROM_ALL) + + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -DCMAKE_INSTALL_PREFIX=${OBS_BUILD_DIR}/rundir + -DCMAKE_INSTALL_COMPONENT=obs_testing + -DCMAKE_INSTALL_CONFIG_NAME=$ -P + ${CMAKE_CURRENT_BINARY_DIR}/cmake_install.cmake + COMMENT "Installing to OBS test directory" + VERBATIM) + endfunction() + endif() +endif() diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt index bd93a6e80..cfc8c1c01 100644 --- a/deps/CMakeLists.txt +++ b/deps/CMakeLists.txt @@ -1,39 +1,27 @@ +if(OS_WINDOWS) + if(NOT MINGW) + add_subdirectory(w32-pthreads) + endif() + add_subdirectory(ipc-util) -if(NOT MINGW) -add_subdirectory(w32-pthreads) + add_subdirectory(blake2) + add_subdirectory(lzma) endif() add_subdirectory(glad) -add_subdirectory(ipc-util) - -if(BUILD_LIBFF) - add_subdirectory(libff) -endif() - add_subdirectory(media-playback) add_subdirectory(file-updater) add_subdirectory(obs-scripting) add_subdirectory(opts-parser) - -if(WIN32) - add_subdirectory(blake2) - add_subdirectory(lzma) -endif() - add_subdirectory(libcaption) +# Use bundled jansson version as fallback find_package(Jansson 2.5 QUIET) +if(NOT TARGET Jansson::Jansson) + message(STATUS "OBS: Jansson >=2.5 not found, building bundled version") -if(NOT JANSSON_FOUND) - message(STATUS "Jansson >=2.5 not found, building bundled version") - - add_subdirectory(jansson) - - set(OBS_JANSSON_IMPORT "jansson" CACHE INTERNAL "Internal var") - set(OBS_JANSSON_INCLUDE_DIRS "" CACHE INTERNAL "Internal var") + add_subdirectory(jansson) + add_library(Jansson::Jansson ALIAS jansson) else() - message(STATUS "Using system Jansson library") - - set(OBS_JANSSON_IMPORT "${JANSSON_LIBRARIES}" CACHE INTERNAL "Internal var") - set(OBS_JANSSON_INCLUDE_DIRS "${JANSSON_INCLUDE_DIRS}" CACHE INTERNAL "Internal var") + message(STATUS "OBS: OBS-Studio - Using system Jansson library") endif() diff --git a/deps/blake2/CMakeLists.txt b/deps/blake2/CMakeLists.txt index 6c407a202..393efa8d9 100644 --- a/deps/blake2/CMakeLists.txt +++ b/deps/blake2/CMakeLists.txt @@ -1,33 +1,18 @@ -cmake_minimum_required(VERSION 3.2) - project(blake2) -set(BLAKE2_INCLUDE_DIR - "${CMAKE_CURRENT_SOURCE_DIR}/src" - CACHE PATH "blake2 include path") +add_library(blake2 STATIC) +add_library(OBS::blake2 ALIAS blake2) -include_directories( - ${LIBblake2_INCLUDE_DIRS} - src -) +target_sources(blake2 PRIVATE src/blake2b-ref.c src/blake2.h src/blake2-impl.h) -if(WIN32) - if(MSVC) - add_compile_options($,/MTd,/MT> /Zl) - endif() - add_definitions( - -Dinline=_inline - -Drestrict=__restrict) +target_include_directories(blake2 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) + +if(OS_WINDOWS) + if(MSVC) + target_compile_options(blake2 PRIVATE "$,/MTd,/MT>" /Zl) + endif() + + target_compile_definitions(blake2 PRIVATE inline=_inline restrict=__restrict) endif() -set(blake2_SOURCES - src/blake2b-ref.c) - -set(blake2_HEADERS - src/blake2.h - src/blake2-impl.h) - -add_library(blake2 STATIC - ${blake2_SOURCES} - ${blake2_HEADERS}) set_target_properties(blake2 PROPERTIES FOLDER "deps") diff --git a/deps/file-updater/CMakeLists.txt b/deps/file-updater/CMakeLists.txt index 0b46b6644..3ac04deeb 100644 --- a/deps/file-updater/CMakeLists.txt +++ b/deps/file-updater/CMakeLists.txt @@ -1,31 +1,17 @@ project(file-updater) -find_package(Libcurl REQUIRED) +find_package(CURL REQUIRED) -include_directories(${LIBCURL_INCLUDE_DIRS}) +add_library(file-updater INTERFACE) +add_library(OBS::file-updater ALIAS file-updater) -if(WIN32 AND NOT MINGW) - include_directories(../w32-pthreads) - set(file-updater_PLATFORM_DEPS - w32-pthreads) +target_sources(file-updater INTERFACE file-updater/file-updater.c + file-updater/file-updater.h) + +target_link_libraries(file-updater INTERFACE CURL::libcurl) + +target_include_directories(file-updater INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + +if(OS_WINDOWS AND NOT MINGW) + target_link_libraries(file-updater INTERFACE OBS::w32-pthreads) endif() - -set(file-updater_HEADERS - file-updater/file-updater.h) -set(file-updater_SOURCES - file-updater/file-updater.c) - -add_library(file-updater STATIC - ${file-updater_SOURCES} - ${file-updater_HEADERS}) - -target_include_directories(file-updater - PUBLIC .) - -target_link_libraries(file-updater - ${LIBCURL_LIBRARIES} - ${file-updater_PLATFORM_DEPS} - libobs) -set_target_properties(file-updater PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) diff --git a/deps/glad/CMakeLists.txt b/deps/glad/CMakeLists.txt index 83f4efac5..b23f10f2c 100644 --- a/deps/glad/CMakeLists.txt +++ b/deps/glad/CMakeLists.txt @@ -1,76 +1,51 @@ project(glad) -find_package(OpenGL) +find_package(OpenGL REQUIRED) + +add_library(glad SHARED) +add_library(OBS::obsglad ALIAS glad) + +target_sources(glad PRIVATE src/glad.c include/glad/glad.h) + +target_include_directories(glad PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) + +target_compile_definitions(glad PRIVATE GLAD_GLAPI_EXPORT_BUILD) + +target_link_libraries(glad PUBLIC OpenGL::GL) + +set_target_properties( + glad + PROPERTIES OUTPUT_NAME obsglad + FOLDER "deps" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "1") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "Glad OpenGL Loading Library") + + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obsglad.rc) + + target_sources(glad PRIVATE src/glad_wgl.c include/glad/glad_wgl.h obsglad.rc) + +elseif(OS_POSIX AND NOT OS_MACOS) + find_package(OpenGL REQUIRED) + find_package(X11 REQUIRED) + + target_link_libraries(glad PRIVATE X11::X11) + + target_sources(glad PRIVATE src/glad_glx.c include/glad/glad_glx.h) + + if(TARGET OpenGL::EGL) + target_sources(glad PRIVATE src/glad_egl.c include/glad/glad_egl.h) + + target_link_libraries(glad PRIVATE OpenGL::EGL) + endif() -if(NOT WIN32 AND NOT APPLE) - find_package(X11 REQUIRED) - find_package(EGL REQUIRED) endif() -set(glad_SOURCES - src/glad.c - include/glad/glad.h) - -if(WIN32) - set(MODULE_DESCRIPTION "Glad OpenGL Loading Library") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obsglad.rc) - set(glad_PLATFORM_SOURCES - src/glad_wgl.c - include/glad/glad_wgl.h - obsglad.rc) -elseif(NOT APPLE) - set(glad_PLATFORM_SOURCES - src/glad_egl.c - src/glad_glx.c - include/glad/glad_egl.h - include/glad/glad_glx.h) -endif() - -set(glad_include_dirs - PRIVATE ${OPENGL_INCLUDE_DIR}) - -if (UNIX AND NOT APPLE) -list (APPEND glad_include_dirs - PRIVATE - ${X11_X11_INCLUDE_PATH} - ${EGL_INCLUDE_DIRS}) -endif() - -add_library(glad SHARED - ${glad_SOURCES} - ${glad_PLATFORM_SOURCES}) -set_target_properties(glad PROPERTIES - FOLDER "deps" - OUTPUT_NAME obsglad - VERSION "0" - SOVERSION "0" - POSITION_INDEPENDENT_CODE ON) -target_include_directories(glad - PUBLIC include - ${glad_include_dirs}) -target_compile_definitions(glad - PRIVATE GLAD_GLAPI_EXPORT_BUILD) - if(NOT MSVC) - target_compile_options(glad - PRIVATE -DPIC -fvisibility=hidden) + target_compile_options(glad PRIVATE -fvisibility=hidden) endif() -if(NOT WIN32 AND NOT APPLE) - set(glad_PLATFORM_DEPS - ${X11_X11_LIB} - ${EGL_LIBRARIES}) - - # only link to libdl on linux - if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set(glad_PLATFORM_DEPS - ${glad_PLATFORM_DEPS} - -ldl) - endif() -endif() - -target_link_libraries(glad - ${glad_PLATFORM_DEPS} - ${OPENGL_gl_LIBRARY}) - -install_obs_core(glad) +setup_binary_target(glad) diff --git a/deps/ipc-util/CMakeLists.txt b/deps/ipc-util/CMakeLists.txt index 66f63a07e..8250503a5 100644 --- a/deps/ipc-util/CMakeLists.txt +++ b/deps/ipc-util/CMakeLists.txt @@ -1,37 +1,23 @@ -# TODO: Add posix support -if(NOT WIN32) - return() -endif() - project(ipc-util) -set(ipc-util_HEADERS - ipc-util/pipe.h) +add_library(ipc-util STATIC) +add_library(OBS::ipc-util ALIAS ipc-util) -if(WIN32) - set(ipc-util_HEADERS - ${ipc-util_HEADERS} - ipc-util/pipe-windows.h) - set(ipc-util_SOURCES - ipc-util/pipe-windows.c) +target_sources(ipc-util PRIVATE ipc-util/pipe.h) + +set_target_properties(ipc-util PROPERTIES FOLDER "deps" + POSITION_INDEPENDENT_CODE ON) + +target_include_directories(ipc-util PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +if(OS_WINDOWS) + if(MSVC) + target_compile_options(ipc-util PRIVATE "$,/MTd,/MT>" + /Zl) + endif() + + target_sources(ipc-util PRIVATE ipc-util/pipe-windows.c + ipc-util/pipe-windows.h) else() - set(ipc-util_HEADERS - ${ipc-util_HEADERS} - ipc-util/pipe-posix.h) - set(ipc-util_SOURCES - ipc-util/pipe-posix.c) + target_sources(ipc-util PRIVATE ipc-util/pipe-posix.c ipc-util/pipe-posic.h) endif() - -if(MSVC) - add_compile_options($,/MTd,/MT> /Zl) -endif() - -add_library(ipc-util STATIC - ${ipc-util_SOURCES} - ${ipc-util_HEADERS}) -set_target_properties(ipc-util PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) -target_include_directories(ipc-util - PUBLIC .) -target_link_libraries(ipc-util) diff --git a/deps/jansson/CMakeLists.txt b/deps/jansson/CMakeLists.txt index a0b27c149..e514324a7 100644 --- a/deps/jansson/CMakeLists.txt +++ b/deps/jansson/CMakeLists.txt @@ -1,12 +1,10 @@ # Notes: # -# Author: Paul Harris, June 2012 -# Additions: Joakim Soderberg, Febuary 2013 +# Author: Paul Harris, June 2012 Additions: Joakim Soderberg, Febuary 2013 # # Supports: building static/shared, release/debug/etc, can also build html docs -# and some of the tests. -# Note that its designed for out-of-tree builds, so it will not pollute your -# source tree. +# and some of the tests. Note that its designed for out-of-tree builds, so it +# will not pollute your source tree. # # TODO 1: Finish implementing tests. api tests are working, but the valgrind # variants are not flagging problems. @@ -15,60 +13,53 @@ # # TODO 3: Consolidate version numbers, currently the version number is written # into: * cmake (here) * autotools (the configure) * source code header files. -# Should not be written directly into header files, autotools/cmake can do -# that job. +# Should not be written directly into header files, autotools/cmake can do that +# job. # -# Brief intro on how to use cmake: -# > mkdir build (somewhere - we do out-of-tree builds) -# > use cmake, ccmake, or cmake-gui to configure the project. for linux, you -# can only choose one variant: release,debug,etc... and static or shared. -# >> example: -# >> cd build -# >> ccmake -i ../path_to_jansson_dir -# >> inside, configure your options. press C until there are no lines -# with * next to them. -# >> note, I like to configure the 'install' path to ../install, so I get -# self-contained clean installs I can point other projects to. -# >> press G to 'generate' the project files. -# >> make (to build the project) -# >> make install -# >> make test (to run the tests, if you enabled them) +# Brief intro on how to use cmake: > mkdir build (somewhere - we do out-of-tree +# builds) > use cmake, ccmake, or cmake-gui to configure the project. for linux, +# you can only choose one variant: release,debug,etc... and static or shared. >> +# example: >> cd build >> ccmake -i ../path_to_jansson_dir >> inside, configure +# your options. press C until there are no lines with * next to them. >> note, +# I like to configure the 'install' path to ../install, so I get self-contained +# clean installs I can point other projects to. >> press G to 'generate' the +# project files. >> make (to build the project) >> make install >> make test (to +# run the tests, if you enabled them) # -# Brief description on how it works: -# There is a small heirachy of CMakeLists.txt files which define how the -# project is built. -# Header file detection etc is done, and the results are written into config.h -# and jansson_config.h, which are generated from the corresponding -# config.h.cmake and jansson_config.h.cmake template files. -# The generated header files end up in the build directory - not in -# the source directory. -# The rest is down to the usual make process. +# Brief description on how it works: There is a small heirachy of CMakeLists.txt +# files which define how the project is built. Header file detection etc is +# done, and the results are written into config.h and jansson_config.h, which +# are generated from the corresponding config.h.cmake and jansson_config.h.cmake +# template files. The generated header files end up in the build directory - not +# in the source directory. The rest is down to the usual make process. - - -cmake_minimum_required (VERSION 2.8.12) +cmake_minimum_required(VERSION 2.8.12) # required for exports? cmake_minimum_required (VERSION 2.8.6) -project (jansson C) +project(jansson C) # Options option(JANSSON_BUILD_SHARED_LIBS "Build shared libraries." OFF) option(USE_URANDOM "Use /dev/urandom to seed the hash function." ON) option(USE_WINDOWS_CRYPTOAPI "Use CryptGenRandom to seed the hash function." ON) -if (MSVC) - # This option must match the settings used in your program, in particular if you - # are linking statically - option(JANSSON_STATIC_CRT "Link the static CRT libraries" ON ) -endif () +if(MSVC) + # This option must match the settings used in your program, in particular if + # you are linking statically + option(JANSSON_STATIC_CRT "Link the static CRT libraries" ON) +endif() # Disabled by OBS option(JANSSON_EXAMPLES "Compile example applications" OFF) -if (UNIX) - option(JANSSON_COVERAGE "(GCC Only! Requires gcov/lcov to be installed). Include target for doing coverage analysis for the test suite. Note that -DCMAKE_BUILD_TYPE=Debug must be set" OFF) - option(JANSSON_COVERALLS "Generate coverage info for Coveralls" OFF) - option(JANSSON_COVERALLS_UPLOAD "Upload coverage info to Coveralls (Only works via Travis)" ON) -endif () +if(UNIX) + option( + JANSSON_COVERAGE + "(GCC Only! Requires gcov/lcov to be installed). Include target for doing coverage analysis for the test suite. Note that -DCMAKE_BUILD_TYPE=Debug must be set" + OFF) + option(JANSSON_COVERALLS "Generate coverage info for Coveralls" OFF) + option(JANSSON_COVERALLS_UPLOAD + "Upload coverage info to Coveralls (Only works via Travis)" ON) +endif() # Set some nicer output dirs. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) @@ -76,16 +67,14 @@ set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set(JANSSON_TEMP_DIR ${PROJECT_BINARY_DIR}/tmp) -# Give the debug version a different postfix for windows, -# so both the debug and release version can be built in the -# same build-tree on Windows (MSVC). -if (WIN32) - set(CMAKE_DEBUG_POSTFIX "_d") -endif (WIN32) +# Give the debug version a different postfix for windows, so both the debug and +# release version can be built in the same build-tree on Windows (MSVC). +if(WIN32) + set(CMAKE_DEBUG_POSTFIX "_d") +endif(WIN32) -# This is how I thought it should go -# set (JANSSON_VERSION "2.3.1") -# set (JANSSON_SOVERSION 2) +# This is how I thought it should go set (JANSSON_VERSION "2.3.1") set +# (JANSSON_SOVERSION 2) set(JANSSON_DISPLAY_VERSION "2.9") @@ -96,502 +85,519 @@ set(JANSSON_SOVERSION 4) # for CheckFunctionKeywords set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -include (CheckCSourceCompiles) -include (CheckFunctionExists) -include (CheckFunctionKeywords) -include (CheckIncludeFiles) -include (CheckTypeSize) +include(CheckCSourceCompiles) +include(CheckFunctionExists) +include(CheckFunctionKeywords) +include(CheckIncludeFiles) +include(CheckTypeSize) -if (MSVC) - # Turn off Microsofts "security" warnings. - add_definitions( "/W3 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo" ) +if(MSVC) + # Turn off Microsofts "security" warnings. + add_definitions("/W3 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo") - # Disabled by OBS, options already set by top level CMakeLists - if (FALSE) - if (JANSSON_STATIC_CRT) - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") - set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") - endif() - endif() + # Disabled by OBS, options already set by top level CMakeLists + if(FALSE) + if(JANSSON_STATIC_CRT) + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd") + endif() + endif() endif() -if (NOT WIN32 AND NOT APPLE) - add_definitions("-fPIC") +if(NOT WIN32 AND NOT APPLE) + add_definitions("-fPIC") endif() message("C compiler: ${CMAKE_C_COMPILER_ID}") # Coverage only works with GCC for a debug build. -if (JANSSON_COVERALLS) - set(JANSSON_COVERAGE ON) +if(JANSSON_COVERALLS) + set(JANSSON_COVERAGE ON) endif() -if (JANSSON_COVERAGE) - include(CodeCoverage) - include(Coveralls) +if(JANSSON_COVERAGE) + include(CodeCoverage) + include(Coveralls) - # This adds coverage arguments to gcc/clang. - coveralls_turn_on_coverage() + # This adds coverage arguments to gcc/clang. + coveralls_turn_on_coverage() endif() -check_include_files (endian.h HAVE_ENDIAN_H) -check_include_files (fcntl.h HAVE_FCNTL_H) -check_include_files (sched.h HAVE_SCHED_H) -check_include_files (unistd.h HAVE_UNISTD_H) -check_include_files (sys/param.h HAVE_SYS_PARAM_H) -check_include_files (sys/stat.h HAVE_SYS_STAT_H) -check_include_files (sys/time.h HAVE_SYS_TIME_H) -check_include_files (sys/time.h HAVE_SYS_TYPES_H) +check_include_files(endian.h HAVE_ENDIAN_H) +check_include_files(fcntl.h HAVE_FCNTL_H) +check_include_files(sched.h HAVE_SCHED_H) +check_include_files(unistd.h HAVE_UNISTD_H) +check_include_files(sys/param.h HAVE_SYS_PARAM_H) +check_include_files(sys/stat.h HAVE_SYS_STAT_H) +check_include_files(sys/time.h HAVE_SYS_TIME_H) +check_include_files(sys/time.h HAVE_SYS_TYPES_H) -check_function_exists (close HAVE_CLOSE) -check_function_exists (getpid HAVE_GETPID) -check_function_exists (gettimeofday HAVE_GETTIMEOFDAY) -check_function_exists (open HAVE_OPEN) -check_function_exists (read HAVE_READ) -check_function_exists (sched_yield HAVE_SCHED_YIELD) +check_function_exists(close HAVE_CLOSE) +check_function_exists(getpid HAVE_GETPID) +check_function_exists(gettimeofday HAVE_GETTIMEOFDAY) +check_function_exists(open HAVE_OPEN) +check_function_exists(read HAVE_READ) +check_function_exists(sched_yield HAVE_SCHED_YIELD) # Check for the int-type includes -check_include_files (stdint.h HAVE_STDINT_H) +check_include_files(stdint.h HAVE_STDINT_H) # Check our 64 bit integer sizes -check_type_size (__int64 __INT64) -check_type_size (int64_t INT64_T) -check_type_size ("long long" LONG_LONG_INT) +check_type_size(__int64 __INT64) +check_type_size(int64_t INT64_T) +check_type_size("long long" LONG_LONG_INT) # Check our 32 bit integer sizes -check_type_size (int32_t INT32_T) -check_type_size (__int32 __INT32) -check_type_size ("long" LONG_INT) -check_type_size ("int" INT) -if (HAVE_INT32_T) - set (JSON_INT32 int32_t) -elseif (HAVE___INT32) - set (JSON_INT32 __int32) -elseif (HAVE_LONG_INT AND (${LONG_INT} EQUAL 4)) - set (JSON_INT32 long) -elseif (HAVE_INT AND (${INT} EQUAL 4)) - set (JSON_INT32 int) -else () - message (FATAL_ERROR "Could not detect a valid 32-bit integer type") -endif () +check_type_size(int32_t INT32_T) +check_type_size(__int32 __INT32) +check_type_size("long" LONG_INT) +check_type_size("int" INT) +if(HAVE_INT32_T) + set(JSON_INT32 int32_t) +elseif(HAVE___INT32) + set(JSON_INT32 __int32) +elseif(HAVE_LONG_INT AND (${LONG_INT} EQUAL 4)) + set(JSON_INT32 long) +elseif(HAVE_INT AND (${INT} EQUAL 4)) + set(JSON_INT32 int) +else() + message(FATAL_ERROR "Could not detect a valid 32-bit integer type") +endif() -check_type_size ("unsigned long" UNSIGNED_LONG_INT) -check_type_size ("unsigned int" UNSIGNED_INT) -check_type_size ("unsigned short" UNSIGNED_SHORT) +check_type_size("unsigned long" UNSIGNED_LONG_INT) +check_type_size("unsigned int" UNSIGNED_INT) +check_type_size("unsigned short" UNSIGNED_SHORT) -check_type_size (uint32_t UINT32_T) -check_type_size (__uint32 __UINT32) -if (HAVE_UINT32_T) - set (JSON_UINT32 uint32_t) -elseif (HAVE___UINT32) - set (JSON_UINT32 __uint32) -elseif (HAVE_UNSIGNED_LONG_INT AND (${UNSIGNED_LONG_INT} EQUAL 4)) - set (JSON_UINT32 "unsigned long") -elseif (HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 4)) - set (JSON_UINT32 "unsigned int") -else () - message (FATAL_ERROR "Could not detect a valid unsigned 32-bit integer type") -endif () +check_type_size(uint32_t UINT32_T) +check_type_size(__uint32 __UINT32) +if(HAVE_UINT32_T) + set(JSON_UINT32 uint32_t) +elseif(HAVE___UINT32) + set(JSON_UINT32 __uint32) +elseif(HAVE_UNSIGNED_LONG_INT AND (${UNSIGNED_LONG_INT} EQUAL 4)) + set(JSON_UINT32 "unsigned long") +elseif(HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 4)) + set(JSON_UINT32 "unsigned int") +else() + message(FATAL_ERROR "Could not detect a valid unsigned 32-bit integer type") +endif() -check_type_size (uint16_t UINT16_T) -check_type_size (__uint16 __UINT16) -if (HAVE_UINT16_T) - set (JSON_UINT16 uint16_t) -elseif (HAVE___UINT16) - set (JSON_UINT16 __uint16) -elseif (HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 2)) - set (JSON_UINT16 "unsigned int") -elseif (HAVE_UNSIGNED_SHORT AND (${UNSIGNED_SHORT} EQUAL 2)) - set (JSON_UINT16 "unsigned short") -else () - message (FATAL_ERROR "Could not detect a valid unsigned 16-bit integer type") -endif () +check_type_size(uint16_t UINT16_T) +check_type_size(__uint16 __UINT16) +if(HAVE_UINT16_T) + set(JSON_UINT16 uint16_t) +elseif(HAVE___UINT16) + set(JSON_UINT16 __uint16) +elseif(HAVE_UNSIGNED_INT AND (${UNSIGNED_INT} EQUAL 2)) + set(JSON_UINT16 "unsigned int") +elseif(HAVE_UNSIGNED_SHORT AND (${UNSIGNED_SHORT} EQUAL 2)) + set(JSON_UINT16 "unsigned short") +else() + message(FATAL_ERROR "Could not detect a valid unsigned 16-bit integer type") +endif() -check_type_size (uint8_t UINT8_T) -check_type_size (__uint8 __UINT8) -if (HAVE_UINT8_T) - set (JSON_UINT8 uint8_t) -elseif (HAVE___UINT8) - set (JSON_UINT8 __uint8) -else () - set (JSON_UINT8 "unsigned char") -endif () +check_type_size(uint8_t UINT8_T) +check_type_size(__uint8 __UINT8) +if(HAVE_UINT8_T) + set(JSON_UINT8 uint8_t) +elseif(HAVE___UINT8) + set(JSON_UINT8 __uint8) +else() + set(JSON_UINT8 "unsigned char") +endif() # Check for ssize_t and SSIZE_T existance. check_type_size(ssize_t SSIZE_T) check_type_size(SSIZE_T UPPERCASE_SSIZE_T) if(NOT HAVE_SSIZE_T) - if(HAVE_UPPERCASE_SSIZE_T) - set(JSON_SSIZE SSIZE_T) - else() - set(JSON_SSIZE int) - endif() + if(HAVE_UPPERCASE_SSIZE_T) + set(JSON_SSIZE SSIZE_T) + else() + set(JSON_SSIZE int) + endif() endif() set(CMAKE_EXTRA_INCLUDE_FILES "") # Check for all the variants of strtoll -check_function_exists (strtoll HAVE_STRTOLL) -check_function_exists (strtoq HAVE_STRTOQ) -check_function_exists (_strtoi64 HAVE__STRTOI64) +check_function_exists(strtoll HAVE_STRTOLL) +check_function_exists(strtoq HAVE_STRTOQ) +check_function_exists(_strtoi64 HAVE__STRTOI64) # Figure out what variant we should use -if (HAVE_STRTOLL) - set (JSON_STRTOINT strtoll) -elseif (HAVE_STRTOQ) - set (JSON_STRTOINT strtoq) -elseif (HAVE__STRTOI64) - set (JSON_STRTOINT _strtoi64) -else () - # fallback to strtol (32 bit) - # this will set all the required variables - set (JSON_STRTOINT strtol) - set (JSON_INT_T long) - set (JSON_INTEGER_FORMAT "\"ld\"") -endif () +if(HAVE_STRTOLL) + set(JSON_STRTOINT strtoll) +elseif(HAVE_STRTOQ) + set(JSON_STRTOINT strtoq) +elseif(HAVE__STRTOI64) + set(JSON_STRTOINT _strtoi64) +else() + # fallback to strtol (32 bit) this will set all the required variables + set(JSON_STRTOINT strtol) + set(JSON_INT_T long) + set(JSON_INTEGER_FORMAT "\"ld\"") +endif() # if we haven't defined JSON_INT_T, then we have a 64 bit conversion function. -# detect what to use for the 64 bit type. -# Note: I will prefer long long if I can get it, as that is what the automake system aimed for. -if (NOT DEFINED JSON_INT_T) - if (HAVE_LONG_LONG_INT AND ((${LONG_LONG_INT}) EQUAL 8)) - set (JSON_INT_T "long long") - elseif (HAVE_INT64_T) - set (JSON_INT_T int64_t) - elseif (HAVE___INT64) - set (JSON_INT_T __int64) - else () - message (FATAL_ERROR "Could not detect 64 bit type, although I detected the strtoll equivalent") - endif () +# detect what to use for the 64 bit type. Note: I will prefer long long if I can +# get it, as that is what the automake system aimed for. +if(NOT DEFINED JSON_INT_T) + if(HAVE_LONG_LONG_INT AND ((${LONG_LONG_INT}) EQUAL 8)) + set(JSON_INT_T "long long") + elseif(HAVE_INT64_T) + set(JSON_INT_T int64_t) + elseif(HAVE___INT64) + set(JSON_INT_T __int64) + else() + message( + FATAL_ERROR + "Could not detect 64 bit type, although I detected the strtoll equivalent" + ) + endif() - # Apparently, Borland BCC and MSVC wants I64d, - # Borland BCC could also accept LD - # and gcc wants ldd, - # I am not sure what cygwin will want, so I will assume I64d - - if (WIN32) # matches both msvc and cygwin - set (JSON_INTEGER_FORMAT "\"I64d\"") - else () - set (JSON_INTEGER_FORMAT "\"lld\"") - endif () -endif () + # Apparently, Borland BCC and MSVC wants I64d, Borland BCC could also accept + # LD and gcc wants ldd, I am not sure what cygwin will want, so I will assume + # I64d + if(WIN32) # matches both msvc and cygwin + set(JSON_INTEGER_FORMAT "\"I64d\"") + else() + set(JSON_INTEGER_FORMAT "\"lld\"") + endif() +endif() # If locale.h and localeconv() are available, define to 1, otherwise to 0. -check_include_files (locale.h HAVE_LOCALE_H) -check_function_exists (localeconv HAVE_LOCALECONV) +check_include_files(locale.h HAVE_LOCALE_H) +check_function_exists(localeconv HAVE_LOCALECONV) -if (HAVE_LOCALECONV AND HAVE_LOCALE_H) - set (JSON_HAVE_LOCALECONV 1) -else () - set (JSON_HAVE_LOCALECONV 0) +if(HAVE_LOCALECONV AND HAVE_LOCALE_H) + set(JSON_HAVE_LOCALECONV 1) +else() + set(JSON_HAVE_LOCALECONV 0) endif() # check if we have setlocale check_function_exists(setlocale HAVE_SETLOCALE) -# Check what the inline keyword is. -# Note that the original JSON_INLINE was always set to just 'inline', so this goes further. +# Check what the inline keyword is. Note that the original JSON_INLINE was +# always set to just 'inline', so this goes further. check_function_keywords("inline") check_function_keywords("__inline") check_function_keywords("__inline__") -if (HAVE_INLINE) - set(JSON_INLINE inline) -elseif (HAVE___INLINE) - set(JSON_INLINE __inline) -elseif (HAVE___INLINE__) - set(JSON_INLINE __inline__) +if(HAVE_INLINE) + set(JSON_INLINE inline) +elseif(HAVE___INLINE) + set(JSON_INLINE __inline) +elseif(HAVE___INLINE__) + set(JSON_INLINE __inline__) else() - # no inline on this platform - set (JSON_INLINE) + # no inline on this platform + set(JSON_INLINE) endif() -check_c_source_compiles ("int main() { unsigned long val; __sync_bool_compare_and_swap(&val, 0, 1); return 0; } " HAVE_SYNC_BUILTINS) -check_c_source_compiles ("int main() { char l; unsigned long v; __atomic_test_and_set(&l, __ATOMIC_RELAXED); __atomic_store_n(&v, 1, __ATOMIC_RELEASE); __atomic_load_n(&v, __ATOMIC_ACQUIRE); return 0; }" HAVE_ATOMIC_BUILTINS) +check_c_source_compiles( + "int main() { unsigned long val; __sync_bool_compare_and_swap(&val, 0, 1); return 0; } " + HAVE_SYNC_BUILTINS) +check_c_source_compiles( + "int main() { char l; unsigned long v; __atomic_test_and_set(&l, __ATOMIC_RELAXED); __atomic_store_n(&v, 1, __ATOMIC_RELEASE); __atomic_load_n(&v, __ATOMIC_ACQUIRE); return 0; }" + HAVE_ATOMIC_BUILTINS) -set (JANSSON_INITIAL_HASHTABLE_ORDER 3 CACHE STRING "Number of buckets new object hashtables contain is 2 raised to this power. The default is 3, so empty hashtables contain 2^3 = 8 buckets.") +set(JANSSON_INITIAL_HASHTABLE_ORDER + 3 + CACHE + STRING + "Number of buckets new object hashtables contain is 2 raised to this power. The default is 3, so empty hashtables contain 2^3 = 8 buckets." +) # configure the public config file -configure_file (${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_config.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_config.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h) # Copy the jansson.h file to the public include folder -file (COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h - DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) +file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/) add_definitions(-DJANSSON_USING_CMAKE) # configure the private config file -configure_file (${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_private_config.h.cmake - ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_private_config.h.cmake + ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h) # and tell the source code to include it add_definitions(-DHAVE_CONFIG_H) -include_directories (${CMAKE_CURRENT_BINARY_DIR}/include) -include_directories (${CMAKE_CURRENT_BINARY_DIR}/private_include) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/private_include) # Add the lib sources. file(GLOB JANSSON_SRC src/*.c) set(JANSSON_HDR_PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src/hashtable.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson_private.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/strbuffer.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/utf.h - ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h) + ${CMAKE_CURRENT_SOURCE_DIR}/src/hashtable.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson_private.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/strbuffer.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/utf.h + ${CMAKE_CURRENT_BINARY_DIR}/private_include/jansson_private_config.h) -set(JANSSON_HDR_PUBLIC - ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h) +set(JANSSON_HDR_PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h) source_group("Library Sources" FILES ${JANSSON_SRC}) source_group("Library Private Headers" FILES ${JANSSON_HDR_PRIVATE}) source_group("Library Public Headers" FILES ${JANSSON_HDR_PUBLIC}) if(JANSSON_BUILD_SHARED_LIBS) - add_library(jansson SHARED - ${JANSSON_SRC} - ${JANSSON_HDR_PRIVATE} - ${JANSSON_HDR_PUBLIC} - src/jansson.def) + add_library(jansson SHARED ${JANSSON_SRC} ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PUBLIC} src/jansson.def) - set_target_properties(jansson PROPERTIES - VERSION ${JANSSON_VERSION} - SOVERSION ${JANSSON_SOVERSION}) + set_target_properties(jansson PROPERTIES VERSION ${JANSSON_VERSION} + SOVERSION ${JANSSON_SOVERSION}) else() - add_library(jansson - ${JANSSON_SRC} - ${JANSSON_HDR_PRIVATE} - ${JANSSON_HDR_PUBLIC}) + add_library(jansson ${JANSSON_SRC} ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PUBLIC}) endif() set_target_properties(jansson PROPERTIES FOLDER "deps") -if (JANSSON_EXAMPLES) - add_executable(simple_parse "${PROJECT_SOURCE_DIR}/examples/simple_parse.c") - target_link_libraries(simple_parse jansson) +if(JANSSON_EXAMPLES) + add_executable(simple_parse "${PROJECT_SOURCE_DIR}/examples/simple_parse.c") + target_link_libraries(simple_parse jansson) endif() -# For building Documentation (uses Sphinx) -# Disabled by OBS +# For building Documentation (uses Sphinx) Disabled by OBS option(JANSSON_BUILD_DOCS "Build documentation (uses python-sphinx)." OFF) -if (JANSSON_BUILD_DOCS) - find_package(Sphinx) +if(JANSSON_BUILD_DOCS) + find_package(Sphinx) - if (NOT SPHINX_FOUND) - message(WARNING "Sphinx not found. Cannot generate documentation! + if(NOT SPHINX_FOUND) + message(WARNING "Sphinx not found. Cannot generate documentation! Set -DJANSSON_BUILD_DOCS=OFF to get rid of this message.") - else() - if (Sphinx_VERSION_STRING VERSION_LESS 1.0) - message(WARNING "Your Sphinx version is too old! + else() + if(Sphinx_VERSION_STRING VERSION_LESS 1.0) + message( + WARNING + "Your Sphinx version is too old! This project requires Sphinx v1.0 or above to produce proper documentation (you have v${Sphinx_VERSION_STRING}). You will get output but it will have errors.") + endif() + + # configured documentation tools and intermediate build results + set(BINARY_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/_build") + + # Sphinx cache with pickled ReST documents + set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") + + # CMake could be used to build the conf.py file too, eg it could + # automatically write the version of the program or change the theme. if(NOT + # DEFINED SPHINX_THEME) set(SPHINX_THEME default) endif() + # + # if(NOT DEFINED SPHINX_THEME_DIR) set(SPHINX_THEME_DIR) endif() + # + # configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in" + # "${BINARY_BUILD_DIR}/conf.py" @ONLY) + + # TODO: Add support for all sphinx builders: + # http://sphinx-doc.org/builders.html + + # Add documentation targets. + set(DOC_TARGETS html) + + option(JANSSON_BUILD_MAN "Create a target for building man pages." ON) + + if(JANSSON_BUILD_MAN) + if(Sphinx_VERSION_STRING VERSION_LESS 1.0) + message( + WARNING + "Sphinx version 1.0 > is required to build man pages. You have v${Sphinx_VERSION_STRING}." + ) + else() + list(APPEND DOC_TARGETS man) endif() + endif() - # configured documentation tools and intermediate build results - set(BINARY_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/_build") + option(JANSSON_BUILD_LATEX + "Create a target for building latex docs (to create PDF)." OFF) - # Sphinx cache with pickled ReST documents - set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") + if(JANSSON_BUILD_LATEX) + find_package(LATEX) - # CMake could be used to build the conf.py file too, - # eg it could automatically write the version of the program or change the theme. - # if(NOT DEFINED SPHINX_THEME) - # set(SPHINX_THEME default) - # endif() - # - # if(NOT DEFINED SPHINX_THEME_DIR) - # set(SPHINX_THEME_DIR) - # endif() - # - # configure_file( - # "${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in" - # "${BINARY_BUILD_DIR}/conf.py" - # @ONLY) - - # TODO: Add support for all sphinx builders: http://sphinx-doc.org/builders.html - - # Add documentation targets. - set(DOC_TARGETS html) - - option(JANSSON_BUILD_MAN "Create a target for building man pages." ON) - - if (JANSSON_BUILD_MAN) - if (Sphinx_VERSION_STRING VERSION_LESS 1.0) - message(WARNING "Sphinx version 1.0 > is required to build man pages. You have v${Sphinx_VERSION_STRING}.") - else() - list(APPEND DOC_TARGETS man) - endif() + if(NOT LATEX_COMPILER) + message("Couldn't find Latex, can't build latex docs using Sphinx") + else() + message( + "Latex found! If you have problems building, see Sphinx documentation for required Latex packages." + ) + list(APPEND DOC_TARGETS latex) endif() + endif() - option(JANSSON_BUILD_LATEX "Create a target for building latex docs (to create PDF)." OFF) + # The doc target will build all documentation targets. + add_custom_target(doc) - if (JANSSON_BUILD_LATEX) - find_package(LATEX) + foreach(DOC_TARGET ${DOC_TARGETS}) + add_custom_target( + ${DOC_TARGET} + ${SPHINX_EXECUTABLE} + # -q # Enable for quiet mode + -b + ${DOC_TARGET} + -d + "${SPHINX_CACHE_DIR}" + # -c "${BINARY_BUILD_DIR}" # enable if using cmake-generated conf.py + "${CMAKE_CURRENT_SOURCE_DIR}/doc" + "${CMAKE_CURRENT_BINARY_DIR}/doc/${DOC_TARGET}" + COMMENT "Building ${DOC_TARGET} documentation with Sphinx") - if (NOT LATEX_COMPILER) - message("Couldn't find Latex, can't build latex docs using Sphinx") - else() - message("Latex found! If you have problems building, see Sphinx documentation for required Latex packages.") - list(APPEND DOC_TARGETS latex) - endif() - endif() + add_dependencies(doc ${DOC_TARGET}) + endforeach() - # The doc target will build all documentation targets. - add_custom_target(doc) - - foreach (DOC_TARGET ${DOC_TARGETS}) - add_custom_target(${DOC_TARGET} - ${SPHINX_EXECUTABLE} - # -q # Enable for quiet mode - -b ${DOC_TARGET} - -d "${SPHINX_CACHE_DIR}" - # -c "${BINARY_BUILD_DIR}" # enable if using cmake-generated conf.py - "${CMAKE_CURRENT_SOURCE_DIR}/doc" - "${CMAKE_CURRENT_BINARY_DIR}/doc/${DOC_TARGET}" - COMMENT "Building ${DOC_TARGET} documentation with Sphinx") - - add_dependencies(doc ${DOC_TARGET}) - endforeach() - - message("Building documentation enabled for: ${DOC_TARGETS}") - endif() -endif () + message("Building documentation enabled for: ${DOC_TARGETS}") + endif() +endif() # Disabled by OBS -option(JANSSON_WITHOUT_TESTS "Don't build tests ('make test' to execute tests)" ON) +option(JANSSON_WITHOUT_TESTS "Don't build tests ('make test' to execute tests)" + ON) -if (NOT JANSSON_WITHOUT_TESTS) - option(JANSSON_TEST_WITH_VALGRIND "Enable valgrind tests." OFF) +if(NOT JANSSON_WITHOUT_TESTS) + option(JANSSON_TEST_WITH_VALGRIND "Enable valgrind tests." OFF) - ENABLE_TESTING() + enable_testing() - if (JANSSON_TEST_WITH_VALGRIND) - # TODO: Add FindValgrind.cmake instead of having a hardcoded path. + if(JANSSON_TEST_WITH_VALGRIND) + # TODO: Add FindValgrind.cmake instead of having a hardcoded path. - add_definitions(-DVALGRIND) + add_definitions(-DVALGRIND) - # enable valgrind - set(CMAKE_MEMORYCHECK_COMMAND valgrind) - set(CMAKE_MEMORYCHECK_COMMAND_OPTIONS - "--error-exitcode=1 --leak-check=full --show-reachable=yes --track-origins=yes -q") + # enable valgrind + set(CMAKE_MEMORYCHECK_COMMAND valgrind) + set(CMAKE_MEMORYCHECK_COMMAND_OPTIONS + "--error-exitcode=1 --leak-check=full --show-reachable=yes --track-origins=yes -q" + ) - set(MEMCHECK_COMMAND - "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") - separate_arguments(MEMCHECK_COMMAND) - endif () + set(MEMCHECK_COMMAND + "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") + separate_arguments(MEMCHECK_COMMAND) + endif() - # - # Test suites. - # - if (CMAKE_COMPILER_IS_GNUCC) - add_definitions(-Wall -Wextra -Wdeclaration-after-statement) - endif () + # + # Test suites. + # + if(CMAKE_COMPILER_IS_GNUCC) + add_definitions(-Wall -Wextra -Wdeclaration-after-statement) + endif() - set(api_tests - test_array - test_copy - test_dump - test_dump_callback - test_equal - test_load - test_loadb - test_number - test_object - test_pack - test_simple - test_unpack) + set(api_tests + test_array + test_copy + test_dump + test_dump_callback + test_equal + test_load + test_loadb + test_number + test_object + test_pack + test_simple + test_unpack) - # Doing arithmetic on void pointers is not allowed by Microsofts compiler - # such as secure_malloc and secure_free is doing, so exclude it for now. - if (NOT MSVC) - list(APPEND api_tests test_memory_funcs) - endif() + # Doing arithmetic on void pointers is not allowed by Microsofts compiler such + # as secure_malloc and secure_free is doing, so exclude it for now. + if(NOT MSVC) + list(APPEND api_tests test_memory_funcs) + endif() - # Helper macro for building and linking a test program. - macro(build_testprog name dir) - add_executable(${name} ${dir}/${name}.c) - add_dependencies(${name} jansson) - target_link_libraries(${name} jansson) - endmacro(build_testprog) + # Helper macro for building and linking a test program. + macro(build_testprog name dir) + add_executable(${name} ${dir}/${name}.c) + add_dependencies(${name} jansson) + target_link_libraries(${name} jansson) + endmacro(build_testprog) - # Create executables and tests/valgrind tests for API tests. - foreach (test ${api_tests}) - build_testprog(${test} ${PROJECT_SOURCE_DIR}/test/suites/api) + # Create executables and tests/valgrind tests for API tests. + foreach(test ${api_tests}) + build_testprog(${test} ${PROJECT_SOURCE_DIR}/test/suites/api) - if (JANSSON_TEST_WITH_VALGRIND) - add_test(memcheck__${test} - ${MEMCHECK_COMMAND} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} - WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) - else() - add_test(${test} - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} - WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) - endif () - endforeach () + if(JANSSON_TEST_WITH_VALGRIND) + add_test(memcheck__${test} ${MEMCHECK_COMMAND} + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} + WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) + else() + add_test(${test} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${test} + WORKING_DIRECTORY ${JANSSON_TEMP_DIR}) + endif() + endforeach() - # Test harness for the suites tests. - build_testprog(json_process ${PROJECT_SOURCE_DIR}/test/bin) + # Test harness for the suites tests. + build_testprog(json_process ${PROJECT_SOURCE_DIR}/test/bin) - set(SUITE_TEST_CMD ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/json_process) - set(SUITES encoding-flags valid invalid invalid-unicode) - foreach (SUITE ${SUITES}) - file(GLOB TESTDIRS ${jansson_SOURCE_DIR}/test/suites/${SUITE}/*) + set(SUITE_TEST_CMD ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/json_process) + set(SUITES encoding-flags valid invalid invalid-unicode) + foreach(SUITE ${SUITES}) + file(GLOB TESTDIRS ${jansson_SOURCE_DIR}/test/suites/${SUITE}/*) - foreach (TESTDIR ${TESTDIRS}) - if (IS_DIRECTORY ${TESTDIR}) - get_filename_component(TNAME ${TESTDIR} NAME) + foreach(TESTDIR ${TESTDIRS}) + if(IS_DIRECTORY ${TESTDIR}) + get_filename_component(TNAME ${TESTDIR} NAME) - if (JANSSON_TEST_WITH_VALGRIND) - add_test(memcheck__${SUITE}__${TNAME} - ${MEMCHECK_COMMAND} ${SUITE_TEST_CMD} ${TESTDIR}) - else() - add_test(${SUITE}__${TNAME} - ${SUITE_TEST_CMD} ${TESTDIR}) - endif() + if(JANSSON_TEST_WITH_VALGRIND) + add_test(memcheck__${SUITE}__${TNAME} ${MEMCHECK_COMMAND} + ${SUITE_TEST_CMD} ${TESTDIR}) + else() + add_test(${SUITE}__${TNAME} ${SUITE_TEST_CMD} ${TESTDIR}) + endif() - if ((${SUITE} STREQUAL "valid" OR ${SUITE} STREQUAL "invalid") AND NOT EXISTS ${TESTDIR}/nostrip) - if (JANSSON_TEST_WITH_VALGRIND) - add_test(memcheck__${SUITE}__${TNAME}__strip - ${MEMCHECK_COMMAND} ${SUITE_TEST_CMD} --strip ${TESTDIR}) - else() - add_test(${SUITE}__${TNAME}__strip - ${SUITE_TEST_CMD} --strip ${TESTDIR}) - endif() - endif () - endif () - endforeach () - endforeach () + if((${SUITE} STREQUAL "valid" OR ${SUITE} STREQUAL "invalid") + AND NOT EXISTS ${TESTDIR}/nostrip) + if(JANSSON_TEST_WITH_VALGRIND) + add_test(memcheck__${SUITE}__${TNAME}__strip ${MEMCHECK_COMMAND} + ${SUITE_TEST_CMD} --strip ${TESTDIR}) + else() + add_test(${SUITE}__${TNAME}__strip ${SUITE_TEST_CMD} --strip + ${TESTDIR}) + endif() + endif() + endif() + endforeach() + endforeach() - if (JANSSON_COVERAGE) - setup_target_for_coverage( - coverage # Coverage make target "make coverage". - coverage # Name of output directory. - make # Name of test runner executable. - test) # Arguments to the test runner above (make test). + if(JANSSON_COVERAGE) + setup_target_for_coverage( + coverage # Coverage make target "make coverage". + coverage # Name of output directory. + make # Name of test runner executable. + test) # Arguments to the test runner above (make test). - if (JANSSON_COVERALLS) - set(COVERAGE_SRCS ${JANSSON_SRC}) - coveralls_setup("${COVERAGE_SRCS}" ${JANSSON_COVERALLS_UPLOAD}) - endif () - endif () + if(JANSSON_COVERALLS) + set(COVERAGE_SRCS ${JANSSON_SRC}) + coveralls_setup("${COVERAGE_SRCS}" ${JANSSON_COVERALLS_UPLOAD}) + endif() + endif() - # Enable using "make check" just like the autotools project. - # By default cmake creates a target "make test" - add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} - DEPENDS json_process ${api_tests}) -endif () + # Enable using "make check" just like the autotools project. By default cmake + # creates a target "make test" + add_custom_target( + check + COMMAND ${CMAKE_CTEST_COMMAND} + DEPENDS json_process ${api_tests}) +endif() # # Installation preparation. # # Allow the user to override installation directories. -set(JANSSON_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") -set(JANSSON_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") -set(JANSSON_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files") +set(JANSSON_INSTALL_LIB_DIR + lib + CACHE PATH "Installation directory for libraries") +set(JANSSON_INSTALL_BIN_DIR + bin + CACHE PATH "Installation directory for executables") +set(JANSSON_INSTALL_INCLUDE_DIR + include + CACHE PATH "Installation directory for header files") if(WIN32 AND NOT CYGWIN) set(DEF_INSTALL_CMAKE_DIR cmake) @@ -599,96 +605,101 @@ else() set(DEF_INSTALL_CMAKE_DIR lib/cmake/jansson) endif() -set(JANSSON_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") +set(JANSSON_INSTALL_CMAKE_DIR + ${DEF_INSTALL_CMAKE_DIR} + CACHE PATH "Installation directory for CMake files") -# Create pkg-conf file. -# (We use the same files as ./configure does, so we -# have to defined the same variables used there). -set(prefix ${CMAKE_INSTALL_PREFIX}) +# Create pkg-conf file. (We use the same files as ./configure does, so we have +# to defined the same variables used there). +set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -set(libdir ${CMAKE_INSTALL_PREFIX}/${JANSSON_INSTALL_LIB_DIR}) -set(VERSION ${JANSSON_DISPLAY_VERSION}) +set(libdir ${CMAKE_INSTALL_PREFIX}/${JANSSON_INSTALL_LIB_DIR}) +set(VERSION ${JANSSON_DISPLAY_VERSION}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY) # Make sure the paths are absolute. foreach(p LIB BIN INCLUDE CMAKE) - set(var JANSSON_INSTALL_${p}_DIR) - if(NOT IS_ABSOLUTE "${${var}}") - set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") - endif() + set(var JANSSON_INSTALL_${p}_DIR) + if(NOT IS_ABSOLUTE "${${var}}") + set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") + endif() endforeach() -# Export targets (This is used for other CMake projects to easily find the libraries and include files). -export(TARGETS jansson - FILE "${PROJECT_BINARY_DIR}/JanssonTargets.cmake") +# Export targets (This is used for other CMake projects to easily find the +# libraries and include files). +export(TARGETS jansson FILE "${PROJECT_BINARY_DIR}/JanssonTargets.cmake") export(PACKAGE jansson) # Generate the config file for the build-tree. -set(JANSSON__INCLUDE_DIRS - "${PROJECT_SOURCE_DIR}/include" - "${PROJECT_BINARY_DIR}/include") -set(JANSSON_INCLUDE_DIRS ${JANSSON__INCLUDE_DIRS} CACHE PATH "Jansson include directories") +set(JANSSON__INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_BINARY_DIR}/include") +set(JANSSON_INCLUDE_DIRS + ${JANSSON__INCLUDE_DIRS} + CACHE PATH "Jansson include directories") configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in - ${PROJECT_BINARY_DIR}/JanssonConfig.cmake - @ONLY) + ${PROJECT_BINARY_DIR}/JanssonConfig.cmake @ONLY) # Generate the config file for the installation tree. -file(RELATIVE_PATH - REL_INCLUDE_DIR - "${JANSSON_INSTALL_CMAKE_DIR}" - "${JANSSON_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the Cmake dir. +file(RELATIVE_PATH REL_INCLUDE_DIR "${JANSSON_INSTALL_CMAKE_DIR}" + "${JANSSON_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from + # the Cmake dir. -# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, -# we escape it here so it's evaluated when it is included instead -# so that the include dirs are given relative to where the -# config file is located. -set(JANSSON__INCLUDE_DIRS - "\${JANSSON_CMAKE_DIR}/${REL_INCLUDE_DIR}") -configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in - ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake - @ONLY) +# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, we escape it +# here so it's evaluated when it is included instead so that the include dirs +# are given relative to where the config file is located. +set(JANSSON__INCLUDE_DIRS "\${JANSSON_CMAKE_DIR}/${REL_INCLUDE_DIR}") +configure_file( + ${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in + ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake @ONLY) # Generate version info for both build-tree and install-tree. configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfigVersion.cmake.in - ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake - @ONLY) + ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake @ONLY) # Define the public headers. set_target_properties(jansson PROPERTIES PUBLIC_HEADER "${JANSSON_HDR_PUBLIC}") -#TODO: fix this. +# TODO: fix this. # # Install targets. # # Disabled by OBS option(JANSSON_INSTALL "Generate installation target" OFF) -if (JANSSON_INSTALL) -install(TARGETS jansson - EXPORT JanssonTargets - LIBRARY DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib - ARCHIVE DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib - RUNTIME DESTINATION "${JANSSON_INSTALL_BIN_DIR}" COMPONENT lib # Windows DLLs - PUBLIC_HEADER DESTINATION "${JANSSON_INSTALL_INCLUDE_DIR}" COMPONENT dev) +if(JANSSON_INSTALL) + install( + TARGETS jansson + EXPORT JanssonTargets + LIBRARY DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib + ARCHIVE DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib + RUNTIME DESTINATION "${JANSSON_INSTALL_BIN_DIR}" COMPONENT lib # Windows + # DLLs + PUBLIC_HEADER DESTINATION "${JANSSON_INSTALL_INCLUDE_DIR}" COMPONENT dev) -# Install the pkg-config. -install (FILES - ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc - DESTINATION ${JANSSON_INSTALL_LIB_DIR}/pkgconfig COMPONENT dev) + # Install the pkg-config. + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc + DESTINATION ${JANSSON_INSTALL_LIB_DIR}/pkgconfig + COMPONENT dev) -# Install the configs. -install(FILES - ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake - ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake - DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + # Install the configs. + install( + FILES ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake + ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" + COMPONENT dev) -# Install exports for the install-tree. -install(EXPORT JanssonTargets - DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + # Install exports for the install-tree. + install( + EXPORT JanssonTargets + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" + COMPONENT dev) endif() # For use when simply using add_library from a parent project to build jansson. -set(JANSSON_LIBRARIES jansson CACHE STRING "Jansson libraries") +set(JANSSON_LIBRARIES + jansson + CACHE STRING "Jansson libraries") -target_include_directories(jansson - PUBLIC src "${CMAKE_CURRENT_BINARY_DIR}/include") +target_include_directories(jansson PUBLIC src + "${CMAKE_CURRENT_BINARY_DIR}/include") diff --git a/deps/libcaption/CMakeLists.txt b/deps/libcaption/CMakeLists.txt index 0dd474cee..97d1c8a17 100644 --- a/deps/libcaption/CMakeLists.txt +++ b/deps/libcaption/CMakeLists.txt @@ -1,41 +1,40 @@ -cmake_minimum_required(VERSION 2.8.12) project(libcaption) -add_definitions(-D__STDC_CONSTANT_MACROS) -if (WIN32) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) -endif() -if (UNIX AND NOT APPLE) - add_compile_options("-fPIC") -endif() +add_library(caption STATIC) +add_library(OBS::caption ALIAS caption) -# Don't need to prefix local includes with "caption/*" -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/caption) +target_sources( + caption + PRIVATE src/caption.c + src/utf8.c + caption/utf8.h + src/srt.c + src/scc.c + caption/scc.h + src/mpeg.c + caption/mpeg.h + src/cea708.c + caption/cea708.h + src/xds.c + src/eia608.c + caption/eia608.h + src/eia608_from_utf8.c + src/eia608_charmap.c + caption/eia608_charmap.h + PUBLIC caption/caption.h) -set(CAPTION_SOURCES - src/utf8.c - src/srt.c - src/scc.c - src/mpeg.c - src/cea708.c - src/xds.c - src/caption.c - src/eia608_charmap.c - src/eia608_from_utf8.c - src/eia608.c -) +target_compile_definitions( + caption PRIVATE __STDC_CONSTANT_MACROS + "$<$:_CRT_SECURE_NO_WARNINGS>") -set(CAPTION_HEADERS - caption/utf8.h - caption/scc.h - caption/mpeg.h - caption/cea708.h - caption/eia608.h - caption/caption.h - caption/eia608_charmap.h -) +target_include_directories( + caption + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/caption + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -add_library(caption STATIC ${CAPTION_SOURCES}) -set_target_properties(caption PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) +set_target_properties( + caption + PROPERTIES FOLDER "deps" + VERSION "0" + SOVERSION "0" + POSITION_INDEPENDENT_CODE ON) diff --git a/deps/libff/CMakeLists.txt b/deps/libff/CMakeLists.txt index 3ff4baa23..6425075e6 100644 --- a/deps/libff/CMakeLists.txt +++ b/deps/libff/CMakeLists.txt @@ -1,61 +1,57 @@ -cmake_minimum_required (VERSION 2.8.12) -project (libff) +cmake_minimum_required(VERSION 2.8.12) +project(libff) -find_package(FFmpeg REQUIRED - COMPONENTS avcodec avfilter avdevice avutil swscale avformat swresample) +find_package( + FFmpeg REQUIRED + COMPONENTS avcodec + avfilter + avdevice + avutil + swscale + avformat + swresample) include_directories(${FFMPEG_INCLUDE_DIRS}) if(WIN32 AND NOT MINGW) - include_directories(../w32-pthreads) - add_definitions(-Dinline=__inline) + include_directories(../w32-pthreads) + add_definitions(-Dinline=__inline) endif(WIN32 AND NOT MINGW) set(libff_HEADERS - libff/ff-callbacks.h - libff/ff-circular-queue.h - libff/ff-clock.h - libff/ff-frame.h - libff/ff-packet-queue.h - libff/ff-threading.h - libff/ff-timer.h - libff/ff-util.h - # - libff/ff-demuxer.h - # - libff/ff-decoder.h) + libff/ff-callbacks.h + libff/ff-circular-queue.h + libff/ff-clock.h + libff/ff-frame.h + libff/ff-packet-queue.h + libff/ff-threading.h + libff/ff-timer.h + libff/ff-util.h + libff/ff-demuxer.h + libff/ff-decoder.h) set(libff_SOURCES - libff/ff-callbacks.c - libff/ff-circular-queue.c - libff/ff-clock.c - libff/ff-packet-queue.c - libff/ff-timer.c - libff/ff-util.c - # - libff/ff-demuxer.c - # - libff/ff-decoder.c - libff/ff-audio-decoder.c - libff/ff-video-decoder.c) + libff/ff-callbacks.c + libff/ff-circular-queue.c + libff/ff-clock.c + libff/ff-packet-queue.c + libff/ff-timer.c + libff/ff-util.c + libff/ff-demuxer.c + libff/ff-decoder.c + libff/ff-audio-decoder.c + libff/ff-video-decoder.c) -if (WIN32) - list(APPEND libff_SOURCES - libff/ff-threading-windows.c) +if(WIN32) + list(APPEND libff_SOURCES libff/ff-threading-windows.c) else(WIN32) - list(APPEND libff_SOURCES - libff/ff-threading-posix.c) + list(APPEND libff_SOURCES libff/ff-threading-posix.c) endif(WIN32) -add_library (libff STATIC - ${libff_HEADERS} - ${libff_SOURCES}) -set_target_properties(libff PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) +add_library(libff STATIC ${libff_HEADERS} ${libff_SOURCES}) +set_target_properties(libff PROPERTIES FOLDER "deps" POSITION_INDEPENDENT_CODE + ON) -target_include_directories(libff - PUBLIC .) +target_include_directories(libff PUBLIC .) -target_link_libraries (libff - ${FFMPEG_LIBRARIES}) +target_link_libraries(libff ${FFMPEG_LIBRARIES}) diff --git a/deps/lzma/CMakeLists.txt b/deps/lzma/CMakeLists.txt index 6e64d3f06..87b433379 100644 --- a/deps/lzma/CMakeLists.txt +++ b/deps/lzma/CMakeLists.txt @@ -1,148 +1,112 @@ -cmake_minimum_required(VERSION 3.2) - project(lzma) -set(LIBLZMA_INCLUDE_DIRS - "${CMAKE_CURRENT_SOURCE_DIR}" - "${CMAKE_CURRENT_SOURCE_DIR}/liblzma/api" - CACHE PATH "lzma include path") +add_library(lzma STATIC) +add_library(OBS::lzma ALIAS lzma) -set(LIBLZMA_CONFIG - "${CMAKE_CURRENT_SOURCE_DIR}/config.h" - CACHE PATH "lzma config.h path") +target_sources(lzma PRIVATE config.h) -include_directories( - ${LIBLZMA_INCLUDE_DIRS} - common - liblzma/api - liblzma/check - liblzma/common - liblzma/delta - liblzma/lz - liblzma/lzma - liblzma/rangecoder - liblzma/simple -) +target_sources( + lzma + PRIVATE liblzma/check/check.c liblzma/check/crc32_table.c + liblzma/check/crc32_fast.c liblzma/check/crc64_table.c + liblzma/check/crc64_fast.c liblzma/check/sha256.c) -add_definitions( - -DHAVE_CONFIG_H - -DTUKLIB_SYMBOL_PREFIX=lzma_) +target_sources( + lzma + PRIVATE liblzma/common/common.c + liblzma/common/block_util.c + liblzma/common/easy_preset.c + liblzma/common/filter_common.c + liblzma/common/hardware_physmem.c + liblzma/common/index.c + liblzma/common/stream_flags_common.c + liblzma/common/vli_size.c + liblzma/common/alone_encoder.c + liblzma/common/block_buffer_encoder.c + liblzma/common/block_encoder.c + liblzma/common/block_header_encoder.c + liblzma/common/easy_buffer_encoder.c + liblzma/common/easy_encoder.c + liblzma/common/easy_encoder_memusage.c + liblzma/common/filter_buffer_encoder.c + liblzma/common/filter_encoder.c + liblzma/common/filter_flags_encoder.c + liblzma/common/index_encoder.c + liblzma/common/stream_buffer_encoder.c + liblzma/common/stream_encoder.c + liblzma/common/stream_flags_encoder.c + liblzma/common/vli_encoder.c + liblzma/common/alone_decoder.c + liblzma/common/auto_decoder.c + liblzma/common/block_buffer_decoder.c + liblzma/common/block_decoder.c + liblzma/common/block_header_decoder.c + liblzma/common/easy_decoder_memusage.c + liblzma/common/filter_buffer_decoder.c + liblzma/common/filter_decoder.c + liblzma/common/filter_flags_decoder.c + liblzma/common/index_decoder.c + liblzma/common/index_hash.c + liblzma/common/stream_buffer_decoder.c + liblzma/common/stream_decoder.c + liblzma/common/stream_flags_decoder.c + liblzma/common/vli_decoder.c) -if(WIN32) - if(MSVC) - add_compile_options($,/MTd,/MT> /Zl) - add_compile_options("/wd4244") - add_compile_options("/wd4267") - endif() - add_definitions( - -Dinline=_inline - -Drestrict=__restrict) +target_sources( + lzma PRIVATE liblzma/delta/delta_common.c liblzma/delta/delta_encoder.c + liblzma/delta/delta_decoder.c) + +target_sources( + lzma + PRIVATE liblzma/lzma/lzma_encoder.c + liblzma/lzma/lzma_encoder_presets.c + liblzma/lzma/lzma_encoder_optimum_fast.c + liblzma/lzma/lzma_encoder_optimum_normal.c + liblzma/lzma/fastpos_table.c + liblzma/lzma/lzma_decoder.c + liblzma/lzma/lzma2_encoder.c + liblzma/lzma/lzma2_decoder.c) + +target_sources(lzma PRIVATE liblzma/lz/lz_encoder.c liblzma/lz/lz_encoder_mf.c + liblzma/lz/lz_decoder.c) + +target_sources(lzma PRIVATE liblzma/rangecoder/price_table.c) + +target_sources( + lzma + PRIVATE liblzma/simple/simple_coder.c + liblzma/simple/simple_encoder.c + liblzma/simple/simple_decoder.c + liblzma/simple/arm.c + liblzma/simple/armthumb.c + liblzma/simple/ia64.c + liblzma/simple/powerpc.c + liblzma/simple/sparc.c + liblzma/simple/x86.c) + +target_compile_definitions(lzma PRIVATE HAVE_CONFIG_H + TUKLIB_SYMBOL_PREFIX=lzma_) + +target_include_directories( + lzma + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/common + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/check + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/common + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/delta + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/lz + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/lzma + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/rangecoder + ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/simple + PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/liblzma/api) + +if(OS_WINDOWS) + if(MSVC) + target_compile_options(lzma PRIVATE "$,/MTd,/MT>" /Zl + /wd4244 /wd4267) + endif() + + target_compile_definitions(lzma PRIVATE inline=_inline restrict=__restrict) endif() -set(liblzma_check_SOURCES - liblzma/check/check.c) - -list(APPEND liblzma_check_SOURCES - liblzma/check/crc32_table.c - liblzma/check/crc32_fast.c - liblzma/check/crc64_table.c - liblzma/check/crc64_fast.c - liblzma/check/sha256.c) - -set(liblzma_common_SOURCES - liblzma/common/common.c - liblzma/common/block_util.c - liblzma/common/easy_preset.c - liblzma/common/filter_common.c - liblzma/common/hardware_physmem.c - liblzma/common/index.c - liblzma/common/stream_flags_common.c - liblzma/common/vli_size.c - liblzma/common/alone_encoder.c - liblzma/common/block_buffer_encoder.c - liblzma/common/block_encoder.c - liblzma/common/block_header_encoder.c - liblzma/common/easy_buffer_encoder.c - liblzma/common/easy_encoder.c - liblzma/common/easy_encoder_memusage.c - liblzma/common/filter_buffer_encoder.c - liblzma/common/filter_encoder.c - liblzma/common/filter_flags_encoder.c - liblzma/common/index_encoder.c - liblzma/common/stream_buffer_encoder.c - liblzma/common/stream_encoder.c - liblzma/common/stream_flags_encoder.c - liblzma/common/vli_encoder.c - liblzma/common/alone_decoder.c - liblzma/common/auto_decoder.c - liblzma/common/block_buffer_decoder.c - liblzma/common/block_decoder.c - liblzma/common/block_header_decoder.c - liblzma/common/easy_decoder_memusage.c - liblzma/common/filter_buffer_decoder.c - liblzma/common/filter_decoder.c - liblzma/common/filter_flags_decoder.c - liblzma/common/index_decoder.c - liblzma/common/index_hash.c - liblzma/common/stream_buffer_decoder.c - liblzma/common/stream_decoder.c - liblzma/common/stream_flags_decoder.c - liblzma/common/vli_decoder.c) - -set(liblzma_delta_SOURCES - liblzma/delta/delta_common.c - liblzma/delta/delta_encoder.c - liblzma/delta/delta_decoder.c) - -set(liblzma_lzma_SOURCES - liblzma/lzma/lzma_encoder.c - liblzma/lzma/lzma_encoder_presets.c - liblzma/lzma/lzma_encoder_optimum_fast.c - liblzma/lzma/lzma_encoder_optimum_normal.c - liblzma/lzma/fastpos_table.c - liblzma/lzma/lzma_decoder.c - - liblzma/lzma/lzma2_encoder.c - liblzma/lzma/lzma2_decoder.c) - -set(liblzma_lz_SOURCES - liblzma/lz/lz_encoder.c - liblzma/lz/lz_encoder_mf.c - liblzma/lz/lz_decoder.c) - -set(liblzma_rangecoder_SOURCES - liblzma/rangecoder/price_table.c) - -set(liblzma_simple_SOURCES - liblzma/simple/simple_coder.c - liblzma/simple/simple_encoder.c - liblzma/simple/simple_decoder.c - - liblzma/simple/arm.c - liblzma/simple/armthumb.c - liblzma/simple/ia64.c - liblzma/simple/powerpc.c - liblzma/simple/sparc.c - liblzma/simple/x86.c) - -if (WIN32) - SET_SOURCE_FILES_PROPERTIES( - ${liblzma_check_SOURCES} - ${liblzma_common_SOURCES} - ${liblzma_delta_SOURCES} - ${liblzma_lz_SOURCES} - ${liblzma_lzma_SOURCES} - ${liblzma_rangecoder_SOURCES} - ${liblzma_simple_SOURCES} - PROPERTIES LANGUAGE C) -endif() - -add_library(lzma STATIC - ${liblzma_check_SOURCES} - ${liblzma_common_SOURCES} - ${liblzma_delta_SOURCES} - ${liblzma_lz_SOURCES} - ${liblzma_lzma_SOURCES} - ${liblzma_rangecoder_SOURCES} - ${liblzma_simple_SOURCES}) set_target_properties(lzma PROPERTIES FOLDER "deps") diff --git a/deps/media-playback/CMakeLists.txt b/deps/media-playback/CMakeLists.txt index 621c17a79..e97d3004c 100644 --- a/deps/media-playback/CMakeLists.txt +++ b/deps/media-playback/CMakeLists.txt @@ -1,39 +1,23 @@ project(media-playback) -find_package(FFmpeg REQUIRED - COMPONENTS avcodec avdevice avutil avformat) +option(ENABLE_SIMDE "Enable non-native SSE2 SIMD support" ON) -include_directories( - ${CMAKE_SOURCE_DIR}/libobs - ${FFMPEG_INCLUDE_DIRS} - ) +find_package(FFmpeg REQUIRED COMPONENTS avcodec avdevice avutil avformat) -set(media-playback_HEADERS - media-playback/closest-format.h - media-playback/decode.h - media-playback/media.h - ) -set(media-playback_SOURCES - media-playback/decode.c - media-playback/media.c - ) +add_library(media-playback INTERFACE) +add_library(OBS::media-playback ALIAS media-playback) -add_library(media-playback STATIC - ${media-playback_HEADERS} - ${media-playback_SOURCES} - ) +target_sources( + media-playback + INTERFACE media-playback/media.c media-playback/media.h + media-playback/decode.c media-playback/decode.h + media-playback/closest-format.h) -target_compile_options(media-playback - PUBLIC - ${ARCH_SIMD_FLAGS}) +target_link_libraries(media-playback INTERFACE FFmpeg::avcodec FFmpeg::avdevice + FFmpeg::avutil FFmpeg::avformat) -target_include_directories(media-playback - PUBLIC . - ) +target_include_directories(media-playback INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(media-playback - ${FFMPEG_LIBRARIES} - ) -set_target_properties(media-playback PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) +target_compile_options(media-playback INTERFACE ${ARCH_SIMD_FLAGS}) + +target_compile_definitions(media-playback INTERFACE ${ARCH_SIMD_DEFINES}) diff --git a/deps/obs-scripting/CMakeLists.txt b/deps/obs-scripting/CMakeLists.txt index 41522f62b..5cdbbee0d 100644 --- a/deps/obs-scripting/CMakeLists.txt +++ b/deps/obs-scripting/CMakeLists.txt @@ -1,216 +1,181 @@ -cmake_minimum_required(VERSION 2.8.12) +option(ENABLE_SCRIPTING_LUA "Enable Lua scripting support" ON) +option(ENABLE_SCRIPTING_PYTHON "Enable Python scripting support" ON) if(NOT ENABLE_SCRIPTING) - message(STATUS "Scripting plugin disabled") - return() + message(STATUS "OBS: DISABLED obs-scripting") + return() endif() project(obs-scripting) -if(POLICY CMP0068) - # RPATH settings on macOS do not affect install_name. - cmake_policy(SET CMP0068 NEW) -endif() +if(ENABLE_SCRIPTING_LUA) + add_subdirectory(obslua) + find_package(Luajit) -if(MSVC) - set(obs-scripting_PLATFORM_DEPS - w32-pthreads) -endif() - -if(APPLE) - set(obs-scripting_PLATFORM_DEPS - objc) -endif() - -option(DISABLE_LUA "Disable Lua scripting support" OFF) -option(DISABLE_PYTHON "Disable Python scripting support" OFF) - -set(COMPILE_PYTHON FALSE CACHE BOOL "" FORCE) -set(COMPILE_LUA FALSE CACHE BOOL "" FORCE) - -if(NOT DISABLE_LUA) - find_package(Luajit QUIET) - - if(NOT DISABLE_LUA AND NOT LUAJIT_FOUND) - message(STATUS "Luajit support not found.") - set(LUAJIT_FOUND FALSE) - else() - message(STATUS "Scripting: Luajit supported") - set(COMPILE_LUA TRUE CACHE BOOL "" FORCE) - endif() + if(NOT TARGET Luajit::Luajit) + message(FATAL_ERROR "OBS: - Luajit not found") + return() + else() + message(STATUS "OBS: - Luajit found") + endif() else() - message(STATUS "Scripting: Luajit support disabled") - set(LUAJIT_FOUND FALSE) + message(STATUS "OBS: DISABLED Luajit support") endif() -if(NOT DISABLE_PYTHON) - find_package(PythonDeps QUIET) +if(ENABLE_SCRIPTING_PYTHON) + add_subdirectory(obspython) + if(OS_WINDOWS) + find_package(PythonWindows) + else() + find_package(Python COMPONENTS Interpreter Development) + endif() - if(NOT DISABLE_PYTHON AND NOT PYTHONLIBS_FOUND) - message(STATUS "Python support not found.") - set(PYTHON_FOUND FALSE) - set(PYTHONLIBS_FOUND FALSE) - else() - message(STATUS "Scripting: Python 3 supported") - set(PYTHON_FOUND TRUE) - set(COMPILE_PYTHON TRUE CACHE BOOL "" FORCE) - - get_filename_component(PYTHON_LIB "${PYTHON_LIBRARIES}" NAME) - string(REGEX REPLACE "\\.[^.]*$" "" PYTHON_LIB ${PYTHON_LIB}) - - if(WIN32) - string(REGEX REPLACE "_d" "" PYTHON_LIB "${PYTHON_LIB}") - endif() - endif() + if(NOT TARGET Python::Python) + message(FATAL_ERROR "OBS: - Python not found") + return() + else() + message(STATUS "OBS: - Python ${Python_VERSION} found") + endif() else() - message(STATUS "Scripting: Python 3 support disabled") - set(PYTHON_FOUND FALSE) - set(PYTHONLIBS_FOUND FALSE) + message(STATUS "OBS: DISABLED Python support") endif() -find_package(SwigDeps QUIET 2) - -if(NOT SWIG_FOUND) - message(STATUS "Scripting: SWIG not found; scripting disabled") - return() +if(NOT TARGET Luajit::Luajit AND NOT TARGET Python::Python) + message( + WARNING + "OBS: DISABLED obs-scripting - no supported scripting libraries found") + return() endif() -if(NOT PYTHONLIBS_FOUND AND NOT LUAJIT_FOUND) - message(STATUS "Scripting: Neither Python 3 nor Luajit was found; scripting plugin disabled") - return() +if(OS_MACOS) + find_package(SWIG 4 REQUIRED) +elseif(OS_POSIX) + find_package(SWIG 3 REQUIRED) +elseif(OS_WINDOWS) + find_package(SwigWindows 3 REQUIRED) endif() -set(SCRIPTING_ENABLED ON CACHE BOOL "Internal global cmake variable" FORCE) +add_library(obs-scripting SHARED) +add_library(OBS::scripting ALIAS obs-scripting) -if(UI_ENABLED) - set(EXTRA_LIBS obs-frontend-api) - include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/UI/obs-frontend-api") +target_sources( + obs-scripting + PUBLIC obs-scripting.h + PRIVATE obs-scripting.c cstrcache.cpp cstrcache.h obs-scripting-logging.c + obs-scripting-callback.h) + +target_link_libraries(obs-scripting PRIVATE OBS::libobs) + +target_compile_features(obs-scripting PRIVATE cxx_auto_type) + +target_include_directories(obs-scripting PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/config) + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Studio scripting module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-scripting.rc) + + target_sources(obs-scripting PRIVATE obs-scripting.rc) + + target_link_libraries(obs-scripting PRIVATE OBS::w32-pthreads) + +elseif(OS_MACOS) + target_link_libraries(obs-scripting PRIVATE objc) endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/obs-scripting-config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/obs-scripting-config.h") - -include(${SWIG_USE_FILE}) - -include_directories(${CMAKE_SOURCE_DIR}/libobs) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -if(PYTHONLIBS_FOUND) - include_directories(${PYTHON_INCLUDE_DIR}) - - set(obs-scripting-python_SOURCES - obs-scripting-python.c - ) - set(obs-scripting-python_HEADERS - obs-scripting-python.h - obs-scripting-python-import.h - ) - - if(UI_ENABLED) - set(obs-scripting-python_SOURCES - ${obs-scripting-python_SOURCES} - obs-scripting-python-frontend.c - ) - endif() - if(WIN32 OR APPLE) - set(obs-scripting-python_SOURCES - ${obs-scripting-python_SOURCES} - obs-scripting-python-import.c - ) - else() - set(EXTRA_LIBS ${EXTRA_LIBS} ${PYTHON_LIBRARIES}) - endif() -endif() - -if(LUAJIT_FOUND) - include_directories(${LUAJIT_INCLUDE_DIR}) - - set(obs-scripting-lua_SOURCES - obs-scripting-lua.c - obs-scripting-lua-source.c - ) - set(obs-scripting-lua_HEADERS - obs-scripting-lua.h - ) - if(UI_ENABLED) - set(obs-scripting-lua_SOURCES - ${obs-scripting-lua_SOURCES} - obs-scripting-lua-frontend.c - ) - endif() -endif() - -set(obs-scripting_SOURCES - obs-scripting.c - obs-scripting-logging.c - cstrcache.cpp - ) -set(obs-scripting_HEADERS - ${CMAKE_CURRENT_BINARY_DIR}/obs-scripting-config.h - obs-scripting.h - obs-scripting-callback.h - cstrcache.h - ) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS Studio scripting module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-scripting.rc) - list(APPEND obs-scripting_SOURCES - obs-scripting.rc) -endif() +set_target_properties( + obs-scripting + PROPERTIES FOLDER "scripting" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "1") file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/swig) -if(PYTHONLIBS_FOUND) - set(SWIG_PY_RUNTIME swig/swigpyrun.h) - add_custom_command(OUTPUT ${SWIG_PY_RUNTIME} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PRE_BUILD - COMMAND ${SWIG_EXECUTABLE} -python -external-runtime ${SWIG_PY_RUNTIME} - COMMENT "Scripting plugin: Building Python SWIG interface header" - ) - set_source_files_properties(${SWIG_PY_RUNTIME} PROPERTIES GENERATED TRUE) +if(TARGET Luajit::Luajit) + add_custom_command( + OUTPUT swig/swigluarun.h + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + PRE_BUILD + COMMAND ${SWIG_EXECUTABLE} -lua -external-runtime swig/swigluarun.h + COMMENT "obs-scripting - generating Luajit SWIG interface headers") + + set_source_files_properties(swig/swigluarun.h PROPERTIES GENERATED ON) + + target_link_libraries(obs-scripting PRIVATE Luajit::Luajit) + + target_sources( + obs-scripting + PRIVATE obs-scripting-lua.c obs-scripting-lua.h obs-scripting-lua-source.c + ${CMAKE_CURRENT_BINARY_DIR}/swig/swigluarun.h) + + target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + + if(ENABLE_UI) + target_link_libraries(obs-scripting PRIVATE OBS::frontend-api) + + target_sources(obs-scripting PRIVATE obs-scripting-lua-frontend.c) + + target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON) + endif() + endif() -if(LUAJIT_FOUND) - set(SWIG_LUA_RUNTIME swig/swigluarun.h) - add_custom_command(OUTPUT ${SWIG_LUA_RUNTIME} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - PRE_BUILD - COMMAND ${SWIG_EXECUTABLE} -lua -external-runtime ${SWIG_LUA_RUNTIME} - COMMENT "Scripting: Building Lua SWIG interface header" - ) - set_source_files_properties(${SWIG_LUA_RUNTIME} PROPERTIES GENERATED TRUE) +if(TARGET Python::Python) + add_custom_command( + OUTPUT swig/swigpyrun.h + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + PRE_BUILD + COMMAND ${SWIG_EXECUTABLE} -python -external-runtime swig/swigpyrun.h + COMMENT "obs-scripting - generating Python 3 SWIG interface headers") + + set_source_files_properties(swig/swigpyrun.h PROPERTIES GENERATED ON) + + target_sources( + obs-scripting + PRIVATE obs-scripting-python.c obs-scripting-python.h + obs-scripting-python-import.h + ${CMAKE_CURRENT_BINARY_DIR}/swig/swigpyrun.h) + + target_include_directories(obs-scripting PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + + get_filename_component(_PYTHON_PATH "${Python_LIBRARIES}" PATH) + get_filename_component(_PYTHON_FILE "${Python_LIBRARIES}" NAME) + + string(REGEX REPLACE "\\.[^.]*$" "" _PYTHON_FILE ${_PYTHON_FILE}) + + if(OS_WINDOWS) + string(REGEX REPLACE "_d" "" _PYTHON_FILE ${_PYTHON_FILE}) + endif() + set(OBS_SCRIPT_PYTHON_PATH "${_PYTHON_FILE}") + + unset(_PYTHON_FILE) + unset(_PYTHON_PATH) + + if(OS_WINDOWS OR OS_MACOS) + target_include_directories(obs-scripting PRIVATE ${Python_INCLUDE_DIRS}) + + target_sources(obs-scripting PRIVATE obs-scripting-python-import.c) + if(OS_MACOS) + target_link_options(obs-scripting PRIVATE -undefined dynamic_lookup) + endif() + else() + target_link_libraries(obs-scripting PRIVATE Python::Python) + endif() + + if(ENABLE_UI) + target_link_libraries(obs-scripting PRIVATE OBS::frontend-api) + + target_sources(obs-scripting PRIVATE obs-scripting-python-frontend.c) + + target_compile_definitions(obs-scripting PRIVATE UI_ENABLED=ON) + endif() endif() -add_library(obs-scripting SHARED - ${obs-scripting_SOURCES} - ${obs-scripting_HEADERS} - ${obs-scripting-python_SOURCES} - ${obs-scripting-python_HEADERS} - ${obs-scripting-lua_SOURCES} - ${obs-scripting-lua_HEADERS} - ${SWIG_PY_RUNTIME} - ${SWIG_LUA_RUNTIME} - ) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs-scripting-config.h.in + ${CMAKE_BINARY_DIR}/config/obs-scripting-config.h) -target_link_libraries(obs-scripting - libobs - ${LUAJIT_LIBRARIES} - ${EXTRA_LIBS} - ${obs-scripting_PLATFORM_DEPS} - ) +target_sources(obs-scripting + PUBLIC ${CMAKE_BINARY_DIR}/config/obs-scripting-config.h) -set_target_properties(obs-scripting PROPERTIES FOLDER "scripting") - -if(PYTHONLIBS_FOUND) - add_subdirectory(obspython) -endif() - -if(LUAJIT_FOUND) - add_subdirectory(obslua) -endif() - -install_obs_core(obs-scripting) +setup_binary_target(obs-scripting) diff --git a/deps/obs-scripting/obs-scripting-config.h.in b/deps/obs-scripting/obs-scripting-config.h.in index 420512637..3525d06e7 100644 --- a/deps/obs-scripting/obs-scripting-config.h.in +++ b/deps/obs-scripting/obs-scripting-config.h.in @@ -16,8 +16,10 @@ #define OFF 0 #endif +#cmakedefine LUAJIT_FOUND +#cmakedefine Python_FOUND + #define SCRIPT_DIR "@OBS_SCRIPT_PLUGIN_PATH@" -#define PYTHON_LIB "@PYTHON_LIB@" -#define COMPILE_LUA @LUAJIT_FOUND@ -#define COMPILE_PYTHON @PYTHON_FOUND@ -#define UI_ENABLED @UI_ENABLED@ +#define PYTHON_LIB "@OBS_SCRIPT_PYTHON_PATH@" + +#define UI_ENABLED @ENABLE_UI@ diff --git a/deps/obs-scripting/obs-scripting-lua.c b/deps/obs-scripting/obs-scripting-lua.c index acfdc2637..f52ce5eef 100644 --- a/deps/obs-scripting/obs-scripting-lua.c +++ b/deps/obs-scripting/obs-scripting-lua.c @@ -32,19 +32,21 @@ #endif #ifdef __APPLE__ -#define SO_EXT "dylib" +#define SO_EXT "so" #elif _WIN32 +#include #define SO_EXT "dll" #else #define SO_EXT "so" #endif -static const char *startup_script_template = "\ +static const char *startup_script_template = + "\ for val in pairs(package.preload) do\n\ package.preload[val] = nil\n\ end\n\ -package.cpath = package.cpath .. \";\" .. \"%s/Contents/MacOS/?.so\" .. \";\" .. \"%s\" .. \"/?." SO_EXT - "\"\n\ +package.cpath = package.cpath .. \";\" .. \"%s/?." SO_EXT + "\" .. \";\" .. \"%s\" .. \"/?." SO_EXT "\"\n\ require \"obslua\"\n"; static const char *get_script_path_func = "\ @@ -1312,7 +1314,6 @@ void obs_lua_script_save(obs_script_t *s) void obs_lua_load(void) { - struct dstr dep_paths = {0}; struct dstr tmp = {0}; pthread_mutex_init(&tick_mutex, NULL); @@ -1322,34 +1323,29 @@ void obs_lua_load(void) /* ---------------------------------------------- */ /* Initialize Lua startup script */ - char *bundlePath = "./"; - -#ifdef __APPLE__ - Class nsRunningApplication = objc_lookUpClass("NSRunningApplication"); - SEL currentAppSel = sel_getUid("currentApplication"); - - typedef id (*running_app_func)(Class, SEL); - running_app_func operatingSystemName = (running_app_func)objc_msgSend; - id app = operatingSystemName(nsRunningApplication, currentAppSel); - - typedef id (*bundle_url_func)(id, SEL); - bundle_url_func bundleURL = (bundle_url_func)objc_msgSend; - id url = bundleURL(app, sel_getUid("bundleURL")); - - typedef id (*url_path_func)(id, SEL); - url_path_func urlPath = (url_path_func)objc_msgSend; - - id path = urlPath(url, sel_getUid("path")); - - typedef id (*string_func)(id, SEL); - string_func utf8String = (string_func)objc_msgSend; - bundlePath = (char *)utf8String(path, sel_registerName("UTF8String")); +#if _WIN32 +#define PATH_MAX MAX_PATH #endif - dstr_printf(&tmp, startup_script_template, bundlePath, SCRIPT_DIR); - startup_script = tmp.array; + char import_path[PATH_MAX]; - dstr_free(&dep_paths); +#ifdef __APPLE__ + struct dstr bundle_path; + + dstr_init_move_array(&bundle_path, os_get_executable_path_ptr("")); + dstr_cat(&bundle_path, "../PlugIns"); + char *absolute_plugin_path = os_get_abs_path_ptr(bundle_path.array); + + if(absolute_plugin_path != NULL) { + strcpy(import_path, absolute_plugin_path); + bfree(absolute_plugin_path); + } + dstr_free(&bundle_path); +#else + strcpy(import_path, "./"); +#endif + dstr_printf(&tmp, startup_script_template, import_path, SCRIPT_DIR); + startup_script = tmp.array; obs_add_tick_callback(lua_tick, NULL); } diff --git a/deps/obs-scripting/obs-scripting-python.c b/deps/obs-scripting/obs-scripting-python.c index 06e9fe9fc..e1362baad 100644 --- a/deps/obs-scripting/obs-scripting-python.c +++ b/deps/obs-scripting/obs-scripting-python.c @@ -1671,17 +1671,24 @@ bool obs_scripting_load_python(const char *python_path) /* ---------------------------------------------- */ /* Load main interface module */ +#ifdef __APPLE__ + struct dstr bundle_path; + + dstr_init_move_array(&bundle_path, os_get_executable_path_ptr("")); + dstr_cat(&bundle_path, "../PlugIns"); + char *absolute_plugin_path = os_get_abs_path_ptr(bundle_path.array); + + if(absolute_plugin_path != NULL) { + add_to_python_path(absolute_plugin_path); + bfree(absolute_plugin_path); + } + dstr_free(&bundle_path); +#endif + char *absolute_script_path = os_get_abs_path_ptr(SCRIPT_DIR); add_to_python_path(absolute_script_path); bfree(absolute_script_path); -#if __APPLE__ - char *exec_path = os_get_executable_path_ptr(""); - if (exec_path) - add_to_python_path(exec_path); - bfree(exec_path); -#endif - py_obspython = PyImport_ImportModule("obspython"); bool success = !py_error(); if (!success) { diff --git a/deps/obs-scripting/obs-scripting.c b/deps/obs-scripting/obs-scripting.c index 14bdbc04f..6b2f7643d 100644 --- a/deps/obs-scripting/obs-scripting.c +++ b/deps/obs-scripting/obs-scripting.c @@ -25,7 +25,7 @@ #include "obs-scripting-callback.h" #include "obs-scripting-config.h" -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) extern obs_script_t *obs_lua_script_create(const char *path, obs_data_t *settings); extern bool obs_lua_script_load(obs_script_t *s); @@ -39,7 +39,7 @@ extern void obs_lua_script_update(obs_script_t *script, obs_data_t *settings); extern void obs_lua_script_save(obs_script_t *script); #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) extern obs_script_t *obs_python_script_create(const char *path, obs_data_t *settings); extern bool obs_python_script_load(obs_script_t *s); @@ -61,10 +61,10 @@ static struct dstr file_filter = {0}; static bool scripting_loaded = false; static const char *supported_formats[] = { -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) "lua", #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) "py", #endif NULL}; @@ -144,13 +144,15 @@ bool obs_scripting_load(void) return false; } -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) obs_lua_load(); #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) obs_python_load(); -#ifndef _WIN32 /* don't risk python startup load issues on windows */ +#if !defined(_WIN32) && \ + !defined( \ + __APPLE__) /* Win32 and macOS need user-provided Python library paths */ obs_scripting_load_python(NULL); #endif #endif @@ -166,11 +168,11 @@ void obs_scripting_unload(void) /* ---------------------- */ -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) obs_lua_unload(); #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) obs_python_unload(); #endif @@ -249,12 +251,12 @@ obs_script_t *obs_script_create(const char *path, obs_data_t *settings) if (!ext) return NULL; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (strcmp(ext, ".lua") == 0) { script = obs_lua_script_create(path, settings); } else #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (strcmp(ext, ".py") == 0) { script = obs_python_script_create(path, settings); } else @@ -306,13 +308,13 @@ obs_properties_t *obs_script_get_properties(obs_script_t *script) if (!ptr_valid(script)) return NULL; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (script->type == OBS_SCRIPT_LANG_LUA) { props = obs_lua_script_get_properties(script); goto out; } #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (script->type == OBS_SCRIPT_LANG_PYTHON) { props = obs_python_script_get_properties(script); goto out; @@ -332,13 +334,13 @@ obs_data_t *obs_script_save(obs_script_t *script) if (!ptr_valid(script)) return NULL; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (script->type == OBS_SCRIPT_LANG_LUA) { obs_lua_script_save(script); goto out; } #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (script->type == OBS_SCRIPT_LANG_PYTHON) { obs_python_script_save(script); goto out; @@ -373,12 +375,12 @@ void obs_script_update(obs_script_t *script, obs_data_t *settings) { if (!ptr_valid(script)) return; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (script->type == OBS_SCRIPT_LANG_LUA) { obs_lua_script_update(script, settings); } #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (script->type == OBS_SCRIPT_LANG_PYTHON) { obs_python_script_update(script, settings); } @@ -392,7 +394,7 @@ bool obs_script_reload(obs_script_t *script) if (!ptr_valid(script)) return false; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (script->type == OBS_SCRIPT_LANG_LUA) { obs_lua_script_unload(script); clear_call_queue(); @@ -400,7 +402,7 @@ bool obs_script_reload(obs_script_t *script) goto out; } #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (script->type == OBS_SCRIPT_LANG_PYTHON) { obs_python_script_unload(script); clear_call_queue(); @@ -423,14 +425,14 @@ void obs_script_destroy(obs_script_t *script) if (!script) return; -#if COMPILE_LUA +#if defined(LUAJIT_FOUND) if (script->type == OBS_SCRIPT_LANG_LUA) { obs_lua_script_unload(script); obs_lua_script_destroy(script); return; } #endif -#if COMPILE_PYTHON +#if defined(Python_FOUND) if (script->type == OBS_SCRIPT_LANG_PYTHON) { obs_python_script_unload(script); obs_python_script_destroy(script); @@ -439,7 +441,7 @@ void obs_script_destroy(obs_script_t *script) #endif } -#if !COMPILE_PYTHON +#if !defined(Python_FOUND) bool obs_scripting_load_python(const char *python_path) { UNUSED_PARAMETER(python_path); diff --git a/deps/obs-scripting/obslua/CMakeLists.txt b/deps/obs-scripting/obslua/CMakeLists.txt index 3a452a65f..6e65da835 100644 --- a/deps/obs-scripting/obslua/CMakeLists.txt +++ b/deps/obs-scripting/obslua/CMakeLists.txt @@ -1,62 +1,61 @@ -cmake_minimum_required(VERSION 2.8.12) -project(obslua) +if(POLICY CMP0086) + cmake_policy(SET CMP0086 NEW) +endif() if(POLICY CMP0078) - # UseSWIG generates standard target names. - cmake_policy(SET CMP0078 OLD) -endif() -if(POLICY CMP0086) - # UseSWIG honors SWIG_MODULE_NAME via -module flag. - cmake_policy(SET CMP0086 OLD) + cmake_policy(SET CMP0078 NEW) endif() -find_package(SWIG 2 REQUIRED) -include(${SWIG_USE_FILE}) +project(obslua) -add_definitions(-DSWIG_TYPE_TABLE=obslua -DSWIG_LUA_INTERPRETER_NO_DEBUG) +find_package(Luajit REQUIRED) -if(MSVC) - add_compile_options("/wd4054") - add_compile_options("/wd4197") - add_compile_options("/wd4244") - add_compile_options("/wd4267") +if(OS_MACOS) + find_package(SWIG 4 REQUIRED) +elseif(OS_POSIX) + find_package(SWIG 3 REQUIRED) +elseif(OS_WINDOWS) + find_package(SwigWindows 3 REQUIRED) +endif() +include(UseSWIG) + +set_source_files_properties(obslua.i PROPERTIES USE_TARGET_INCLUDE_DIRECTORIES + TRUE) + +swig_add_library( + obslua + LANGUAGE lua + TYPE MODULE + SOURCES obslua.i ../cstrcache.cpp ../cstrcache.h) + +target_link_libraries(obslua PRIVATE OBS::scripting OBS::libobs Luajit::Luajit) + +set_target_properties( + obslua PROPERTIES SWIG_COMPILE_DEFINITIONS + "SWIG_TYPE_TABLE=obslua;SWIG_LUA_INTERPRETER_NO_DEBUG") + +set_target_properties( + obslua + PROPERTIES FOLDER "scripting" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "${OBS_VERSION_CANONICAL}") + +target_compile_definitions(obslua PRIVATE SWIG_TYPE_TABLE=obslua + SWIG_LUA_INTERPRETER_NO_DEBUG) + +if(ENABLE_UI) + target_link_libraries(obslua PRIVATE OBS::frontend-api) + + target_compile_definitions(obslua PRIVATE ENABLE_UI) endif() -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -if(CMAKE_VERSION VERSION_GREATER 3.7.2) - SWIG_ADD_LIBRARY(obslua - LANGUAGE lua - TYPE MODULE - SOURCES obslua.i ../cstrcache.cpp ../cstrcache.h) -else() - SWIG_ADD_MODULE(obslua lua obslua.i ../cstrcache.cpp ../cstrcache.h) +if(OS_WINDOWS) + if(MSVC) + target_compile_options(obslua PRIVATE /wd4054 /wd4197 /wd4244 /wd4267) + endif() +elseif(OS_MACOS) + set_target_properties(obslua PROPERTIES MACHO_CURRENT_VERSION 0 + MACHO_COMPATIBILITY_VERSION 0) endif() -SWIG_LINK_LIBRARIES(obslua obs-scripting libobs ${LUA_LIBRARIES} ${EXTRA_LIBS}) -set_target_properties(obslua PROPERTIES FOLDER "scripting") - -function(install_plugin_bin_swig target additional_target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() - - set_target_properties(${additional_target} PROPERTIES - PREFIX "") - - install(TARGETS "${additional_target}" - LIBRARY DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}") - - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${OBS_OUTPUT_DIR}/$/data/obs-scripting/${_bit_suffix}$" - VERBATIM) -endfunction() - -install_plugin_bin_swig(obs-scripting obslua) +setup_script_plugin_target(obslua) diff --git a/deps/obs-scripting/obslua/obslua.i b/deps/obs-scripting/obslua/obslua.i index e800dcbbf..bb5536de2 100644 --- a/deps/obs-scripting/obslua/obslua.i +++ b/deps/obs-scripting/obslua/obslua.i @@ -26,7 +26,7 @@ #include "obs-scripting-config.h" #include -#if UI_ENABLED +#if defined(ENABLE_UI) #include "obs-frontend-api.h" #endif @@ -104,6 +104,6 @@ static inline void wrap_blog(int log_level, const char *message) %include "util/base.h" %include "util/platform.h" -#if UI_ENABLED +#if defined(ENABLE_UI) %include "obs-frontend-api.h" #endif diff --git a/deps/obs-scripting/obspython/CMakeLists.txt b/deps/obs-scripting/obspython/CMakeLists.txt index 950405231..a165f547a 100644 --- a/deps/obs-scripting/obspython/CMakeLists.txt +++ b/deps/obs-scripting/obspython/CMakeLists.txt @@ -1,92 +1,113 @@ -cmake_minimum_required(VERSION 2.8.12) +if(POLICY CMP0078) + cmake_policy(SET CMP0078 NEW) +endif() + +if(POLICY CMP0086) + cmake_policy(SET CMP0086 NEW) +endif() + project(obspython) -if(POLICY CMP0078) - # UseSWIG generates standard target names. - cmake_policy(SET CMP0078 OLD) +if(OS_MACOS) + find_package(Python REQUIRED COMPONENTS Interpreter Development) + find_package(SWIG 4 REQUIRED) +elseif(OS_POSIX) + find_package(Python REQUIRED COMPONENTS Interpreter Development) + find_package(SWIG 3 REQUIRED) +elseif(OS_WINDOWS) + find_package(PythonWindows REQUIRED) + find_package(SwigWindows 3 REQUIRED) endif() -if(POLICY CMP0086) - # UseSWIG honors SWIG_MODULE_NAME via -module flag. - cmake_policy(SET CMP0086 OLD) +include(UseSWIG) + +set_source_files_properties( + obspython.i PROPERTIES USE_TARGET_INCLUDE_DIRECTORIES TRUE SWIG_FLAGS + "-builtin;-py3") + +swig_add_library( + obspython + LANGUAGE python + TYPE MODULE + SOURCES obspython.i ../cstrcache.cpp ../cstrcache.h) + +target_link_libraries(obspython PRIVATE OBS::scripting OBS::libobs) + +set_target_properties( + obspython + PROPERTIES + SWIG_COMPILE_DEFINITIONS + "SWIG_TYPE_TABLE=obspython;Py_ENABLE_SHARED=1;SWIG_PYTHON_INTERPRETER_NO_DEBUG" +) + +target_compile_features(obspython PRIVATE cxx_auto_type c_std_11) + +target_compile_definitions( + obspython PRIVATE SWIG_TYPE_TABLE=obspython Py_ENABLE_SHARED=1 + SWIG_PYTHON_INTERPRETER_NO_DEBUG) + +if(ENABLE_UI) + target_link_libraries(obspython PRIVATE OBS::frontend-api) + + target_compile_definitions(obspython PRIVATE ENABLE_UI) endif() -find_package(SWIG 2 REQUIRED) -include(${SWIG_USE_FILE}) +if(OS_WINDOWS) + set_target_properties( + obspython + PROPERTIES + SWIG_COMPILE_DEFINITIONS + "SWIG_TYPE_TABLE=obspython;Py_ENABLE_SHARED=1;SWIG_PYTHON_INTERPRETER_NO_DEBUG;MS_NO_COREDLL" + ) -add_definitions(-DSWIG_TYPE_TABLE=obspython -DMS_NO_COREDLL -DPy_ENABLE_SHARED=1 -DSWIG_PYTHON_INTERPRETER_NO_DEBUG) + target_link_libraries(obspython PRIVATE Python::Python) + + target_compile_options(obspython PRIVATE /wd4100) + + if(MSVC) + add_custom_command( + TARGET obspython + POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_BINARY_DIR}/obspython.py" + "${CMAKE_CURRENT_BINARY_DIR}/$/obspython.py" + VERBATIM) + endif() + +elseif(OS_MACOS) + get_target_property(_PYTHON_INCLUDE_DIRECTORY Python::Python + INTERFACE_INCLUDE_DIRECTORIES) + + target_include_directories(obspython PRIVATE ${_PYTHON_INCLUDE_DIRECTORY}) + + target_link_options(obspython PRIVATE -undefined dynamic_lookup) + + target_compile_options(obspython PRIVATE -Wno-unused-parameter) + + if(XCODE) + add_custom_command( + TARGET obspython + POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_BINARY_DIR}/obspython.py" + "${CMAKE_CURRENT_BINARY_DIR}/$/obspython.py" + VERBATIM) + endif() + + set_target_properties(obspython PROPERTIES MACHO_CURRENT_VERSION 0 + MACHO_COMPATIBILITY_VERSION 0) +elseif(OS_POSIX) + target_link_libraries(obspython PRIVATE Python::Python) + + target_compile_options(obspython PRIVATE -Wno-unused-parameter) + + set_target_properties(obspython PROPERTIES PREFIX "") -if(MSVC) - add_compile_options("/wd4054") - add_compile_options("/wd4100") - add_compile_options("/wd4115") - add_compile_options("/wd4197") - add_compile_options("/wd4701") endif() -include_directories(${PYTHON_INCLUDE_DIR}) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +set_target_properties( + obspython + PROPERTIES FOLDER "scripting" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "${OBS_VERSION_CANONICAL}") -#add_definitions( -DSWIG_TYPE_TABLE=libobs ) -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-modern") -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-builtin") -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-modernargs") -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-includeall") -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-importall") -SET_SOURCE_FILES_PROPERTIES(obspython.i PROPERTIES SWIG_FLAGS "-py3") - -if(WIN32) - string(REGEX REPLACE "_d" "" PYTHON_LIBRARIES "${PYTHON_LIBRARIES}") -endif() - -if(CMAKE_VERSION VERSION_GREATER 3.7.2) - SWIG_ADD_LIBRARY(obspython - LANGUAGE python - TYPE MODULE - SOURCES obspython.i ../cstrcache.cpp ../cstrcache.h) -else() - SWIG_ADD_MODULE(obspython python obspython.i ../cstrcache.cpp ../cstrcache.h) -endif() - -IF(APPLE) - SWIG_LINK_LIBRARIES(obspython obs-scripting libobs) -ELSE() - SWIG_LINK_LIBRARIES(obspython obs-scripting libobs ${PYTHON_LIBRARIES}) -ENDIF() - -set_target_properties(_obspython PROPERTIES FOLDER "scripting") - -function(install_plugin_bin_swig target additional_target) - if(APPLE) - set(_bit_suffix "") - elseif(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_bit_suffix "64bit/") - else() - set(_bit_suffix "32bit/") - endif() - - set_target_properties(${additional_target} PROPERTIES - PREFIX "") - - if (APPLE) - SET_TARGET_PROPERTIES(${additional_target} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") - endif() - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/obspython.py" - DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}") - install(TARGETS "${additional_target}" - LIBRARY DESTINATION "${OBS_SCRIPT_PLUGIN_DESTINATION}") - - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${CMAKE_CURRENT_BINARY_DIR}/obspython.py" - "${OBS_OUTPUT_DIR}/$/data/obs-scripting/${_bit_suffix}/obspython.py" - VERBATIM) - add_custom_command(TARGET ${additional_target} POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "$" - "${OBS_OUTPUT_DIR}/$/data/obs-scripting/${_bit_suffix}$" - VERBATIM) -endfunction() - -install_plugin_bin_swig(obs-scripting _obspython) +setup_script_plugin_target(obspython) diff --git a/deps/obs-scripting/obspython/obspython.i b/deps/obs-scripting/obspython/obspython.i index 1b6e45413..2574daed0 100644 --- a/deps/obs-scripting/obspython/obspython.i +++ b/deps/obs-scripting/obspython/obspython.i @@ -26,7 +26,7 @@ #include "obs-scripting-config.h" #include -#if UI_ENABLED +#if defined(ENABLE_UI) #include "obs-frontend-api.h" #endif @@ -102,7 +102,7 @@ static inline void wrap_blog(int log_level, const char *message) %include "util/base.h" %include "util/platform.h" -#if UI_ENABLED +#if defined(ENABLE_UI) %include "obs-frontend-api.h" #endif diff --git a/deps/opts-parser/CMakeLists.txt b/deps/opts-parser/CMakeLists.txt index 27e9a4c30..92d36332a 100644 --- a/deps/opts-parser/CMakeLists.txt +++ b/deps/opts-parser/CMakeLists.txt @@ -1,17 +1,10 @@ project(opts-parser) -set(opts-parser_SOURCES - opts-parser.c) -set(opts-parser_HEADERS - opts-parser.h) +add_library(opts-parser INTERFACE) +add_library(OBS::opts-parser ALIAS opts-parser) -add_library(opts-parser STATIC - ${opts-parser_SOURCES} - ${opts-parser_HEADERS}) -target_include_directories(opts-parser - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(opts-parser - libobs) -set_target_properties(opts-parser PROPERTIES - FOLDER "deps" - POSITION_INDEPENDENT_CODE ON) +target_sources(opts-parser INTERFACE opts-parser.c opts-parser.h) + +target_link_libraries(opts-parser INTERFACE OBS::libobs) + +target_include_directories(opts-parser INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/deps/w32-pthreads/CMakeLists.txt b/deps/w32-pthreads/CMakeLists.txt index e8b5cdab7..ed32281af 100644 --- a/deps/w32-pthreads/CMakeLists.txt +++ b/deps/w32-pthreads/CMakeLists.txt @@ -1,30 +1,25 @@ -project(w32-pthreads) - -if(NOT WIN32) - return() +if(POLICY CMP0090) + cmake_policy(SET CMP0090 NEW) endif() +project(w32-pthreads) + +add_library(w32-pthreads SHARED) +add_library(OBS::w32-pthreads ALIAS w32-pthreads) + +target_sources(w32-pthreads PRIVATE implement.h pthread.c pthread.h sched.h + semaphore.h w32-pthreads.rc) + set(MODULE_DESCRIPTION "POSIX Threads for Windows") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in w32-pthreads.rc) -set(w32-pthreads_SOURCES - pthread.c - w32-pthreads.rc) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + w32-pthreads.rc) -set(w32-pthreads_HEADERS - implement.h - pthread.h - sched.h - semaphore.h) +target_compile_definitions(w32-pthreads PRIVATE __CLEANUP_C PTW32_BUILD) + +target_include_directories( + w32-pthreads PUBLIC "$") -add_library(w32-pthreads SHARED - ${w32-pthreads_SOURCES} - ${w32-pthreads_HEADERS}) -target_compile_definitions(w32-pthreads - PRIVATE __CLEANUP_C PTW32_BUILD) -target_include_directories(w32-pthreads - PUBLIC - "$") -target_link_libraries(w32-pthreads) set_target_properties(w32-pthreads PROPERTIES FOLDER "deps") -install_obs_core(w32-pthreads EXPORT w32-pthreads) +setup_binary_target(w32-pthreads) +export_target(w32-pthreads) diff --git a/deps/w32-pthreads/cmake/w32-pthreadsConfig.cmake.in b/deps/w32-pthreads/cmake/w32-pthreadsConfig.cmake.in new file mode 100644 index 000000000..40afeeefe --- /dev/null +++ b/deps/w32-pthreads/cmake/w32-pthreadsConfig.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@PROJECT_NAME@") + +set(LIBOBS_LIBRARIES w32-pthreads) diff --git a/formatcode.sh b/formatcode.sh deleted file mode 100755 index 5bb867fbc..000000000 --- a/formatcode.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash -# Original source https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/format.sh - -set +x -set -o errexit -set -o pipefail -set -o nounset - -# Runs the Clang Formatter in parallel on the code base. -# Return codes: -# - 1 there are files to be formatted -# - 0 everything looks fine - -# Get CPU count -OS=$(uname) -NPROC=1 -if [[ $OS = "Linux" || $OS = "Darwin" ]] ; then - NPROC=$(getconf _NPROCESSORS_ONLN) -fi - -# Discover clang-format -if type clang-format-12 2> /dev/null ; then - CLANG_FORMAT=clang-format-12 -elif type clang-format-10 2> /dev/null ; then - CLANG_FORMAT=clang-format-10 -elif type clang-format-8 2> /dev/null ; then - CLANG_FORMAT=clang-format-8 -else - CLANG_FORMAT=clang-format -fi - -find . -type d \( -path ./deps \ --o -path ./cmake \ --o -path ./plugins/decklink/win/decklink-sdk \ --o -path ./plugins/decklink/mac/decklink-sdk \ --o -path ./plugins/decklink/linux/decklink-sdk \ --o -path ./plugins/enc-amf \ --o -path ./plugins/mac-syphon/syphon-framework \ --o -path ./plugins/obs-outputs/ftl-sdk \ --o -path ./plugins/obs-vst \ --o -path ./plugins/aja/sdk \ --o -path ./build \) -prune -type f -o -name '*.h' -or -name '*.hpp' -or -name '*.m' -or -name '*.mm' -or -name '*.c' -or -name '*.cpp' \ -| xargs -L100 -P${NPROC} ${CLANG_FORMAT} -i -style=file -fallback-style=none diff --git a/libobs-d3d11/CMakeLists.txt b/libobs-d3d11/CMakeLists.txt index e201523cc..1f155650f 100644 --- a/libobs-d3d11/CMakeLists.txt +++ b/libobs-d3d11/CMakeLists.txt @@ -1,59 +1,57 @@ project(libobs-d3d11) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +add_library(libobs-d3d11 MODULE) +add_library(OBS::libobs-d3d11 ALIAS libobs-d3d11) -add_definitions(-DLIBOBS_EXPORTS) +target_sources( + libobs-d3d11 + PRIVATE d3d11-indexbuffer.cpp + d3d11-samplerstate.cpp + d3d11-shader.cpp + d3d11-shaderprocessor.cpp + d3d11-shaderprocessor.hpp + d3d11-stagesurf.cpp + d3d11-subsystem.cpp + d3d11-subsystem.hpp + d3d11-texture2d.cpp + d3d11-texture3d.cpp + d3d11-vertexbuffer.cpp + d3d11-duplicator.cpp + d3d11-rebuild.cpp + d3d11-zstencilbuffer.cpp + intel-nv12-support.hpp) set(MODULE_DESCRIPTION "OBS Library D3D11 wrapper") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in libobs-d3d11.rc) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + libobs-d3d11.rc) -if(NOT DEFINED GPU_PRIORITY_VAL OR "${GPU_PRIORITY_VAL}" STREQUAL "" OR - "${GPU_PRIORITY_VAL}" STREQUAL "0") - set(USE_GPU_PRIORITY FALSE) - set(GPU_PRIORITY_VAL "0") +target_include_directories(libobs-d3d11 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +target_sources(libobs-d3d11 PRIVATE libobs-d3d11.rc) + +target_compile_features(libobs-d3d11 PRIVATE cxx_std_17) + +target_compile_definitions( + libobs-d3d11 PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + +if(NOT DEFINED GPU_PRIORITY_VAL + OR "x${GPU_PRIORITY_VAL}x" STREQUAL "xx" + OR "${GPU_PRIORITY_VAL}" STREQUAL "0") + target_compile_definitions(libobs-d3d11 PRIVATE USE_GPU_PRIORITY=FALSE + GPU_PRIORITY_VAL=0) else() - set(USE_GPU_PRIORITY TRUE) + target_compile_definitions( + libobs-d3d11 PRIVATE USE_GPU_PRIORITY=TRUE + GPU_PRIORITY_VAL=${GPU_PRIORITY_VAL}) endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/d3d11-config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/d3d11-config.h") +target_link_libraries(libobs-d3d11 PRIVATE OBS::libobs d3d9 d3d11 dxgi) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +set_target_properties( + libobs-d3d11 + PROPERTIES OUTPUT_NAME libobs-d3d11 + FOLDER "core" + PREFIX "") -set(libobs-d3d11_SOURCES - d3d11-indexbuffer.cpp - d3d11-samplerstate.cpp - d3d11-shader.cpp - d3d11-shaderprocessor.cpp - d3d11-stagesurf.cpp - d3d11-subsystem.cpp - d3d11-texture2d.cpp - d3d11-texture3d.cpp - d3d11-vertexbuffer.cpp - d3d11-duplicator.cpp - d3d11-rebuild.cpp - d3d11-zstencilbuffer.cpp - libobs-d3d11.rc) - -set(libobs-d3d11_HEADERS - ${CMAKE_CURRENT_BINARY_DIR}/d3d11-config.h - intel-nv12-support.hpp - d3d11-shaderprocessor.hpp - d3d11-subsystem.hpp) - -add_library(libobs-d3d11 MODULE - ${libobs-d3d11_SOURCES} - ${libobs-d3d11_HEADERS}) -set_target_properties(libobs-d3d11 - PROPERTIES - FOLDER "core" - OUTPUT_NAME libobs-d3d11 - PREFIX "") -target_link_libraries(libobs-d3d11 - libobs - d3d9 - d3d11 - dxgi) - -install_obs_core(libobs-d3d11) +setup_binary_target(libobs-d3d11) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 76f05a708..60e4a36ac 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -25,7 +25,6 @@ #include #include #include "d3d11-subsystem.hpp" -#include "d3d11-config.h" #include "intel-nv12-support.hpp" struct UnsupportedHWError : HRError { diff --git a/libobs-opengl/CMakeLists.txt b/libobs-opengl/CMakeLists.txt index 0865a059f..70e2f7f81 100644 --- a/libobs-opengl/CMakeLists.txt +++ b/libobs-opengl/CMakeLists.txt @@ -1,127 +1,73 @@ project(libobs-opengl) +add_library(libobs-opengl SHARED) +add_library(OBS::libobs-opengl ALIAS libobs-opengl) -find_package(OpenGL REQUIRED) -include_directories(${OPENGL_INCLUDE_DIR}) +target_sources( + libobs-opengl + PRIVATE gl-helpers.c + gl-helpers.h + gl-indexbuffer.c + gl-shader.c + gl-shaderparser.c + gl-shaderparser.h + gl-stagesurf.c + gl-subsystem.c + gl-subsystem.h + gl-texture2d.c + gl-texture3d.c + gl-texturecube.c + gl-vertexbuffer.c + gl-zstencil.c) -add_definitions(-DLIBOBS_EXPORTS) +target_link_libraries(libobs-opengl PRIVATE OBS::libobs OBS::obsglad) -if(WIN32) - set(MODULE_DESCRIPTION "OBS Library OpenGL wrapper") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in libobs-opengl.rc) - set(libobs-opengl_PLATFORM_SOURCES - gl-windows.c - libobs-opengl.rc) -elseif(APPLE) - set(libobs-opengl_PLATFORM_SOURCES - gl-cocoa.m) +set_target_properties( + libobs-opengl + PROPERTIES FOLDER "core" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "1") - find_library(COCOA Cocoa) - include_directories(${COCOA}) - mark_as_advanced(COCOA) +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Library OpenGL wrapper") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + libobs-opengl.rc) - find_library(IOSURF IOSurface) - include_directories(${IOSURF}) - mark_as_advanced(${IOSURF}) + target_sources(libobs-opengl PRIVATE gl-windows.c libobs-opengl.rc) - set(libobs-opengl_PLATFORM_DEPS - ${COCOA} - ${IOSURF} - ${OPENGL_gl_LIBRARY}) -else() - find_package(XCB COMPONENTS XCB REQUIRED) - find_package(X11_XCB REQUIRED) +elseif(OS_MACOS) + find_library(COCOA Cocoa) + find_library(IOSURF IOSurface) - include_directories( - ${XCB_INCLUDE_DIRS} - ${X11_XCB_INCLUDE_DIRS}) + target_sources(libobs-opengl PRIVATE gl-cocoa.m) - add_definitions( - ${XCB_DEFINITIONS} - ${X11_XCB_DEFINITIONS}) + target_link_libraries(libobs-opengl PRIVATE ${COCOA} ${IOSURF}) - set(libobs-opengl_PLATFORM_DEPS - ${XCB_LIBRARIES} - ${X11_XCB_LIBRARIES}) + set_target_properties(libobs-opengl PROPERTIES PREFIX "") - set(libobs-opengl_PLATFORM_SOURCES - gl-egl-common.c - gl-nix.c - gl-x11-egl.c - gl-x11-glx.c) +elseif(OS_POSIX) + find_package(X11 REQUIRED) + find_package(XCB COMPONENTS XCB) + find_package(X11_XCB REQUIRED) - if(ENABLE_WAYLAND) - find_package(EGL REQUIRED) - find_package(Wayland REQUIRED) + target_sources(libobs-opengl PRIVATE gl-egl-common.c gl-nix.c gl-x11-egl.c + gl-x11-glx.c) - include_directories( - ${WAYLAND_CLIENT_INCLUDE_DIRS} - ${WAYLAND_EGL_INCLUDE_DIRS} - ${EGL_INCLUDE_DIRS}) + target_link_libraries(libobs-opengl PRIVATE XCB::XCB X11::X11_xcb) - add_definitions( - ${WAYLAND_DEFINITIONS}) + set_target_properties(libobs-opengl PROPERTIES PREFIX "") - set(libobs-opengl_PLATFORM_DEPS - ${libobs-opengl_PLATFORM_DEPS} - ${WAYLAND_CLIENT_LIBRARIES} - ${WAYLAND_EGL_LIBRARIES} - ${EGL_LIBRARIES}) + if(ENABLE_WAYLAND) + find_package( + OpenGL + COMPONENTS EGL + REQUIRED) + find_package(Wayland REQUIRED) - set(libobs-opengl_PLATFORM_SOURCES - ${libobs-opengl_PLATFORM_SOURCES} - gl-wayland-egl.c) - endif() + target_sources(libobs-opengl PRIVATE gl-wayland-egl.c) + + target_link_libraries(libobs-opengl PRIVATE OpenGL::EGL Wayland::EGL) + endif() endif() -set(libobs-opengl_SOURCES - ${libobs-opengl_PLATFORM_SOURCES} - gl-helpers.c - gl-indexbuffer.c - gl-shader.c - gl-shaderparser.c - gl-stagesurf.c - gl-subsystem.c - gl-texture2d.c - gl-texture3d.c - gl-texturecube.c - gl-vertexbuffer.c - gl-zstencil.c) - -set(libobs-opengl_HEADERS - gl-helpers.h - gl-shaderparser.h - gl-subsystem.h) - -if(WIN32 OR APPLE) - add_library(libobs-opengl MODULE - ${libobs-opengl_SOURCES} - ${libobs-opengl_HEADERS}) -else() - add_library(libobs-opengl SHARED - ${libobs-opengl_SOURCES} - ${libobs-opengl_HEADERS}) -endif() - -if(WIN32 OR APPLE) -set_target_properties(libobs-opengl - PROPERTIES - FOLDER "core" - OUTPUT_NAME libobs-opengl - PREFIX "") -else() -set_target_properties(libobs-opengl - PROPERTIES - FOLDER "core" - OUTPUT_NAME obs-opengl - VERSION 0.0 - SOVERSION 0 - ) -endif() - -target_link_libraries(libobs-opengl - libobs - glad - ${libobs-opengl_PLATFORM_DEPS}) - -install_obs_core(libobs-opengl) +setup_binary_target(libobs-opengl) diff --git a/libobs-winrt/CMakeLists.txt b/libobs-winrt/CMakeLists.txt index a09f97795..00215b3e8 100644 --- a/libobs-winrt/CMakeLists.txt +++ b/libobs-winrt/CMakeLists.txt @@ -1,41 +1,32 @@ project(libobs-winrt) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +add_library(libobs-winrt MODULE) +add_library(OBS::libobs-winrt ALIAS libobs-winrt) -add_definitions(-DLIBOBS_EXPORTS) +target_sources(libobs-winrt PRIVATE winrt-capture.cpp winrt-capture.h + winrt-dispatch.cpp winrt-dispatch.h) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +target_precompile_headers( + libobs-winrt + PRIVATE + [["../libobs/util/windows/ComPtr.hpp"]] + + + + + + + + ) -set(libobs-winrt_SOURCES - winrt-capture.cpp - winrt-dispatch.cpp) +target_link_libraries(libobs-winrt PRIVATE OBS::libobs Dwmapi windowsapp) -set(libobs-winrt_HEADERS - winrt-capture.h - winrt-dispatch.h) +target_compile_features(libobs-winrt PRIVATE cxx_std_17) -add_library(libobs-winrt MODULE - ${libobs-winrt_SOURCES} - ${libobs-winrt_HEADERS}) -set_target_properties(libobs-winrt - PROPERTIES - FOLDER "core" - OUTPUT_NAME libobs-winrt - PREFIX "") -target_precompile_headers(libobs-winrt - PRIVATE - [["../libobs/util/windows/ComPtr.hpp"]] - - - - - - - - ) -target_link_libraries(libobs-winrt - libobs - Dwmapi - windowsapp) +set_target_properties( + libobs-winrt + PROPERTIES OUTPUT_NAME libobs-winrt + FOLDER "core" + PREFIX "") -install_obs_core(libobs-winrt) +setup_binary_target(libobs-winrt) diff --git a/libobs/CMakeLists.txt b/libobs/CMakeLists.txt index 2f1150b31..54d5e28cb 100644 --- a/libobs/CMakeLists.txt +++ b/libobs/CMakeLists.txt @@ -1,593 +1,467 @@ +if(POLICY CMP0090) + cmake_policy(SET CMP0090 NEW) +endif() + project(libobs) find_package(Threads REQUIRED) - -find_package(FFmpeg REQUIRED - COMPONENTS avformat avutil swscale swresample - OPTIONAL_COMPONENTS avcodec) -include_directories(${FFMPEG_INCLUDE_DIRS}) - -if (NOT "${FFMPEG_AVCODEC_LIBRARIES}" STREQUAL "") - list(REMOVE_ITEM FFMPEG_LIBRARIES ${FFMPEG_AVCODEC_LIBRARIES}) -endif() - -add_definitions(-DIS_LIBOBS=1) - -if(DEBUG_FFMPEG_MUX) - add_definitions(-DSHOW_SUBPROCESSES) -endif() - -if(UNIX) - if (NOT APPLE) - find_package(X11 REQUIRED) - find_package(X11_XCB REQUIRED) - find_package(XCB OPTIONAL_COMPONENTS XINPUT) - find_package(XCB) - find_library(M_LIBRARY NAMES m) - find_library(DL_LIBRARY NAMES dl) - if (XCB_XINPUT_FOUND) - set(USE_XINPUT "1") - else() - set(USE_XINPUT "0") - endif() - if (NOT DISABLE_PULSEAUDIO) - find_package(PulseAudio REQUIRED) - message(STATUS "Found PulseAudio - Audio Monitor enabled") - set(HAVE_PULSEAUDIO "1") - else() - set(HAVE_PULSEAUDIO "0") - endif() - else() - set(HAVE_PULSEAUDIO "0") - set(USE_XINPUT "0") - endif() - find_package(Gio QUIET) -else() - set(HAVE_DBUS "0") - set(HAVE_PULSEAUDIO "0") - set(USE_XINPUT "0") -endif() - -find_package(ImageMagick QUIET COMPONENTS MagickCore) - -if(NOT ImageMagick_MagickCore_FOUND AND NOT FFMPEG_AVCODEC_FOUND) - message(FATAL_ERROR "Either MagickCore or Libavcodec is required, but neither were found.") -elseif(NOT ImageMagick_MagickCore_FOUND AND LIBOBS_PREFER_IMAGEMAGICK) - message(FATAL_ERROR "ImageMagick support was requested, but was not found.") -endif() - -option(LIBOBS_PREFER_IMAGEMAGICK "Prefer ImageMagick over ffmpeg for image loading" OFF) - -if(NOT FFMPEG_AVCODEC_FOUND OR (ImageMagick_MagickCore_FOUND AND LIBOBS_PREFER_IMAGEMAGICK)) - message(STATUS "Using ImageMagick for image loading in libobs") - - if(${ImageMagick_VERSION_STRING} LESS 7) - set(LIBOBS_IMAGEMAGICK_DIR_STYLE LIBOBS_IMAGEMAGICK_DIR_STYLE_6L) - elseif(${ImageMagick_VERSION_STRING} GREATER_EQUAL 7) - set(LIBOBS_IMAGEMAGICK_DIR_STYLE LIBOBS_IMAGEMAGICK_DIR_STYLE_7GE) - endif() - - set(libobs_image_loading_SOURCES - graphics/graphics-magick.c) - set(libobs_image_loading_LIBRARIES - ${ImageMagick_LIBRARIES}) - - include_directories(${ImageMagick_INCLUDE_DIRS}) -else() - message(STATUS "Using libavcodec for image loading in libobs") - - set(libobs_image_loading_SOURCES - graphics/graphics-ffmpeg.c) - set(libobs_image_loading_LIBRARIES - ${FFMPEG_AVCODEC_LIBRARIES}) -endif() - +find_package( + FFmpeg REQUIRED + COMPONENTS avformat avutil swscale swresample + OPTIONAL_COMPONENTS avcodec) find_package(ZLIB REQUIRED) -include_directories(SYSTEM ${ZLIB_INCLUDE_DIRS}) +add_library(libobs SHARED) +add_library(OBS::libobs ALIAS libobs) -add_definitions(-DLIBOBS_EXPORTS) +target_sources( + libobs + PRIVATE obs.c + obs.h + obs.hpp + obs-audio.c + obs-audio-controls.c + obs-audio-controls.h + obs-avc.c + obs-avc.h + obs-data.c + obs-data.h + obs-defs.h + obs-display.c + obs-encoder.c + obs-encoder.h + obs-ffmpeg-compat.h + obs-hotkey.c + obs-hotkey.h + obs-hotkeys.h + obs-missing-files.c + obs-missing-files.h + obs-hotkey-name-map.c + obs-interaction.h + obs-internal.h + obs-module.c + obs-module.h + obs-output.c + obs-output.h + obs-output-delay.c + obs-properties.c + obs-properties.h + obs-service.c + obs-service.h + obs-scene.c + obs-scene.h + obs-source.c + obs-source.h + obs-source-deinterlace.c + obs-source-transition.c + obs-ui.h + obs-video.c + obs-video-gpu-encode.c + obs-view.c + obs-config.h) -include_directories(${OBS_JANSSON_INCLUDE_DIRS}) +target_sources( + libobs + PRIVATE util/simde/check.h + util/simde/debug-trap.h + util/simde/hedley.h + util/simde/simde-align.h + util/simde/simde-arch.h + util/simde/simde-common.h + util/simde/simde-constify.h + util/simde/simde-detect-clang.h + util/simde/simde-diagnostic.h + util/simde/simde-features.h + util/simde/simde-math.h + util/simde/x86/mmx.h + util/simde/x86/sse2.h + util/simde/x86/sse.h) -if(WIN32) - set(MODULE_DESCRIPTION "OBS Library") - file(STRINGS obs-config.h _version_parse REGEX "^.*(MAJOR|MINOR|PATCH)_VER[ \t]+[0-9]+[ \t]*$") +target_sources( + libobs + PRIVATE callback/calldata.c + callback/calldata.h + callback/decl.c + callback/decl.h + callback/signal.c + callback/signal.h + callback/proc.c + callback/proc.h) - string(REGEX REPLACE ".*MAJOR_VER[ \t]+([0-9]+).*" "\\1" UI_VERSION_MAJOR "${_version_parse}") - string(REGEX REPLACE ".*MINOR_VER[ \t]+([0-9]+).*" "\\1" UI_VERSION_MINOR "${_version_parse}") - string(REGEX REPLACE ".*PATCH_VER[ \t]+([0-9]+).*" "\\1" UI_VERSION_PATCH "${_version_parse}") - set(UI_VERSION "${UI_VERSION_MAJOR}.${UI_VERSION_MINOR}.${UI_VERSION_PATCH}") +target_sources( + libobs + PRIVATE graphics/graphics.c + graphics/graphics.h + graphics/graphics-imports.c + graphics/graphics-internal.h + graphics/axisang.c + graphics/axisang.h + graphics/bounds.c + graphics/bounds.h + graphics/device-exports.h + graphics/effect.c + graphics/effect.h + graphics/effect-parser.c + graphics/effect-parser.h + graphics/half.h + graphics/image-file.c + graphics/image-file.h + graphics/math-extra.c + graphics/math-extra.h + graphics/matrix3.c + graphics/matrix3.h + graphics/matrix4.c + graphics/matrix4.h + graphics/plane.c + graphics/plane.h + graphics/quat.c + graphics/quat.h + graphics/shader-parser.c + graphics/shader-parser.h + graphics/srgb.h + graphics/texture-render.c + graphics/vec2.c + graphics/vec2.h + graphics/vec3.c + graphics/vec3.h + graphics/vec4.c + graphics/vec4.h + graphics/libnsgif/libnsgif.c + graphics/libnsgif/libnsgif.h + graphics/graphics-ffmpeg.c) - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in libobs.rc) - set(libobs_PLATFORM_SOURCES - obs-win-crash-handler.c - obs-windows.c - util/threading-windows.c - util/pipe-windows.c - util/platform-windows.c - libobs.rc) - set(libobs_PLATFORM_HEADERS - util/threading-windows.h - util/windows/win-registry.h - util/windows/win-version.h - util/windows/ComPtr.hpp - util/windows/CoTaskMemPtr.hpp - util/windows/HRError.hpp - util/windows/WinHandle.hpp) - set(libobs_audio_monitoring_SOURCES - audio-monitoring/win32/wasapi-enum-devices.c - audio-monitoring/win32/wasapi-monitoring-available.c - audio-monitoring/win32/wasapi-output.c - ) - set(libobs_audio_monitoring_HEADERS - audio-monitoring/win32/wasapi-output.h - ) - set(libobs_PLATFORM_DEPS Avrt winmm) - if(MSVC) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - w32-pthreads) - endif() -elseif(APPLE) - set(libobs_PLATFORM_SOURCES - obs-cocoa.m - util/threading-posix.c - util/pipe-posix.c - util/platform-nix.c - util/platform-cocoa.m) - set(libobs_PLATFORM_HEADERS - util/threading-posix.h - util/apple/cfstring-utils.h) - set(libobs_audio_monitoring_SOURCES - audio-monitoring/osx/coreaudio-enum-devices.c - audio-monitoring/osx/coreaudio-monitoring-available.c - audio-monitoring/osx/coreaudio-output.c - ) - set(libobs_audio_monitoring_HEADERS - audio-monitoring/osx/mac-helpers.h - ) +target_sources( + libobs + PRIVATE media-io/audio-io.c + media-io/audio-io.h + media-io/audio-math.h + media-io/audio-resampler.h + media-io/audio-resampler-ffmpeg.c + media-io/format-conversion.c + media-io/format-conversion.h + media-io/frame-rate.h + media-io/media-remux.c + media-io/media-remux.h + media-io/video-fourcc.c + media-io/video-frame.c + media-io/video-frame.h + media-io/video-io.c + media-io/video-io.h + media-io/media-io-defs.h + media-io/video-matrices.c + media-io/video-scaler-ffmpeg.c + media-io/video-scaler.h) - set_source_files_properties(${libobs_PLATFORM_SOURCES} - PROPERTIES - COMPILE_FLAGS "-fobjc-arc") +target_sources( + libobs + PRIVATE util/array-serializer.c + util/array-serializer.h + util/base.c + util/base.h + util/bitstream.c + util/bitstream.h + util/bmem.c + util/bmem.h + util/c99defs.h + util/cf-lexer.c + util/cf-lexer.h + util/cf-parser.c + util/cf-parser.h + util/circlebuf.h + util/config-file.c + util/config-file.h + util/crc32.c + util/crc32.h + util/dstr.c + util/dstr.h + util/file-serializer.c + util/file-serializer.h + util/lexer.c + util/lexer.h + util/platform.c + util/platform.h + util/profiler.c + util/profiler.h + util/profiler.hpp + util/pipe.h + util/serializer.h + util/sse-intrin.h + util/task.c + util/task.h + util/text-lookup.c + util/text-lookup.h + util/threading.h + util/utf8.c + util/utf8.h + util/util_uint64.h + util/util_uint128.h + util/curl/curl-helper.h + util/darray.h + util/util.hpp) - find_library(COCOA Cocoa) - mark_as_advanced(COCOA) - include_directories(${COCOA}) - - find_library(COREAUDIO CoreAudio) - mark_as_advanced(COREAUDIO) - include_directories(${COREAUDIO}) - - find_library(AUDIOTOOLBOX AudioToolbox) - mark_as_advanced(AUDIOTOOLBOX) - include_directories(${AUDIOTOOLBOX}) - - find_library(AUDIOUNIT AudioUnit) - mark_as_advanced(AUDIOUNIT) - include_directories(${AUDIOUNIT}) - - find_library(APPKIT AppKit) - mark_as_advanced(APPKIT) - include_directories(${APPKIT}) - - find_library(IOKIT IOKit) - mark_as_advanced(IOKIT) - include_directories(${IOKIT}) - - find_library(CARBON Carbon) - mark_as_advanced(CARBON) - include_directories(${CARBON}) - - set(libobs_PLATFORM_DEPS - ${COCOA} - ${COREAUDIO} - ${AUDIOUNIT} - ${AUDIOTOOLBOX} - ${APPKIT} - ${IOKIT} - ${CARBON}) -elseif(UNIX) - set(libobs_PLATFORM_SOURCES - obs-nix.c - obs-nix-platform.c - obs-nix-x11.c - util/threading-posix.c - util/pipe-posix.c - util/platform-nix.c) - - set(libobs_PLATFORM_HEADERS - util/threading-posix.h - obs-nix-platform.h) - - if(ENABLE_WAYLAND) - find_package(Wayland COMPONENTS Client REQUIRED) - find_package(Xkbcommon REQUIRED) - - set(libobs_PLATFORM_SOURCES ${libobs_PLATFORM_SOURCES} - obs-nix-wayland.c) - - include_directories( - ${WAYLAND_CLIENT_INCLUDE_DIR} - ${XKBCOMMON_INCLUDE_DIR}) - add_definitions( - ${WAYLAND_DEFINITIONS}) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - ${WAYLAND_CLIENT_LIBRARIES} - ${XKBCOMMON_LIBRARIES}) - endif() - - if(HAVE_PULSEAUDIO) - set(libobs_audio_monitoring_HEADERS - audio-monitoring/pulse/pulseaudio-wrapper.h) - - set(libobs_audio_monitoring_SOURCES - audio-monitoring/pulse/pulseaudio-wrapper.c - audio-monitoring/pulse/pulseaudio-enum-devices.c - audio-monitoring/pulse/pulseaudio-monitoring-available.c - audio-monitoring/pulse/pulseaudio-output.c) - else() - set(libobs_audio_monitoring_SOURCES - audio-monitoring/null/null-audio-monitoring.c) - endif() - if(GIO_FOUND) - set(libobs_PLATFORM_SOURCES ${libobs_PLATFORM_SOURCES} - util/platform-nix-dbus.c - util/platform-nix-portal.c) - include_directories(${GIO_INCLUDE_DIRS}) - add_definitions( - ${GIO_DEFINITIONS}) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - ${GIO_LIBRARIES}) - endif() - - include_directories( - ${X11_X11_INCLUDE_PATH} - ${X11_XCB_INCLUDE_DIRS}) - add_definitions( - ${X11_XCB_DEFINITIONS}) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - ${DL_LIBRARY} - ${M_LIBRARY} - ${X11_X11_LIB} - ${XCB_LIBRARIES} - ${X11_XCB_LIBRARIES}) - - if(USE_XINPUT) - include_directories( - ${XCB_XINPUT_INCLUDE_DIR}) - add_definitions( - ${XCB_DEFINITIONS}) - set(libobs_PLATFORM_DEPS - ${XCB_XINPUT_LIBRARY} - ${libobs_PLATFORM_DEPS}) - endif() - - if(HAVE_PULSEAUDIO) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - ${PULSEAUDIO_LIBRARY}) - endif() - - if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - # use the sysinfo compatibility library on bsd - find_package(Libsysinfo REQUIRED) - include_directories(${SYSINFO_INCLUDE_DIRS}) - set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - ${SYSINFO_LIBRARIES}) - endif() +# Contents of "data" dir already automatically added to bundles on macOS +if(NOT OS_MACOS) + target_sources( + libobs + PRIVATE data/area.effect + data/bicubic_scale.effect + data/bilinear_lowres_scale.effect + data/default.effect + data/default_rect.effect + data/deinterlace_base.effect + data/deinterlace_blend.effect + data/deinterlace_blend_2x.effect + data/deinterlace_discard.effect + data/deinterlace_discard_2x.effect + data/deinterlace_linear.effect + data/deinterlace_linear_2x.effect + data/deinterlace_yadif.effect + data/deinterlace_yadif_2x.effect + data/format_conversion.effect + data/lanczos_scale.effect + data/opaque.effect + data/premultiplied_alpha.effect + data/repeat.effect + data/solid.effect) endif() -if(MSVC) - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SAFESEH:NO") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /EHc-") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHc-") +target_link_libraries( + libobs + PRIVATE FFmpeg::avcodec + FFmpeg::avformat + FFmpeg::avutil + FFmpeg::swscale + FFmpeg::swresample + Jansson::Jansson + OBS::caption + ZLIB::ZLIB + PUBLIC Threads::Threads) + +set_target_properties( + libobs + PROPERTIES OUTPUT_NAME obs + FOLDER "core" + VERSION "${OBS_VERSION_MAJOR}" + SOVERSION "0") + +target_compile_definitions( + libobs + PUBLIC ${ARCH_SIMD_DEFINES} + PRIVATE IS_LIBOBS) + +target_compile_features(libobs PRIVATE cxx_alias_templates) + +target_compile_options(libobs PUBLIC ${ARCH_SIMD_FLAGS}) + +target_include_directories( + libobs PUBLIC $ + $) + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Library") + set(UI_VERSION "${OBS_VERSION_CANONICAL}") + + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + libobs.rc) + + target_sources( + libobs + PRIVATE obs-win-crash-handler.c + obs-windows.c + util/threading-windows.c + util/threading-windows.h + util/pipe-windows.c + util/platform-windows.c + util/windows/win-registry.h + util/windows/win-version.h + util/windows/ComPtr.hpp + util/windows/CoTaskMemPtr.hpp + util/windows/HRError.hpp + util/windows/WinHandle.hpp + libobs.rc + audio-monitoring/win32/wasapi-output.c + audio-monitoring/win32/wasapi-enum-devices.c + audio-monitoring/win32/wasapi-output.h + audio-monitoring/win32/wasapi-monitoring-available.c) + + target_compile_definitions( + libobs PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + + target_link_libraries(libobs PRIVATE Avrt winmm) + + if(MSVC) + target_link_libraries(libobs PRIVATE OBS::w32-pthreads) + + target_compile_options(libobs PRIVATE "$<$:/EHc->" + "$<$:/EHc->") + + target_link_options(libobs PRIVATE "LINKER:/SAFESEH:NO") + endif() + +elseif(OS_MACOS) + + find_library(COCOA Cocoa) + find_library(COREAUDIO CoreAudio) + find_library(AUDIOTOOLBOX AudioToolbox) + find_library(AUDIOUNIT AudioUnit) + find_library(APPKIT AppKit) + find_library(IOKIT IOKit) + find_library(CARBON Carbon) + + mark_as_advanced( + COCOA + COREAUDIO + AUDIOTOOLBOX + AUDIOUNIT + APPKIT + IOKIT + CARBON) + + target_link_libraries( + libobs + PRIVATE ${COCOA} + ${COREAUDIO} + ${AUDIOTOOLBOX} + ${AUDIOUNIT} + ${APPKIT} + ${IOKIT} + ${CARBON}) + + target_sources( + libobs + PRIVATE obs-cocoa.m + util/pipe-posix.c + util/platform-cocoa.m + util/platform-nix.c + util/threading-posix.c + util/threading-posix.h + util/apple/cfstring-utils.h + audio-monitoring/osx/coreaudio-enum-devices.c + audio-monitoring/osx/coreaudio-output.c + audio-monitoring/osx/coreaudio-monitoring-available.c + audio-monitoring/osx/mac-helpers.h) + + set_source_files_properties(util/platform-cocoa.m obs-cocoa.m + PROPERTIES COMPILE_FLAGS -fobjc-arc) + + set_target_properties( + libobs PROPERTIES SOVERSION "1" BUILD_RPATH + "$") + +elseif(OS_POSIX) + if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) + target_compile_definitions(libobs PRIVATE ENABLE_DARRAY_TYPE_TEST) + endif() + + find_package(X11 REQUIRED) + find_package( + XCB + COMPONENTS XCB + OPTIONAL_COMPONENTS XINPUT + QUIET) + find_package(X11_XCB REQUIRED) + + target_sources( + libobs + PRIVATE obs-nix.c + obs-nix-platform.c + obs-nix-platform.h + obs-nix-x11.c + util/threading-posix.c + util/threading-posix.h + util/pipe-posix.c + util/platform-nix.c) + + target_link_libraries(libobs PRIVATE X11::X11_xcb XCB::XCB) + + if(USE_XDG) + target_compile_definitions(libobs PRIVATE USE_XDG) + endif() + + if(ENABLE_PULSEAUDIO) + find_package(PulseAudio REQUIRED) + message(STATUS "OBS: PulseAudio found - audio monitoring enabled") + target_sources( + libobs + PRIVATE audio-monitoring/pulse/pulseaudio-output.c + audio-monitoring/pulse/pulseaudio-enum-devices.c + audio-monitoring/pulse/pulseaudio-wrapper.c + audio-monitoring/pulse/pulseaudio-wrapper.h + audio-monitoring/pulse/pulseaudio-monitoring-available.c) + + target_link_libraries(libobs PRIVATE ${PULSEAUDIO_LIBRARY}) + else() + target_sources(libobs PRIVATE audio-monitoring/null/null-audio-monitoring.c) + endif() + + find_package(Gio) + if(TARGET GIO::GIO) + target_link_libraries(libobs PRIVATE GIO::GIO) + + target_sources(libobs PRIVATE util/platform-nix-dbus.c + util/platform-nix-portal.c) + endif() + + if(TARGET XCB::XINPUT) + target_link_libraries(libobs PRIVATE XCB::XINPUT) + endif() + + if(ENABLE_WAYLAND) + find_package( + Wayland + COMPONENTS Client + REQUIRED) + find_package(Xkbcommon REQUIRED) + + target_link_libraries(libobs PRIVATE Wayland::Client Xkbcommon::Xkbcommon) + + target_sources(libobs PRIVATE obs-nix-wayland.c) + endif() + + if(OS_LINUX) + target_link_libraries(glad PRIVATE ${CMAKE_DL_LIBS}) + endif() + + if(OS_FREEBSD) + find_package(Sysinfo REQUIRED) + target_link_libraries(libobs PRIVATE Sysinfo::Sysinfo) + endif() + + set_target_properties( + libobs PROPERTIES BUILD_RPATH "$") endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/obsconfig.h.in" - "${CMAKE_BINARY_DIR}/config/obsconfig.h") +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obsconfig.h.in + ${CMAKE_BINARY_DIR}/config/obsconfig.h) -set(libobs_config_HEADERS - "${CMAKE_BINARY_DIR}/config/obsconfig.h" - obs-config.h) +target_compile_definitions(libobs PUBLIC HAVE_OBSCONFIG_H) -set(libobs_callback_SOURCES - callback/calldata.c - callback/decl.c - callback/signal.c - callback/proc.c) -set(libobs_callback_HEADERS - callback/calldata.h - callback/decl.h - callback/proc.h - callback/signal.h) - -set(libobs_graphics_SOURCES - ${libobs_image_loading_SOURCES} - graphics/quat.c - graphics/effect-parser.c - graphics/axisang.c - graphics/vec4.c - graphics/vec2.c - graphics/libnsgif/libnsgif.c - graphics/texture-render.c - graphics/image-file.c - graphics/bounds.c - graphics/matrix3.c - graphics/matrix4.c - graphics/vec3.c - graphics/graphics.c - graphics/shader-parser.c - graphics/plane.c - graphics/effect.c - graphics/math-extra.c - graphics/graphics-imports.c) -set(libobs_graphics_HEADERS - graphics/half.h - graphics/plane.h - graphics/quat.h - graphics/input.h - graphics/axisang.h - graphics/shader-parser.h - graphics/effect.h - graphics/math-defs.h - graphics/matrix4.h - graphics/graphics.h - graphics/graphics-internal.h - graphics/libnsgif/libnsgif.h - graphics/device-exports.h - graphics/image-file.h - graphics/srgb.h - graphics/vec2.h - graphics/vec4.h - graphics/matrix3.h - graphics/vec3.h - graphics/math-extra.h - graphics/bounds.h - graphics/effect-parser.h) - -set(libobs_mediaio_SOURCES - media-io/video-io.c - media-io/video-fourcc.c - media-io/video-matrices.c - media-io/audio-io.c - media-io/video-frame.c - media-io/format-conversion.c - media-io/audio-resampler-ffmpeg.c - media-io/video-scaler-ffmpeg.c - media-io/media-remux.c) -set(libobs_mediaio_HEADERS - media-io/media-io-defs.h - media-io/video-io.h - media-io/audio-io.h - media-io/audio-math.h - media-io/video-frame.h - media-io/format-conversion.h - media-io/audio-resampler.h - media-io/video-scaler.h - media-io/media-remux.h - media-io/frame-rate.h) - -set(libobs_util_SOURCES - util/array-serializer.c - util/file-serializer.c - util/base.c - util/platform.c - util/cf-lexer.c - util/bmem.c - util/config-file.c - util/lexer.c - util/task.c - util/dstr.c - util/utf8.c - util/crc32.c - util/text-lookup.c - util/cf-parser.c - util/profiler.c - util/bitstream.c) -set(libobs_util_HEADERS - util/curl/curl-helper.h - util/sse-intrin.h - util/array-serializer.h - util/file-serializer.h - util/utf8.h - util/crc32.h - util/base.h - util/text-lookup.h - util/bmem.h - util/c99defs.h - util/util_uint64.h - util/util_uint128.h - util/cf-parser.h - util/threading.h - util/pipe.h - util/cf-lexer.h - util/darray.h - util/circlebuf.h - util/dstr.h - util/serializer.h - util/config-file.h - util/lexer.h - util/task.h - util/platform.h - util/profiler.h - util/profiler.hpp - util/bitstream.h - util/util.hpp) - -set(libobs_libobs_SOURCES - ${libobs_PLATFORM_SOURCES} - obs-audio-controls.c - obs-avc.c - obs-encoder.c - obs-service.c - obs-source.c - obs-source-deinterlace.c - obs-source-transition.c - obs-output.c - obs-output-delay.c - obs.c - obs-properties.c - obs-data.c - obs-missing-files.c - obs-hotkey.c - obs-hotkey-name-map.c - obs-module.c - obs-display.c - obs-view.c - obs-scene.c - obs-audio.c - obs-video-gpu-encode.c - obs-video.c) -set(libobs_libobs_HEADERS - util/simde/check.h - util/simde/debug-trap.h - util/simde/hedley.h - util/simde/simde-align.h - util/simde/simde-arch.h - util/simde/simde-common.h - util/simde/simde-constify.h - util/simde/simde-detect-clang.h - util/simde/simde-diagnostic.h - util/simde/simde-features.h - util/simde/simde-math.h - util/simde/x86/mmx.h - util/simde/x86/sse2.h - util/simde/x86/sse.h - ${libobs_PLATFORM_HEADERS} - obs-audio-controls.h - obs-defs.h - obs-avc.h - obs-encoder.h - obs-service.h - obs-internal.h - obs.h - obs-ui.h - obs-properties.h - obs-data.h - obs-missing-files.h - obs-interaction.h - obs-hotkey.h - obs-hotkeys.h - obs-module.h - obs-scene.h - obs-source.h - obs-output.h - obs-ffmpeg-compat.h - obs.hpp) - -set(libobs_SOURCES - ${libobs_callback_SOURCES} - ${libobs_graphics_SOURCES} - ${libobs_mediaio_SOURCES} - ${libobs_util_SOURCES} - ${libobs_libobs_SOURCES} - ${libobs_audio_monitoring_SOURCES} - ) - -set(libobs_HEADERS - ${libobs_config_HEADERS} - ${libobs_callback_HEADERS} - ${libobs_graphics_HEADERS} - ${libobs_mediaio_HEADERS} - ${libobs_util_HEADERS} - ${libobs_libobs_HEADERS} - ${libobs_audio_monitoring_HEADERS} - ) - -set(libobs_data_EFFECTS - data/area.effect - data/bicubic_scale.effect - data/bilinear_lowres_scale.effect - data/default.effect - data/default_rect.effect - data/deinterlace_base.effect - data/deinterlace_blend.effect - data/deinterlace_blend_2x.effect - data/deinterlace_discard.effect - data/deinterlace_discard_2x.effect - data/deinterlace_linear.effect - data/deinterlace_linear_2x.effect - data/deinterlace_yadif.effect - data/deinterlace_yadif_2x.effect - data/format_conversion.effect - data/lanczos_scale.effect - data/opaque.effect - data/premultiplied_alpha.effect - data/repeat.effect - data/solid.effect) - -source_group("callback\\Source Files" FILES ${libobs_callback_SOURCES}) -source_group("callback\\Header Files" FILES ${libobs_callback_HEADERS}) -source_group("data\\Effect Files" FILES ${libobs_data_EFFECTS}) -source_group("graphics\\Source Files" FILES ${libobs_graphics_SOURCES}) -source_group("graphics\\Header Files" FILES ${libobs_graphics_HEADERS}) -source_group("libobs\\Source Files" FILES ${libobs_libobs_SOURCES}) -source_group("libobs\\Header Files" FILES ${libobs_libobs_HEADERS}) -source_group("media-io\\Source Files" FILES ${libobs_mediaio_SOURCES}) -source_group("media-io\\Header Files" FILES ${libobs_mediaio_HEADERS}) -source_group("util\\Source Files" FILES ${libobs_util_SOURCES}) -source_group("util\\Header Files" FILES ${libobs_util_HEADERS}) -source_group("audio-monitoring\\Source Files" FILES ${libobs_audio_monitoring_SOURCES}) -source_group("audio-monitoring\\Header Files" FILES ${libobs_audio_monitoring_HEADERS}) - -include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption) -set(libobs_PLATFORM_DEPS - ${libobs_PLATFORM_DEPS} - caption) - -add_library(libobs SHARED ${libobs_SOURCES} ${libobs_HEADERS} ${libobs_data_EFFECTS}) -if(UNIX AND NOT APPLE) - set(DEST_DIR "${CMAKE_INSTALL_PREFIX}") - foreach(LIB "obs" "rt") - set(PRIVATE_LIBS "${PRIVATE_LIBS} -l${LIB}") - endforeach() - if(LOWERCASE_CMAKE_SYSTEM_PROCESSOR MATCHES "^(powerpc|ppc)64(le)?") - set(PPC64_CFLAGS "-DNO_WARN_X86_INTRINSICS -mvsx") - endif() - CONFIGURE_FILE("libobs.pc.in" "libobs.pc" @ONLY) - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libobs.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +if(ENABLE_FFMPEG_MUX_DEBUG) + target_compile_definitions(libobs PRIVATE SHOW_SUBPROCESSES) endif() -set_target_properties(libobs PROPERTIES - FOLDER "core" - OUTPUT_NAME obs - VERSION "0" - SOVERSION "0") -target_compile_definitions(libobs - PUBLIC - HAVE_OBSCONFIG_H) +get_target_property(_OBS_SOURCES libobs SOURCES) +set(_OBS_HEADERS ${_OBS_SOURCES}) +set(_OBS_FILTERS ${_OBS_SOURCES}) +list(FILTER _OBS_HEADERS INCLUDE REGEX ".*\\.h(pp)?") +list(FILTER _OBS_SOURCES INCLUDE REGEX ".*\\.(m|c[cp]?p?)") +list(FILTER _OBS_FILTERS INCLUDE REGEX ".*\\.effect") -target_compile_definitions(libobs - PUBLIC - ${ARCH_SIMD_DEFINES}) +source_group( + TREE "${CMAKE_CURRENT_SOURCE_DIR}" + PREFIX "Source Files" + FILES ${_OBS_SOURCES}) +source_group( + TREE "${CMAKE_CURRENT_SOURCE_DIR}" + PREFIX "Header Files" + FILES ${_OBS_HEADERS}) +source_group( + TREE "${CMAKE_CURRENT_SOURCE_DIR}" + PREFIX "Effect Files" + FILES ${_OBS_FILTERS}) -target_compile_options(libobs - PUBLIC - ${ARCH_SIMD_FLAGS}) - -target_include_directories(libobs - PUBLIC - "$" - "$" - "$") -target_link_libraries(libobs - PRIVATE - ${libobs_PLATFORM_DEPS} - ${libobs_image_loading_LIBRARIES} - ${OBS_JANSSON_IMPORT} - ${FFMPEG_LIBRARIES} - ${ZLIB_LIBRARIES} - Threads::Threads) - -install_obs_core(libobs EXPORT LibObs) -install_obs_data(libobs data libobs) -install_obs_headers(${libobs_HEADERS}) - -obs_install_additional(libobs) +setup_binary_target(libobs) +setup_target_resources(libobs libobs) +export_target(libobs) +install_headers(libobs) diff --git a/libobs/cmake/libobsConfig.cmake.in b/libobs/cmake/libobsConfig.cmake.in new file mode 100644 index 000000000..40f49f88a --- /dev/null +++ b/libobs/cmake/libobsConfig.cmake.in @@ -0,0 +1,15 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +check_required_components("@PROJECT_NAME@") + +if(MSVC) + find_package(w32-pthreads REQUIRED) +endif() + +find_package(Threads REQUIRED) + +set(LIBOBS_PLUGIN_DESTINATION "@PACKAGE_OBS_PLUGIN_DESTINATION@") +set(LIBOBS_PLUGIN_DATA_DESTINATION "@PACKAGE_OBS_DATA_DESTINATION@/obs-plugins") + +set(LIBOBS_LIBRARIES libobs) diff --git a/libobs/obs-cocoa.m b/libobs/obs-cocoa.m index 1831c60a9..734696ce9 100644 --- a/libobs/obs-cocoa.m +++ b/libobs/obs-cocoa.m @@ -38,44 +38,30 @@ bool is_in_bundle() const char *get_module_extension(void) { - return ".so"; + return ""; } -static const char *module_bin[] = { - "../obs-plugins", - OBS_INSTALL_PREFIX "obs-plugins", -}; - -static const char *module_data[] = { - "../data/obs-plugins/%module%", - OBS_INSTALL_DATA_PATH "obs-plugins/%module%", -}; - -static const int module_patterns_size = - sizeof(module_bin) / sizeof(module_bin[0]); - void add_default_module_paths(void) { - for (int i = 0; i < module_patterns_size; i++) - obs_add_module_path(module_bin[i], module_data[i]); + struct dstr plugin_path; - if (is_in_bundle()) { - NSRunningApplication *app = - [NSRunningApplication currentApplication]; - NSURL *bundleURL = [app bundleURL]; - NSURL *pluginsURL = [bundleURL - URLByAppendingPathComponent:@"Contents/PlugIns"]; - NSURL *dataURL = [bundleURL - URLByAppendingPathComponent: - @"Contents/Resources/data/obs-plugins/%module%"]; + dstr_init_move_array(&plugin_path, os_get_executable_path_ptr("")); + dstr_cat(&plugin_path, "../PlugIns"); + char *abs_plugin_path = os_get_abs_path_ptr(plugin_path.array); - const char *binPath = [[pluginsURL path] - cStringUsingEncoding:NSUTF8StringEncoding]; - const char *dataPath = [[dataURL path] - cStringUsingEncoding:NSUTF8StringEncoding]; + if (abs_plugin_path != NULL) { + dstr_move_array(&plugin_path, abs_plugin_path); + struct dstr plugin_data; + dstr_init_copy_dstr(&plugin_data, &plugin_path); + dstr_cat(&plugin_path, "/%module%.plugin/Contents/MacOS/"); + dstr_cat(&plugin_data, "/%module%.plugin/Contents/Resources/"); - obs_add_module_path(binPath, dataPath); + obs_add_module_path(plugin_path.array, plugin_data.array); + + dstr_free(&plugin_data); } + + dstr_free(&plugin_path); } char *find_libobs_data_file(const char *file) @@ -83,12 +69,11 @@ char *find_libobs_data_file(const char *file) struct dstr path; if (is_in_bundle()) { - NSRunningApplication *app = - [NSRunningApplication currentApplication]; - NSURL *bundleURL = [app bundleURL]; + NSBundle *frameworkBundle = [NSBundle + bundleWithIdentifier:@"com.obsproject.libobs"]; + NSURL *bundleURL = [frameworkBundle bundleURL]; NSURL *libobsDataURL = - [bundleURL URLByAppendingPathComponent: - @"Contents/Resources/data/libobs/"]; + [bundleURL URLByAppendingPathComponent:@"Resources/"]; const char *libobsDataPath = [[libobsDataURL path] cStringUsingEncoding:NSUTF8StringEncoding]; dstr_init_copy(&path, libobsDataPath); diff --git a/libobs/obs-module.c b/libobs/obs-module.c index 3f3cb98a0..14e15b539 100644 --- a/libobs/obs-module.c +++ b/libobs/obs-module.c @@ -358,9 +358,17 @@ static bool parse_binary_from_directory(struct dstr *parsed_bin_path, dstr_copy_dstr(parsed_bin_path, &directory); dstr_cat(parsed_bin_path, file); +#ifdef __APPLE__ + if (!os_file_exists(parsed_bin_path->array)) { + dstr_cat(parsed_bin_path, ".so"); + } +#else dstr_cat(parsed_bin_path, get_module_extension()); +#endif if (!os_file_exists(parsed_bin_path->array)) { + /* Legacy fallback: Check for plugin with .so suffix*/ + dstr_cat(parsed_bin_path, ".so"); /* if the file doesn't exist, check with 'lib' prefix */ dstr_copy_dstr(parsed_bin_path, &directory); dstr_cat(parsed_bin_path, "lib"); @@ -397,15 +405,15 @@ static void process_found_module(struct obs_module_path *omp, const char *path, return; dstr_copy(&name, file); - if (!directory) { - char *ext = strrchr(name.array, '.'); - if (ext) - dstr_resize(&name, ext - name.array); + char *ext = strrchr(name.array, '.'); + if (ext) + dstr_resize(&name, ext - name.array); + if (!directory) { dstr_copy(&parsed_bin_path, path); } else { bin_found = parse_binary_from_directory(&parsed_bin_path, - omp->bin, file); + omp->bin, name.array); } parsed_data_dir = make_data_directory(name.array, omp->data); diff --git a/libobs/obs-nix-x11.c b/libobs/obs-nix-x11.c index 0f73a44a8..cd9e62317 100644 --- a/libobs/obs-nix-x11.c +++ b/libobs/obs-nix-x11.c @@ -22,7 +22,7 @@ #include "obs-nix-x11.h" #include -#if USE_XINPUT +#if defined(XINPUT_FOUND) #include #endif #include @@ -94,7 +94,7 @@ struct obs_hotkeys_platform { int num_keysyms; int syms_per_code; -#if USE_XINPUT +#if defined(XINPUT_FOUND) bool pressed[XINPUT_MOUSE_LEN]; bool update[XINPUT_MOUSE_LEN]; bool button_pressed[XINPUT_MOUSE_LEN]; @@ -805,7 +805,7 @@ static inline xcb_window_t root_window(obs_hotkeys_platform_t *context, return 0; } -#if USE_XINPUT +#if defined(XINPUT_FOUND) static inline void registerMouseEvents(struct obs_core_hotkeys *hotkeys) { obs_hotkeys_platform_t *context = hotkeys->platform_context; @@ -836,7 +836,7 @@ static bool obs_nix_x11_hotkeys_platform_init(struct obs_core_hotkeys *hotkeys) hotkeys->platform_context = bzalloc(sizeof(obs_hotkeys_platform_t)); hotkeys->platform_context->display = display; -#if USE_XINPUT +#if defined(XINPUT_FOUND) registerMouseEvents(hotkeys); #endif fill_base_keysyms(hotkeys); @@ -864,7 +864,7 @@ static bool mouse_button_pressed(xcb_connection_t *connection, { bool ret = false; -#if USE_XINPUT +#if defined(XINPUT_FOUND) memset(context->pressed, 0, XINPUT_MOUSE_LEN); memset(context->update, 0, XINPUT_MOUSE_LEN); diff --git a/libobs/obs-nix.c b/libobs/obs-nix.c index 63b24fca0..93827ca37 100644 --- a/libobs/obs-nix.c +++ b/libobs/obs-nix.c @@ -54,16 +54,15 @@ const char *get_module_extension(void) #define FLATPAK_PLUGIN_PATH "/app/plugins" static const char *module_bin[] = { - "../../obs-plugins/" BIT_STRING, OBS_INSTALL_PREFIX "/" OBS_PLUGIN_DESTINATION, + "../../obs-plugins/" BIT_STRING, FLATPAK_PLUGIN_PATH "/" OBS_PLUGIN_DESTINATION, }; static const char *module_data[] = { - OBS_DATA_PATH "/obs-plugins/%module%", OBS_INSTALL_DATA_PATH "/obs-plugins/%module%", - FLATPAK_PLUGIN_PATH "/share/obs/obs-plugins/%module%", -}; + OBS_DATA_PATH "/obs-plugins/%module%", + FLATPAK_PLUGIN_PATH "/share/obs/obs-plugins/%module%"}; static const int module_patterns_size = sizeof(module_bin) / sizeof(module_bin[0]); diff --git a/libobs/obsconfig.h.in b/libobs/obsconfig.h.in index 7264da985..9f91b977e 100644 --- a/libobs/obsconfig.h.in +++ b/libobs/obsconfig.h.in @@ -10,18 +10,15 @@ #endif #define OBS_VERSION "@OBS_VERSION@" +#define OBS_VERSION_CANONICAL "@OBS_VERSION_CANONICAL@" #define OBS_DATA_PATH "@OBS_DATA_PATH@" #define OBS_INSTALL_PREFIX "@OBS_INSTALL_PREFIX@" #define OBS_PLUGIN_DESTINATION "@OBS_PLUGIN_DESTINATION@" -#define OBS_RELATIVE_PREFIX "@OBS_RELATIVE_PREFIX@" -#define OBS_UNIX_STRUCTURE @OBS_UNIX_STRUCTURE@ -#define HAVE_DBUS @HAVE_DBUS@ -#define HAVE_PULSEAUDIO @HAVE_PULSEAUDIO@ -#define USE_XINPUT @USE_XINPUT@ -#define LIBOBS_IMAGEMAGICK_DIR_STYLE_6L 6 -#define LIBOBS_IMAGEMAGICK_DIR_STYLE_7GE 7 -#define LIBOBS_IMAGEMAGICK_DIR_STYLE @LIBOBS_IMAGEMAGICK_DIR_STYLE@ +#define LINUX_PORTABLE "@LINUX_PORTABLE@" +#cmakedefine GIO_FOUND +#cmakedefine PULSEAUDIO_FOUND +#cmakedefine XCB_XINPUT_FOUND #cmakedefine ENABLE_WAYLAND /* NOTE: Release candidate version numbers internally are always the previous diff --git a/libobs/pkgconfig/libobs.pc.in b/libobs/pkgconfig/libobs.pc.in new file mode 100644 index 000000000..c32e0cb70 --- /dev/null +++ b/libobs/pkgconfig/libobs.pc.in @@ -0,0 +1,10 @@ +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@/obs + +Name: libobs +Description: OBS Studio Library +Version: @OBS_VERSION_CANONICAL@ +Cflags: -I${includedir} @_TARGET_DEFINITIONS@ @_TARGET_OPTIONS@ @_LINKED_DEFINITIONS@ +Libs: -L${libdir} @_LINKED_LIBRARIES@ diff --git a/libobs/util/c99defs.h b/libobs/util/c99defs.h index 5208bf0cb..f8a087b2e 100644 --- a/libobs/util/c99defs.h +++ b/libobs/util/c99defs.h @@ -24,16 +24,18 @@ #define UNUSED_PARAMETER(param) (void)param #ifdef _MSC_VER +#define OBS_UNUSED #define OBS_DEPRECATED __declspec(deprecated) #define OBS_NORETURN __declspec(noreturn) #define FORCE_INLINE __forceinline #else +#define OBS_UNUSED __attribute__((unused)) #define OBS_DEPRECATED __attribute__((deprecated)) #define OBS_NORETURN __attribute__((noreturn)) #define FORCE_INLINE inline __attribute__((always_inline)) #endif -#if defined(IS_LIBOBS) || defined(SWIG) +#if defined(IS_LIBOBS) || defined(SWIG_TYPE_TABLE) #define OBS_EXTERNAL_DEPRECATED #else #define OBS_EXTERNAL_DEPRECATED OBS_DEPRECATED diff --git a/libobs/util/platform-nix.c b/libobs/util/platform-nix.c index 636ce8d7b..b266bfdb0 100644 --- a/libobs/util/platform-nix.c +++ b/libobs/util/platform-nix.c @@ -64,7 +64,9 @@ void *os_dlopen(const char *path) dstr_init_copy(&dylib_name, path); #ifdef __APPLE__ - if (!dstr_find(&dylib_name, ".so") && !dstr_find(&dylib_name, ".dylib")) + if (!dstr_find(&dylib_name, ".framework") && + !dstr_find(&dylib_name, ".plugin") && + !dstr_find(&dylib_name, ".dylib") && !dstr_find(&dylib_name, ".so")) #else if (!dstr_find(&dylib_name, ".so")) #endif @@ -629,7 +631,7 @@ int os_chdir(const char *path) #if !defined(__APPLE__) -#if HAVE_DBUS +#if defined(GIO_FOUND) struct dbus_sleep_info; struct portal_inhibit_info; @@ -645,7 +647,7 @@ extern void portal_inhibit_info_destroy(struct portal_inhibit_info *portal); #endif struct os_inhibit_info { -#if HAVE_DBUS +#if defined(GIO_FOUND) struct dbus_sleep_info *dbus; struct portal_inhibit_info *portal; #endif @@ -661,7 +663,7 @@ os_inhibit_t *os_inhibit_sleep_create(const char *reason) struct os_inhibit_info *info = bzalloc(sizeof(*info)); sigset_t set; -#if HAVE_DBUS +#if defined(GIO_FOUND) info->portal = portal_inhibit_info_create(); if (!info->portal) info->dbus = dbus_sleep_info_create(); @@ -718,7 +720,7 @@ bool os_inhibit_sleep_set_active(os_inhibit_t *info, bool active) if (info->active == active) return false; -#if HAVE_DBUS +#if defined(GIO_FOUND) if (info->portal) portal_inhibit(info->portal, info->reason, active); if (info->dbus) @@ -749,7 +751,7 @@ void os_inhibit_sleep_destroy(os_inhibit_t *info) { if (info) { os_inhibit_sleep_set_active(info, false); -#if HAVE_DBUS +#if defined(GIO_FOUND) portal_inhibit_info_destroy(info->portal); dbus_sleep_info_destroy(info->dbus); #endif diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 272399493..6e0032098 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,84 +1,92 @@ -option(DISABLE_PLUGINS "Disable building of OBS plugins" OFF) -if(DISABLE_PLUGINS) - message(STATUS "DISABLE_PLUGINS is set; building of plugins is disabled.") - return() +option(ENABLE_PLUGINS "Enable building OBS plugins" ON) +if(NOT ENABLE_PLUGINS) + message(STATUS "OBS: building with plugins disabled") + return() endif() -if(WIN32) - option(BUILD_CA_ENCODER "Build CoreAudio encoder module" ON) - if (BUILD_CA_ENCODER) - add_subdirectory(coreaudio-encoder) - endif() - add_subdirectory(win-wasapi) - add_subdirectory(win-dshow) - add_subdirectory(win-capture) - add_subdirectory(decklink/win) - add_subdirectory(win-mf) - add_subdirectory(obs-qsv11) - add_subdirectory(vlc-video) - if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/enc-amf/CMakeLists.txt") - add_subdirectory(enc-amf) - else() - message(STATUS "enc-amf submodule not found! Please fetch submodules. enc-amf plugin disabled.") - endif() - if (MSVC) - add_subdirectory(win-ivcam) - endif() -elseif(APPLE) - add_subdirectory(coreaudio-encoder) - add_subdirectory(mac-avcapture) - add_subdirectory(mac-capture) - add_subdirectory(mac-vth264) - add_subdirectory(mac-syphon) - option(BUILD_VIRTUALCAM "Build Virtualcam" ON) - if(BUILD_VIRTUALCAM) - add_subdirectory(mac-virtualcam) - endif() - add_subdirectory(decklink/mac) - add_subdirectory(vlc-video) - add_subdirectory(linux-jack) -elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") - add_subdirectory(linux-capture) - add_subdirectory(linux-pulseaudio) - add_subdirectory(linux-v4l2) - add_subdirectory(linux-jack) - add_subdirectory(linux-alsa) - add_subdirectory(decklink/linux) - add_subdirectory(vlc-video) - add_subdirectory(sndio) -elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD") - add_subdirectory(linux-capture) - add_subdirectory(linux-pulseaudio) - add_subdirectory(linux-v4l2) - add_subdirectory(linux-jack) - add_subdirectory(linux-alsa) - add_subdirectory(vlc-video) - add_subdirectory(oss-audio) - add_subdirectory(sndio) -elseif("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD") - add_subdirectory(linux-capture) - add_subdirectory(sndio) -endif() +function(check_obs_browser) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt) + add_subdirectory(obs-browser) + else() + message(FATAL_ERROR "OBS: obs-browser submodule not available") + endif() +endfunction() -option(BUILD_BROWSER "Build browser plugin" ON) -if (BUILD_BROWSER) - if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt") - add_subdirectory(obs-browser) - set(BROWSER_AVAILABLE_INTERNAL ON CACHE BOOL "Internal global cmake variable" FORCE) - else() - message(FATAL_ERROR "obs-browser submodule not found! Please fetch submodules or set BUILD_BROWSER=OFF.") - endif() -else() - set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Internal global cmake variable" FORCE) -endif() +function(check_obs_vst) + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt) + add_subdirectory(obs-vst) + else() + message(FATAL_ERROR "OBS: obs-vst submodule not available") + endif() +endfunction() -option(BUILD_VST "Build VST plugin" ON) -if(BUILD_VST) - if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt") - add_subdirectory(obs-vst) - else() - message(FATAL_ERROR "obs-vst submodule not found! Please fetch submodules or set BUILD_VST=OFF.") - endif() +# APPLE/WIN32/UNIX are soft-deprecated: +# https://discourse.cmake.org/t/platform-id-vs-win32-vs-cmake-system-name/1226/2 +if(OS_WINDOWS) + add_subdirectory(coreaudio-encoder) + add_subdirectory(win-wasapi) + add_subdirectory(win-dshow) + add_subdirectory(win-capture) + add_subdirectory(decklink) + add_subdirectory(win-mf) + add_subdirectory(obs-qsv11) + add_subdirectory(obs-text) + add_subdirectory(vlc-video) + + if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/enc-amf/CMakeLists.txt") + add_subdirectory(enc-amf) + else() + message(WARNING "OBS: enc-amf plugin not found") + endif() + if(MSVC) + add_subdirectory(win-ivcam) + endif() + + check_obs_browser() + check_obs_vst() +elseif(OS_MACOS) + add_subdirectory(coreaudio-encoder) + add_subdirectory(mac-avcapture) + add_subdirectory(mac-capture) + add_subdirectory(mac-vth264) + add_subdirectory(mac-syphon) + add_subdirectory(mac-virtualcam) + add_subdirectory(decklink) + add_subdirectory(vlc-video) + add_subdirectory(linux-jack) + + check_obs_browser() + check_obs_vst() +elseif(OS_LINUX) + add_subdirectory(linux-capture) + add_subdirectory(linux-pulseaudio) + add_subdirectory(linux-v4l2) + add_subdirectory(linux-jack) + add_subdirectory(linux-alsa) + add_subdirectory(decklink) + add_subdirectory(vlc-video) + add_subdirectory(sndio) + + check_obs_browser() + check_obs_vst() +elseif(OS_FREEBSD) + add_subdirectory(linux-capture) + add_subdirectory(linux-pulseaudio) + add_subdirectory(linux-v4l2) + add_subdirectory(linux-jack) + add_subdirectory(linux-alsa) + add_subdirectory(vlc-video) + add_subdirectory(oss-audio) + add_subdirectory(sndio) + + message(STATUS "OBS: obs-browser plugin not available") + message(STATUS "OBS: obs-vst plugin not available") +elseif(OS_OPENBSD) + add_subdirectory(linux-capture) + add_subdirectory(sndio) + + message(STATUS "OBS: obs-browser plugin not available") + message(STATUS "OBS: obs-vst plugin not available") endif() add_subdirectory(image-source) @@ -88,7 +96,6 @@ add_subdirectory(obs-ffmpeg) add_subdirectory(obs-outputs) add_subdirectory(obs-filters) add_subdirectory(obs-transitions) -add_subdirectory(obs-text) add_subdirectory(rtmp-services) add_subdirectory(text-freetype2) add_subdirectory(aja) diff --git a/plugins/aja/CMakeLists.txt b/plugins/aja/CMakeLists.txt index 108d5a10b..af0ee7685 100644 --- a/plugins/aja/CMakeLists.txt +++ b/plugins/aja/CMakeLists.txt @@ -1,111 +1,68 @@ project(aja) -if(DISABLE_AJA) - message(STATUS "aja plugin disabled") - return() +option(ENABLE_AJA "Build OBS with aja support" ON) +if(NOT ENABLE_AJA) + message(STATUS "OBS: DISABLED aja") + return() endif() -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - find_package(LibAJANTV2) - if (NOT LIBAJANTV2_FOUND) - message(STATUS "aja plugin disabled (deps not found)") - return() - else() - message("aja plugin includes: ${LIBAJANTV2_INCLUDE_DIRS}") - message("aja plugin libs: ${LIBAJANTV2_LIBRARIES}") - message("aja plugin debug libs: ${LIBAJANTV2_DEBUG_LIBRARIES}") - endif() -else() - message(STATUS "aja plugin disabled (32-bit not supported)") - return() +if(NOT OS_MACOS AND NOT CMAKE_SIZEOF_VOID_P EQUAL 8) + message( + STATUS "OBS: aja support not enabled (32-bit not supported)") + set(ENABLE_AJA + OFF + CACHE BOOL "Build OBS with aja support" FORCE) + return() endif() -set(aja_INCLUDE_DIRS - ${LIBAJANTV2_INCLUDE_DIRS}) -set(aja_LIBRARIES - $,${LIBAJANTV2_DEBUG_LIBRARIES},${LIBAJANTV2_LIBRARIES}> - libobs) +find_package(LibAJANTV2 REQUIRED) -set(aja_SOURCES - main.cpp - aja-card-manager.cpp - aja-common.cpp - aja-output.cpp - aja-presets.cpp - aja-props.cpp - aja-routing.cpp - aja-source.cpp - aja-vpid-data.cpp - aja-widget-io.cpp) +add_library(aja MODULE) +add_library(OBS::aja ALIAS aja) -set(aja_HEADERS - aja-card-manager.hpp - aja-common.hpp - aja-enums.hpp - aja-ui-props.hpp - aja-output.hpp - aja-presets.hpp - aja-props.hpp - aja-routing.hpp - aja-source.hpp - aja-vpid-data.hpp - aja-widget-io.hpp) +target_sources( + aja + PRIVATE main.cpp + aja-card-manager.cpp + aja-common.cpp + aja-common.hpp + aja-output.cpp + aja-enums.hpp + aja-output.hpp + aja-presets.cpp + aja-presets.hpp + aja-props.cpp + aja-props.hpp + aja-routing.cpp + aja-routing.hpp + aja-source.cpp + aja-source.hpp + aja-vpid-data.cpp + aja-vpid-data.hpp + aja-widget-io.cpp + aja-widget-io.hpp + aja-card-manager.hpp + aja-ui-props.hpp) -# macOS -if(APPLE) - set(aja_COMPILE_DEFS - AJAMac - AJA_MAC) +target_link_libraries(aja PRIVATE OBS::libobs AJA::LibAJANTV2) - find_library(IOKIT_FRAMEWORK Iokit) - find_library(COREFOUNDATION_LIBRARY CoreFoundation) - find_library(APPKIT_FRAMEWORK AppKit) +if(OS_MACOS) + find_library(IOKIT IOKit) + find_library(COREFOUNDATION CoreFoundation) + find_library(APPKIT AppKit) - list(APPEND aja_LIBRARIES - ${IOKIT_FRAMEWORK} - ${COREFOUNDATION_LIBRARY} - ${APPKIT_FRAMEWORK}) -# Windows -elseif(WIN32) - set(aja_COMPILE_DEFS - AJA_WINDOWS - _WINDOWS - WIN32 - MSWindows) + target_link_libraries(aja PRIVATE ${IOKIT} ${COREFOUNDATION} ${APPKIT}) +elseif(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS AJA Windows module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-aja.rc) - if(CMAKE_BUILD_TYPE STREQUAL Debug) - list(APPEND aja_COMPILE_DEFS - _DEBUG) - else() - list(APPEND aja_COMPILE_DEFS - NDEBUG) - endif() + target_sources(aja PRIVATE win-aja.rc) - list(APPEND aja_LIBRARIES - ws2_32.lib - setupapi.lib - Winmm.lib - netapi32.lib - Shlwapi.lib) - - set(MODULE_DESCRIPTION "OBS AJA Windows module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-aja.rc) - list(APPEND aja_SOURCES - win-aja.rc) -# Linux -elseif(UNIX AND NOT APPLE) - set(aja_COMPILE_DEFS - AJA_LINUX - AJALinux) + target_link_libraries(aja PRIVATE ws2_32.lib setupapi.lib Winmm.lib + netapi32.lib Shlwapi.lib) endif() -add_library(aja MODULE ${aja_SOURCES} ${aja_HEADERS}) +set_target_properties(aja PROPERTIES FOLDER "plugins/aja" PREFIX "") -target_include_directories(aja PUBLIC ${aja_INCLUDE_DIRS}) -target_link_libraries(aja PUBLIC ${aja_LIBRARIES}) -target_compile_definitions(aja PUBLIC ${aja_COMPILE_DEFS}) - -set_target_properties(aja PROPERTIES FOLDER - "plugins") - -install_obs_plugin_with_data(aja data) +setup_plugin_target(aja) diff --git a/plugins/coreaudio-encoder/CMakeLists.txt b/plugins/coreaudio-encoder/CMakeLists.txt index ae185e1ec..22c9aa3b6 100644 --- a/plugins/coreaudio-encoder/CMakeLists.txt +++ b/plugins/coreaudio-encoder/CMakeLists.txt @@ -1,43 +1,53 @@ project(coreaudio-encoder) -set(coreaudio-encoder_SOURCES - encoder.cpp) - -if (WIN32) - # Set compiler flag before adding resource file - if (MINGW) - set_source_files_properties(${coreaudio-encoder_SOURCES} - PROPERTIES COMPILE_FLAGS "-Wno-multichar") - endif() - - set(MODULE_DESCRIPTION "OBS Core Audio encoder") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in coreaudio-encoder.rc) - list(APPEND coreaudio-encoder_SOURCES - coreaudio-encoder.rc) - set(coreaudio-encoder_HEADERS windows-imports.h) - set(coreaudio-encoder_LIBS ) -else() - find_library(COREFOUNDATION CoreFoundation) - find_library(COREAUDIO CoreAudio) - find_library(AUDIOTOOLBOX AudioToolbox) - set(coreaudio-encoder_HEADERS ) - set(coreaudio-encoder_LIBS - ${COREFOUNDATION} - ${COREAUDIO} - ${AUDIOTOOLBOX}) - - include_directories(${COREFOUNDATION} - ${COREAUDIO} - ${AUDIOTOOLBOX}) +if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + option(ENABLE_COREAUDIO_ENCODER + "Enable building with CoreAudio encoder (Windows)" ON) + if(NOT ENABLE_COREAUDIO_ENCODER) + message(STATUS "OBS: DISABLED coreaudio-encoder") + return() + endif() endif() -add_library(coreaudio-encoder MODULE - ${coreaudio-encoder_SOURCES} - ${coreaudio-encoder_HEADERS}) +add_library(coreaudio-encoder MODULE) +add_library(OBS::coreaudio-encoder ALIAS coreaudio-encoder) -target_link_libraries(coreaudio-encoder - libobs - ${coreaudio-encoder_LIBS}) -set_target_properties(coreaudio-encoder PROPERTIES FOLDER "plugins") +target_sources(coreaudio-encoder PRIVATE encoder.cpp) -install_obs_plugin_with_data(coreaudio-encoder data) +set_target_properties( + coreaudio-encoder + PROPERTIES OUTPUT_NAME "coreaudio-encoder" + FOLDER "plugins" + PREFIX "") + +target_compile_features(coreaudio-encoder PRIVATE cxx_std_11) + +target_link_libraries(coreaudio-encoder PRIVATE OBS::libobs) + +if(OS_MACOS) + find_library(COREFOUNDATION CoreFoundation) + find_library(COREAUDIO CoreAudio) + find_library(AUDIOTOOLBOX AudioToolbox) + + mark_as_advanced(AUDIOTOOLBOX COREAUDIO COREFOUNDATION) + + target_link_libraries(coreaudio-encoder PRIVATE ${COREFOUNDATION} + ${COREAUDIO} ${AUDIOTOOLBOX}) + +elseif(OS_WINDOWS) + if(MINGW) + set_source_files_properties(encoder.cpp PROPERTIES COMPILE_FLAGS + -Wno-multichar) + endif() + + target_compile_definitions(coreaudio-encoder PRIVATE UNICODE _UNICODE) + + set(MODULE_DESCRIPTION "OBS CoreAudio encoder") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + coreaudio-encoder.rc) + + target_sources(coreaudio-encoder PRIVATE coreaudio-encoder.rc + windows-imports.h) +endif() + +setup_plugin_target(coreaudio-encoder) diff --git a/plugins/decklink/CMakeLists.txt b/plugins/decklink/CMakeLists.txt new file mode 100644 index 000000000..30980c32e --- /dev/null +++ b/plugins/decklink/CMakeLists.txt @@ -0,0 +1,106 @@ +project(decklink) + +option(ENABLE_DECKLINK "Build OBS with Decklink support" ON) +if(NOT ENABLE_DECKLINK) + message(STATUS "OBS: DISABLED decklink support") + return() +endif() + +if(OS_WINDOWS) + include(IDLFileHelper) + add_idl_files(win-decklink-sdk_GENERATED_FILES + win/decklink-sdk/DeckLinkAPI.idl) +endif() + +add_library(decklink MODULE) +add_library(OBS::decklink ALIAS decklink) + +add_library(decklink-sdk INTERFACE) +add_library(Decklink::SDK ALIAS decklink-sdk) + +target_sources( + decklink + PRIVATE OBSVideoFrame.cpp + OBSVideoFrame.h + audio-repack.c + audio-repack.h + audio-repack.hpp + const.h + decklink-device.cpp + decklink-device.hpp + decklink-devices.cpp + decklink-devices.hpp + decklink-device-discovery.cpp + decklink-device-discovery.hpp + decklink-device-instance.cpp + decklink-device-instance.hpp + decklink-device-mode.cpp + decklink-device-mode.hpp + decklink-output.cpp + decklink-source.cpp + DecklinkBase.cpp + DecklinkBase.h + DecklinkInput.cpp + DecklinkInput.hpp + DecklinkOutput.cpp + DecklinkOutput.hpp + platform.hpp + plugin-main.cpp + util.cpp + util.hpp) + +target_include_directories(decklink-sdk INTERFACE ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries(decklink PRIVATE OBS::libobs OBS::caption Decklink::SDK) + +set_target_properties(decklink PROPERTIES FOLDER "plugins/decklink") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS DeckLink Windows module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-decklink.rc) + + target_sources(decklink PRIVATE win/platform.cpp win-decklink.rc) + + target_sources(decklink-sdk INTERFACE win/decklink-sdk/DeckLinkAPIVersion.h + ${win-decklink-sdk_GENERATED_FILES}) + +elseif(OS_MACOS) + find_library(COREFOUNDATION CoreFoundation) + mark_as_advanced(COREFOUNDATION) + + target_sources(decklink PRIVATE mac/platform.cpp) + + target_sources( + decklink-sdk + INTERFACE mac/decklink-sdk/DeckLinkAPIDispatch.cpp + mac/decklink-sdk/DeckLinkAPI.h + mac/decklink-sdk/DeckLinkAPIConfiguration.h + mac/decklink-sdk/DeckLinkAPIDeckControl.h + mac/decklink-sdk/DeckLinkAPIDiscovery.h + mac/decklink-sdk/DeckLinkAPIModes.h + mac/decklink-sdk/DeckLinkAPIStreaming.h + mac/decklink-sdk/DeckLinkAPITypes.h + mac/decklink-sdk/DeckLinkAPIVersion.h) + + target_link_libraries(decklink PRIVATE ${COREFOUNDATION}) + + target_compile_features(decklink PRIVATE cxx_auto_type) +elseif(OS_POSIX) + target_sources(decklink PRIVATE linux/platform.cpp) + + target_sources( + decklink-sdk + INTERFACE linux/decklink-sdk/DeckLinkAPIDispatch.cpp + linux/decklink-sdk/DeckLinkAPI.h + linux/decklink-sdk/DeckLinkAPIConfiguration.h + linux/decklink-sdk/DeckLinkAPIDeckControl.h + linux/decklink-sdk/DeckLinkAPIDiscovery.h + linux/decklink-sdk/DeckLinkAPIModes.h + linux/decklink-sdk/DeckLinkAPITypes.h + linux/decklink-sdk/DeckLinkAPIVersion.h + linux/decklink-sdk/LinuxCOM.h) +endif() + +setup_plugin_target(decklink) +setup_target_resources(decklink "obs-plugins/decklink") diff --git a/plugins/decklink/DecklinkOutput.hpp b/plugins/decklink/DecklinkOutput.hpp index 598206f17..3b0cfc536 100644 --- a/plugins/decklink/DecklinkOutput.hpp +++ b/plugins/decklink/DecklinkOutput.hpp @@ -2,7 +2,7 @@ #include "DecklinkBase.h" -#include "../../libobs/media-io/video-scaler.h" +#include class DeckLinkOutput : public DecklinkBase { protected: diff --git a/plugins/decklink/decklink-device-instance.hpp b/plugins/decklink/decklink-device-instance.hpp index 9e2ab905f..20f80cdbc 100644 --- a/plugins/decklink/decklink-device-instance.hpp +++ b/plugins/decklink/decklink-device-instance.hpp @@ -4,8 +4,8 @@ blog(level, "%s: " message, "decklink", ##__VA_ARGS__) #include +#include #include "decklink-device.hpp" -#include "../../libobs/media-io/video-scaler.h" #include "OBSVideoFrame.h" class AudioRepacker; diff --git a/plugins/decklink/decklink-output.cpp b/plugins/decklink/decklink-output.cpp index 4f3f81dd2..a3d0b7f9d 100644 --- a/plugins/decklink/decklink-output.cpp +++ b/plugins/decklink/decklink-output.cpp @@ -8,8 +8,8 @@ #include "decklink-device-discovery.hpp" #include "decklink-devices.hpp" -#include "../../libobs/media-io/video-scaler.h" -#include "../../libobs/util/util_uint64.h" +#include +#include static void decklink_output_destroy(void *data) { diff --git a/plugins/decklink/linux/CMakeLists.txt b/plugins/decklink/linux/CMakeLists.txt deleted file mode 100644 index fdb96bf58..000000000 --- a/plugins/decklink/linux/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -project(linux-decklink) - -if(DISABLE_DECKLINK) - message(STATUS "decklink plugin disabled") - return() -endif() - -include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption) - -set(linux-decklink-sdk_HEADERS - decklink-sdk/DeckLinkAPI.h - decklink-sdk/DeckLinkAPIConfiguration.h - decklink-sdk/DeckLinkAPIDeckControl.h - decklink-sdk/DeckLinkAPIDiscovery.h - decklink-sdk/DeckLinkAPIModes.h - decklink-sdk/DeckLinkAPITypes.h - decklink-sdk/DeckLinkAPIVersion.h - decklink-sdk/LinuxCOM.h - ) - -set(linux-decklink-sdk_SOURCES - decklink-sdk/DeckLinkAPIDispatch.cpp - ) - -set(linux-decklink_HEADERS - ../decklink-devices.hpp - ../const.h - ../DecklinkOutput.hpp - ../platform.hpp - ../DecklinkInput.hpp - ../DecklinkBase.h - ../decklink-device-instance.hpp - ../decklink-device-discovery.hpp - ../decklink-device.hpp - ../decklink-device-mode.hpp - ../audio-repack.h - ../audio-repack.hpp - ../util.hpp - ../OBSVideoFrame.h - ) - -set(linux-decklink_SOURCES - ../plugin-main.cpp - ../decklink-devices.cpp - ../decklink-source.cpp - ../decklink-output.cpp - ../DecklinkOutput.cpp - ../DecklinkInput.cpp - ../DecklinkBase.cpp - ../decklink-device-instance.cpp - ../decklink-device-discovery.cpp - ../decklink-device.cpp - ../decklink-device-mode.cpp - ../audio-repack.c - platform.cpp - ../util.cpp - ../OBSVideoFrame.cpp - ) - -add_library(linux-decklink MODULE - ${linux-decklink_SOURCES} - ${linux-decklink_HEADERS} - ${linux-decklink-sdk_HEADERS} - ${linux-decklink-sdk_SOURCES} - ) - -target_link_libraries(linux-decklink - libobs - caption) -set_target_properties(linux-decklink PROPERTIES FOLDER "plugins/decklink") - -install_obs_plugin_with_data(linux-decklink ../data) diff --git a/plugins/decklink/mac/CMakeLists.txt b/plugins/decklink/mac/CMakeLists.txt deleted file mode 100644 index f745b8602..000000000 --- a/plugins/decklink/mac/CMakeLists.txt +++ /dev/null @@ -1,84 +0,0 @@ -project(mac-decklink) - -if(DISABLE_DECKLINK) - message(STATUS "decklink plugin disabled") - return() -endif() - -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}") - -find_library(COREFOUNDATION CoreFoundation) - -include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption) - -set(mac-decklink-sdk_HEADERS - decklink-sdk/DeckLinkAPI.h - decklink-sdk/DeckLinkAPIConfiguration.h - decklink-sdk/DeckLinkAPIDeckControl.h - decklink-sdk/DeckLinkAPIDiscovery.h - decklink-sdk/DeckLinkAPIModes.h - decklink-sdk/DeckLinkAPIStreaming.h - decklink-sdk/DeckLinkAPITypes.h - decklink-sdk/DeckLinkAPIVersion.h) - -set(mac-decklink-sdk_SOURCES - decklink-sdk/DeckLinkAPIDispatch.cpp - ) - -set(mac-decklink_HEADERS - ../decklink-devices.hpp - ../const.h - ../DecklinkOutput.hpp - ../platform.hpp - ../DecklinkInput.hpp - ../DecklinkBase.h - ../decklink-device-instance.hpp - ../decklink-device-discovery.hpp - ../decklink-device.hpp - ../decklink-device-mode.hpp - ../audio-repack.h - ../audio-repack.hpp - ../util.hpp - ../OBSVideoFrame.h - ) - -set(mac-decklink_SOURCES - ../plugin-main.cpp - ../decklink-devices.cpp - ../decklink-output.cpp - ../decklink-source.cpp - ../DecklinkOutput.cpp - ../DecklinkInput.cpp - ../DecklinkBase.cpp - ../decklink-device-instance.cpp - ../decklink-device-discovery.cpp - ../decklink-device.cpp - ../decklink-device-mode.cpp - ../audio-repack.c - platform.cpp - ../util.cpp - ../OBSVideoFrame.cpp - ) - -list(APPEND decklink_HEADERS ${decklink_UI_HEADERS}) - -include_directories( - ${COREFOUNDATION} -) - -list(APPEND mac-decklink_HEADERS ${decklink_UI_HEADERS}) - -add_library(mac-decklink MODULE - ${mac-decklink_SOURCES} - ${mac-decklink_HEADERS} - ${mac-decklink-sdk_HEADERS} - ${mac-decklink-sdk_SOURCES} - ) - -target_link_libraries(mac-decklink - libobs - ${COREFOUNDATION} - caption) -set_target_properties(mac-decklink PROPERTIES FOLDER "plugins/decklink") - -install_obs_plugin_with_data(mac-decklink ../data) diff --git a/plugins/decklink/win/CMakeLists.txt b/plugins/decklink/win/CMakeLists.txt deleted file mode 100644 index 96265b042..000000000 --- a/plugins/decklink/win/CMakeLists.txt +++ /dev/null @@ -1,77 +0,0 @@ -project(win-decklink) - -if(DISABLE_DECKLINK) - message(STATUS "decklink plugin disabled") - return() -endif() - -include(IDLFileHelper) - -include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption) - -set(win-decklink-sdk_IDLS - decklink-sdk/DeckLinkAPI.idl - ) - -set(win-decklink-sdk_HEADERS - decklink-sdk/DeckLinkAPIVersion.h - ) - -set(win-decklink_HEADERS - ../decklink-devices.hpp - ../DecklinkOutput.hpp - ../const.h - ../platform.hpp - ../DecklinkInput.hpp - ../DecklinkBase.h - ../decklink-device-instance.hpp - ../decklink-device-discovery.hpp - ../decklink-device.hpp - ../decklink-device-mode.hpp - ../audio-repack.h - ../audio-repack.hpp - ../util.hpp - ../OBSVideoFrame.h - ) - -set(MODULE_DESCRIPTION "OBS DeckLink Windows module") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-decklink.rc) -set(win-decklink_SOURCES - ../plugin-main.cpp - ../decklink-devices.cpp - ../DecklinkOutput.cpp - ../decklink-source.cpp - ../decklink-output.cpp - ../DecklinkInput.cpp - ../DecklinkBase.cpp - ../decklink-device-instance.cpp - ../decklink-device-discovery.cpp - ../decklink-device.cpp - ../decklink-device-mode.cpp - ../audio-repack.c - platform.cpp - ../util.cpp - win-decklink.rc - ../OBSVideoFrame.cpp) - -add_idl_files(win-decklink-sdk_GENERATED_FILES - ${win-decklink-sdk_IDLS} - ) - -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} -) - -add_library(win-decklink MODULE - ${win-decklink_SOURCES} - ${win-decklink_HEADERS} - ${win-decklink-sdk_HEADERS} - ${win-decklink-sdk_GENERATED_FILES} - ) - -target_link_libraries(win-decklink - libobs - caption) -set_target_properties(win-decklink PROPERTIES FOLDER "plugins/decklink") - -install_obs_plugin_with_data(win-decklink ../data) diff --git a/plugins/image-source/CMakeLists.txt b/plugins/image-source/CMakeLists.txt index 95fff78c5..dc927294e 100644 --- a/plugins/image-source/CMakeLists.txt +++ b/plugins/image-source/CMakeLists.txt @@ -1,27 +1,25 @@ project(image-source) -if(MSVC) - set(image-source_PLATFORM_DEPS - w32-pthreads) +add_library(image-source MODULE) +add_library(OBS::image-source ALIAS image-source) + +target_sources(image-source PRIVATE image-source.c color-source.c + obs-slideshow.c) + +target_link_libraries(image-source PRIVATE OBS::libobs) + +if(OS_WINDOWS) + if(MSVC) + target_link_libraries(image-source PRIVATE OBS::w32-pthreads) + endif() + + set(MODULE_DESCRIPTION "OBS image module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + image-source.rc) + + target_sources(image-source PRIVATE image-source.rc) endif() -set(image-source_SOURCES - image-source.c - color-source.c - obs-slideshow.c) +set_target_properties(image-source PROPERTIES FOLDER "plugins" PREFIX "") -if(WIN32) - set(MODULE_DESCRIPTION "OBS image module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in image-source.rc) - list(APPEND image-source_SOURCES - image-source.rc) -endif() - -add_library(image-source MODULE - ${image-source_SOURCES}) -target_link_libraries(image-source - libobs - ${image-source_PLATFORM_DEPS}) -set_target_properties(image-source PROPERTIES FOLDER "plugins") - -install_obs_plugin_with_data(image-source data) +setup_plugin_target(image-source) diff --git a/plugins/linux-alsa/CMakeLists.txt b/plugins/linux-alsa/CMakeLists.txt index c53308a40..d0d763a09 100644 --- a/plugins/linux-alsa/CMakeLists.txt +++ b/plugins/linux-alsa/CMakeLists.txt @@ -1,35 +1,20 @@ project(linux-alsa) -if(DISABLE_ALSA) - message(STATUS "ALSA support disabled") - return() +option(ENABLE_ALSA "Build OBS with ALSA support" ON) +if(NOT ENABLE_ALSA) + message(STATUS "OBS: DISABLED alsa") + return() endif() -find_package(ALSA) -if(NOT ALSA_FOUND AND ENABLE_ALSA) - message(FATAL_ERROR "ALSA not found but set as enabled") -elseif(NOT ALSA_FOUND) - message(STATUS "ALSA not found, disabling ALSA plugin") - return() -endif() +find_package(ALSA REQUIRED) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" - ${ALSA_INCLUDE_DIR} -) +add_library(linux-alsa MODULE) +add_library(OBS::alsa ALIAS linux-alsa) -set(linux-alsa_SOURCES - linux-alsa.c - alsa-input.c -) +target_sources(linux-alsa PRIVATE linux-alsa.c alsa-input.c) + +target_link_libraries(linux-alsa PRIVATE OBS::libobs ALSA::ALSA) -add_library(linux-alsa MODULE - ${linux-alsa_SOURCES} -) -target_link_libraries(linux-alsa - libobs - ${ALSA_LIBRARY} -) set_target_properties(linux-alsa PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(linux-alsa data) +setup_plugin_target(linux-alsa) diff --git a/plugins/linux-capture/CMakeLists.txt b/plugins/linux-capture/CMakeLists.txt index ed4e9762a..58a42ce84 100644 --- a/plugins/linux-capture/CMakeLists.txt +++ b/plugins/linux-capture/CMakeLists.txt @@ -1,107 +1,79 @@ project(linux-capture) -find_package(X11 REQUIRED) -if(NOT X11_Xcomposite_FOUND) - message(STATUS "Xcomposite library not found, linux-capture plugin disabled") - return() -endif() - -find_package(XCB COMPONENTS XCB RANDR SHM XFIXES XINERAMA REQUIRED) -find_package(X11_XCB REQUIRED) - -set(linux-capture_INCLUDES - "${CMAKE_SOURCE_DIR}/libobs" - ${X11_Xcomposite_INCLUDE_PATH} - ${X11_X11_INCLUDE_PATH} - ${XCB_INCLUDE_DIRS} -) - -set(linux-capture_SOURCES - linux-capture.c - xcursor.c - xcursor-xcb.c - xhelpers.c - xshm-input.c - xcomposite-main.cpp - xcompcap-main.cpp - xcompcap-helper.cpp -) -set(linux-capture_HEADERS - xcursor.h - xcursor-xcb.h - xhelpers.h - xcompcap-main.hpp - xcompcap-helper.hpp -) - -set(linux-capture_LIBRARIES - libobs - glad - ${X11_LIBRARIES} - ${X11_Xfixes_LIB} - ${X11_X11_LIB} - ${X11_Xcomposite_LIB} - ${XCB_LIBRARIES} -) - option(ENABLE_PIPEWIRE "Enable PipeWire support" ON) -if(ENABLE_PIPEWIRE) - find_package(PipeWire 0.3.32 QUIET) - find_package(Libdrm QUIET) # we require libdrm/drm_fourcc.h to build - find_package(Gio QUIET) - - if(NOT PIPEWIRE_FOUND) - message(FATAL_ERROR "PipeWire library not found! Please install PipeWire or set ENABLE_PIPEWIRE=OFF") - elseif(NOT GIO_FOUND) - message(FATAL_ERROR "Gio library not found! Please install GLib2 (or Gio) or set ENABLE_PIPEWIRE=OFF") - elseif(NOT LIBDRM_INCLUDE_DIRS) - message(FATAL_ERROR "libdrm headers not found! Please install libdrm or set ENABLE_PIPEWIRE=OFF") - endif() - - add_definitions(-DENABLE_PIPEWIRE) - - set(linux-capture_INCLUDES - ${linux-capture_INCLUDES} - ${GIO_INCLUDE_DIRS} - ${PIPEWIRE_INCLUDE_DIRS} - ${DRM_INCLUDE_DIRS} - ) - - add_definitions( - ${GIO_DEFINITIONS} - ${PIPEWIRE_DEFINITIONS} - ) - - set(linux-capture_SOURCES - ${linux-capture_SOURCES} - pipewire.c - pipewire-capture.c - portal.c - ) - set(linux-capture_HEADERS - ${linux-capture_HEADERS} - pipewire.h - pipewire-capture.h - portal.h - ) - set(linux-capture_LIBRARIES - ${linux-capture_LIBRARIES} - ${GIO_LIBRARIES} - ${PIPEWIRE_LIBRARIES} - ) +if(NOT ENABLE_PIPEWIRE) + message(STATUS "OBS: - PipeWire support disabled") endif() -include_directories(SYSTEM - ${linux-capture_INCLUDES} -) -add_library(linux-capture MODULE - ${linux-capture_SOURCES} - ${linux-capture_HEADERS} -) -target_link_libraries(linux-capture - ${linux-capture_LIBRARIES} -) +find_package(X11 REQUIRED) +if(NOT TARGET X11::Xcomposite) + message( + FATAL_ERROR "OBS: DISABLED linux-capture - Xcomposite library not found") +endif() +find_package(XCB COMPONENTS XCB XFIXES RANDR SHM XINERAMA) + +add_library(linux-capture MODULE) +add_library(OBS::capture ALIAS linux-capture) + +target_sources( + linux-capture + PRIVATE linux-capture.c + xcursor.c + xcursor.h + xcursor-xcb.c + xcursor-xcb.h + xhelpers.c + xhelpers.h + xshm-input.c + xcomposite-main.cpp + xcompcap-main.cpp + xcompcap-main.hpp + xcompcap-helper.cpp + xcompcap-helper.hpp) + +target_link_libraries( + linux-capture + PRIVATE OBS::libobs + OBS::obsglad + X11::X11 + X11::Xfixes + X11::Xcomposite + XCB::XCB + XCB::XFIXES + XCB::RANDR + XCB::SHM + XCB::XINERAMA) set_target_properties(linux-capture PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(linux-capture data) +if(ENABLE_PIPEWIRE) + find_package(PipeWire 0.3.32 QUIET) + find_package(Gio QUIET) + find_package(Libdrm QUIET) + + if(NOT TARGET PipeWire::PipeWire) + message( + FATAL_ERROR + "OBS: - PipeWire library not found! Please install PipeWire or set ENABLE_PIPEWIRE=OFF" + ) + elseif(NOT TARGET GIO::GIO) + message( + FATAL_ERROR + "OBS: - Gio library not found! Please install GLib2 (or Gio) or set ENABLE_PIPEWIRE=OFF" + ) + elseif(NOT TARGET Libdrm::Libdrm) + message( + FATAL_ERROR + "OBS: - libdrm headers not found! Please install libdrm or set ENABLE_PIPEWIRE=OFF" + ) + endif() + + target_sources(linux-capture PRIVATE pipewire.c pipewire.h pipewire-capture.c + pipewire-capture.h portal.c portal.h) + + target_link_libraries(linux-capture PRIVATE PipeWire::PipeWire GIO::GIO + Libdrm::Libdrm) + target_compile_definitions(linux-capture PRIVATE ENABLE_PIPEWIRE) +endif() + +setup_plugin_target(linux-capture) diff --git a/plugins/linux-jack/CMakeLists.txt b/plugins/linux-jack/CMakeLists.txt index 5aefba450..e2c79ebc0 100644 --- a/plugins/linux-jack/CMakeLists.txt +++ b/plugins/linux-jack/CMakeLists.txt @@ -1,36 +1,21 @@ project(linux-jack) -if(DISABLE_JACK) - message(STATUS "JACK support disabled") - return() +option(ENABLE_JACK "Build OBS with JACK support" OFF) +if(NOT ENABLE_JACK) + message(STATUS "OBS: DISABLED linux-jack") + return() endif() -find_package(Jack) -if(NOT JACK_FOUND AND ENABLE_JACK) - message(FATAL_ERROR "JACK Audio Connection Kit not found but set as enabled") -elseif(NOT JACK_FOUND) - message(STATUS "JACK Audio Connection Kit not found, disabling JACK plugin") - return() -endif() +find_package(Jack REQUIRED) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" - ${JACK_INCLUDE_DIR} -) +add_library(linux-jack MODULE) +add_library(OBS::jack ALIAS linux-jack) -set(linux-jack_SOURCES - linux-jack.c - jack-wrapper.c - jack-input.c -) +target_sources(linux-jack PRIVATE linux-jack.c jack-wrapper.c jack-input.c) -add_library(linux-jack MODULE - ${linux-jack_SOURCES} -) -target_link_libraries(linux-jack - libobs - ${JACK_LIBRARIES} -) -set_target_properties(linux-jack PROPERTIES FOLDER "plugins") +target_link_libraries(linux-jack PRIVATE OBS::libobs Jack::Jack) -install_obs_plugin_with_data(linux-jack data) +set_target_properties(linux-jack PROPERTIES FOLDER "plugins" PROJECT_LABEL + "JACK Audio") + +setup_plugin_target(linux-jack) diff --git a/plugins/linux-pulseaudio/CMakeLists.txt b/plugins/linux-pulseaudio/CMakeLists.txt index 51814ea3b..6913ee87a 100644 --- a/plugins/linux-pulseaudio/CMakeLists.txt +++ b/plugins/linux-pulseaudio/CMakeLists.txt @@ -1,36 +1,25 @@ project(linux-pulseaudio) -if(DISABLE_PULSEAUDIO) - message(STATUS "PulseAudio support disabled") - return() +option(ENABLE_PULSEAUDIO "Enable PulseAudio support" ON) + +if(NOT ENABLE_PULSEAUDIO) + message(STATUS "OBS: DISABLED linux-pulseaudio") + return() endif() -find_package(PulseAudio) -if(NOT PULSEAUDIO_FOUND AND ENABLE_PULSEAUDIO) - message(FATAL_ERROR "PulseAudio not found but set as enabled") -elseif(NOT PULSEAUDIO_FOUND) - message(STATUS "PulseAudio not found, disabling PulseAudio plugin") - return() -endif() +find_package(PulseAudio REQUIRED) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" - ${PULSEAUDIO_INCLUDE_DIR} -) +add_library(linux-pulseaudio MODULE) +add_library(OBS::pulseaudio ALIAS linux-pulseaudio) -set(linux-pulseaudio_SOURCES - linux-pulseaudio.c - pulse-wrapper.c - pulse-input.c -) +target_sources(linux-pulseaudio PRIVATE linux-pulseaudio.c pulse-wrapper.c + pulse-input.c) + +target_include_directories(linux-pulseaudio PRIVATE ${PULSEAUDIO_INCLUDE_DIR}) + +target_link_libraries(linux-pulseaudio PRIVATE OBS::libobs + ${PULSEAUDIO_LIBRARY}) -add_library(linux-pulseaudio MODULE - ${linux-pulseaudio_SOURCES} -) -target_link_libraries(linux-pulseaudio - libobs - ${PULSEAUDIO_LIBRARY} -) set_target_properties(linux-pulseaudio PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(linux-pulseaudio data) +setup_plugin_target(linux-pulseaudio) diff --git a/plugins/linux-v4l2/CMakeLists.txt b/plugins/linux-v4l2/CMakeLists.txt index 403a3318b..c427b738d 100644 --- a/plugins/linux-v4l2/CMakeLists.txt +++ b/plugins/linux-v4l2/CMakeLists.txt @@ -1,62 +1,35 @@ project(linux-v4l2) -if(DISABLE_V4L2) - message(STATUS "v4l2 plugin disabled") - return() +option(ENABLE_V4L2 "Build OBS with v4l2 support" ON) +if(NOT ENABLE_V4L2) + message(STATUS "OBS: DISABLED linux-v4l2") + return() endif() +option(ENABLE_UDEV "Build linux-v4l2 with UDEV support" ON) -if(ENABLE_V4L2) - find_package(Libv4l2 REQUIRED) -else() - find_package(Libv4l2) - if(NOT LIBV4L2_FOUND) - message(STATUS "libv4l2 not found, disabling v4l2 plugin") - return() - endif() -endif() +find_package(Libv4l2 REQUIRED) +find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat) -if(DISABLE_UDEV) - add_definitions(-DHAVE_UDEV) -else() - find_package(UDev) - if(NOT UDEV_FOUND) - message(STATUS "udev disabled for v4l2 plugin") - else() - set(linux-v4l2-udev_SOURCES - v4l2-udev.c - ) - endif() -endif() +add_library(linux-v4l2 MODULE) +add_library(OBS::v4l2 ALIAS linux-v4l2) -find_package(FFmpeg REQUIRED - COMPONENTS avcodec avutil avformat) +target_sources(linux-v4l2 PRIVATE linux-v4l2.c v4l2-controls.c v4l2-input.c + v4l2-helpers.c v4l2-output.c v4l2-mjpeg.c) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" - ${LIBV4L2_INCLUDE_DIRS} - ${FFMPEG_INCLUDE_DIRS} -) +target_link_libraries( + linux-v4l2 PRIVATE OBS::libobs LIB4L2::LIB4L2 FFmpeg::avcodec + FFmpeg::avformat FFmpeg::avutil) -set(linux-v4l2_SOURCES - linux-v4l2.c - v4l2-controls.c - v4l2-input.c - v4l2-helpers.c - v4l2-output.c - v4l2-mjpeg.c - ${linux-v4l2-udev_SOURCES} -) - -add_library(linux-v4l2 MODULE - ${linux-v4l2_SOURCES} -) -target_link_libraries(linux-v4l2 - libobs - ${LIBV4L2_LIBRARIES} - ${UDEV_LIBRARIES} - ${FFMPEG_LIBRARIES} -) set_target_properties(linux-v4l2 PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(linux-v4l2 data) +if(NOT ENABLE_UDEV) + target_compile_definitions(linux-v4l2 PRIVATE HAVE_UDEV) +else() + find_package(Udev REQUIRED) + target_sources(linux-v4l2 PRIVATE v4l2-udev.c) + + target_link_libraries(linux-v4l2 PRIVATE Udev::Udev) +endif() + +setup_plugin_target(linux-v4l2) diff --git a/plugins/mac-avcapture/CMakeLists.txt b/plugins/mac-avcapture/CMakeLists.txt index 75ce61032..8d6a4d421 100644 --- a/plugins/mac-avcapture/CMakeLists.txt +++ b/plugins/mac-avcapture/CMakeLists.txt @@ -5,41 +5,31 @@ find_library(COCOA Cocoa) find_library(COREFOUNDATION CoreFoundation) find_library(COREMEDIA CoreMedia) find_library(COREVIDEO CoreVideo) -find_library(COCOA Cocoa) find_library(COREMEDIAIO CoreMediaIO) -include_directories(${AVFOUNDATION} - ${COCOA} - ${COREFOUNDATION} - ${COREMEDIA} - ${COREVIDEO} - ${COREMEDIAIO} - ${COCOA}) +mark_as_advanced(AVFOUNDATION COCOA COREFOUNDATION COREMEDIA COREMEDIAIO + COREVIDEO) -set(mac-avcapture_HEADERS - left-right.hpp - scope-guard.hpp - ) +add_library(mac-avcapture MODULE) +add_library(OBS::avcapture ALIAS mac-avcapture) -set(mac-avcapture_SOURCES - av-capture.mm) +target_sources(mac-avcapture PRIVATE av-capture.mm left-right.hpp + scope-guard.hpp) -set_source_files_properties(av-capture.mm - PROPERTIES COMPILE_FLAGS "-fobjc-arc") +target_compile_features(mac-avcapture PRIVATE cxx_std_11) -add_library(mac-avcapture MODULE - ${mac-avcapture_SOURCES} - ${mac-avcapture_HEADERS}) +set_source_files_properties(av-capture.mm PROPERTIES COMPILE_FLAGS -fobjc-arc) -target_link_libraries(mac-avcapture - libobs - ${AVFOUNDATION} - ${COCOA} - ${COREFOUNDATION} - ${COREMEDIA} - ${COREVIDEO} - ${COREMEDIAIO} - ${COCOA}) -set_target_properties(mac-avcapture PROPERTIES FOLDER "plugins") +target_link_libraries( + mac-avcapture + PRIVATE OBS::libobs + ${AVFOUNDATION} + ${COCOA} + ${COREFOUNDATION} + ${COREMEDIA} + ${COREVIDEO} + ${COREMEDIAIO}) -install_obs_plugin_with_data(mac-avcapture data) +set_target_properties(mac-avcapture PROPERTIES FOLDER "plugins" PREFIX "") + +setup_plugin_target(mac-avcapture) diff --git a/plugins/mac-capture/CMakeLists.txt b/plugins/mac-capture/CMakeLists.txt index 851f9f1c0..bb2c1ff8f 100644 --- a/plugins/mac-capture/CMakeLists.txt +++ b/plugins/mac-capture/CMakeLists.txt @@ -6,34 +6,23 @@ find_library(COREFOUNDATION CoreFoundation) find_library(IOSURF IOSurface) find_library(COCOA Cocoa) -include_directories(${COREAUDIO} - ${AUDIOUNIT} - ${COREFOUNDATION} - ${IOSURF} - ${COCOA}) +add_library(mac-capture MODULE) +add_library(OBS::capture ALIAS mac-capture) -set(mac-capture_HEADERS - audio-device-enum.h - window-utils.h) +target_sources( + mac-capture + PRIVATE plugin-main.c + audio-device-enum.c + audio-device-enum.h + mac-audio.c + mac-display-capture.m + mac-window-capture.m + window-utils.m + window-utils.h) -set(mac-capture_SOURCES - plugin-main.c - audio-device-enum.c - mac-audio.c - mac-display-capture.m - mac-window-capture.m - window-utils.m) +target_link_libraries(mac-capture PRIVATE OBS::libobs ${COREAUDIO} ${AUDIOUNIT} + ${COREFOUNDATION} ${IOSURF} ${COCOA}) -add_library(mac-capture MODULE - ${mac-capture_SOURCES} - ${mac-capture_HEADERS}) -target_link_libraries(mac-capture - libobs - ${COREAUDIO} - ${AUDIOUNIT} - ${COREFOUNDATION} - ${IOSURF} - ${COCOA}) -set_target_properties(mac-capture PROPERTIES FOLDER "plugins") +set_target_properties(mac-capture PROPERTIES FOLDER "plugins" PREFIX "") -install_obs_plugin_with_data(mac-capture data) +setup_plugin_target(mac-capture) diff --git a/plugins/mac-syphon/CMakeLists.txt b/plugins/mac-syphon/CMakeLists.txt index d8a3a5b4f..c3a7d8819 100644 --- a/plugins/mac-syphon/CMakeLists.txt +++ b/plugins/mac-syphon/CMakeLists.txt @@ -1,87 +1,86 @@ project(mac-syphon) +find_package(OpenGL REQUIRED) + find_library(COCOA Cocoa) find_library(IOSURF IOSurface) find_library(SCRIPTINGBRIDGE ScriptingBridge) -find_package(OpenGL REQUIRED) -include_directories(${COCOA} - ${IOSURF} - ${SCRIPTINGBIRDGE} - ${OPENGL_INCLUDE_DIR}) +mark_as_advanced(COCOA IOSURF SCRIPTINGBRIDGE) -set(syphon_HEADERS - syphon-framework/Syphon_Prefix.pch - syphon-framework/Syphon.h - syphon-framework/SyphonBuildMacros.h - syphon-framework/SyphonCFMessageReceiver.h - syphon-framework/SyphonCFMessageSender.h - syphon-framework/SyphonClient.h - syphon-framework/SyphonClientConnectionManager.h - syphon-framework/SyphonDispatch.h - syphon-framework/SyphonIOSurfaceImage.h - syphon-framework/SyphonImage.h - syphon-framework/SyphonMachMessageReceiver.h - syphon-framework/SyphonMachMessageSender.h - syphon-framework/SyphonMessageQueue.h - syphon-framework/SyphonMessageReceiver.h - syphon-framework/SyphonMessageSender.h - syphon-framework/SyphonMessaging.h - syphon-framework/SyphonOpenGLFunctions.h - syphon-framework/SyphonPrivate.h - syphon-framework/SyphonServer.h - syphon-framework/SyphonServerConnectionManager.h - syphon-framework/SyphonServerDirectory.h - ) +add_library(mac-syphon MODULE) +add_library(OBS::syphon ALIAS mac-syphon) -set(syphon_SOURCES - syphon-framework/SyphonCFMessageReceiver.m - syphon-framework/SyphonCFMessageSender.m - syphon-framework/SyphonClient.m - syphon-framework/SyphonClientConnectionManager.m - syphon-framework/SyphonDispatch.c - syphon-framework/SyphonImage.m - syphon-framework/SyphonIOSurfaceImage.m - syphon-framework/SyphonMachMessageReceiver.m - syphon-framework/SyphonMachMessageSender.m - syphon-framework/SyphonMessageQueue.m - syphon-framework/SyphonMessageReceiver.m - syphon-framework/SyphonMessageSender.m - syphon-framework/SyphonMessaging.m - syphon-framework/SyphonOpenGLFunctions.c - syphon-framework/SyphonPrivate.m - syphon-framework/SyphonServer.m - syphon-framework/SyphonServerConnectionManager.m - syphon-framework/SyphonServerDirectory.m - ) +add_library(syphon-framework STATIC) +add_library(Syphon::Framework ALIAS syphon-framework) -add_library(syphon-framework ${syphon_HEADERS} - ${syphon_SOURCES}) +target_sources(mac-syphon PRIVATE syphon.m plugin-main.c) -set(mac-syphon_HEADERS - ) +target_sources( + syphon-framework + PRIVATE syphon-framework/Syphon_Prefix.pch + syphon-framework/Syphon.h + syphon-framework/SyphonBuildMacros.h + syphon-framework/SyphonCFMessageReceiver.m + syphon-framework/SyphonCFMessageReceiver.h + syphon-framework/SyphonCFMessageSender.h + syphon-framework/SyphonCFMessageSender.m + syphon-framework/SyphonClient.m + syphon-framework/SyphonClient.h + syphon-framework/SyphonClientConnectionManager.m + syphon-framework/SyphonClientConnectionManager.h + syphon-framework/SyphonDispatch.c + syphon-framework/SyphonDispatch.h + syphon-framework/SyphonIOSurfaceImage.m + syphon-framework/SyphonIOSurfaceImage.h + syphon-framework/SyphonImage.m + syphon-framework/SyphonImage.h + syphon-framework/SyphonMachMessageReceiver.m + syphon-framework/SyphonMachMessageReceiver.h + syphon-framework/SyphonMachMessageSender.m + syphon-framework/SyphonMachMessageSender.h + syphon-framework/SyphonMessageQueue.m + syphon-framework/SyphonMessageQueue.h + syphon-framework/SyphonMessageReceiver.m + syphon-framework/SyphonMessageReceiver.h + syphon-framework/SyphonMessageSender.m + syphon-framework/SyphonMessageSender.h + syphon-framework/SyphonMessaging.m + syphon-framework/SyphonMessaging.h + syphon-framework/SyphonOpenGLFunctions.c + syphon-framework/SyphonOpenGLFunctions.h + syphon-framework/SyphonPrivate.m + syphon-framework/SyphonPrivate.h + syphon-framework/SyphonServer.m + syphon-framework/SyphonServer.h + syphon-framework/SyphonServerConnectionManager.m + syphon-framework/SyphonServerConnectionManager.h + syphon-framework/SyphonServerDirectory.m + syphon-framework/SyphonServerDirectory.h) -set(mac-syphon_SOURCES - syphon.m - plugin-main.c) +target_link_libraries(mac-syphon PRIVATE OBS::libobs Syphon::Framework + ${SCRIPTINGBRIDGE}) -add_definitions(-DSYPHON_UNIQUE_CLASS_NAME_PREFIX=OBS_ -include - ${PROJECT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch) +target_link_libraries(syphon-framework PUBLIC OpenGL::GL ${COCOA} ${IOSURF}) -add_library(mac-syphon MODULE - ${mac-syphon_SOURCES} - ${mac-syphon_HEADERS}) +target_compile_options( + mac-syphon + PRIVATE -include + ${CMAKE_CURRENT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch + -fobjc-arc) -target_link_libraries(mac-syphon - libobs - syphon-framework - ${COCOA} - ${IOSURF} - ${SCRIPTINGBRIDGE} - ${OPENGL_gl_LIBRARY}) +target_compile_options( + syphon-framework + PRIVATE -include + ${CMAKE_CURRENT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch + -Wno-deprecated-declarations) -set_property (TARGET mac-syphon APPEND_STRING PROPERTY - COMPILE_FLAGS "-fobjc-arc") -set_target_properties(mac-syphon PROPERTIES FOLDER "plugins") +target_compile_definitions(syphon-framework + PUBLIC "SYPHON_UNIQUE_CLASS_NAME_PREFIX=OBS_") -install_obs_plugin_with_data(mac-syphon data) +set_target_properties(mac-syphon PROPERTIES FOLDER "plugins" PREFIX "") + +set_target_properties(syphon-framework PROPERTIES FOLDER "plugins/mac-syphon" + PREFIX "") + +setup_plugin_target(mac-syphon) diff --git a/plugins/mac-virtualcam/CMakeLists.txt b/plugins/mac-virtualcam/CMakeLists.txt index 843c0cb51..8bbe6ccc4 100644 --- a/plugins/mac-virtualcam/CMakeLists.txt +++ b/plugins/mac-virtualcam/CMakeLists.txt @@ -1,2 +1,9 @@ +option(ENABLE_VIRTUALCAM "Build OBS Virtualcam" ON) + +if(NOT ENABLE_VIRTUALCAM) + message(STATUS "OBS: DISABLED mac-virtualcam") + return() +endif() + add_subdirectory(src/obs-plugin) add_subdirectory(src/dal-plugin) diff --git a/plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt b/plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt index 526a427e9..8af3cec40 100644 --- a/plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt +++ b/plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt @@ -1,101 +1,65 @@ -# Universal build for Apple Silicon +# Build DAL plugin universal to ensure compatibility with Rosetta-translated +# apps on arm64 hosts set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64") project(mac-dal-plugin) -find_library(APPKIT AppKit) -find_library(COREFOUNDATION CoreFoundation) -find_library(COREVIDEO CoreVideo) +find_library(COCOA Cocoa) find_library(COREMEDIA CoreMedia) find_library(COREMEDIAIO CoreMediaIO) -find_library(IOKIT IOKit) +find_library(COREVIDEO CoreVideo) -include_directories(${APPKIT} - ${COREFOUNDATION} - ${COREVIDEO} - ${COREMEDIA} - ${COREMEDIAIO} - ${IOSURFACE} - ./ - ../common) +mark_as_advanced(COCOA COREMEDIA COREMEDIAIO COREVIDEO) -set(mac-dal-plugin_HEADERS - Defines.h - Logging.h - OBSDALPlugInInterface.h - OBSDALObjectStore.h - OBSDALPlugIn.h - OBSDALDevice.h - OBSDALStream.h - CMSampleBufferUtils.h - OBSDALMachClient.h - ../common/MachProtocol.h) +add_library(mac-dal-plugin MODULE) +add_library(OBS::mac-dal-plugin ALIAS mac-dal-plugin) -set(mac-dal-plugin_SOURCES - OBSDALPlugInMain.mm - OBSDALPlugInInterface.mm - OBSDALObjectStore.mm - OBSDALPlugIn.mm - OBSDALDevice.mm - OBSDALStream.mm - CMSampleBufferUtils.mm - OBSDALMachClient.mm) +target_sources( + mac-dal-plugin + PRIVATE OBSDALPlugIn.mm + OBSDALPlugIn.h + OBSDALPlugInMain.mm + OBSDALPlugInInterface.mm + OBSDALPlugInInterface.h + OBSDALObjectStore.mm + OBSDALObjectStore.h + OBSDALDevice.mm + OBSDALDevice.h + OBSDALMachClient.mm + OBSDALMachClient.h + CMSampleBufferUtils.mm + OBSDALStream.mm + OBSDALStream.h + CMSampleBufferUtils.h + Defines.h + Logging.h + ${CMAKE_CURRENT_SOURCE_DIR}/../common/MachProtocol.h) -add_library(mac-dal-plugin MODULE - ${mac-dal-plugin_SOURCES} - ${mac-dal-plugin_HEADERS}) +target_include_directories( + mac-dal-plugin + PRIVATE "$/../common") -set_target_properties(mac-dal-plugin PROPERTIES - FOLDER "plugins" - BUNDLE TRUE - OUTPUT_NAME "obs-mac-virtualcam" - COMPILE_FLAGS "-std=gnu++14 -stdlib=libc++ -fobjc-arc -fobjc-weak") +target_compile_options(mac-dal-plugin PRIVATE -fobjc-arc -fobjc-weak) -if (XCODE) - set(TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}/Debug") -else (XCODE) - set(TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}") -endif (XCODE) +target_link_libraries(mac-dal-plugin PRIVATE ${COCOA} ${COREMEDIA} + ${COREMEDIAIO} ${COREVIDEO}) -target_link_libraries(mac-dal-plugin - ${APPKIT} - ${COREFOUNDATION} - ${COREVIDEO} - ${COREMEDIA} - ${COREMEDIAIO} - ${IOKIT}) +set(MACOSX_PLUGIN_BUNDLE_TYPE "BNDL") +target_sources(mac-dal-plugin PRIVATE placeholder.png) +set_source_files_properties(placeholder.png PROPERTIES MACOSX_PACKAGE_LOCATION + "Resources") +source_group("Resources" FILES placeholder.png) -add_custom_command(TARGET mac-dal-plugin - POST_BUILD - COMMAND rm -rf ${TARGET_DIR}/obs-mac-virtualcam.plugin || true - COMMAND ${CMAKE_COMMAND} -E copy_directory ${TARGET_DIR}/obs-mac-virtualcam.bundle ${TARGET_DIR}/obs-mac-virtualcam.plugin - COMMENT "Rename bundle to plugin" -) +set_target_properties( + mac-dal-plugin + PROPERTIES BUNDLE ON + BUNDLE_EXTENSION "plugin" + OUTPUT_NAME "obs-mac-virtualcam" + FOLDER "plugins" + VERSION "0" + SOVERSION "0" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../" + MACOSX_BUNDLE_INFO_PLIST + "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Virtualcam-Info.plist.in") -# Note: Xcode seems to run a command `builtin-infoPlistUtility` to generate the Info.plist, but I'm -# not sure where to find that binary. If we had access to it, the command would look something like: -# builtin-infoPlistUtility ${PROJECT_SOURCE_DIR}/../common/CoreMediaIO/DeviceAbstractionLayer/Devices/Sample/PlugIn/SampleVCam-Info.plist -producttype com.apple.product-type.bundle -expandbuildsettings -platform macosx -o mac-virtualcam.bundle/Contents/Info.plist -# Instead, just copy in one that was already generated from Xcode. -add_custom_command(TARGET mac-dal-plugin - POST_BUILD - COMMAND cp ${PROJECT_SOURCE_DIR}/Info.plist ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist - COMMAND mkdir ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Resources - COMMAND cp ${PROJECT_SOURCE_DIR}/placeholder.png ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Resources/placeholder.png - COMMAND /usr/bin/plutil -insert CFBundleVersion -string "${OBS_VERSION}" ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist - COMMAND /usr/bin/plutil -insert CFBundleShortVersionString -string "${OBS_VERSION}" ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist - DEPENDS {PROJECT_SOURCE_DIR}/Info.plist - COMMENT "Copy in Info.plist" -) - -add_custom_command(TARGET mac-dal-plugin - POST_BUILD - COMMAND /usr/bin/codesign --force --deep --sign - --timestamp=none ${TARGET_DIR}/obs-mac-virtualcam.plugin - COMMENT "Codesign plugin" -) - -add_custom_command(TARGET mac-dal-plugin - POST_BUILD - COMMAND rm -rf "${OBS_OUTPUT_DIR}/$/data/obs-mac-virtualcam.plugin" || true - COMMAND ${CMAKE_COMMAND} -E copy_directory ${TARGET_DIR}/obs-mac-virtualcam.plugin "${OBS_OUTPUT_DIR}/$/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin" - COMMENT "Copy plugin to destination" -) +setup_binary_target(mac-dal-plugin) diff --git a/plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt b/plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt index a500a8a13..6e5826829 100644 --- a/plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt +++ b/plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt @@ -1,33 +1,32 @@ project(mac-virtualcam) find_library(APPKIT AppKit) -find_library(COREFOUNDATION CoreFoundation) -include_directories(${APPKIT} - ${COREFOUNDATION} - ../common) +mark_as_advanced(APPKIT) -set(mac-virtualcam_HEADERS - Defines.h - OBSDALMachServer.h - ../common/MachProtocol.h) +add_library(mac-virtualcam MODULE) +add_library(OBS::virtualcam ALIAS mac-virtualcam) -set(mac-virtualcam_SOURCES - plugin-main.mm - OBSDALMachServer.mm) +target_sources( + mac-virtualcam PRIVATE Defines.h plugin-main.mm OBSDALMachServer.mm + OBSDALMachServer.h ../common/MachProtocol.h) -add_library(mac-virtualcam MODULE - ${mac-virtualcam_SOURCES} - ${mac-virtualcam_HEADERS}) +target_include_directories( + mac-virtualcam + PRIVATE "$/../common") -target_link_libraries(mac-virtualcam - libobs - ${APPKIT} - ${COREFOUNDATION}) +target_link_libraries(mac-virtualcam PRIVATE OBS::libobs OBS::frontend-api + ${APPKIT}) -set_target_properties(mac-virtualcam PROPERTIES - FOLDER "plugins" - COMPILE_FLAGS "-std=gnu++14 -stdlib=libc++ -fobjc-arc -fobjc-weak" -) +target_compile_features(mac-virtualcam PRIVATE cxx_deleted_functions + cxx_rvalue_references cxx_std_17) -install_obs_plugin_with_data(mac-virtualcam data) +target_compile_options(mac-virtualcam PRIVATE -fobjc-arc -fobjc-weak) + +set_target_properties( + mac-virtualcam + PROPERTIES FOLDER "plugins" + PREFIX "" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../") + +setup_plugin_target(mac-virtualcam) diff --git a/plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm b/plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm index 1ca3da192..34e3b087a 100644 --- a/plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm +++ b/plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm @@ -36,34 +36,28 @@ static bool check_dal_plugin() @"/Library/CoreMediaIO/Plug-Ins/DAL/obs-mac-virtualcam.plugin/Contents/Info.plist"]]; NSString *dalPluginVersion = [dalPluginInfoPlist valueForKey:@"CFBundleShortVersionString"]; - const char *obsVersion = obs_get_version_string(); + NSString *dalPluginBuild = + [dalPluginInfoPlist valueForKey:@"CFBundleVersion"]; + NSString *obsVersion = [[[NSBundle mainBundle] infoDictionary] + objectForKey:@"CFBundleShortVersionString"]; + NSString *obsBuild = [[[NSBundle mainBundle] infoDictionary] + objectForKey:(NSString *)kCFBundleVersionKey]; dalPluginUpdateNeeded = - ![dalPluginVersion isEqualToString:@(obsVersion)]; + !([dalPluginVersion isEqualToString:obsVersion] && + [dalPluginBuild isEqualToString:obsBuild]); } if (!dalPluginInstalled || dalPluginUpdateNeeded) { - // TODO: Remove this distinction once OBS is built into an app bundle by cmake by default NSString *dalPluginSourcePath; - NSRunningApplication *app = - [NSRunningApplication currentApplication]; - if ([app bundleIdentifier] != nil) { - NSURL *bundleURL = [app bundleURL]; - NSString *pluginPath = - @"Contents/Resources/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin"; + NSURL *bundleURL = [[NSBundle mainBundle] bundleURL]; + NSString *pluginPath = + @"Contents/Resources/obs-mac-virtualcam.plugin"; - NSURL *pluginUrl = [bundleURL - URLByAppendingPathComponent:pluginPath]; - dalPluginSourcePath = [pluginUrl path]; - } else { - dalPluginSourcePath = [[[[app executableURL] - URLByAppendingPathComponent: - @"../data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin"] - path] - stringByReplacingOccurrencesOfString:@"obs/" - withString:@""]; - } + NSURL *pluginUrl = + [bundleURL URLByAppendingPathComponent:pluginPath]; + dalPluginSourcePath = [pluginUrl path]; NSString *createPluginDirCmd = (!dalPluginDirExists) diff --git a/plugins/mac-vth264/CMakeLists.txt b/plugins/mac-vth264/CMakeLists.txt index 60632a638..f9138c2f0 100644 --- a/plugins/mac-vth264/CMakeLists.txt +++ b/plugins/mac-vth264/CMakeLists.txt @@ -7,27 +7,24 @@ find_library(COREVIDEO CoreVideo) find_library(VIDEOTOOLBOX VideoToolbox) find_library(COREMEDIA CoreMedia) -include_directories(${AVFOUNDATION} - ${COCOA} - ${COREFOUNDATION} - ${COREVIDEO} - ${VIDEOTOOLBOX} - ${COREMEDIA}) +mark_as_advanced(AVFOUNDATION COCOA COREFOUNDATION COREVIDEO VIDEOTOOLBOX + COREMEDIA) -set(mac-vth264_SOURCES - encoder.c) +add_library(mac-vth264 MODULE) +add_library(OBS::vth264 ALIAS mac-vth264) -add_library(mac-vth264 MODULE - ${mac-vth264_SOURCES}) +target_sources(mac-vth264 PRIVATE encoder.c) -target_link_libraries(mac-vth264 - libobs - ${AVFOUNDATION} - ${COCOA} - ${COREFOUNDATION} - ${COREVIDEO} - ${VIDEOTOOLBOX} - ${COREMEDIA}) -set_target_properties(mac-vth264 PROPERTIES FOLDER "plugins") +target_link_libraries( + mac-vth264 + PRIVATE OBS::libobs + ${AVFOUNDATION} + ${COCOA} + ${COREFOUNDATION} + ${COREVIDEO} + ${VIDEOTOOLBOX} + ${COREMEDIA}) -install_obs_plugin_with_data(mac-vth264 data) +set_target_properties(mac-vth264 PROPERTIES FOLDER "plugins" PREFIX "") + +setup_plugin_target(mac-vth264) diff --git a/plugins/obs-browser b/plugins/obs-browser index cbce71dd8..b798763ae 160000 --- a/plugins/obs-browser +++ b/plugins/obs-browser @@ -1 +1 @@ -Subproject commit cbce71dd826cafb7c75cf99cbc7ce101ea7d03c4 +Subproject commit b798763ae75b538e405c2d7e2ab3a1edfe59ed0c diff --git a/plugins/obs-ffmpeg/CMakeLists.txt b/plugins/obs-ffmpeg/CMakeLists.txt index b257d6df6..4c23d869a 100644 --- a/plugins/obs-ffmpeg/CMakeLists.txt +++ b/plugins/obs-ffmpeg/CMakeLists.txt @@ -1,80 +1,77 @@ project(obs-ffmpeg) -if(MSVC) - set(obs-ffmpeg_PLATFORM_DEPS - w32-pthreads) -endif() - option(ENABLE_FFMPEG_LOGGING "Enables obs-ffmpeg logging" OFF) -find_package(FFmpeg REQUIRED - COMPONENTS avcodec avfilter avdevice avutil swscale avformat swresample) -include_directories(${FFMPEG_INCLUDE_DIRS}) +find_package( + FFmpeg REQUIRED + COMPONENTS avcodec + avfilter + avdevice + avutil + swscale + avformat + swresample) -if(UNIX AND NOT APPLE) - find_package(Libpci REQUIRED) - include_directories(${LIBPCI_INCLUDE_DIRS}) -endif() +add_library(obs-ffmpeg MODULE) +add_library(OBS::ffmpeg ALIAS obs-ffmpeg) +add_subdirectory(ffmpeg-mux) -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/obs-ffmpeg-config.h.in" - "${CMAKE_CURRENT_BINARY_DIR}/obs-ffmpeg-config.h") -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs-ffmpeg-config.h.in + ${CMAKE_BINARY_DIR}/config/obs-ffmpeg-config.h) -set(obs-ffmpeg_config_HEADERS - "${CMAKE_CURRENT_BINARY_DIR}/obs-ffmpeg-config.h") +target_sources( + obs-ffmpeg + PRIVATE obs-ffmpeg.c + obs-ffmpeg-audio-encoders.c + obs-ffmpeg-av1.c + obs-ffmpeg-nvenc.c + obs-ffmpeg-output.c + obs-ffmpeg-mux.c + obs-ffmpeg-mux.h + obs-ffmpeg-hls-mux.c + obs-ffmpeg-source.c + obs-ffmpeg-compat.h + obs-ffmpeg-formats.h + ${CMAKE_BINARY_DIR}/config/obs-ffmpeg-config.h) -set(obs-ffmpeg_HEADERS - obs-ffmpeg-compat.h - obs-ffmpeg-formats.h - obs-ffmpeg-mux.h) +target_include_directories(obs-ffmpeg PRIVATE ${CMAKE_BINARY_DIR}/config) -set(obs-ffmpeg_SOURCES - obs-ffmpeg.c - obs-ffmpeg-audio-encoders.c - obs-ffmpeg-nvenc.c - obs-ffmpeg-av1.c - obs-ffmpeg-output.c - obs-ffmpeg-mux.c - obs-ffmpeg-hls-mux.c - obs-ffmpeg-source.c) - -if(UNIX AND NOT APPLE) - list(APPEND obs-ffmpeg_SOURCES - obs-ffmpeg-vaapi.c) - LIST(APPEND obs-ffmpeg_PLATFORM_DEPS - ${LIBVA_LBRARIES} - ${LIBPCI_LIBRARIES}) -endif() +target_link_libraries( + obs-ffmpeg + PRIVATE OBS::libobs + OBS::media-playback + OBS::opts-parser + FFmpeg::avcodec + FFmpeg::avfilter + FFmpeg::avformat + FFmpeg::avdevice + FFmpeg::avutil + FFmpeg::swscale + FFmpeg::swresample) if(ENABLE_FFMPEG_LOGGING) - list(APPEND obs-ffmpeg_SOURCES - obs-ffmpeg-logging.c) + target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-logging.c) endif() -if(WIN32) - set(MODULE_DESCRIPTION "OBS FFmpeg module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-ffmpeg.rc) - list(APPEND obs-ffmpeg_SOURCES - jim-nvenc.c - jim-nvenc-helpers.c - obs-ffmpeg.rc) - list(APPEND obs-ffmpeg_HEADERS - jim-nvenc.h) +set_target_properties(obs-ffmpeg PROPERTIES FOLDER "plugins/obs-ffmpeg" PREFIX + "") + +if(OS_WINDOWS) + if(MSVC) + target_link_libraries(obs-ffmpeg PRIVATE OBS::w32-pthreads) + endif() + + set(MODULE_DESCRIPTION "OBS FFmpeg module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-ffmpeg.rc) + + target_sources(obs-ffmpeg PRIVATE jim-nvenc.c jim-nvenc.h jim-nvenc-helpers.c + obs-ffmpeg.rc) + +elseif(OS_POSIX AND NOT OS_MACOS) + find_package(Libpci REQUIRED) + target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c) + target_link_libraries(obs-ffmpeg PRIVATE LIBPCI::LIBPCI) endif() -add_library(obs-ffmpeg MODULE - ${obs-ffmpeg_config_HEADERS} - ${obs-ffmpeg_HEADERS} - ${obs-ffmpeg_SOURCES}) -target_link_libraries(obs-ffmpeg - libobs - opts-parser - media-playback - ${obs-ffmpeg_PLATFORM_DEPS} - ${FFMPEG_LIBRARIES}) -set_target_properties(obs-ffmpeg PROPERTIES FOLDER "plugins/obs-ffmpeg") - -install_obs_plugin_with_data(obs-ffmpeg data) - -add_subdirectory(ffmpeg-mux) +setup_plugin_target(obs-ffmpeg) diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt b/plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt index 754a1ab58..25da53b93 100644 --- a/plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt +++ b/plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt @@ -1,27 +1,21 @@ project(obs-ffmpeg-mux) -if(DEBUG_FFMPEG_MUX) - add_definitions(-DDEBUG_FFMPEG) +option(ENABLE_FFMPEG_MUX_DEBUG "Enable FFmpeg-mux debugging" OFF) + +find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat) + +add_executable(obs-ffmpeg-mux) +add_executable(OBS::ffmpeg-mux ALIAS obs-ffmpeg-mux) + +target_sources(obs-ffmpeg-mux PRIVATE ffmpeg-mux.c ffmpeg-mux.h) + +target_link_libraries(obs-ffmpeg-mux PRIVATE OBS::libobs FFmpeg::avcodec + FFmpeg::avutil FFmpeg::avformat) + +if(ENABLE_FFMPEG_MUX_DEBUG) + target_compile_definitions(obs-ffmpeg-mux PRIVATE ENABLE_FFMPEG_MUX_DEBUG) endif() -find_package(FFmpeg REQUIRED - COMPONENTS avcodec avutil avformat) -include_directories(${FFMPEG_INCLUDE_DIRS}) - -set(obs-ffmpeg-mux_SOURCES - ffmpeg-mux.c) - -set(obs-ffmpeg-mux_HEADERS - ffmpeg-mux.h) - -add_executable(obs-ffmpeg-mux - ${obs-ffmpeg-mux_SOURCES} - ${obs-ffmpeg-mux_HEADERS}) - -target_link_libraries(obs-ffmpeg-mux - libobs - ${FFMPEG_LIBRARIES}) - set_target_properties(obs-ffmpeg-mux PROPERTIES FOLDER "plugins/obs-ffmpeg") -install_obs_core(obs-ffmpeg-mux) +setup_binary_target(obs-ffmpeg-mux) diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c index db26cb425..59dcf0401 100644 --- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c @@ -232,7 +232,7 @@ static bool get_audio_params(struct audio_params *audio, int *argc, static void ffmpeg_log_callback(void *param, int level, const char *format, va_list args) { -#ifdef DEBUG_FFMPEG +#ifdef ENABLE_FFMPEG_MUX_DEBUG char out_buffer[4096]; struct dstr out = {0}; diff --git a/plugins/obs-filters/CMakeLists.txt b/plugins/obs-filters/CMakeLists.txt index d1563dad8..c8c4ad0f6 100644 --- a/plugins/obs-filters/CMakeLists.txt +++ b/plugins/obs-filters/CMakeLists.txt @@ -1,131 +1,174 @@ project(obs-filters) -option(DISABLE_SPEEXDSP "Disable building of the SpeexDSP-based Noise Suppression filter" OFF) +option(ENABLE_SPEEXDSP + "Enable building with SpeexDSP-based noise suppression filter" ON) +option(ENABLE_RNNOISE "Enable building with RNNoise noise supression filter" ON) -if(DISABLE_SPEEXDSP) - message(STATUS "SpeexDSP support disabled") - set(LIBSPEEXDSP_FOUND FALSE) +if(OS_WINDOWS) + option( + ENABLE_NVAFX + "Enable building with NVIDIA Audio Effects SDK (requires redistributable to be installed)" + ON) +endif() + +add_library(obs-filters MODULE) +add_library(OBS::filters ALIAS obs-filters) + +set(HAS_NOISEREDUCTION OFF) + +if(NOT ENABLE_SPEEXDSP) + message(STATUS "OBS: DISABLED SpeexDSP") else() - find_package(Libspeexdsp) - if(LIBSPEEXDSP_FOUND) - add_definitions(-DLIBSPEEXDSP_ENABLED) - endif() + find_package(Libspeexdsp REQUIRED) + + target_sources(obs-filters PRIVATE noise-suppress-filter.c) + + target_link_libraries(obs-filters PRIVATE LibspeexDSP::LibspeexDSP) + + target_compile_definitions(obs-filters PRIVATE LIBSPEEXDSP_ENABLED) + + if(OS_WINDOWS) + target_link_options(obs-filters PRIVATE "LINKER:/LTCG") + endif() endif() -find_package(Librnnoise QUIET) -add_definitions(-DLIBRNNOISE_ENABLED) -if(NOT LIBRNNOISE_FOUND) - file(GLOB rnnoise_SOURCES - "rnnoise/src/*.c" - "rnnoise/src/*.h" - "rnnoise/include/*.h") - add_definitions(-DCOMPILE_OPUS) - if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux") - set_property(SOURCE ${rnnoise_SOURCES} PROPERTY COMPILE_FLAGS "-fvisibility=protected") - endif() - include_directories("rnnoise/include") - source_group("rnnoise" FILES ${rnnoise_SOURCES}) - set(LIBRNNOISE_FOUND TRUE) -endif() - -if (WIN32) - if(DISABLE_NVAFX) - message(STATUS "NVIDIA Audio Effects SDK support disabled") - set(LIBNVAFX_FOUND FALSE) - else() - message(STATUS "NVIDIA Audio Effects SDK support enabled; requires redist to be installed by end-user") - add_definitions(-DLIBNVAFX_ENABLED) - set(LIBNVAFX_FOUND TRUE) - endif() -endif() - -if(LIBSPEEXDSP_FOUND OR LIBRNNOISE_FOUND OR LIBNVAFX_FOUND) - set(obs-filters_NOISEREDUCTION_SOURCES - noise-suppress-filter.c) - if(LIBNVAFX_FOUND) - set(obs-filters_NOISEREDUCTION_HEADERS - nvafx-load.h) - else() - set(obs-filters_NOISEREDUCTION_HEADERS) - endif() - set(obs-filters_NOISEREDUCTION_LIBRARIES - ${LIBSPEEXDSP_LIBRARIES} ${LIBRNNOISE_LIBRARIES}) - set(NOISEREDUCTION_ENABLED TRUE) +if(NOT ENABLE_RNNOISE) + message(STATUS "OBS: DISABLED RNNoise") else() - set(NOISEREDUCTION_ENABLED FALSE) + find_package(Librnnoise QUIET) + + if(NOT TARGET Librnnoise::Librnnoise) + message(STATUS "OBS: - using bundled RNNoise library") + add_library(obs-rnnoise INTERFACE) + add_library(Librnnoise::Librnnoise ALIAS obs-rnnoise) + + set(_RNNOISE_SOURCES + rnnoise/src/arch.h + rnnoise/src/celt_lpc.c + rnnoise/src/celt_lpc.h + rnnoise/src/common.h + rnnoise/src/denoise.c + rnnoise/src/kiss_fft.c + rnnoise/src/kiss_fft.h + rnnoise/src/opus_types.h + rnnoise/src/pitch.c + rnnoise/src/pitch.h + rnnoise/src/rnn_data.c + rnnoise/src/rnn_data.h + rnnoise/src/rnn_reader.c + rnnoise/src/rnn.c + rnnoise/src/rnn.h + rnnoise/src/tansig_table.h + rnnoise/src/_kiss_fft_guts.h + rnnoise/include/rnnoise.h) + + target_sources(obs-rnnoise INTERFACE ${_RNNOISE_SOURCES}) + + target_include_directories( + obs-rnnoise INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/rnnoise/include") + + target_compile_definitions(obs-rnnoise INTERFACE COMPILE_OPUS) + + if(OS_LINUX) + set_property(SOURCE ${_RNNOISE_SOURCES} PROPERTY COMPILE_FLAGS + -fvisibility=hidden) + endif() + + source_group("rnnoise" FILES ${_RNNOISE_SOURCES}) + endif() + + target_sources(obs-filters PRIVATE noise-suppress-filter.c) + + target_link_libraries(obs-filters PRIVATE Librnnoise::Librnnoise) + + target_compile_definitions(obs-filters PRIVATE LIBRNNOISE_ENABLED) endif() -configure_file("${CMAKE_CURRENT_SOURCE_DIR}/obs-filters-config.h.in" - "${CMAKE_BINARY_DIR}/plugins/obs-filters/config/obs-filters-config.h") +if(NOT ENABLE_NVAFX) + message(STATUS "OBS: DISABLED NVidia Audio FX support") + set(LIBNVAFX_FOUND OFF) +else() + message(STATUS "OBS: ENABLED NVidia Audio FX support") -set(obs-filters_config_HEADERS - "${CMAKE_BINARY_DIR}/plugins/obs-filters/config/obs-filters-config.h") -include_directories(${LIBSPEEXDSP_INCLUDE_DIRS} ${LIBRNNOISE_INCLUDE_DIRS} - "${CMAKE_BINARY_DIR}/plugins/obs-filters/config") + target_compile_definitions(obs-filters PRIVATE LIBNVAFX_ENABLED) -if(MSVC) - set(obs-filters_PLATFORM_DEPS - w32-pthreads) + set(LIBNVAFX_FOUND ON) endif() -set(obs-filters_SOURCES - obs-filters.c - color-correction-filter.c - async-delay-filter.c - gpu-delay.c - crop-filter.c - scale-filter.c - scroll-filter.c - chroma-key-filter.c - color-key-filter.c - color-grade-filter.c - sharpness-filter.c - gain-filter.c - noise-gate-filter.c - mask-filter.c - invert-audio-polarity.c - compressor-filter.c - limiter-filter.c - expander-filter.c - luma-key-filter.c) - -set(obs-filters_data_EFFECTS - data/blend_add_filter.effect - data/blend_mul_filter.effect - data/blend_sub_filter.effect - data/chroma_key_filter.effect - data/chroma_key_filter_v2.effect - data/color_correction_filter.effect - data/color_grade_filter.effect - data/color_key_filter.effect - data/color_key_filter_v2.effect - data/crop_filter.effect - data/luma_key_filter.effect - data/luma_key_filter_v2.effect - data/mask_alpha_filter.effect - data/mask_color_filter.effect - data/sharpness.effect) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS A/V Filters") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-filters.rc) - list(APPEND obs-filters_SOURCES - obs-filters.rc) +if(TARGET Librnnoise::Librnnoise + OR TARGET LibspeexDSP::LibspeexDSP + OR LIBNVAFX_FOUND) + target_compile_definitions(obs-filters PRIVATE HAS_NOISEREDUCTION) endif() -add_library(obs-filters MODULE - ${rnnoise_SOURCES} - ${obs-filters_SOURCES} - ${obs-filters_config_HEADERS} - ${obs-filters_data_EFFECTS} - ${obs-filters_NOISEREDUCTION_SOURCES} - ${obs-filters_NOISEREDUCTION_HEADERS}) -target_link_libraries(obs-filters - libobs - ${obs-filters_PLATFORM_DEPS} - ${obs-filters_NOISEREDUCTION_LIBRARIES}) -set_target_properties(obs-filters PROPERTIES FOLDER "plugins") +target_sources( + obs-filters + PRIVATE obs-filters.c + color-correction-filter.c + async-delay-filter.c + gpu-delay.c + crop-filter.c + scale-filter.c + scroll-filter.c + chroma-key-filter.c + color-key-filter.c + color-grade-filter.c + sharpness-filter.c + gain-filter.c + noise-gate-filter.c + mask-filter.c + invert-audio-polarity.c + compressor-filter.c + limiter-filter.c + expander-filter.c + luma-key-filter.c) -source_group("data\\Effect Files" FILES ${obs-filters_data_EFFECTS}) +if(NOT OS_MACOS) + target_sources( + obs-filters + PRIVATE data/blend_add_filter.effect + data/blend_mul_filter.effect + data/blend_sub_filter.effect + data/chroma_key_filter.effect + data/chroma_key_filter_v2.effect + data/color_correction_filter.effect + data/color_grade_filter.effect + data/color_key_filter.effect + data/color_key_filter_v2.effect + data/crop_filter.effect + data/luma_key_filter.effect + data/luma_key_filter_v2.effect + data/mask_alpha_filter.effect + data/mask_color_filter.effect + data/sharpness.effect) -install_obs_plugin_with_data(obs-filters data) + get_target_property(_SOURCES obs-filters SOURCES) + set(_FILTERS ${_SOURCES}) + list(FILTER _FILTERS INCLUDE REGEX ".*\\.effect") + + source_group( + TREE "${CMAKE_CURRENT_SOURCE_DIR}" + PREFIX "Effect Files" + FILES ${_FILTERS}) +endif() + +target_include_directories( + obs-filters PRIVATE $) + +target_link_libraries(obs-filters PRIVATE OBS::libobs) + +set_target_properties(obs-filters PROPERTIES FOLDER "plugins" PREFIX "") + +if(OS_WINDOWS) + if(MSVC) + target_link_libraries(obs-filters PRIVATE OBS::w32-pthreads) + endif() + + set(MODULE_DESCRIPTION "OBS A/V Filters") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-filters.rc) + + target_sources(obs-filters PRIVATE obs-filters.rc) +endif() + +setup_plugin_target(obs-filters) diff --git a/plugins/obs-filters/noise-suppress-filter.c b/plugins/obs-filters/noise-suppress-filter.c index 29bd4eb0a..424c8be61 100644 --- a/plugins/obs-filters/noise-suppress-filter.c +++ b/plugins/obs-filters/noise-suppress-filter.c @@ -334,8 +334,8 @@ failure: } static inline void alloc_channel(struct noise_suppress_data *ng, - uint32_t sample_rate, size_t channel, - size_t frames) + uint32_t sample_rate OBS_UNUSED, + size_t channel, size_t frames) { #ifdef LIBSPEEXDSP_ENABLED ng->spx_states[channel] = diff --git a/plugins/obs-filters/obs-filters-config.h.in b/plugins/obs-filters/obs-filters-config.h.in index 4392a8e64..0bbe303c2 100644 --- a/plugins/obs-filters/obs-filters-config.h.in +++ b/plugins/obs-filters/obs-filters-config.h.in @@ -8,4 +8,4 @@ #define FALSE 0 #endif -#define NOISEREDUCTION_ENABLED @NOISEREDUCTION_ENABLED@ +#cmakedefine HAS_NOISEREDUCTION diff --git a/plugins/obs-filters/obs-filters.c b/plugins/obs-filters/obs-filters.c index d9e291b01..737c383fb 100644 --- a/plugins/obs-filters/obs-filters.c +++ b/plugins/obs-filters/obs-filters.c @@ -1,5 +1,4 @@ #include -#include "obs-filters-config.h" OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("obs-filters", "en-US") @@ -25,7 +24,7 @@ extern struct obs_source_info sharpness_filter_v2; extern struct obs_source_info chroma_key_filter; extern struct obs_source_info chroma_key_filter_v2; extern struct obs_source_info async_delay_filter; -#if NOISEREDUCTION_ENABLED +#if defined(HAS_NOISEREDUCTION) extern struct obs_source_info noise_suppress_filter; extern struct obs_source_info noise_suppress_filter_v2; extern bool load_nvafx(void); @@ -58,7 +57,7 @@ bool obs_module_load(void) obs_register_source(&chroma_key_filter); obs_register_source(&chroma_key_filter_v2); obs_register_source(&async_delay_filter); -#if NOISEREDUCTION_ENABLED +#if defined(HAS_NOISEREDUCTION) #ifdef LIBNVAFX_ENABLED /* load nvidia audio fx dll */ load_nvafx(); diff --git a/plugins/obs-libfdk/CMakeLists.txt b/plugins/obs-libfdk/CMakeLists.txt index 2144b579b..c5d7ab34e 100644 --- a/plugins/obs-libfdk/CMakeLists.txt +++ b/plugins/obs-libfdk/CMakeLists.txt @@ -1,29 +1,21 @@ project(obs-libfdk) -if(DISABLE_LIBFDK) - message(STATUS "Libfdk support disabled") - return() +option(ENABLE_LIBFDK "Enable FDK AAC support" OFF) + +if(NOT ENABLE_LIBFDK) + message(STATUS "OBS: DISABLED obs-libfdk") + return() endif() -find_package(Libfdk QUIET) -if(NOT LIBFDK_FOUND AND ENABLE_LIBFDK) - message(FATAL_ERROR "Libfdk not found but set as enabled") -elseif(NOT LIBFDK_FOUND) - message(STATUS "Libfdk not found - obs-libfdk plugin disabled") - return() -endif() +find_package(Libfdk REQUIRED) -include_directories(${LIBFDK_INCLUDE_DIRS}) -add_definitions(${LIBFDK_DEFINITIONS}) +add_library(obs-libfdk MODULE) +add_library(OBS::libfdk ALIAS obs-libfdk) -set(obs-libfdk_SOURCES - obs-libfdk.c) +target_sources(obs-libfdk PRIVATE obs-libfdk.c) -add_library(obs-libfdk MODULE - ${obs-libfdk_SOURCES}) -target_link_libraries(obs-libfdk - libobs - ${LIBFDK_LIBRARIES}) -set_target_properties(obs-libfdk PROPERTIES FOLDER "plugins") +target_link_libraries(obs-libfdk PRIVATE OBS::libobs LibFDK::LibFDK) -install_obs_plugin_with_data(obs-libfdk data) +set_target_properties(obs-libfdk PROPERTIES FOLDER "plugins" PREFIX "") + +setup_plugin_target(obs-libfdk) diff --git a/plugins/obs-outputs/CMakeLists.txt b/plugins/obs-outputs/CMakeLists.txt index 3ec627396..894183c47 100644 --- a/plugins/obs-outputs/CMakeLists.txt +++ b/plugins/obs-outputs/CMakeLists.txt @@ -1,200 +1,186 @@ project(obs-outputs) -set(WITH_RTMPS AUTO CACHE STRING "Enable RTMPS support with mbedTLS") -set_property(CACHE WITH_RTMPS PROPERTY STRINGS AUTO ON OFF) - -find_package(PkgConfig) - -option(STATIC_MBEDTLS "Statically link mbedTLS into binary" OFF) - -if (WITH_RTMPS STREQUAL "AUTO") - find_package(MbedTLS) - find_package(ZLIB) - if (NOT MBEDTLS_FOUND OR NOT ZLIB_FOUND) - set(WITH_RTMPS "OFF") - message(WARNING "mbedTLS or zlib was not found, RTMPS will be auto-disabled") - endif() +if(NOT DEFINED ENABLE_RTMPS) + set(ENABLE_RTMPS + AUTO + CACHE STRING "Enable RTMPS support with mbedTLS" FORCE) + set_property(CACHE ENABLE_RTMPS PROPERTY STRINGS AUTO ON OFF) endif() -if (WITH_RTMPS) - find_package(MbedTLS REQUIRED) - find_package(ZLIB REQUIRED) - add_definitions(-DCRYPTO -DUSE_MBEDTLS) - include_directories(${MBEDTLS_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS}) +option(ENABLE_STATIC_MBEDTLS "Enable statically linking mbedTLS into binary" + OFF) +mark_as_advanced(ENABLE_STATIC_MBEDTLS) + +add_library(obs-outputs MODULE) +add_library(OBS::outputs ALIAS obs-outputs) + +target_sources( + obs-outputs + PRIVATE obs-outputs.c + obs-output-ver.h + flv-mux.c + flv-mux.h + flv-output.c + net-if.c + net-if.h + null-output.c + rtmp-helpers.h + rtmp-stream.c + rtmp-stream.h + rtmp-windows.c) + +target_link_libraries(obs-outputs PRIVATE OBS::libobs) + +set_target_properties(obs-outputs PROPERTIES FOLDER "plugins" PREFIX "") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS output module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-outputs.rc) + + target_sources(obs-outputs PRIVATE obs-outputs.rc) + + if(MSVC) + target_link_libraries(obs-outputs PRIVATE OBS::w32-pthreads) + endif() + + target_link_libraries(obs-outputs PRIVATE ws2_32 winmm Iphlpapi) +endif() + +if(ENABLE_RTMPS STREQUAL "AUTO" OR ENABLE_RTMPS STREQUAL "ON") + find_package(MbedTLS) + find_package(ZLIB) + if(NOT MBEDTLS_FOUND OR NOT ZLIB_FOUND) + if(ENABLE_RTMPS STREQUAL "ON") + message( + FATAL_ERROR + "OBS: - mbedTLS or zlib not found, but required for RTMPS support." + ) + return() + else() + message( + WARNING + "OBS: - mbedTLS or zlib was not found, RTMPS will be auto-disabled" + ) + target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO) + endif() + else() + target_sources( + obs-outputs + PRIVATE librtmp/amf.c + librtmp/amf.h + librtmp/bytes.h + librtmp/cencode.c + librtmp/cencode.h + librtmp/dh.h + librtmp/dhgroups.h + librtmp/handshake.h + librtmp/hashswf.c + librtmp/http.h + librtmp/log.c + librtmp/log.h + librtmp/md5.c + librtmp/md5.h + librtmp/parseurl.c + librtmp/rtmp.c + librtmp/rtmp.h + librtmp/rtmp_sys.h) + + target_compile_definitions(obs-outputs PRIVATE USE_MBEDTLS CRYPTO) + + target_link_libraries(obs-outputs PRIVATE Mbedtls::Mbedtls ZLIB::ZLIB) + + if(OS_WINDOWS) + target_link_libraries(obs-outputs PRIVATE crypt32) + + elseif(OS_MACOS) + find_library(FOUNDATION_FRAMEWORK Foundation) + find_library(SECURITY_FRAMEWORK Security) + mark_as_advanced(FOUNDATION_FRAMEWORK SECURITY_FRAMEWORK) + + target_link_libraries(obs-outputs PRIVATE ${FOUNDATION_FRAMEWORK} + ${SECURITY_FRAMEWORK}) + set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden) + + elseif(OS_POSIX) + set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden) + endif() + endif() else() - add_definitions(-DNO_CRYPTO) + target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO) endif() -set(COMPILE_FTL FALSE) - -if (PKG_CONFIG_FOUND) - pkg_check_modules(FTL libftl) +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(FTL QUIET libftl) endif() -if (FTL_FOUND) - find_package(Libcurl REQUIRED) - message(STATUS "Found ftl-sdk (system): ftl outputs enabled") - - set(ftl_SOURCES ftl-stream.c) - - include_directories(${LIBCURL_INCLUDE_DIRS} ${FTL_INCLUDE_DIRS}) - set(COMPILE_FTL TRUE) -elseif (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt") - find_package(Libcurl REQUIRED) - message(STATUS "Found ftl-sdk: ftl outputs enabled") - - add_definitions(-DFTL_STATIC_COMPILE) - - include_directories(${LIBCURL_INCLUDE_DIRS}) - - set(ftl_SOURCES - ftl-stream.c - ftl-sdk/libftl/hmac/hmac.c - ftl-sdk/libftl/hmac/sha2.c - ftl-sdk/libftl/ftl-sdk.c - ftl-sdk/libftl/handshake.c - ftl-sdk/libftl/ingest.c - ftl-sdk/libftl/ftl_helpers.c - ftl-sdk/libftl/media.c - ftl-sdk/libftl/gettimeofday/gettimeofday.c - ftl-sdk/libftl/logging.c) - set(ftl_HEADERS - ftl-sdk/libftl/hmac/hmac.h - ftl-sdk/libftl/hmac/sha2.h - ftl-sdk/libftl/ftl.h - ftl-sdk/libftl/ftl_private.h) - set(ftl_IMPORTS - ${OBS_JANSSON_IMPORT} - ${LIBCURL_LIBRARIES}) - - if (WIN32) - list(APPEND ftl_SOURCES - ftl-sdk/libftl/win32/socket.c - ftl-sdk/libftl/gettimeofday/gettimeofday.c - ftl-sdk/libftl/win32/threads.c) - list(APPEND ftl_HEADERS - ftl-sdk/libftl/gettimeofday/gettimeofday.h - ftl-sdk/libftl/win32/threads.h) - - include_directories(ftl-sdk/libftl/win32) - else() - list(APPEND ftl_SOURCES - ftl-sdk/libftl/posix/socket.c - ftl-sdk/libftl/posix/threads.c) - list(APPEND ftl_HEADERS - ftl-sdk/libftl/posix/threads.h) - - include_directories(ftl-sdk/libftl/posix) - endif() - - include_directories(ftl-sdk/libftl) - - set(COMPILE_FTL TRUE) -endif() - -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/obs-outputs-config.h.in" - "${CMAKE_BINARY_DIR}/plugins/obs-outputs/config/obs-outputs-config.h") - -include_directories("${CMAKE_BINARY_DIR}/plugins/obs-outputs/config") - -if(WIN32) - set(obs-outputs_PLATFORM_DEPS - ws2_32 - winmm - Iphlpapi) - - if (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO")) - SET(obs-outputs_PLATFORM_DEPS - ${obs-outputs_PLATFORM_DEPS} - crypt32) - endif() -endif() - -if(MSVC) - set(obs-outputs_PLATFORM_DEPS - ${obs-outputs_PLATFORM_DEPS} - w32-pthreads) -endif() - -if(APPLE AND (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO"))) - find_library(FOUNDATION_FRAMEWORK Foundation) - find_library(SECURITY_FRAMEWORK Security) - - set(obs-outputs_PLATFORM_DEPS - ${obs-outputs_PLATFORM_DEPS} - ${FOUNDATION_FRAMEWORK} - ${SECURITY_FRAMEWORK}) -endif() - -set(obs-outputs_librtmp_HEADERS - librtmp/amf.h - librtmp/bytes.h - librtmp/cencode.h - librtmp/dh.h - librtmp/dhgroups.h - librtmp/handshake.h - librtmp/http.h - librtmp/log.h - librtmp/md5.h - librtmp/rtmp.h - librtmp/rtmp_sys.h) -set(obs-outputs_librtmp_SOURCES - librtmp/amf.c - librtmp/cencode.c - librtmp/hashswf.c - librtmp/log.c - librtmp/md5.c - librtmp/parseurl.c - librtmp/rtmp.c) - -if(NOT WIN32) - set_source_files_properties(${obs-outputs_librtmp_SOURCES} PROPERTIES - COMPILE_FLAGS "-fvisibility=hidden") -endif() - -set(obs-outputs_HEADERS - "${CMAKE_BINARY_DIR}/plugins/obs-outputs/config/obs-outputs-config.h" - obs-output-ver.h - rtmp-helpers.h - rtmp-stream.h - net-if.h - flv-mux.h) -set(obs-outputs_SOURCES - obs-outputs.c - null-output.c - rtmp-stream.c - rtmp-windows.c - flv-output.c - flv-mux.c - net-if.c) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS output module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-outputs.rc) - list(APPEND obs-outputs_SOURCES - obs-outputs.rc) -endif() - -add_library(obs-outputs MODULE - ${ftl_SOURCES} - ${ftl_HEADERS} - ${obs-outputs_SOURCES} - ${obs-outputs_HEADERS} - ${obs-outputs_librtmp_SOURCES} - ${obs-outputs_librtmp_HEADERS}) - if(FTL_FOUND) - target_link_libraries(obs-outputs ${FTL_LIBRARIES}) - target_include_directories(obs-outputs PUBLIC ${FTL_INCLUDE_DIRS}) + find_package(CURL REQUIRED) + message(STATUS "OBS: ENABLED ftl outputs (system ftl-sdk)") + + target_sources(obs-outputs PRIVATE ftl-stream.c) + + target_include_directories(obs-outputs PRIVATE ${FTL_INCLUDE_DIRS}) + + target_link_libraries(obs-outputs PRIVATE ${FTL_LIBRARIES} CURL::libcurl) + + target_compile_features(obs-outputs PRIVATE c_std_11) + + target_compile_definitions(obs-outputs PRIVATE FTL_FOUND) + +elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt") + find_package(CURL REQUIRED) + message(STATUS "OBS: ENABLED ftl ouputs (bundled ftl-sdk)") + + target_compile_definitions(obs-outputs PRIVATE FTL_STATIC_COMPILE) + + target_compile_features(obs-outputs PRIVATE c_std_11) + + target_link_libraries(obs-outputs PRIVATE Jansson::Jansson CURL::libcurl) + + target_sources( + obs-outputs + PRIVATE ftl-stream.c + ftl-sdk/libftl/ftl.h + ftl-sdk/libftl/ftl_private.h + ftl-sdk/libftl/hmac/hmac.c + ftl-sdk/libftl/hmac/hmac.h + ftl-sdk/libftl/hmac/sha2.c + ftl-sdk/libftl/hmac/sha2.h + ftl-sdk/libftl/ftl-sdk.c + ftl-sdk/libftl/handshake.c + ftl-sdk/libftl/ingest.c + ftl-sdk/libftl/ftl_helpers.c + ftl-sdk/libftl/media.c + ftl-sdk/libftl/gettimeofday/gettimeofday.c + ftl-sdk/libftl/logging.c) + + target_include_directories(obs-outputs + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl) + + if(OS_WINDOWS) + target_sources( + obs-outputs + PRIVATE ftl-sdk/libftl/gettimeofday/gettimeofday.c + ftl-sdk/libftl/gettimeofday/gettimeofday.h + ftl-sdk/libftl/win32/socket.c + ftl-sdk/libftl/win32/threads.c + ftl-sdk/libftl/win32/threads.h) + + target_include_directories( + obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/win32) + elseif(OS_POSIX) + target_sources( + obs-outputs + PRIVATE ftl-sdk/libftl/posix/socket.c ftl-sdk/libftl/posix/threads.c + ftl-sdk/libftl/posix/threads.h) + + target_include_directories( + obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/posix) + endif() + + target_compile_definitions(obs-outputs PRIVATE FTL_FOUND) endif() -target_link_libraries(obs-outputs - libobs - ${MBEDTLS_LIBRARIES} - ${ZLIB_LIBRARIES} - ${ftl_IMPORTS} - ${obs-outputs_PLATFORM_DEPS}) -set_target_properties(obs-outputs PROPERTIES FOLDER "plugins") - -install_obs_plugin_with_data(obs-outputs data) +setup_plugin_target(obs-outputs) diff --git a/plugins/obs-outputs/obs-outputs-config.h.in b/plugins/obs-outputs/obs-outputs-config.h.in index 60d746884..5677dbc3c 100644 --- a/plugins/obs-outputs/obs-outputs-config.h.in +++ b/plugins/obs-outputs/obs-outputs-config.h.in @@ -12,4 +12,4 @@ #define FALSE 0 #endif -#define COMPILE_FTL @COMPILE_FTL@ +#cmakedefine FTL_FOUND diff --git a/plugins/obs-outputs/obs-outputs.c b/plugins/obs-outputs/obs-outputs.c index e2aab8b00..4d55e6366 100644 --- a/plugins/obs-outputs/obs-outputs.c +++ b/plugins/obs-outputs/obs-outputs.c @@ -1,7 +1,5 @@ #include -#include "obs-outputs-config.h" - #ifdef _WIN32 #include #include @@ -17,7 +15,7 @@ MODULE_EXPORT const char *obs_module_description(void) extern struct obs_output_info rtmp_output_info; extern struct obs_output_info null_output_info; extern struct obs_output_info flv_output_info; -#if COMPILE_FTL +#if defined(FTL_FOUND) extern struct obs_output_info ftl_output_info; #endif @@ -67,7 +65,7 @@ bool obs_module_load(void) obs_register_output(&rtmp_output_info); obs_register_output(&null_output_info); obs_register_output(&flv_output_info); -#if COMPILE_FTL +#if defined(FTL_FOUND) obs_register_output(&ftl_output_info); #endif return true; diff --git a/plugins/obs-qsv11/CMakeLists.txt b/plugins/obs-qsv11/CMakeLists.txt index 6fc7d8407..1ef2fd93f 100644 --- a/plugins/obs-qsv11/CMakeLists.txt +++ b/plugins/obs-qsv11/CMakeLists.txt @@ -1,111 +1,129 @@ option(ENABLE_QSV11 "Build Intel QSV11 Hardware Encoder." TRUE) if(NOT ENABLE_QSV11) - message(STATUS "NOT building Intel QSV11 Hardware Encoder.") - return() + message(STATUS "OBS: DISABLED obs-qsv11") + return() endif() project(obs-qsv11) -include_directories(libmfx/include/msdk/include) -include_directories(libmfx/include) +add_library(obs-qsv11 MODULE) +add_library(OBS::qsv11 ALIAS obs-qsv11) -set(obs-qsv11_libmfx_SOURCES - libmfx/src/main.cpp - libmfx/src/mfx_critical_section.cpp - libmfx/src/mfx_dispatcher.cpp - libmfx/src/mfx_dispatcher_log.cpp - libmfx/src/mfx_driver_store_loader.cpp - libmfx/src/mfx_dxva2_device.cpp - libmfx/src/mfx_function_table.cpp - libmfx/src/mfx_library_iterator.cpp - libmfx/src/mfx_load_dll.cpp - libmfx/src/mfx_load_plugin.cpp - libmfx/src/mfx_plugin_hive.cpp - libmfx/src/mfx_win_reg_key.cpp - ) +add_library(libmfx INTERFACE) +add_library(OBS::libmfx ALIAS libmfx) -set(obs-qsv11_libmfx_HEADERS - libmfx/include/msdk/include/mfxadapter.h - libmfx/include/msdk/include/mfxastructures.h - libmfx/include/msdk/include/mfxaudio.h - libmfx/include/msdk/include/mfxaudio++.h - libmfx/include/msdk/include/mfxcommon.h - libmfx/include/msdk/include/mfxdefs.h - libmfx/include/msdk/include/mfxjpeg.h - libmfx/include/msdk/include/mfxmvc.h - libmfx/include/msdk/include/mfxplugin.h - libmfx/include/msdk/include/mfxplugin++.h - libmfx/include/msdk/include/mfxsession.h - libmfx/include/msdk/include/mfxstructures.h - libmfx/include/msdk/include/mfxvideo.h - libmfx/include/msdk/include/mfxvideo++.h - libmfx/include/msdk/include/mfxvstructures.h - libmfx/include/mfx_critical_section.h - libmfx/include/mfx_dispatcher.h - libmfx/include/mfx_dispatcher_defs.h - libmfx/include/mfx_dispatcher_log.h - libmfx/include/mfx_driver_store_loader.h - libmfx/include/mfx_dxva2_device.h - libmfx/include/mfx_exposed_functions_list.h - libmfx/include/mfx_library_iterator.h - libmfx/include/mfx_load_dll.h - libmfx/include/mfx_load_plugin.h - libmfx/include/mfx_plugin_hive.h - libmfx/include/mfx_vector.h - libmfx/include/mfx_win_reg_key.h - libmfx/include/mfxaudio_exposed_functions_list.h - ) +target_sources( + libmfx + INTERFACE libmfx/src/main.cpp + libmfx/src/mfx_critical_section.cpp + libmfx/src/mfx_dispatcher.cpp + libmfx/src/mfx_dispatcher_log.cpp + libmfx/src/mfx_driver_store_loader.cpp + libmfx/src/mfx_dxva2_device.cpp + libmfx/src/mfx_function_table.cpp + libmfx/src/mfx_library_iterator.cpp + libmfx/src/mfx_load_dll.cpp + libmfx/src/mfx_load_plugin.cpp + libmfx/src/mfx_plugin_hive.cpp + libmfx/src/mfx_win_reg_key.cpp + libmfx/include/msdk/include/mfxadapter.h + libmfx/include/msdk/include/mfxastructures.h + libmfx/include/msdk/include/mfxaudio.h + libmfx/include/msdk/include/mfxaudio++.h + libmfx/include/msdk/include/mfxcommon.h + libmfx/include/msdk/include/mfxdefs.h + libmfx/include/msdk/include/mfxjpeg.h + libmfx/include/msdk/include/mfxmvc.h + libmfx/include/msdk/include/mfxplugin.h + libmfx/include/msdk/include/mfxplugin++.h + libmfx/include/msdk/include/mfxsession.h + libmfx/include/msdk/include/mfxstructures.h + libmfx/include/msdk/include/mfxvideo.h + libmfx/include/msdk/include/mfxvideo++.h + libmfx/include/msdk/include/mfxvstructures.h + libmfx/include/mfx_critical_section.h + libmfx/include/mfx_dispatcher.h + libmfx/include/mfx_dispatcher_defs.h + libmfx/include/mfx_dispatcher_log.h + libmfx/include/mfx_driver_store_loader.h + libmfx/include/mfx_dxva2_device.h + libmfx/include/mfx_exposed_functions_list.h + libmfx/include/mfx_library_iterator.h + libmfx/include/mfx_load_dll.h + libmfx/include/mfx_load_plugin.h + libmfx/include/mfx_plugin_hive.h + libmfx/include/mfx_vector.h + libmfx/include/mfx_win_reg_key.h + libmfx/include/mfxaudio_exposed_functions_list.h) -set(obs-qsv11_SOURCES - common_directx9.cpp - common_directx11.cpp - common_utils.cpp - common_utils_windows.cpp - device_directx9.cpp - QSV_Encoder.cpp - QSV_Encoder_Internal.cpp - obs-qsv11.c - obs-qsv11-plugin-main.c) +target_include_directories( + libmfx INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libmfx/include/msdk/include + ${CMAKE_CURRENT_SOURCE_DIR}/libmfx/include) -if(WIN32) - set(MODULE_DESCRIPTION "OBS QSV encoder") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-qsv11.rc) - list(APPEND obs-qsv11_SOURCES - obs-qsv11.rc) -endif() +target_sources( + obs-qsv11 + PRIVATE obs-qsv11.c + obs-qsv11-plugin-main.c + common_directx9.cpp + common_directx9.h + common_directx11.cpp + common_directx11.h + common_utils.cpp + common_utils.h + common_utils_windows.cpp + device_directx9.cpp + device_directx9.h + QSV_Encoder.cpp + QSV_Encoder.h + QSV_Encoder_Internal.cpp + QSV_Encoder_Internal.h + bits/linux_defs.h + bits/windows_defs.h) -set(obs-qsv11_HEADERS - bits/linux_defs.h - bits/windows_defs.h - common_directx9.h - common_directx11.h - device_directx9.h - common_utils.h - QSV_Encoder.h - QSV_Encoder_Internal.h) - -add_library(obs-qsv11 MODULE - ${obs-qsv11_SOURCES} - ${obs-qsv11_HEADERS} - ${obs-qsv11_libmfx_SOURCES} - ${obs-qsv11_libmfx_HEADERS} - ) -target_link_libraries(obs-qsv11 - libobs - d3d9 - d3d11 - dxva2 - dxgi - dxguid - ) +target_link_libraries( + obs-qsv11 + PRIVATE OBS::libobs + OBS::libmfx + d3d9 + d3d11 + dxva2 + dxgi + dxguid) target_compile_definitions(obs-qsv11 PRIVATE DX11_D3D) + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS QSV encoder") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-qsv11.rc) + + target_sources(obs-qsv11 PRIVATE obs-qsv11.rc) + + target_compile_definitions( + obs-qsv11 PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) +endif() + set_target_properties(obs-qsv11 PROPERTIES FOLDER "plugins") -source_group("obs-qsv11\\Source Files" FILES ${obs-qsv11_SOURCES}) -source_group("obs-qsv11\\Header Files" FILES ${obs-qsv11_HEADERS}) -source_group("libmfx\\Source Files" FILES ${obs-qsv11_libmfx_SOURCES}) -source_group("libmfx\\Header Files" FILES ${obs-qsv11_libmfx_HEADERS}) +file(GLOB _OBS_QSV11_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +file(GLOB _OBS_QSV11_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp) -install_obs_plugin_with_data(obs-qsv11 data) +source_group("obs-qsv11\\Source Files" FILES ${_OBS_QSV11_SOURCE_FILES}) +source_group("obs-qsv11\\Header Files" FILES ${_OBS_QSV11_HEADER_FILES}) + +get_target_property(_LIBMFX_SOURCES OBS::libmfx INTERFACE_SOURCES) + +foreach(_LIBMFX_SOURCE ${_LIBMFX_SOURCES}) + get_filename_component(_EXT ${_LIBMFX_SOURCE} EXT) + if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h") + source_group("libmfx\\Header Files" FILES ${_LIBMFX_SOURCE}) + elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c") + source_group("libmfx\\Source Files" FILES ${_LIBMFX_SOURCE}) + endif() +endforeach() + +setup_plugin_target(obs-qsv11) diff --git a/plugins/obs-text/CMakeLists.txt b/plugins/obs-text/CMakeLists.txt index 43599fcd0..d956041e0 100644 --- a/plugins/obs-text/CMakeLists.txt +++ b/plugins/obs-text/CMakeLists.txt @@ -1,25 +1,22 @@ -if (NOT WIN32) - return() -endif() - project(obs-text) -if(WIN32) - set(MODULE_DESCRIPTION "OBS GDI+ text module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-text.rc) - set(obs-text_PLATFORM_SOURCES - gdiplus/obs-text.cpp - obs-text.rc) - set(obs-text_PLATFORM_DEPS - gdiplus) -endif() +add_library(obs-text MODULE) +add_library(OBS::text ALIAS obs-text) + +target_link_libraries(obs-text PRIVATE OBS::libobs) -add_library(obs-text MODULE - ${obs-text_PLATFORM_SOURCES} - ${obs-text_PLATFORM_HEADERS}) -target_link_libraries(obs-text - libobs - ${obs-text_PLATFORM_DEPS}) set_target_properties(obs-text PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(obs-text data) +set(MODULE_DESCRIPTION "OBS GDI+ text module") +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-text.rc) + +target_sources(obs-text PRIVATE gdiplus/obs-text.cpp obs-text.rc) + +target_link_libraries(obs-text PRIVATE gdiplus) + +target_compile_definitions( + obs-text PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + +setup_plugin_target(obs-text) diff --git a/plugins/obs-transitions/CMakeLists.txt b/plugins/obs-transitions/CMakeLists.txt index 267e74e2a..53b7f8cb7 100644 --- a/plugins/obs-transitions/CMakeLists.txt +++ b/plugins/obs-transitions/CMakeLists.txt @@ -1,27 +1,30 @@ project(obs-transitions) -set(obs-transitions_SOURCES - obs-transitions.c - transition-slide.c - transition-swipe.c - transition-fade.c - transition-cut.c - transition-fade-to-color.c - transition-luma-wipe.c - transition-stinger.c - ) +add_library(obs-transitions MODULE) +add_library(OBS::transition ALIAS obs-transitions) + +target_sources( + obs-transitions + PRIVATE obs-transitions.c + transition-slide.c + transition-swipe.c + transition-fade.c + transition-cut.c + transition-fade-to-color.c + transition-luma-wipe.c + transition-stinger.c) + +target_link_libraries(obs-transitions PRIVATE OBS::libobs) + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS Transitions module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-transitions.rc) + + target_sources(obs-transitions PRIVATE obs-transitions.rc) -if(WIN32) - set(MODULE_DESCRIPTION "OBS Transitions module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-transitions.rc) - list(APPEND obs-transitions_SOURCES - obs-transitions.rc) endif() -add_library(obs-transitions MODULE - ${obs-transitions_SOURCES}) -target_link_libraries(obs-transitions - libobs) -set_target_properties(obs-transitions PROPERTIES FOLDER "plugins") +set_target_properties(obs-transitions PROPERTIES FOLDER "plugins" PREFIX "") -install_obs_plugin_with_data(obs-transitions data) +setup_plugin_target(obs-transitions) diff --git a/plugins/obs-vst b/plugins/obs-vst index 8ad3f64e7..937ba7952 160000 --- a/plugins/obs-vst +++ b/plugins/obs-vst @@ -1 +1 @@ -Subproject commit 8ad3f64e702ac4f1799b209a511620eb1d096a01 +Subproject commit 937ba7952ddea9b8f4106dfd6f54ee0f3ef4d03d diff --git a/plugins/obs-x264/CMakeLists.txt b/plugins/obs-x264/CMakeLists.txt index 8c8100fa2..09db3f814 100644 --- a/plugins/obs-x264/CMakeLists.txt +++ b/plugins/obs-x264/CMakeLists.txt @@ -1,32 +1,31 @@ project(obs-x264) find_package(Libx264 REQUIRED) -include_directories(${LIBX264_INCLUDE_DIRS}) -add_definitions(${LIBX264_DEFINITIONS}) -set(obs-x264_SOURCES - obs-x264.c - obs-x264-plugin-main.c) +add_library(obs-x264 MODULE) +add_library(OBS::x264 ALIAS obs-x264) +add_executable(obs-x264-test) + +target_sources(obs-x264-test PRIVATE obs-x264-test.c) + +target_link_libraries(obs-x264-test PRIVATE OBS::opts-parser) + +target_sources(obs-x264 PRIVATE obs-x264.c obs-x264-plugin-main.c) + +target_link_libraries(obs-x264 PRIVATE LIBX264::LIBX264 OBS::opts-parser) + +set_target_properties(obs-x264 PROPERTIES FOLDER "plugins" PREFIX "") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS x264 encoder") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + obs-x264.rc) + + target_sources(obs-x264 PRIVATE obs-x264.rc) -if(WIN32) - set(MODULE_DESCRIPTION "OBS x264 encoder") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-x264.rc) - list(APPEND obs-x264_SOURCES - obs-x264.rc) endif() -add_library(obs-x264 MODULE - ${obs-x264_HEADERS} - ${obs-x264_SOURCES}) -target_link_libraries(obs-x264 - libobs - opts-parser - ${LIBX264_LIBRARIES}) -set_target_properties(obs-x264 PROPERTIES FOLDER "plugins") - -install_obs_plugin_with_data(obs-x264 data) - -add_executable(obs-x264-test obs-x264-test.c) set_target_properties(obs-x264-test PROPERTIES FOLDER "plugins") -target_link_libraries(obs-x264-test PRIVATE libobs opts-parser) add_test(NAME obs-x264-test COMMAND obs-x264-test) + +setup_plugin_target(obs-x264) diff --git a/plugins/oss-audio/CMakeLists.txt b/plugins/oss-audio/CMakeLists.txt index 50b4eab5e..4abad7567 100644 --- a/plugins/oss-audio/CMakeLists.txt +++ b/plugins/oss-audio/CMakeLists.txt @@ -1,37 +1,27 @@ project(oss-audio) -if(DISABLE_OSS) - message(STATUS "OSS support disabled") - return() +option(ENABLE_OSS "Enable building with OSS audio support" ON) + +if(NOT ENABLE_OSS) + message(STATUS "OBS: DISABLED oss-audio") + return() endif() -find_package(OSS) -if(NOT OSS_FOUND AND ENABLE_OSS) - message(FATAL_ERROR "OSS not found but set as enabled") -elseif(NOT OSS_FOUND) - message(STATUS "OSS not found, disabling OSS plugin") - return() -endif() +find_package(OSS REQUIRED) -configure_file(oss-platform.h.in oss-platform.h) +add_library(oss-audio MODULE) +add_library(OBS::oss-audio ALIAS oss-audio) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" - "${OSS_INCLUDE_DIR}" - "${CMAKE_CURRENT_BINARY_DIR}" -) +target_sources(oss-audio PRIVATE oss-audio.c oss-input.c) -set(oss-audio_SOURCES - oss-audio.c - oss-input.c -) +target_link_libraries(oss-audio PRIVATE OBS::libobs OSS::OSS) + +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/oss-platform.h.in oss-platform.h) + +target_include_directories(oss-audio PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +target_sources(oss-audio PRIVATE oss-platform.h) -add_library(oss-audio MODULE - ${oss-audio_SOURCES} -) -target_link_libraries(oss-audio - libobs -) set_target_properties(oss-audio PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(oss-audio data) +setup_plugin_target(oss-audio) diff --git a/plugins/rtmp-services/CMakeLists.txt b/plugins/rtmp-services/CMakeLists.txt index 113bc2c62..d9fef9a88 100644 --- a/plugins/rtmp-services/CMakeLists.txt +++ b/plugins/rtmp-services/CMakeLists.txt @@ -1,63 +1,50 @@ project(rtmp-services) -find_package(Libcurl REQUIRED) - -include_directories(${LIBCURL_INCLUDE_DIRS}) - -include_directories(${OBS_JANSSON_INCLUDE_DIRS}) - -set(rtmp-services_SOURCES - service-specific/twitch.c - service-specific/younow.c - service-specific/nimotv.c - service-specific/showroom.c - service-specific/dacast.c - rtmp-common.c - rtmp-custom.c - rtmp-services-main.c) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS RTMP Services") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in rtmp-services.rc) - list(APPEND rtmp-services_SOURCES - rtmp-services.rc) -endif() - -set(rtmp-services_HEADERS - service-specific/twitch.h - service-specific/younow.h - service-specific/nimotv.h - service-specific/showroom.h - service-specific/dacast.h - rtmp-format-ver.h) +option(ENABLE_SERVICE_UPDATES "Checks for service updates" OFF) set(RTMP_SERVICES_URL - "https://obsproject.com/obs2_update/rtmp-services" - CACHE STRING "Default services package URL") -option(CHECK_FOR_SERVICE_UPDATES "Checks for service updates" OFF) + "https://obsproject.com/obs2_update/rtmp-services" + CACHE STRING "Default services package URL" FORCE) -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/lookup-config.h.in" - "${CMAKE_BINARY_DIR}/plugins/rtmp-services/lookup-config.h") +mark_as_advanced(RTMP_SERVICES_URL) -set(rtmp-services_config_HEADERS - "${CMAKE_BINARY_DIR}/plugins/rtmp-services/lookup-config.h") +add_library(rtmp-services MODULE) +add_library(OBS::rtmp-services ALIAS rtmp-services) -add_library(rtmp-services MODULE - ${rtmp-services_SOURCES} - ${rtmp-services_HEADERS} - ${rtmp-services_config_HEADERS}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/lookup-config.h.in + ${CMAKE_BINARY_DIR}/config/lookup-config.h) -target_link_libraries(rtmp-services - libobs - file-updater - ${OBS_JANSSON_IMPORT} - ${LIBCURL_LIBRARIES}) +target_sources( + rtmp-services + PRIVATE service-specific/twitch.c + service-specific/twitch.h + service-specific/younow.c + service-specific/younow.h + service-specific/nimotv.c + service-specific/nimotv.h + service-specific/showroom.c + service-specific/showroom.h + service-specific/dacast.c + service-specific/dacast.h + rtmp-common.c + rtmp-custom.c + rtmp-services-main.c + rtmp-format-ver.h + ${CMAKE_BINARY_DIR}/config/lookup-config.h) -set_target_properties(rtmp-services PROPERTIES FOLDER "plugins") +target_include_directories(rtmp-services PRIVATE ${CMAKE_BINARY_DIR}/config) -target_include_directories(rtmp-services - PUBLIC - "$") +target_link_libraries(rtmp-services PRIVATE OBS::libobs OBS::file-updater + Jansson::Jansson) -install_obs_plugin_with_data(rtmp-services data) +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS RTMP Services") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + rtmp-services.rc) + + target_sources(rtmp-services PRIVATE rtmp-services.rc) +endif() + +set_target_properties(rtmp-services PROPERTIES FOLDER "plugins" PREFIX "") + +setup_plugin_target(rtmp-services) diff --git a/plugins/rtmp-services/lookup-config.h.in b/plugins/rtmp-services/lookup-config.h.in index d1cb6ed0e..ea21f1361 100644 --- a/plugins/rtmp-services/lookup-config.h.in +++ b/plugins/rtmp-services/lookup-config.h.in @@ -17,4 +17,4 @@ #endif #define RTMP_SERVICES_URL "@RTMP_SERVICES_URL@" -#define CHECK_FOR_SERVICE_UPDATES @CHECK_FOR_SERVICE_UPDATES@ +#cmakedefine ENABLE_SERVICE_UPDATES diff --git a/plugins/rtmp-services/rtmp-services-main.c b/plugins/rtmp-services/rtmp-services-main.c index 0c3806509..56ddf0616 100644 --- a/plugins/rtmp-services/rtmp-services-main.c +++ b/plugins/rtmp-services/rtmp-services-main.c @@ -84,7 +84,7 @@ bool obs_module_load(void) proc_handler_add(ph, "void twitch_ingests_refresh(int seconds)", refresh_callback, NULL); -#if !defined(_WIN32) || CHECK_FOR_SERVICE_UPDATES +#if !defined(_WIN32) || defined(ENABLE_SERVICE_UPDATES) char *local_dir = obs_module_file(""); char *cache_dir = obs_module_config_path(""); char update_url[128]; diff --git a/plugins/sndio/CMakeLists.txt b/plugins/sndio/CMakeLists.txt index 24f8d943b..843299c21 100644 --- a/plugins/sndio/CMakeLists.txt +++ b/plugins/sndio/CMakeLists.txt @@ -1,35 +1,20 @@ project(sndio) -if(DISABLE_SNDIO) - message(STATUS "Sndio support disabled") - return() +option(ENABLE_SNDIO "Build OBS with sndio support" OFF) +if(NOT ENABLE_SNDIO) + message(STATUS "OBS: DISABLED sndio") + return() endif() -find_package(Sndio) -if(NOT Sndio_FOUND AND ENABLE_SNDIO) - message(FATAL_ERROR "Sndio not found but set as enabled") -elseif(NOT Sndio_FOUND) - message(STATUS "Sndio not found, disabling Sndio plugin") - return() -endif() +find_package(Sndio REQUIRED) -include_directories( - SYSTEM "${CMAKE_SOURCE_DIR}/libobs" SYSTEM "${CMAKE_SOURCE_DIR}/../../libobs" - ${Sndio_INCLUDE_DIRS} -) +add_library(sndio MODULE) +add_library(OBS::sndio ALIAS sndio) -set(sndio_SOURCES - sndio.c - sndio-input.c -) +target_sources(sndio PRIVATE sndio.c sndio-input.c) + +target_link_libraries(sndio PRIVATE OBS::libobs Sndio::Sndio) -add_library(sndio MODULE - ${sndio_SOURCES} -) -target_link_libraries(sndio - libobs - ${Sndio_LIBRARIES} -) set_target_properties(sndio PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(sndio data) +setup_plugin_target(sndio) diff --git a/plugins/text-freetype2/CMakeLists.txt b/plugins/text-freetype2/CMakeLists.txt index c561d444c..fce96cffe 100644 --- a/plugins/text-freetype2/CMakeLists.txt +++ b/plugins/text-freetype2/CMakeLists.txt @@ -1,89 +1,49 @@ project(text-freetype2) -if(DISABLE_FREETYPE) - message(STATUS "Freetype text plugin disabled") - return() +option(ENABLE_FREETYPE "Enable FreeType text plugin" ON) + +if(NOT ENABLE_FREETYPE) + message(STATUS "OBS: DISABLED text-freetype2") + return() endif() -find_package(Freetype QUIET) -if(NOT FREETYPE_FOUND AND ENABLE_FREETYPE) - message(FATAL_ERROR "Freetype library not found but set as enabled") -elseif(NOT FREETYPE_FOUND) - message(STATUS "Freetype library not found, Freetype text plugin disabled") - return() +find_package(Freetype REQUIRED) + +add_library(text-freetype2 MODULE) +add_library(OBS::text-freetype2 ALIAS text-freetype2) + +target_sources( + text-freetype2 PRIVATE find-font.h obs-convenience.c text-functionality.c + text-freetype2.c obs-convenience.h text-freetype2.h) + +target_link_libraries(text-freetype2 PRIVATE OBS::libobs Freetype::Freetype) + +set_target_properties(text-freetype2 PROPERTIES FOLDER "plugins" PREFIX "") + +if(OS_WINDOWS) + set(MODULE_DESCRIPTION "OBS FreeType text module") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + text-freetype2.rc) + + target_sources(text-freetype2 PRIVATE find-font.c find-font-windows.c + text-freetype2.rc) + +elseif(OS_MACOS) + find_package(Iconv REQUIRED) + find_library(COCOA Cocoa) + mark_as_advanced(COCOA) + + target_sources(text-freetype2 PRIVATE find-font.c find-font-cocoa.m + find-font-iconv.c) + + target_link_libraries(text-freetype2 PRIVATE Iconv::Iconv ${COCOA}) + +elseif(OS_POSIX) + find_package(Fontconfig REQUIRED) + + target_sources(text-freetype2 PRIVATE find-font-unix.c) + + target_link_libraries(text-freetype2 PRIVATE Fontconfig::Fontconfig) endif() -if(WIN32) - set(MODULE_DESCRIPTION "OBS Freetype text module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in text-freetype2.rc) - set(text-freetype2_PLATFORM_SOURCES - find-font.c - find-font-windows.c - text-freetype2.rc) -elseif(APPLE) - find_package(Iconv QUIET) - if(NOT ICONV_FOUND AND ENABLE_FREETYPE) - message(FATAL_ERROR "Iconv library not found but plugin set as enabled") - elseif(NOT ICONV_FOUND) - message(STATUS "Iconv library not found, Freetype text plugin disabled") - return() - endif() - - find_library(COCOA Cocoa) - - set(text-freetype2_PLATFORM_SOURCES - find-font.c - find-font-cocoa.m - find-font-iconv.c) - - include_directories(${COCOA} - ${ICONV_INCLUDE_DIRS}) - - set(text-freetype2_PLATFORM_DEPS - ${COCOA} - ${ICONV_LIBRARIES}) -else() - find_package(Fontconfig QUIET) - if(NOT FONTCONFIG_FOUND AND ENABLE_FREETYPE) - message(FATAL_ERROR "fontconfig not found but plugin set as enabled") - elseif(NOT FONTCONFIG_FOUND) - message(STATUS "fontconfig not found, Freetype text plugin disabled") - return() - endif() - - set(text-freetype2_PLATFORM_SOURCES - find-font-unix.c) - - include_directories(${FONTCONFIG_INCLUDE_DIRS}) -endif() - -include_directories(${FREETYPE_INCLUDE_DIRS}) - -set(text-freetype2_SOURCES - find-font.h - obs-convenience.c - text-functionality.c - text-freetype2.c - obs-convenience.h - text-freetype2.h) - -add_library(text-freetype2 MODULE - ${text-freetype2_PLATFORM_SOURCES} - ${text-freetype2_SOURCES}) -target_link_libraries(text-freetype2 - libobs - ${text-freetype2_PLATFORM_DEPS} - ${FREETYPE_LIBRARIES}) -set_target_properties(text-freetype2 PROPERTIES FOLDER "plugins") - -if(NOT WIN32) - if(FONTCONFIG_FOUND) - target_link_libraries(text-freetype2 ${FONTCONFIG_LIBRARIES}) - endif() -endif() - -if(APPLE AND ICONV_FOUND) - target_link_libraries(text-freetype2 ${ICONV_LIBRARIES}) -endif() - -install_obs_plugin_with_data(text-freetype2 data) +setup_plugin_target(text-freetype2) diff --git a/plugins/vlc-video/CMakeLists.txt b/plugins/vlc-video/CMakeLists.txt index 09b858b59..f93fa2cdd 100644 --- a/plugins/vlc-video/CMakeLists.txt +++ b/plugins/vlc-video/CMakeLists.txt @@ -1,51 +1,38 @@ project(vlc-video) -if(DISABLE_VLC) - message(STATUS "VLC video plugin disabled") - return() +option(ENABLE_VLC "Build OBS with VLC plugin support" ${OS_LINUX}) +if(NOT ENABLE_VLC) + message(STATUS "OBS: DISABLED vlc-video") + message( + WARNING + "VLC plugin supported is not enabled by default - please switch ENABLE_VLC to ON to enable this functionality." + ) + return() endif() -if(ENABLE_VLC) - find_package(LibVLC REQUIRED) -else() - find_package(LibVLC) - if(NOT LibVLC_FOUND) - message(STATUS "VLC video plugin disabled") - return() - endif() +find_package(LibVLC REQUIRED) + +add_library(vlc-video MODULE) +add_library(OBS::vlc-video ALIAS vlc-video) + +target_sources(vlc-video PRIVATE vlc-video-plugin.c vlc-video-plugin.h + vlc-video-source.c) + +target_link_libraries(vlc-video PRIVATE OBS::libobs VLC::LibVLC) + +if(OS_WINDOWS) + if(MSVC) + target_link_libraries(vlc-video PRIVATE OBS::w32-pthreads) + endif() + + set(MODULE_DESCRIPTION "OBS VLC Plugin") + configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + vlc-video.rc) + + target_sources(vlc-video PRIVATE vlc-video.rc) + endif() -include_directories(${LIBVLC_INCLUDE_DIRS}) -add_definitions(${LIBVLC_DEFINITIONS}) +set_target_properties(vlc-video PROPERTIES FOLDER "plugins" PREFIX "") -if(MSVC) - set(vlc-video_PLATFORM_DEPS - w32-pthreads) -endif() - -set(vlc-video_HEADERS - vlc-video-plugin.h - ) - -set(vlc-video_SOURCES - vlc-video-plugin.c - vlc-video-source.c - ) - -if(WIN32) - set(MODULE_DESCRIPTION "OBS VLC module") - configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in vlc-video.rc) - list(APPEND vlc-video_SOURCES - vlc-video.rc) -endif() - -add_library(vlc-video MODULE - ${vlc-video_SOURCES} - ${vlc-video_HEADERS}) -# instead of linking vlc we load at runtime. -target_link_libraries(vlc-video - libobs - ${vlc-video_PLATFORM_DEPS}) -set_target_properties(vlc-video PROPERTIES FOLDER "plugins") - -install_obs_plugin_with_data(vlc-video data) +setup_plugin_target(vlc-video) diff --git a/plugins/win-capture/CMakeLists.txt b/plugins/win-capture/CMakeLists.txt index 7d22136fa..276ec562e 100644 --- a/plugins/win-capture/CMakeLists.txt +++ b/plugins/win-capture/CMakeLists.txt @@ -1,49 +1,50 @@ project(win-capture) -if(MSVC) - set(win-capture_PLATFORM_DEPS - w32-pthreads) -endif() +add_library(win-capture MODULE) +add_library(OBS::capture ALIAS win-capture) -set(win-capture_HEADERS - nt-stuff.h - obfuscate.h - app-helpers.h - hook-helpers.h - inject-library.h - cursor-capture.h - graphics-hook-info.h - graphics-hook-ver.h - window-helpers.h - dc-capture.h) +target_sources( + win-capture + PRIVATE plugin-main.c + app-helpers.c + app-helpers.h + cursor-capture.c + cursor-capture.h + dc-capture.c + dc-capture.h + duplicator-monitor-capture.c + game-capture.c + game-capture-file-init.c + graphics-hook-info.h + graphics-hook-ver.h + hook-helpers.h + inject-library.c + inject-library.h + load-graphics-offsets.c + monitor-capture.c + nt-stuff.c + nt-stuff.h + obfuscate.c + obfuscate.h + window-capture.c + window-helpers.c + window-helpers.h) -set(win-capture_SOURCES - dc-capture.c - obfuscate.c - app-helpers.c - inject-library.c - cursor-capture.c - game-capture.c - window-helpers.c - monitor-capture.c - window-capture.c - load-graphics-offsets.c - game-capture-file-init.c - duplicator-monitor-capture.c - plugin-main.c - nt-stuff.c) +target_link_libraries(win-capture PRIVATE OBS::libobs OBS::ipc-util Dwmapi) -add_library(win-capture MODULE - ${win-capture_SOURCES} - ${win-capture_HEADERS}) -target_link_libraries(win-capture - ${win-capture_PLATFORM_DEPS} - libobs - Dwmapi - ipc-util) set_target_properties(win-capture PROPERTIES FOLDER "plugins/win-capture") -install_obs_plugin_with_data(win-capture data) +if(MSVC) + target_link_libraries(win-capture PRIVATE OBS::w32-pthreads) +endif() + +target_compile_definitions( + win-capture PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + +set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "win-capture") + +setup_plugin_target(win-capture) add_subdirectory(graphics-hook) add_subdirectory(get-graphics-offsets) diff --git a/plugins/win-capture/get-graphics-offsets/CMakeLists.txt b/plugins/win-capture/get-graphics-offsets/CMakeLists.txt index f1a0b38d2..716526037 100644 --- a/plugins/win-capture/get-graphics-offsets/CMakeLists.txt +++ b/plugins/win-capture/get-graphics-offsets/CMakeLists.txt @@ -1,39 +1,37 @@ project(get-graphics-offsets) -set(get-graphics-offsets_HEADERS - ../graphics-hook-info.h - ../hook-helpers.h - get-graphics-offsets.h) +add_executable(get-graphics-offsets) -set(get-graphics-offsets_SOURCES - get-graphics-offsets.c - dxgi-offsets.cpp - d3d8-offsets.cpp - d3d9-offsets.cpp) +target_sources( + get-graphics-offsets + PRIVATE get-graphics-offsets.c + get-graphics-offsets.h + dxgi-offsets.cpp + d3d8-offsets.cpp + d3d9-offsets.cpp + ../graphics-hook-info.h + ../hook-helpers.h) + +target_include_directories(get-graphics-offsets + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) + +target_link_libraries(get-graphics-offsets d3d9.lib dxgi.lib d3d11.lib) if(MSVC) - add_compile_options($,/MTd,/MT>) + target_compile_options(get-graphics-offsets + PRIVATE "$,/MTd,/MT>") + add_target_resource( + get-graphics-offsets "$" + "obs-plugins/win-capture/") endif() -add_executable(get-graphics-offsets - ${get-graphics-offsets_SOURCES} - ${get-graphics-offsets_HEADERS}) +set_target_properties(get-graphics-offsets PROPERTIES FOLDER + "plugins/win-capture") +set_target_properties( + get-graphics-offsets + PROPERTIES OUTPUT_NAME + "get-graphics-offsets$,64,32>" +) -target_link_libraries(get-graphics-offsets - d3d9.lib - dxgi.lib - d3d11.lib) - -set_target_properties(get-graphics-offsets PROPERTIES FOLDER "plugins/win-capture") - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") -else() - set(_output_suffix "32") -endif() - -set_target_properties(get-graphics-offsets - PROPERTIES - OUTPUT_NAME "get-graphics-offsets${_output_suffix}") - -install_obs_datatarget(get-graphics-offsets "obs-plugins/win-capture") +add_target_resource(get-graphics-offsets "$" + "obs-plugins/win-capture/") diff --git a/plugins/win-capture/graphics-hook/CMakeLists.txt b/plugins/win-capture/graphics-hook/CMakeLists.txt index b4e6781c9..fbf63637e 100644 --- a/plugins/win-capture/graphics-hook/CMakeLists.txt +++ b/plugins/win-capture/graphics-hook/CMakeLists.txt @@ -1,79 +1,74 @@ project(graphics-hook) -set(COMPILE_D3D12_HOOK FALSE CACHE BOOL "Compile D3D12 hook support (required windows 10 SDK)") - find_package(Detours REQUIRED) find_package(Vulkan REQUIRED) -include_directories(${VULKAN_INCLUDE_DIR}) -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/graphics-hook-config.h.in" - "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h") +add_library(graphics-hook MODULE) +add_library(OBS::graphics-hook ALIAS graphics-hook) +target_sources( + graphics-hook + PRIVATE graphics-hook.c + graphics-hook.h + gl-capture.c + gl-decs.h + d3d8-capture.cpp + d3d9-capture.cpp + d3d9-patches.hpp + dxgi-capture.cpp + d3d10-capture.cpp + d3d11-capture.cpp + d3d12-capture.cpp + ../obfuscate.c + ../obfuscate.h + ../graphics-hook-ver.h + ../graphics-hook-info.h + ../hook-helpers.h + graphics-hook.rc) -set(graphics-hook_HEADERS - "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h" - graphics-hook.h - ../graphics-hook-ver.h - ../graphics-hook-info.h - ../hook-helpers.h - ../obfuscate.h - gl-decs.h - d3d9-patches.hpp) +target_include_directories(graphics-hook PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) -set(graphics-hook_SOURCES - graphics-hook.c - ../obfuscate.c - gl-capture.c - d3d8-capture.cpp - d3d9-capture.cpp - dxgi-capture.cpp - d3d10-capture.cpp - d3d11-capture.cpp - d3d12-capture.cpp) +target_link_libraries(graphics-hook PRIVATE OBS::ipc-util Detours::Detours + dxguid) if(MSVC) - add_compile_options("$,/MTd,/MT>") + target_compile_options(graphics-hook PRIVATE "$,/MTd,/MT>") + add_target_resource(graphics-hook "$" + "obs-plugins/win-capture/") endif() -if (VULKAN_FOUND) - list(APPEND graphics-hook_SOURCES - vulkan-capture.c) - list(APPEND graphics-hook_HEADERS - vulkan-capture.h) +set_target_properties( + graphics-hook + PROPERTIES FOLDER "plugins/win-capture" + OUTPUT_NAME + "graphics-hook$,64,32>") + +target_compile_definitions(graphics-hook PRIVATE COMPILE_D3D12_HOOK) + +if(TARGET Vulkan::Vulkan) + target_sources(graphics-hook PRIVATE vulkan-capture.c vulkan-capture.h) + + target_link_libraries(graphics-hook PRIVATE Vulkan::Vulkan) + + target_compile_definitions(graphics-hook PRIVATE COMPILE_VULKAN_HOOK) + + add_target_resource( + graphics-hook "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json" + "obs-plugins/win-capture/") + add_target_resource( + graphics-hook "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json" + "obs-plugins/win-capture/") + add_custom_command( + TARGET graphics-hook + POST_BUILD + COMMAND + "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json" + "${OBS_OUTPUT_DIR}/$/data/obs-plugins/win-capture/obs-vulkan64.json" + COMMAND + "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json" + "${OBS_OUTPUT_DIR}/$/data/obs-plugins/win-capture/obs-vulkan32.json" + VERBATIM) endif() -add_library(graphics-hook MODULE - graphics-hook.rc - ${graphics-hook_SOURCES} - ${graphics-hook_HEADERS}) - -target_include_directories(graphics-hook PUBLIC - ${DETOURS_INCLUDE_DIR} - "${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config") - -target_link_libraries(graphics-hook - dxguid - ipc-util - ${DETOURS_LIBRARIES}) - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") -else() - set(_output_suffix "32") -endif() - -set_target_properties(graphics-hook - PROPERTIES - FOLDER "plugins/win-capture" - OUTPUT_NAME "graphics-hook${_output_suffix}") - -if (VULKAN_FOUND) - add_custom_command(TARGET graphics-hook POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy - "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json" "${OBS_OUTPUT_DIR}/$/data/obs-plugins/win-capture/obs-vulkan64.json" - COMMAND "${CMAKE_COMMAND}" -E copy - "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json" "${OBS_OUTPUT_DIR}/$/data/obs-plugins/win-capture/obs-vulkan32.json" - VERBATIM) -endif() -install_obs_datatarget(graphics-hook "obs-plugins/win-capture") +add_target_resource(graphics-hook "$" + "obs-plugins/win-capture/") diff --git a/plugins/win-capture/graphics-hook/graphics-hook.c b/plugins/win-capture/graphics-hook/graphics-hook.c index 87ac4540d..c123db186 100644 --- a/plugins/win-capture/graphics-hook/graphics-hook.c +++ b/plugins/win-capture/graphics-hook/graphics-hook.c @@ -319,7 +319,7 @@ static inline bool attempt_hook(void) static bool d3d12_hooked = false; static bool dxgi_hooked = false; static bool gl_hooked = false; -#if COMPILE_VULKAN_HOOK +#ifdef COMPILE_VULKAN_HOOK static bool vulkan_hooked = false; if (!vulkan_hooked) { vulkan_hooked = hook_vulkan(); @@ -329,7 +329,7 @@ static inline bool attempt_hook(void) } #endif //COMPILE_VULKAN_HOOK -#if COMPILE_D3D12_HOOK +#ifdef COMPILE_D3D12_HOOK if (!d3d12_hooked) { d3d12_hooked = hook_d3d12(); } diff --git a/plugins/win-capture/graphics-hook/graphics-hook.h b/plugins/win-capture/graphics-hook/graphics-hook.h index db341a92e..f16b737d9 100644 --- a/plugins/win-capture/graphics-hook/graphics-hook.h +++ b/plugins/win-capture/graphics-hook/graphics-hook.h @@ -1,7 +1,5 @@ #pragma once -#include "graphics-hook-config.h" - #ifdef _MSC_VER /* conversion from data/function pointer */ #pragma warning(disable : 4152) @@ -53,7 +51,7 @@ extern bool hook_d3d9(void); extern bool hook_d3d12(void); extern bool hook_dxgi(void); extern bool hook_gl(void); -#if COMPILE_VULKAN_HOOK +#ifdef COMPILE_VULKAN_HOOK extern bool hook_vulkan(void); #endif @@ -62,7 +60,7 @@ extern void d3d10_free(void); extern void d3d11_capture(void *swap, void *backbuffer); extern void d3d11_free(void); -#if COMPILE_D3D12_HOOK +#ifdef COMPILE_D3D12_HOOK extern void d3d12_capture(void *swap, void *backbuffer); extern void d3d12_free(void); #endif diff --git a/plugins/win-capture/inject-helper/CMakeLists.txt b/plugins/win-capture/inject-helper/CMakeLists.txt index 353216751..d5d4d25f6 100644 --- a/plugins/win-capture/inject-helper/CMakeLists.txt +++ b/plugins/win-capture/inject-helper/CMakeLists.txt @@ -1,32 +1,24 @@ project(inject-helper) -set(inject-helper_HEADERS - ../inject-library.h - ../obfuscate.h) +add_executable(inject-helper) -set(inject-helper_SOURCES - ../inject-library.c - ../obfuscate.c - inject-helper.c) +target_sources( + inject-helper PRIVATE inject-helper.c ../inject-library.c ../inject-library.h + ../obfuscate.c ../obfuscate.h) + +target_include_directories(inject-helper PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) if(MSVC) - add_compile_options($,/MTd,/MT>) + target_compile_options(inject-helper PRIVATE "$,/MTd,/MT>") + add_target_resource(inject-helper "$" + "obs-plugins/win-capture/") endif() -add_executable(inject-helper - ${inject-helper_SOURCES}) +set_target_properties( + inject-helper + PROPERTIES FOLDER "plugins/win-capture" + OUTPUT_NAME + "inject-helper$,64,32>") -target_link_libraries(inject-helper) - -if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") -else() - set(_output_suffix "32") -endif() - -set_target_properties(inject-helper - PROPERTIES - FOLDER "plugins/win-capture" - OUTPUT_NAME "inject-helper${_output_suffix}") - -install_obs_datatarget(inject-helper "obs-plugins/win-capture") +add_target_resource(inject-helper "$" + "obs-plugins/win-capture/") diff --git a/plugins/win-dshow/CMakeLists.txt b/plugins/win-dshow/CMakeLists.txt index 55bcdf2c5..6d3c095cb 100644 --- a/plugins/win-dshow/CMakeLists.txt +++ b/plugins/win-dshow/CMakeLists.txt @@ -1,152 +1,188 @@ if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/dshowcapture.hpp") - message(STATUS "libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled.") - return() + message( + FATAL_ERROR + "OBS: libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled." + ) + return() +endif() + +option(ENABLE_VIRTUALCAM "Enable building with Virtual Camera (Windows)" ON) + +if(NOT ENABLE_VIRTUALCAM) + message(STATUS "OBS: DISABLED Windows Virtual Camera") +endif() + +if(ENABLE_VIRTUALCAM AND NOT VIRTUALCAM_GUID) + set(VIRTUALCAM_GUID + "" + CACHE STRING "Virtual Camera GUID" FORCE) + mark_as_advanced(VIRTUALCAM_GUID) endif() project(win-dshow) find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil) -include_directories(${FFMPEG_INCLUDE_DIRS}) -set(win-dshow_HEADERS - encode-dstr.hpp - ffmpeg-decode.h) +add_library(win-dshow MODULE) +add_library(OBS::dshow ALIAS win-dshow) + +target_sources( + win-dshow PRIVATE encode-dstr.hpp win-dshow.cpp win-dshow-encoder.cpp + dshow-plugin.cpp ffmpeg-decode.c ffmpeg-decode.h) + +add_library(libdshowcapture INTERFACE) +add_library(OBS::libdshowcapture ALIAS libdshowcapture) + +target_sources( + libdshowcapture + INTERFACE libdshowcapture/dshowcapture.hpp + libdshowcapture/source/capture-filter.cpp + libdshowcapture/source/capture-filter.hpp + libdshowcapture/source/output-filter.cpp + libdshowcapture/source/output-filter.hpp + libdshowcapture/source/dshowcapture.cpp + libdshowcapture/source/dshowencode.cpp + libdshowcapture/source/device.cpp + libdshowcapture/source/device.hpp + libdshowcapture/source/encoder.cpp + libdshowcapture/source/encoder.hpp + libdshowcapture/source/dshow-base.cpp + libdshowcapture/source/dshow-base.hpp + libdshowcapture/source/dshow-demux.cpp + libdshowcapture/source/dshow-demux.hpp + libdshowcapture/source/dshow-device-defs.hpp + libdshowcapture/source/dshow-enum.cpp + libdshowcapture/source/dshow-enum.hpp + libdshowcapture/source/dshow-formats.cpp + libdshowcapture/source/dshow-formats.hpp + libdshowcapture/source/dshow-media-type.cpp + libdshowcapture/source/dshow-encoded-device.cpp + libdshowcapture/source/dshow-media-type.hpp + libdshowcapture/source/log.cpp + libdshowcapture/source/log.hpp + libdshowcapture/source/external/IVideoCaptureFilter.h) + +target_include_directories( + libdshowcapture INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture) set(MODULE_DESCRIPTION "OBS DirectShow module") -set(VIRTUALCAM_GUID "" CACHE STRING "VirtualCam GUID") +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-dshow.rc) -set(VIRTUALCAM_ENABLED FALSE) +target_sources(win-dshow PRIVATE win-dshow.rc) + +target_compile_definitions( + win-dshow PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) + +set(VIRTUALCAM_AVAILABLE OFF) if(VIRTUALCAM_GUID STREQUAL "") - message(STATUS "VirtualCam GUID not set! VirtualCam disabled.") + message( + WARNING + "OBS: DISABLED Windows Virtual Camera - GUID not set - specify as 'VIRTUALCAM_GUID' to enable." + ) else() - set(INVALID_GUID TRUE) + set(INVALID_GUID ON) - string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID}) + string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID}) - list(LENGTH GUID_VALS GUID_VAL_COUNT) - if(GUID_VAL_COUNT EQUAL 5) - string(REPLACE ";" "0" GUID_HEX ${GUID_VALS}) - string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX}) - if(GUID_ACTUAL_HEX STREQUAL GUID_HEX) - list(GET GUID_VALS 0 GUID_VALS_DATA1) - list(GET GUID_VALS 1 GUID_VALS_DATA2) - list(GET GUID_VALS 2 GUID_VALS_DATA3) - list(GET GUID_VALS 3 GUID_VALS_DATA4) - list(GET GUID_VALS 4 GUID_VALS_DATA5) - string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH) - string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH) - string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH) - string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH) - string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH) - if(GUID_VALS_DATA1_LENGTH EQUAL 8 AND - GUID_VALS_DATA2_LENGTH EQUAL 4 AND - GUID_VALS_DATA3_LENGTH EQUAL 4 AND - GUID_VALS_DATA4_LENGTH EQUAL 4 AND - GUID_VALS_DATA5_LENGTH EQUAL 12) - set(GUID_VAL01 ${GUID_VALS_DATA1}) - set(GUID_VAL02 ${GUID_VALS_DATA2}) - set(GUID_VAL03 ${GUID_VALS_DATA3}) - string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04) - string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05) - string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06) - string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07) - string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08) - string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09) - string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10) - string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11) - set(VIRTUALCAM_ENABLED TRUE) - set(INVALID_GUID FALSE) - endif() - endif() - endif() + list(LENGTH GUID_VALS GUID_VAL_COUNT) + if(GUID_VAL_COUNT EQUAL 5) + string(REPLACE ";" "0" GUID_HEX ${GUID_VALS}) + string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX}) + if(GUID_ACTUAL_HEX STREQUAL GUID_HEX) + list(GET GUID_VALS 0 GUID_VALS_DATA1) + list(GET GUID_VALS 1 GUID_VALS_DATA2) + list(GET GUID_VALS 2 GUID_VALS_DATA3) + list(GET GUID_VALS 3 GUID_VALS_DATA4) + list(GET GUID_VALS 4 GUID_VALS_DATA5) + string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH) + string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH) + string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH) + string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH) + string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH) + if(GUID_VALS_DATA1_LENGTH EQUAL 8 + AND GUID_VALS_DATA2_LENGTH EQUAL 4 + AND GUID_VALS_DATA3_LENGTH EQUAL 4 + AND GUID_VALS_DATA4_LENGTH EQUAL 4 + AND GUID_VALS_DATA5_LENGTH EQUAL 12) + set(GUID_VAL01 ${GUID_VALS_DATA1}) + set(GUID_VAL02 ${GUID_VALS_DATA2}) + set(GUID_VAL03 ${GUID_VALS_DATA3}) + string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04) + string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05) + string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06) + string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07) + string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08) + string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09) + string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10) + string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11) + set(VIRTUALCAM_AVAILABLE ON) + set(INVALID_GUID OFF) + endif() + endif() + endif() endif() if(INVALID_GUID) - message(WARNING "Invalid VirtualCam GUID! VirtualCam disabled.") + message( + WARNING "OBS: DISABLED Windows Virtual Camera - invalid GUID supplied") endif() -if(VIRTUALCAM_ENABLED) - add_definitions(-DVIRTUALCAM_ENABLED) -endif() +target_link_libraries( + win-dshow + PRIVATE OBS::libobs + OBS::w32-pthreads + OBS::libdshowcapture + setupapi + strmiids + ksuser + winmm + wmcodecdspuuid + FFmpeg::avcodec + FFmpeg::avutil) -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-dshow.rc) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-guid.h) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) +file(GLOB _LIBOBS_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.c + ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.cpp) +file(GLOB _LIBOBS_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.hpp) -set(win-dshow_SOURCES - win-dshow.cpp - win-dshow-encoder.cpp - dshow-plugin.cpp - ffmpeg-decode.c - win-dshow.rc) +source_group("libdshowcapture\\Source Files" FILES ${_LIBOBS_SOURCE_FILES}) +source_group("libdshowcapture\\Header Files" FILES ${_LIBOBS_HEADER_FILES}) -if(VIRTUALCAM_ENABLED) - set(virtualcam-output_SOURCES - tiny-nv12-scale.c - shared-memory-queue.c - virtualcam.c) - set(virtualcam-output_HEADERS - tiny-nv12-scale.h - shared-memory-queue.h) -endif() - -set(libdshowcapture_SOURCES - libdshowcapture/source/capture-filter.cpp - libdshowcapture/source/output-filter.cpp - libdshowcapture/source/dshowcapture.cpp - libdshowcapture/source/dshowencode.cpp - libdshowcapture/source/device.cpp - libdshowcapture/source/encoder.cpp - libdshowcapture/source/dshow-base.cpp - libdshowcapture/source/dshow-demux.cpp - libdshowcapture/source/dshow-enum.cpp - libdshowcapture/source/dshow-formats.cpp - libdshowcapture/source/dshow-media-type.cpp - libdshowcapture/source/dshow-encoded-device.cpp - libdshowcapture/source/log.cpp) - -set(libdshowcapture_HEADERS - libdshowcapture/dshowcapture.hpp - libdshowcapture/source/external/IVideoCaptureFilter.h - libdshowcapture/source/capture-filter.hpp - libdshowcapture/source/output-filter.hpp - libdshowcapture/source/device.hpp - libdshowcapture/source/encoder.hpp - libdshowcapture/source/dshow-base.hpp - libdshowcapture/source/dshow-demux.hpp - libdshowcapture/source/dshow-device-defs.hpp - libdshowcapture/source/dshow-enum.hpp - libdshowcapture/source/dshow-formats.hpp - libdshowcapture/source/dshow-media-type.hpp - libdshowcapture/source/log.hpp) - -add_library(win-dshow MODULE - ${win-dshow_SOURCES} - ${win-dshow_HEADERS} - ${virtualcam-output_SOURCES} - ${virtualcam-output_HEADERS} - ${libdshowcapture_SOURCES} - ${libdshowcapture_HEADERS}) -target_link_libraries(win-dshow - libobs - setupapi - strmiids - ksuser - winmm - wmcodecdspuuid - w32-pthreads - ${FFMPEG_LIBRARIES}) set_target_properties(win-dshow PROPERTIES FOLDER "plugins/win-dshow") -source_group("libdshowcapture\\Source Files" FILES ${libdshowcapture_SOURCES}) -source_group("libdshowcapture\\Header Files" FILES ${libdshowcapture_HEADERS}) +setup_plugin_target(win-dshow) -install_obs_plugin_with_data(win-dshow data) +if(ENABLE_VIRTUALCAM AND VIRTUALCAM_AVAILABLE) + target_sources( + win-dshow PRIVATE tiny-nv12-scale.c tiny-nv12-scale.h shared-memory-queue.c + shared-memory-queue.h virtualcam.c) -if(VIRTUALCAM_ENABLED) - configure_file(virtualcam-install.bat.in "${CMAKE_CURRENT_BINARY_DIR}/data/virtualcam-install.bat") - configure_file(virtualcam-uninstall.bat.in "${CMAKE_CURRENT_BINARY_DIR}/data/virtualcam-uninstall.bat") - install_obs_data_from_abs_path(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/data" "obs-plugins/win-dshow") - add_subdirectory(virtualcam-module) + target_compile_definitions(win-dshow PRIVATE VIRTUALCAM_AVAILABLE) + + target_include_directories(win-dshow + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in + ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h) + + target_sources(win-dshow + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h) + + configure_file(virtualcam-install.bat.in + "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat") + + configure_file(virtualcam-uninstall.bat.in + "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat") + + add_target_resource( + win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat" + "obs-plugins/win-dshow/") + add_target_resource( + win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat" + "obs-plugins/win-dshow/") + + add_subdirectory(virtualcam-module) endif() diff --git a/plugins/win-dshow/dshow-plugin.cpp b/plugins/win-dshow/dshow-plugin.cpp index 2891692a1..b31d002cc 100644 --- a/plugins/win-dshow/dshow-plugin.cpp +++ b/plugins/win-dshow/dshow-plugin.cpp @@ -1,7 +1,9 @@ #include #include #include +#ifdef VIRTUALCAM_AVAILABLE #include "virtualcam-guid.h" +#endif OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("win-dshow", "en-US") @@ -13,7 +15,7 @@ MODULE_EXPORT const char *obs_module_description(void) extern void RegisterDShowSource(); extern void RegisterDShowEncoders(); -#ifdef VIRTUALCAM_ENABLED +#ifdef VIRTUALCAM_AVAILABLE extern "C" struct obs_output_info virtualcam_info; static bool vcam_installed(bool b64) @@ -42,7 +44,7 @@ bool obs_module_load(void) { RegisterDShowSource(); RegisterDShowEncoders(); -#ifdef VIRTUALCAM_ENABLED +#ifdef VIRTUALCAM_AVAILABLE obs_register_output(&virtualcam_info); bool installed = vcam_installed(false); diff --git a/plugins/win-dshow/virtualcam-guid.h.in b/plugins/win-dshow/virtualcam-guid.h.in index fd06b6417..c7ae40471 100644 --- a/plugins/win-dshow/virtualcam-guid.h.in +++ b/plugins/win-dshow/virtualcam-guid.h.in @@ -3,7 +3,7 @@ #include #include -#ifdef VIRTUALCAM_ENABLED +#ifdef VIRTUALCAM_AVAILABLE DEFINE_GUID(CLSID_OBS_VirtualVideo, 0x@GUID_VAL01@, 0x@GUID_VAL02@, diff --git a/plugins/win-dshow/virtualcam-module/CMakeLists.txt b/plugins/win-dshow/virtualcam-module/CMakeLists.txt index b4e99b642..82b79aecb 100644 --- a/plugins/win-dshow/virtualcam-module/CMakeLists.txt +++ b/plugins/win-dshow/virtualcam-module/CMakeLists.txt @@ -2,84 +2,87 @@ cmake_minimum_required(VERSION 3.5) project(obs-virtualcam-module) if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(_output_suffix "64") + set(_output_suffix "64") else() - set(_output_suffix "32") + set(_output_suffix "32") endif() -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in" - "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def") +add_library(obs-virtualcam-module MODULE) +add_library(OBS::virtualcam-module ALIAS obs-virtualcam-module) + +target_sources( + obs-virtualcam-module + PRIVATE sleepto.c + sleepto.h + placeholder.cpp + virtualcam-module.cpp + virtualcam-filter.cpp + virtualcam-filter.hpp + virtualcam-module.rc + ../shared-memory-queue.c + ../shared-memory-queue.h + ../tiny-nv12-scale.c + ../tiny-nv12-scale.h) + +target_include_directories(obs-virtualcam-module + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..) set(MODULE_DESCRIPTION "OBS Virtual Camera output module") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in virtualcam-module.rc) -include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + virtualcam-module.rc) -set(libdshowcapture_SOURCES - ../libdshowcapture/source/log.cpp - ../libdshowcapture/source/dshow-base.cpp - ../libdshowcapture/source/dshow-enum.cpp - ../libdshowcapture/source/dshow-formats.cpp - ../libdshowcapture/source/dshow-media-type.cpp - ../libdshowcapture/source/output-filter.cpp - ) +target_sources(obs-virtualcam-module PRIVATE virtualcam-module.rc) -set(libdshowcapture_HEADERS - ../libdshowcapture/source/ComPtr.hpp - ../libdshowcapture/source/CoTaskMemPtr.hpp - ../libdshowcapture/source/log.hpp - ../libdshowcapture/source/dshow-base.hpp - ../libdshowcapture/source/dshow-enum.hpp - ../libdshowcapture/source/dshow-formats.hpp - ../libdshowcapture/source/dshow-media-type.hpp - ../libdshowcapture/source/output-filter.hpp - ../libdshowcapture/dshowcapture.hpp - ) +target_link_libraries( + obs-virtualcam-module PRIVATE OBS::libdshowcapture setupapi winmm strmiids + gdiplus) -set(obs-virtualcam-module_SOURCES - "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def" - sleepto.c - placeholder.cpp - virtualcam-module.cpp - virtualcam-filter.cpp - virtualcam-module.rc - ../shared-memory-queue.c - ../tiny-nv12-scale.c - ) +target_link_options(obs-virtualcam-module PRIVATE "LINKER:/ignore:4104") -set(obs-virtualcam-module_HEADERS - sleepto.h - virtualcam-filter.hpp - ../shared-memory-queue.h - ../tiny-nv12-scale.h - ) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in + ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def) + +target_sources(obs-virtualcam-module + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def) + +target_include_directories(obs-virtualcam-module + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../config) + +target_compile_definitions( + obs-virtualcam-module + PRIVATE VIRTUALCAM_AVAILABLE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS + _CRT_NONSTDC_NO_WARNINGS) if(MSVC) - add_compile_options("$,/MTd,/MT>") + target_compile_options(obs-virtualcam-module + PRIVATE "$,/MTd,/MT>") + add_target_resource( + obs-virtualcam-module "$" + "obs-plugins/win-dshow/") + endif() -include_directories(${CMAKE_SOURCE_DIR}/libobs/util) +get_target_property(_LIBDSHOW_SOURCES OBS::libdshowcapture INTERFACE_SOURCES) -source_group("libdshowcapture\\Source Files" FILES ${libdshowcapture_SOURCES}) -source_group("libdshowcapture\\Header Files" FILES ${libdshowcapture_HEADERS}) +foreach(_LIBDSHOW_SOURCE ${_LIBDSHOW_SOURCES}) + get_filename_component(_EXT ${_LIBDSHOW_SOURCE} EXT) + if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h") + source_group("libdshowcapture\\Header Files" FILES ${_LIBDSHOW_SOURCE}) + elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c") + source_group("libdshowcapture\\Source Files" FILES ${_LIBDSHOW_SOURCE}) + endif() +endforeach() +unset(_LIBDSHOW_SOURCE) +unset(_LIBDSHOW_SOURCES) -set(CMAKE_MODULE_LINKER_FLAGS "${MAKE_MODULE_LINKER_FLAGS} /ignore:4104") +set_target_properties(obs-virtualcam-module PROPERTIES FOLDER + "plugins/win-dshow") -add_library(obs-virtualcam-module MODULE - ${libdshowcapture_SOURCES} - ${libdshowcapture_HEADERS} - ${obs-virtualcam-module_SOURCES} - ${obs-virtualcam-module_HEADERS}) -target_link_libraries(obs-virtualcam-module - setupapi - winmm - strmiids - gdiplus - ) -set_target_properties(obs-virtualcam-module PROPERTIES FOLDER "plugins/win-dshow") +set_target_properties( + obs-virtualcam-module PROPERTIES OUTPUT_NAME + "obs-virtualcam-module${_output_suffix}") -set_target_properties(obs-virtualcam-module - PROPERTIES - OUTPUT_NAME "obs-virtualcam-module${_output_suffix}") -install_obs_datatarget(obs-virtualcam-module "obs-plugins/win-dshow") +add_target_resource( + obs-virtualcam-module "$" + "obs-plugins/win-dshow/") diff --git a/plugins/win-ivcam/CMakeLists.txt b/plugins/win-ivcam/CMakeLists.txt index a202d976a..b3713a74c 100644 --- a/plugins/win-ivcam/CMakeLists.txt +++ b/plugins/win-ivcam/CMakeLists.txt @@ -1,64 +1,62 @@ -project(win-ivcam) +option(ENABLE_IVCAM "Enable building with Realsense camera support" OFF) -if(DISABLE_IVCAM) - message(STATUS "Realsense camera plugin disabled") - return() +if(NOT ENABLE_IVCAM) + message(STATUS "OBS: DISABLED Realsense camera plugin support") + return() endif() -find_package(RSSDK QUIET) -if(NOT RSSDK_FOUND AND ENABLE_IVCAM) - message(FATAL_ERROR "RSSDK not found, but the realsense camera plugin is set as enabled") -elseif(NOT RSSDK_FOUND) - message(STATUS "RSSDK not found, Realsense camera plugin disabled") - return() +project(win-ivcam) + +find_package(RSSDK REQUIRED) + +if(NOT TARGET RSS::SDK) + message(FATAL_ERROR "OBS: - RSSDK not found") endif() include(IDLFileHelper) -set(win-ivcam_seg_library_IDLS - seg_service/seg_service.idl - ) +add_library(win-ivcam MODULE) +add_library(OBS::ivcam ALIAS win-ivcam) -add_idl_files(win-ivcam_seg_library_GENERATED_FILES - ${win-ivcam_seg_library_IDLS}) +add_library(seglibrary INTERFACE) +add_library(Intel::seglibrary ALIAS seglibrary) -include_directories( - ${CMAKE_CURRENT_BINARY_DIR} - ) +add_idl_files(win-ivcam_seg_library_GENERATED_FILES seg_service/seg_service.idl) -set(win-ivcam_seg_library_HEADERS - seg_library/Dependencies.h - seg_library/SegImage.h - seg_library/SegServer.h - seg_library/SegServerImpl.h - seg_library/SegService.h - ) -set(win-ivcam_seg_library_SOURCES - seg_library/SerServer.cpp - seg_library/SegServerImpl.cpp - seg_library/SegImage.cpp - ${win-ivcam_seg_library_GENERATED_FILES} - ) +target_sources( + seglibrary + INTERFACE seg_library/Dependencies.h + seg_library/SerServer.cpp + seg_library/SegServer.h + seg_library/SegServerImpl.cpp + seg_library/SegServerImpl.h + seg_library/SegService.h + seg_library/SegImage.cpp + seg_library/SegImage.h + ${win-ivcam_seg_library_GENERATED_FILES}) set(MODULE_DESCRIPTION "OBS Intel(R) RealSense(TM) module") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-ivcam.rc) -set(win-ivcam_SOURCES - realsense.cpp - win-ivcam.rc) -source_group("seg_library\\Source Files" FILES ${win-ivcam_seg_library_SOURCES}) -source_group("seg_library\\Header Files" FILES ${win-ivcam_seg_library_HEADERS}) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-ivcam.rc) -add_library(win-ivcam MODULE - ${win-ivcam_seg_library_HEADERS} - ${win-ivcam_seg_library_SOURCES} - ${win-ivcam_SOURCES} - ) -target_link_libraries(win-ivcam - libobs) +target_sources(win-ivcam PRIVATE realsense.cpp win-ivcam.rc) -install_obs_plugin(win-ivcam) +target_link_libraries(win-ivcam OBS::libobs Intel::seglibrary) + +get_target_property(_SEGLIBRARY_SOURCES INTEL::seglibrary INTERFACE_SOURCES) + +foreach(_SEGLIBRARY_SOURCE ${_SEGLIBRARY_SOURCES}) + get_filename_component(_EXT ${_SEGLIBRARY_SOURCE} EXT) + if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h") + source_group("seg_library\\Header Files" FILES ${_SEGLIBRARY_SOURCE}) + elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c") + source_group("seg_library\\Source Files" FILES ${_SEGLIBRARY_SOURCE}) + endif() +endforeach() if(CMAKE_SIZEOF_VOID_P EQUAL 4) - add_subdirectory(seg_service) + add_subdirectory(seg_service) endif() + +setup_plugin_target(win-ivcam) diff --git a/plugins/win-ivcam/seg_service/CMakeLists.txt b/plugins/win-ivcam/seg_service/CMakeLists.txt index f74763983..f262f2870 100644 --- a/plugins/win-ivcam/seg_service/CMakeLists.txt +++ b/plugins/win-ivcam/seg_service/CMakeLists.txt @@ -1,46 +1,37 @@ project(seg_service) +find_package(RSSDK REQUIRED) + +if(NOT TARGET RSS::SDK) + message(FATAL_ERROR "OBS: - RSSDK not found") +endif() + include(IDLFileHelper) -set(seg_service_IDLS - seg_service.idl - ) +add_executable(seg_service WIN32) -add_idl_files_with_tlb(seg_service_GENERATED_FILES - ${seg_service_IDLS}) +target_sources( + seg_service + PRIVATE SegProc.rgs + seg_service.rgs + seg_service.cpp + SegProc.cpp + stdafx.cpp + seg_service.rc + resource.h + SegProc.h + stdafx.h + targetver.h + xdlldata.h) -include_directories( - ${RSSDK_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} - ) +add_idl_files_with_tlb(seg_service_GENERATED_FILES seg_service.idl) -set(seg_service_HEADERS - resource.h - SegProc.h - stdafx.h - targetver.h - xdlldata.h - ) +get_target_property(_RSSSDK_INCLUDE_DIRECTORY RSS::SDK + INTERFACE_INCLUDE_DIRECTORIES) -set(seg_service_SOURCES - SegProc.rgs - seg_service.rgs - seg_service.cpp - SegProc.cpp - stdafx.cpp - seg_service.rc - ${seg_service_GENERATED_FILES} - ) +target_include_directories(seg_service PRIVATE ${_RSSSDK_INCLUDE_DIRECTORY}) if(MSVC) - add_compile_options($,/MTd,/MT>) + target_compile_definitions(seg_service + PRIVATE "$,/MTd,/MT>") endif() - -add_executable(seg_service WIN32 - ${seg_service_SOURCES} - ${seg_service_HEADERS}) - -target_link_libraries(seg_service - ) - -install_obs_datatarget(seg_service "obs-plugins/win-ivcam") diff --git a/plugins/win-mf/CMakeLists.txt b/plugins/win-mf/CMakeLists.txt index bffb0f03b..e08b20c93 100644 --- a/plugins/win-mf/CMakeLists.txt +++ b/plugins/win-mf/CMakeLists.txt @@ -1,64 +1,49 @@ +option(ENABLE_WINMF "Enable building with deprecated win-mf plugin" OFF) +mark_as_advanced(ENABLE_WINMF) + project(win-mf) -set(ENABLE_WINMF FALSE CACHE BOOL "Enables the now deprecated win-mf plugin") - -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/mf-config.hpp.in" - "${CMAKE_CURRENT_BINARY_DIR}/mf-config.hpp") - -set(win-mf_config_HEADERS - "${CMAKE_CURRENT_BINARY_DIR}/mf-config.hpp") +add_library(win-mf MODULE) +add_library(OBS::win-mf ALIAS win-mf) set(MODULE_DESCRIPTION "OBS Windows Media Foundations H.264/AAC encoder") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-mf.rc) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-mf.rc) + +target_sources(win-mf PRIVATE win-mf.rc) + if(ENABLE_WINMF) - set(win-mf_SOURCES - mf-plugin.cpp - mf-aac.cpp - mf-aac-encoder.cpp - mf-common.cpp - mf-encoder-descriptor.cpp - mf-h264.cpp - mf-h264-encoder.cpp - win-mf.rc) + target_sources( + win-mf + PRIVATE mf-plugin.cpp + mf-aac.cpp + mf-aac-encoder.cpp + mf-aac-encoder.hpp + mf-common.cpp + mf-common.hpp + mf-encoder-descriptor.cpp + mf-encoder-descriptor.hpp + mf-h264.cpp + mf-h264-encoder.cpp + mf-h264-encoder.hpp) - set(win-mf_HEADERS - mf-common.hpp - mf-encoder-descriptor.hpp - mf-aac-encoder.hpp - mf-h264-encoder.hpp) + target_link_libraries( + win-mf + PRIVATE d3d9 + dxva2 + uuid + mfplat + mfuuid + mf + wmcodecdspuuid) - set(win-mf_DEPS - d3d9 - dxva2 - uuid - mfplat - mfuuid - mf - wmcodecdspuuid) + target_compile_definitions(win-mf PRIVATE ENABLE_WINMF) else() - set(win-mf_SOURCES - mf-plugin.cpp - win-mf.rc) + target_sources(win-mf PRIVATE mf-plugin.cpp win-mf.rc) endif() -add_library(win-mf MODULE - ${win-mf_config_HEADERS} - ${win-mf_SOURCES} - ${win-mf_HEADERS}) - -target_link_libraries(win-mf - ${win-mf_DEPS} - libobs) - -target_include_directories(win-mf - PUBLIC - "$") +target_link_libraries(win-mf PRIVATE OBS::libobs) set_target_properties(win-mf PROPERTIES FOLDER "plugins") -if(ENABLE_WINMF) - install_obs_plugin_with_data(win-mf data) -else() - install_obs_plugin(win-mf) -endif() +setup_plugin_target(win-mf) diff --git a/plugins/win-mf/mf-plugin.cpp b/plugins/win-mf/mf-plugin.cpp index 10baa2b95..578befe79 100644 --- a/plugins/win-mf/mf-plugin.cpp +++ b/plugins/win-mf/mf-plugin.cpp @@ -1,7 +1,6 @@ #include -#include "mf-config.hpp" -#if ENABLE_WINMF +#ifdef ENABLE_WINMF #include #include "mf-common.hpp" @@ -12,7 +11,7 @@ extern void RegisterMFH264Encoders(); extern "C" bool obs_module_load(void) { -#if ENABLE_WINMF +#ifdef ENABLE_WINMF MFStartup(MF_VERSION, MFSTARTUP_FULL); RegisterMFAACEncoder(); @@ -24,7 +23,7 @@ extern "C" bool obs_module_load(void) extern "C" void obs_module_unload(void) { -#if ENABLE_WINMF +#ifdef ENABLE_WINMF MFShutdown(); #endif } @@ -35,6 +34,6 @@ MODULE_EXPORT const char *obs_module_description(void) return "Windows Media Foundations H.264/AAC encoder"; } -#if ENABLE_WINMF +#ifdef ENABLE_WINMF OBS_MODULE_USE_DEFAULT_LOCALE("win-mf", "en-US") #endif diff --git a/plugins/win-wasapi/CMakeLists.txt b/plugins/win-wasapi/CMakeLists.txt index 4a5542960..f60392bc7 100644 --- a/plugins/win-wasapi/CMakeLists.txt +++ b/plugins/win-wasapi/CMakeLists.txt @@ -1,22 +1,20 @@ project(win-wasapi) -set(win-wasapi_HEADERS - enum-wasapi.hpp) +add_library(win-wasapi MODULE) +add_library(OBS::wasapi ALIAS win-wasapi) + +target_sources(win-wasapi PRIVATE win-wasapi.cpp enum-wasapi.cpp + enum-wasapi.hpp plugin-main.cpp) set(MODULE_DESCRIPTION "OBS WASAPI module") -configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-wasapi.rc) -set(win-wasapi_SOURCES - win-wasapi.cpp - enum-wasapi.cpp - plugin-main.cpp - win-wasapi.rc) -add_library(win-wasapi MODULE - ${win-wasapi_SOURCES} - ${win-wasapi_HEADERS}) -target_link_libraries(win-wasapi - Avrt - libobs) +configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in + win-wasapi.rc) + +target_sources(win-wasapi PRIVATE win-wasapi.rc) + +target_link_libraries(win-wasapi PRIVATE OBS::libobs Avrt) + set_target_properties(win-wasapi PROPERTIES FOLDER "plugins") -install_obs_plugin_with_data(win-wasapi data) +setup_plugin_target(win-wasapi) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 45a5543b9..8e5dd867b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,16 +1,15 @@ - if(BUILD_TESTS) - add_subdirectory(test-input) + add_subdirectory(test-input) - if(WIN32) - add_subdirectory(win) - endif() + if(OS_WINDOWS) + add_subdirectory(win) + endif() - if(APPLE AND UNIX) - add_subdirectory(osx) - endif() + if(OS_POSIX) + add_subdirectory(osx) + endif() endif() -if (ENABLE_UNIT_TESTS) - add_subdirectory(cmocka) +if(ENABLE_UNIT_TESTS) + add_subdirectory(cmocka) endif() diff --git a/test/cmocka/CMakeLists.txt b/test/cmocka/CMakeLists.txt index 775e1e88f..d31da02b3 100644 --- a/test/cmocka/CMakeLists.txt +++ b/test/cmocka/CMakeLists.txt @@ -1,50 +1,23 @@ project(obs-cmocka) -# Fix libobs path -macro(fixLink target_arg) - if(APPLE AND UNIX) - add_custom_command (TARGET ${target_arg} - POST_BUILD COMMAND "${CMAKE_INSTALL_NAME_TOOL}" - "-change" "@rpath/libobs.0.dylib" "@executable_path/../../libobs/libobs.0.dylib" - "$" VERBATIM) - add_custom_command (TARGET ${target_arg} - POST_BUILD COMMAND "${CMAKE_INSTALL_NAME_TOOL}" - "-add_rpath" /tmp/obsdeps/lib - "$" VERBATIM) - endif() -endmacro() - -set(CMAKE_MACOSX_RPATH TRUE) -set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) -list(APPEND CMAKE_INSTALL_RPATH "@loader_path/" "@executable_path/") - find_package(CMocka CONFIG REQUIRED) -include_directories(${CMOCKA_INCLUDE_DIR}) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") - -# fix rpath on linux -if (UNIX AND NOT APPLE) - set(CMAKE_INSTALL_RPATH "$ORIGIN";../../libobs) -endif() # Serializer test add_executable(test_serializer test_serializer.c) -target_link_libraries(test_serializer ${CMOCKA_LIBRARIES} libobs) - +target_include_directories(test_serializer PRIVATE ${CMOCKA_INCLUDE_DIR}) +target_link_libraries(test_serializer PRIVATE OBS::libobs ${CMOCKA_LIBRARIES}) add_test(test_serializer ${CMAKE_CURRENT_BINARY_DIR}/test_serializer) -fixLink(test_serializer) - # darray test add_executable(test_darray test_darray.c) -target_link_libraries(test_darray ${CMOCKA_LIBRARIES} libobs) +target_include_directories(test_darray PRIVATE ${CMOCKA_INCLUDE_DIR}) +target_link_libraries(test_darray PRIVATE OBS::libobs ${CMOCKA_LIBRARIES}) add_test(test_darray ${CMAKE_CURRENT_BINARY_DIR}/test_darray) -fixLink(test_darray) # bitstream test add_executable(test_bitstream test_bitstream.c) -target_link_libraries(test_bitstream ${CMOCKA_LIBRARIES} libobs) +target_include_directories(test_bitstream PRIVATE ${CMOCKA_INCLUDE_DIR}) +target_link_libraries(test_bitstream PRIVATE OBS::libobs ${CMOCKA_LIBRARIES}) add_test(test_bitstream ${CMAKE_CURRENT_BINARY_DIR}/test_bitstream) -fixLink(test_bitstream) diff --git a/test/osx/CMakeLists.txt b/test/osx/CMakeLists.txt index 862acdc5e..cc6c1c8d7 100644 --- a/test/osx/CMakeLists.txt +++ b/test/osx/CMakeLists.txt @@ -1,19 +1,18 @@ project(osx-text) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") - find_library(COCOA Cocoa) -include_directories(${COCOA}) +mark_as_advanced(COCOA) -add_definitions(-fobjc-arc) +add_executable(macOS_test) -set(osx-test_SOURCES - test.mm) +target_sources(macOS_test PRIVATE test.mm) -add_executable(osx_test - ${osx-test_SOURCES}) -set_target_properties(osx_test PROPERTIES FOLDER "tests and examples") -target_link_libraries(osx_test - libobs - ${COCOA}) -define_graphic_modules(osx_test) +target_link_libraries(macOS_test PRIVATE OBS::libobs ${COCOA}) + +target_compile_options(macOS_test PRIVATE -fobjc-arc) + +target_compile_features(macOS_test PRIVATE cxx_std_11) + +set_target_properties(macOS_test PROPERTIES FOLDER "tests and examples") + +define_graphic_modules(macOS_test) diff --git a/test/test-input/CMakeLists.txt b/test/test-input/CMakeLists.txt index 4de030ff8..24e75544b 100644 --- a/test/test-input/CMakeLists.txt +++ b/test/test-input/CMakeLists.txt @@ -1,29 +1,24 @@ project(test-input) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +add_library(test-input MODULE) + +target_sources( + test-input + PRIVATE test-filter.c + test-input.c + test-sinewave.c + sync-async-source.c + sync-audio-buffering.c + sync-pair-vid.c + sync-pair-aud.c + test-random.c) + +target_link_libraries(test-input PRIVATE OBS::libobs) if(MSVC) - set(test-input_PLATFORM_DEPS - w32-pthreads) + target_link_libraries(test-input PRIVATE OBS::w32-pthreads) endif() -set(test-input_SOURCES - ${test-input_PLATFORM_SOURCES} - test-filter.c - test-input.c - test-sinewave.c - sync-async-source.c - sync-audio-buffering.c - sync-pair-vid.c - sync-pair-aud.c - test-random.c) - -add_library(test-input MODULE - ${test-input_SOURCES}) - -target_link_libraries(test-input - ${test-input_PLATFORM_DEPS} - libobs) set_target_properties(test-input PROPERTIES FOLDER "tests and examples") -install_obs_plugin_with_data(test-input data) +setup_plugin_target(test-input) diff --git a/test/win/CMakeLists.txt b/test/win/CMakeLists.txt index fd7f6c324..8270f9b74 100644 --- a/test/win/CMakeLists.txt +++ b/test/win/CMakeLists.txt @@ -1,13 +1,11 @@ project(win-test) -include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs") +add_executable(win-test WIN32) -set(win-text_SOURCES - test.cpp) +target_sources(win-test PRIVATE test.cpp) + +target_link_libraries(win-test PRIVATE OBS::libobs) -add_executable(win-test WIN32 - ${win-text_SOURCES}) -target_link_libraries(win-test - libobs) set_target_properties(win-test PROPERTIES FOLDER "tests and examples") + define_graphic_modules(win-test)