cmake: Improve build system with additional features and options

- Moved all auto-dependencies to a uniform subdirectory for easier caching and cleanup.
- Add an option to download or specify a path for libOBS+obs-frontend-api.
- Remove the dependency on the non-standard obs-frontend-apiConfig.cmake file.
- Add an option to download or specify a path for OBS Dependencies.
- Add an option to download or specify a path for Qt.
- Add an option to download or specify a path for AOM.
- Fix and improve architecture and platform detection.
- Fix some messages having two :, or no prefix at all.
- Fix detection of obs-frontend-api.
- Fix applying custom compiler and linker flags for MSVC and GNU-style builds.
- Use target_compile_options over add_compile_options for compatibility.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2022-05-10 19:29:58 +02:00
parent 56f2ae4290
commit f160580794
5 changed files with 495 additions and 497 deletions

View file

@ -1,27 +1,14 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches:
- 'master'
tags:
- '*'
- '!i18n_master'
- '!l10n_master'
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
schedule:
- cron: '37 20 * * 4'
branches:
- '*'
env:
OBS_VERSION: "27.0.0-ci"
@ -88,20 +75,18 @@ jobs:
cmake \
ninja-build \
git \
gcc-9 g++9 \
qt5-default libqwt-qt5-dev libqt5svg5-dev \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev \
libcurl4-openssl-dev
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
- name: "libobs: Cache"
- name: "Dependencies: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/libobs-download
build/temp/libobs-build
build/temp/libobs-src
key: libobs-codeql-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
build/temp/autodeps
key: autodeps-${{ matrix.id }}-${{ env.CACHE_VERSION }}
- name: "StreamFX: Configure"
shell: bash
@ -110,11 +95,8 @@ jobs:
-DCMAKE_VERBOSE_MAKEFILE=ON \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX="build/distrib" \
-DENABLE_FILTER_NVIDIA_FACE_TRACKING=FALSE \
-DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
-DPACKAGE_PREFIX="build/package" \
-DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-ubuntu-x86-64.7z" \
-DDOWNLOAD_OBS_HASH="SHA256=0AF6C7262C37D80C24CB18523A851FD765C04E766D8EB0F4AC0F6E75D13A035F"
-DPACKAGE_PREFIX="build/package"
- name: "StreamFX: Build"
shell: bash

View file

@ -11,9 +11,7 @@ on:
- '*'
env:
QT_VERSION: "5.15.2"
OBS_VERSION: "27.0.0-ci"
OBSDEPS_VERSION: "27.0.0"
CACHE_VERSION: 1
LIBAOM_VERSION: "3.2.0.0"
jobs:
@ -41,48 +39,15 @@ jobs:
with:
submodules: recursive
fetch-depth: 0
- name: "libobs: Cache"
- name: "Dependencies: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/libobs-download
build/temp/libobs-build
build/temp/libobs-src
key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
- name: "obsdeps: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/obsdeps-download
build/temp/obsdeps-build
build/temp/obsdeps-src
key: obsdeps-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.DOWNLOAD_OBSDEPS_HASH }}-${{ secrets.CACHE_VERSION }}
- name: "qt: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/qt-download
build/temp/qt-build
build/temp/qt-src
key: qt-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.QT_VERSION }}-${{ secrets.CACHE_VERSION }}
- name: "libaom: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
id: libaom-cache
with:
path: |
build/libaom
key: libaom-${{ matrix.id }}-${{ env.LIBAOM_VERSION }}-${{ secrets.CACHE_VERSION }}
- name: "libaom: Install"
if: ${{ steps.libaom-cache.outputs.cache-hit != 'true' }}
id: libaom-install
shell: bash
run: |
curl -L -o "aom.7z" "https://github.com/Xaymar/aom/releases/download/v${{ env.LIBAOM_VERSION }}/aom-windows-64-shared.7z"
7z x -y -o"build/libaom/" "aom.7z"
build/temp/autodeps
key: autodeps-${{ matrix.id }}-${{ env.CACHE_VERSION }}
- name: "Code Signing"
if: ${{ github.event_name != 'pull_request' }}
id: codesign
@ -91,6 +56,7 @@ jobs:
# Restore the Certificate back into a file.
echo "${{ secrets.CODESIGN_CERT_WIN }}" | base64 --decode > "${{ github.workspace }}/cert.pfx"
echo "::set-output name=cmake_args::-DENABLE_CODESIGN=ON -DCODESIGN_TIMESTAMPS=ON"
- name: "StreamFX: Configure"
shell: bash
env:
@ -103,28 +69,25 @@ jobs:
-DCMAKE_INSTALL_PREFIX="build/distrib" \
-DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
-DPACKAGE_PREFIX="build/package" \
-DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-windows-x86-64.7z" \
-DDOWNLOAD_OBS_HASH="SHA256=EBF9853C8A553E16ECBCA22523F401E6CF1EB2E8DA93F1493FEF41D65BD06633" \
-DDOWNLOAD_OBSDEPS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/deps-windows-x86.7z" \
-DDOWNLOAD_OBSDEPS_HASH="SHA256=B4AED165016F0B64A7E8B256CCC12EAF8AF087F61B0B239B9D3D00277485B5B5" \
-DDOWNLOAD_QT=ON \
-DDOWNLOAD_QT_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/qt-${{ env.QT_VERSION }}-windows-x86-64.7z" \
-DDOWNLOAD_QT_HASH="SHA256=109B9C21EF165B0C46DFAA9AD23124F2070ED4D74207C4AFB308183CB8D43BDD" \
-DAOM_PATH="build/libaom/"
- name: "StreamFX: Build"
shell: bash
run: |
cmake --build "build/temp" --config RelWithDebInfo --target INSTALL
- name: "StreamFX: Package (Install Prerequisites)"
run: |
curl "-kL" "https://cdn.xaymar.com/ci/innosetup-6.1.2.exe" "-f" "--retry" "5" "-o" "inno.exe"
.\inno.exe /VERYSILENT /SP- /SUPPRESSMSGBOXES /NORESTART
- name: "StreamFX: Package"
shell: bash
run: |
mkdir build/package
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
- name: "StreamFX: Signed Installer Preparation"
if: ${{ github.event_name != 'pull_request' }}
id: codesign_install
@ -134,11 +97,13 @@ jobs:
signtool=$(awk 'match($0, /^;signtool=(.+)$/, ary) {print ary[1]}' "${{ github.workspace }}/build/temp/installer.iss")
echo "::set-output name=iscc_signtool::${signtool}"
fi
- name: "StreamFX: Package Installer"
shell: cmd
run: |
echo '"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" /V10 "/Ssigntool=${{ steps.codesign_install.outputs.iscc_signtool }} $p" ".\build\temp\installer.iss"'
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" /V10 "/Ssigntool=${{ steps.codesign_install.outputs.iscc_signtool }} $p" ".\build\temp\installer.iss"
- name: "Artifacts"
uses: actions/upload-artifact@v1
with:
@ -178,6 +143,7 @@ jobs:
with:
submodules: recursive
fetch-depth: 0
- name: "Prerequisites: Apt-Get"
shell: bash
run: |
@ -195,36 +161,36 @@ jobs:
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev \
libcurl4-openssl-dev
${{ matrix.extra_command }}
- name: "libobs: Cache"
- name: "Dependencies: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/libobs-download
build/temp/libobs-build
build/temp/libobs-src
key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
build/temp/autodeps
key: autodeps-${{ matrix.id }}-${{ env.CACHE_VERSION }}
- name: "StreamFX: Configure"
shell: bash
run: |
cmake -H. -B"build/temp" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX="build/distrib" \
-DENABLE_FILTER_NVIDIA_FACE_TRACKING=FALSE \
-DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
-DPACKAGE_PREFIX="build/package" \
-DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-ubuntu-x86-64.7z" \
-DDOWNLOAD_OBS_HASH="SHA256=0AF6C7262C37D80C24CB18523A851FD765C04E766D8EB0F4AC0F6E75D13A035F"
-DPACKAGE_PREFIX="build/package"
- name: "StreamFX: Build"
shell: bash
run: |
cmake --build "build/temp" --config RelWithDebInfo --target install
- name: "StreamFX: Package"
shell: bash
run: |
mkdir build/package
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
- name: "Artifacts"
uses: actions/upload-artifact@v1
with:
@ -251,42 +217,15 @@ jobs:
with:
submodules: recursive
fetch-depth: 0
- name: "libobs: Cache"
- name: "Dependencies: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/libobs-download
build/temp/libobs-build
build/temp/libobs-src
key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
- name: "obsdeps: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/obsdeps-download
build/temp/obsdeps-build
build/temp/obsdeps-src
key: obsdeps-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.DOWNLOAD_OBSDEPS_HASH }}-${{ secrets.CACHE_VERSION }}
- name: "qt: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
id: qt-cache
with:
path: |
/usr/local/Cellar/qt@5
key: qt-${{ matrix.id }}-${{ env.QT_VERSION }}-${{ secrets.CACHE_VERSION }}
- name: "qt: Install"
if: ${{ (github.event_name == 'pull_request') || (steps.qt-cache.outputs.cache-hit != 'true') }}
shell: bash
run: |
brew install qt@5
- name: "qt: Link"
if: ${{ (github.event_name != 'pull_request') && (steps.qt-cache.outputs.cache-hit != 'false') }}
shell: bash
run: |
brew link qt@5
build/temp/autodeps
key: autodeps-${{ matrix.id }}-${{ env.CACHE_VERSION }}
- name: "StreamFX: Configure"
shell: bash
run: |
@ -294,22 +233,20 @@ jobs:
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX="build/distrib" \
-DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
-DPACKAGE_PREFIX="build/package" \
-DQt5_DIR="/usr/local/opt/qt@5/lib/cmake/Qt5/" \
-DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-macos-x86-64.7z" \
-DDOWNLOAD_OBS_HASH="SHA256=F15BC4CA8EB3F581A94372759CFE554E30D202B604B541445A5756B878E4E799" \
-DDOWNLOAD_OBSDEPS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/deps-macos-x86_64-2021-03-25.tar.gz" \
-DDOWNLOAD_OBSDEPS_HASH="SHA256=1C409374BCAB9D5CEEAFC121AA327E13AB222096718AF62F2648302DF62898D6"
-DPACKAGE_PREFIX="build/package"
- name: "StreamFX: Build"
shell: bash
run: |
cmake --build "build/temp" --config RelWithDebInfo --target install
- name: "StreamFX: Package"
shell: bash
run: |
mkdir build/package
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
- name: 'Packages: Install'
shell: bash
run: |
@ -317,10 +254,12 @@ jobs:
sudo hdiutil attach ./Packages.dmg
pushd /Volumes/Packages*
sudo installer -pkg ./Install\ Packages.pkg -target /
- name: "Packages: Package"
shell: bash
run: |
packagesbuild ./build/temp/installer.pkgproj
- name: "Artifacts"
uses: actions/upload-artifact@v1
with:

View file

@ -8,6 +8,9 @@ on:
tags:
- '*'
env:
CACHE_VERSION: 1
jobs:
clang-format:
name: "clang-format"
@ -17,38 +20,53 @@ jobs:
CXX: clang++
CMAKE_GENERATOR: "Ninja"
steps:
- name: "Clone Repository"
uses: actions/checkout@v1
- name: "Submodules & Packages"
- name: "Clone"
uses: actions/checkout@v2
with:
submodules: recursive
fetch-depth: 0
- name: "Prerequisites: Apt-Get"
shell: bash
run: |
git submodule update --init --recursive
sudo apt-get -qq update
sudo apt-get purge libjpeg9-dev:amd64 libjpeg8-dev:amd64 libjpeg-turbo8-dev:amd64
sudo apt-get install \
build-essential \
checkinstall \
pkg-config \
cmake \
ninja-build \
git \
${{ matrix.packages }} \
qt5-default libqwt-qt5-dev libqt5svg5-dev \
libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev \
libcurl4-openssl-dev \
checkinstall pkg-config
libcurl4-openssl-dev
sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
- name: "Cache: Prerequisites"
- name: "Dependencies: Cache"
if: ${{ github.event_name != 'pull_request' }}
uses: actions/cache@v2
with:
path: |
build/temp/libobs-download/libobs-download-prefix/src/libobs.7z
key: ubuntu-20.04
- name: "Configure & Format Project"
build/temp/autodeps
key: autodeps-${{ matrix.id }}-${{ env.CACHE_VERSION }}
- name: "StreamFX: Configure"
shell: bash
run: |
cmake -H. -B"build/temp" \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX="build/distrib" \
-DCMAKE_PACKAGE_NAME="streamfx-${{ matrix.id }}" -DCMAKE_PACKAGE_PREFIX="build/package" \
-DENABLE_CLANG=TRUE -DENABLE_FILTER_NVIDIA_FACE_TRACKING=FALSE
-DCMAKE_PACKAGE_NAME="streamfx-${{ matrix.id }}" \
-DCMAKE_PACKAGE_PREFIX="build/package" \
-DENABLE_CLANG=TRUE
- name: "StreamFX: Format"
shell: bash
run: |
cmake --build "build/temp" --config RelWithDebInfo --target StreamFX_CLANG-FORMAT
- name: "Validate Formatting"
shell: bash
run: |

View file

@ -176,7 +176,6 @@ set(CMAKE_MODULE_PATH
)
# Include
include("Architecture") # Architecture Detection
include("util") # CacheClear, CacheSet
include("DownloadProject") # DownloadProject
@ -201,71 +200,56 @@ else()
endif()
# Architecture
set(D_PLATFORM_INSTR ${ARCH_INST})
if(ARCH_INST STREQUAL "x86")
set(ARCH_INSTR_32 "i386;i686;x86;arm;ARM")
set(ARCH_INSTR_64 "x86_64;AMD64;IA64;arm64;ARM64")
set(ARCH_INSTR_X86 "i386;i686;x86;x86_64;AMD64")
set(ARCH_INSTR_ARM "arm;ARM;arm64;ARM64")
set(ARCH_INSTR_ITANIUM "IA64")
set(ARCH_BITS 0)
set(ARCH_BITS_POINTER 0)
set(ARCH_INST "")
# - Bitness
list(FIND ARCH_INSTR_32 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_BITS 32)
endif()
list(FIND ARCH_INSTR_64 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_BITS 64)
endif()
set(D_PLATFORM_BITS ${ARCH_BITS})
# - Pointer Size (bits)
math(EXPR ARCH_BITS_POINTER "8*${CMAKE_SIZEOF_VOID_P}")
set(D_PLATFORM_BITS_PTR ${ARCH_BITS_POINTER})
# - Basic Instruction Set
list(FIND ARCH_INSTR_X86 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
list(APPEND ARCH_INST "x86")
set(D_PLATFORM_INSTR_X86 ON)
set(D_PLATFORM_ARCH_X86 ON)
elseif(ARCH_INST STREQUAL "ARM")
endif()
list(FIND ARCH_INSTR_ARM "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
list(APPEND ARCH_INST "ARM")
set(D_PLATFORM_INSTR_ARM ON)
set(D_PLATFORM_ARCH_ARM ON)
elseif(ARCH_INST STREQUAL "IA64")
endif()
list(FIND ARCH_INSTR_ITANIUM "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
list(APPEND ARCH_INST "Itanium")
set(D_PLATFORM_INSTR_ITANIUM ON)
set(D_PLATFORM_ARCH_ITANIUM ON)
endif()
set(D_PLATFORM_INSTR ${ARCH_INST})
set(D_PLATFORM_ARCH ${ARCH_INST})
# Bitness
set(D_PLATFORM_BITS ${ARCH_BITS})
set(D_PLATFORM_BITS_PTR ${ARCH_BITS_POINTER})
################################################################################
# C/C++ Compiler Adjustments
################################################################################
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
message(STATUS "Applying custom flags for MSVC style build.")
# MSVC/ClangCL
# - Dynamically link Microsoft C/C++ Redistributable.
# - Enable /W3 and disable useless warnings.
# - Enable C++ exceptions with SEH exceptions.
# - Enable multi-processor compiling.
# Build with dynamic MSVC linkage.
add_compile_options(
$<$<CONFIG:>:/MD>
$<$<CONFIG:Debug>:/MDd>
$<$<CONFIG:Release>:/MD>
$<$<CONFIG:RelWithDebInfo>:/MD>
$<$<CONFIG:MinSizeRel>:/MD>
)
# Enable most useful warnings.
set(DISABLED_WARNINGS
"/wd4061" "/wd4100" "/wd4180" "/wd4201" "/wd4464" "/wd4505" "/wd4514"
"/wd4571" "/wd4623" "/wd4625" "/wd4626" "/wd4668" "/wd4710" "/wd4774"
"/wd4820" "/wd5026" "/wd5027" "/wd5039" "/wd5045" "/wd26812"
)
add_compile_options("/W3")
foreach(WARN ${DISABLED_WARNINGS})
add_compile_options("${WARN}")
endforeach()
# C++ Exceptions & SEH
add_compile_options("/EHa")
# Multiprocessor compiling
add_compile_options("/MP")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
message(STATUS "Applying custom flags for GNU style build.")
# Clang/AppleClang/GNU
# - Don't export by default. (Temporarily disabled)
# - Enable all and extra warnings.
add_compile_options("-Wall")
add_compile_options("-Wextra")
# add_compile_options("-fvisibility=hidden")
endif()
message(STATUS "${LOGPREFIX} Taget is ${D_PLATFORM_BITS}bit ${ARCH_INST} with a pointer size of ${D_PLATFORM_BITS_PTR}bit.")
################################################################################
# Detect if we are building with OBS Studio (different from Grouped builds)
@ -380,243 +364,344 @@ if(${PREFIX}ENABLE_CODESIGN AND (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/codes
endif()
################################################################################
# Standalone Build: OBS Studio
# Auto-Dependency: libOBS + obs-frontend-api
################################################################################
if(NOT ${PREFIX}OBS_NATIVE)
if(STANDALONE)
# Options
set(${PREFIX}DOWNLOAD_OBS_URL "" CACHE STRING "(Optional) URL of prebuilt libOBS archive to download.")
set(${PREFIX}DOWNLOAD_OBS_HASH "" CACHE STRING "(Optional) The hash for the libOBS archive.")
set(${PREFIX}OBS_DOWNLOAD TRUE CACHE BOOL "Automatically download libOBS and obs-frontend-api?")
set(${PREFIX}OBS_PATH "" CACHE PATH "Path to libOBS, if ${PREFIX}OBS_DOWNLOAD is not set.")
set(${PREFIX}OBS_DOWNLOAD_URL "" CACHE STRING "The URL from which to download libOBS and obs-frontend-api, if autodetection fails. (Optional)")
set(${PREFIX}OBS_DOWNLOAD_HASH "" CACHE STRING "The hash string for the given URL. Must be a SHA-256 hash if provided. (Optional)")
mark_as_advanced(
${PREFIX}DOWNLOAD_OBS_URL
${PREFIX}DOWNLOAD_OBS_HASH
${PREFIX}OBS_PATH
${PREFIX}OBS_DOWNLOAD_URL
${PREFIX}OBS_DOWNLOAD_HASH
)
# Allow overriding what version we build against.
if(${PREFIX}DOWNLOAD_OBS_URL)
set(_DOWNLOAD_OBS_URL "${${PREFIX}DOWNLOAD_OBS_URL}")
set(_DOWNLOAD_OBS_HASH "${${PREFIX}DOWNLOAD_OBS_HASH}")
else()
set(_DOWNLOAD_OBS_VERSION "27.0.0-ci")
if (D_PLATFORM_WINDOWS)
if (D_PLATFORM_ARCH_X86)
set(_DOWNLOAD_OBS_URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBS_VERSION}/obs-studio-x64-0.0.0.0-windows-${D_PLATFORM_ARCH}-${D_PLATFORM_BITS}.7z")
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBS_HASH "SHA256=EBF9853C8A553E16ECBCA22523F401E6CF1EB2E8DA93F1493FEF41D65BD06633")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
elseif(D_PLATFORM_LINUX)
if (D_PLATFORM_ARCH_X86)
set(_DOWNLOAD_OBS_URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBS_VERSION}/obs-studio-x64-0.0.0.0-ubuntu-${D_PLATFORM_ARCH}-${D_PLATFORM_BITS}.7z")
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBS_HASH "SHA256=0AF6C7262C37D80C24CB18523A851FD765C04E766D8EB0F4AC0F6E75D13A035F")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
elseif(D_PLATFORM_MAC)
if (D_PLATFORM_ARCH_X86)
set(_DOWNLOAD_OBS_URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBS_VERSION}/obs-studio-x64-0.0.0.0-macos-${D_PLATFORM_ARCH}-${D_PLATFORM_BITS}.7z")
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBS_HASH "SHA256=F15BC4CA8EB3F581A94372759CFE554E30D202B604B541445A5756B878E4E799")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
endif()
# Download libOBS
download_project(
PROJ libobs
URL "${_DOWNLOAD_OBS_URL}"
URL_HASH "${_DOWNLOAD_OBS_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
include("${libobs_SOURCE_DIR}/cmake/LibObs/LibObsConfig.cmake")
endif()
################################################################################
# Standalone Build: OBS Studio Dependencies
################################################################################
if(STANDALONE AND NOT D_PLATFORM_LINUX)
# Options
set(${PREFIX}DOWNLOAD_OBSDEPS_URL "" CACHE STRING "(Optional) URL of prebuilt libOBS archive to download.")
set(${PREFIX}DOWNLOAD_OBSDEPS_HASH "" CACHE STRING "(Optional) The hash for the libOBS archive.")
mark_as_advanced(
${PREFIX}DOWNLOAD_OBSDEPS_URL
${PREFIX}DOWNLOAD_OBSDEPS_HASH
)
# Allow overriding what version we build against.
if(${PREFIX}DOWNLOAD_OBSDEPS_URL)
set(_DOWNLOAD_OBSDEPS_URL "${${PREFIX}DOWNLOAD_OBSDEPS_URL}")
set(_DOWNLOAD_OBSDEPS_HASH "${${PREFIX}DOWNLOAD_OBSDEPS_HASH}")
else()
if (D_PLATFORM_WINDOWS)
if (D_PLATFORM_ARCH_X86)
set(_DOWNLOAD_OBSDEPS_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/deps-windows-x86.7z")
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBSDEPS_HASH "SHA256=B4AED165016F0B64A7E8B256CCC12EAF8AF087F61B0B239B9D3D00277485B5B5")
elseif (D_PLATFORM_BITS EQUAL 32)
set(_DOWNLOAD_OBSDEPS_HASH "SHA256=B4AED165016F0B64A7E8B256CCC12EAF8AF087F61B0B239B9D3D00277485B5B5")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
elseif(D_PLATFORM_MAC)
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBSDEPS_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/deps-macos-x86_64-2021-03-25.tar.gz")
set(_DOWNLOAD_OBSDEPS_HASH "SHA256=1C409374BCAB9D5CEEAFC121AA327E13AB222096718AF62F2648302DF62898D6")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
elseif(D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_OBSDEPS_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/deps-macos-arm64-2021-03-25.tar.gz")
set(_DOWNLOAD_OBSDEPS_HASH "SHA256=C0EC57D360AF190E372D6BB883134FA26B1A7E49840DD146B172B48D548B55BC")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
endif()
# Download libOBS
download_project(
PROJ obsdeps
URL "${_DOWNLOAD_OBSDEPS_URL}"
URL_HASH "${_DOWNLOAD_OBSDEPS_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
if (D_PLATFORM_WINDOWS)
set(_OBSDEPS_PATH "${obsdeps_SOURCE_DIR}/win${D_PLATFORM_BITS}")
elseif(D_PLATFORM_MAC)
set(_OBSDEPS_PATH "${obsdeps_SOURCE_DIR}/obsdeps")
endif()
endif()
################################################################################
# Standalone Build: Qt v5.x
################################################################################
if(STANDALONE AND NOT D_PLATFORM_LINUX)
set(${PREFIX}DOWNLOAD_QT OFF CACHE BOOL "Download Qt?")
if(${PREFIX}DOWNLOAD_QT)
set(${PREFIX}DOWNLOAD_QT_URL "" CACHE STRING "")
set(${PREFIX}DOWNLOAD_QT_HASH "" CACHE STRING "")
mark_as_advanced(
${PREFIX}DOWNLOAD_QT_URL
${PREFIX}DOWNLOAD_QT_HASH
)
# Allow overriding what version we build against.
if(${PREFIX}DOWNLOAD_QT_URL)
set(_DOWNLOAD_QT_URL "${${PREFIX}DOWNLOAD_QT_URL}")
set(_DOWNLOAD_QT_HASH "${${PREFIX}DOWNLOAD_QT_HASH}")
else()
if(${PREFIX}OBS_DOWNLOAD)
if(${PREFIX}OBS_DOWNLOAD_URL STREQUAL "")
# Figure out download URLs and hashes.
if (D_PLATFORM_WINDOWS)
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_QT_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/qt-5.15.2-windows-x86-64.7z")
set(_DOWNLOAD_QT_HASH "SHA256=109B9C21EF165B0C46DFAA9AD23124F2070ED4D74207C4AFB308183CB8D43BDD")
elseif (D_PLATFORM_BITS EQUAL 32)
set(_DOWNLOAD_QT_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/qt-5.15.2-windows-x86-32.7z")
set(_DOWNLOAD_QT_HASH "SHA256=372E4FBF2A15DD4FDA955A07334D8B8AC6802990148C9CB4E766C90205F8F570")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
set(OBS_DOWNLOAD_URL "https://github.com/Xaymar/obs-studio/releases/download/27.2.4-ci/windows-x86_64.tar.gz")
set(OBS_DOWNLOAD_HASH "DD931BBB2E0720F1D7573C65D8CC9D638F1EE2AC99F7173BF8935CD3A3BCE3F4")
endif()
endif()
elseif(D_PLATFORM_LINUX)
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(OBS_DOWNLOAD_URL "https://github.com/Xaymar/obs-studio/releases/download/27.2.4-ci/linux-x86_64.tar.gz")
set(OBS_DOWNLOAD_HASH "CA19E8260E1A556E6231D75064837C61C6D480BD90C97A0B930005AE527BF625")
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
elseif(D_PLATFORM_MAC)
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_QT_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/qt-5.15.2-macos-x86_64-2021-03-25.tar.gz")
set(_DOWNLOAD_QT_HASH "SHA256=FFABB54624B931EA3FCC06BED244895F50CEFC95DE09D792D280C46D4F91D4C5")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
set(OBS_DOWNLOAD_URL "https://github.com/Xaymar/obs-studio/releases/download/27.2.4-ci/macos-x86_64.tar.gz")
set(OBS_DOWNLOAD_HASH "0DD5A57DD537B97CAA8470212F8F6B637F47D4742A5D1F17787F4FE9DBC70B33")
endif()
elseif(D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(_DOWNLOAD_QT_URL "https://github.com/Xaymar/obs-studio/releases/download/27.0.0/qt-5.15.2-macos-arm64-2021-03-25.tar.gz")
set(_DOWNLOAD_QT_HASH "SHA256=366BA8AC0FA0CAC440AFB9ED1C2EF5932E50091DC43BDE8B5C4B490082B6F19F")
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
message(FATAL_ERROR "${LOGPREFIX} Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
endif()
# Verify that the platform, architecture and bitness is supported.
if(OBS_DOWNLOAD_URL STREQUAL "")
message(FATAL_ERROR "${LOGPREFIX} Download for libOBS failed, as Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
set(OBS_DOWNLOAD_URL "${${PREFIX}OBS_DOWNLOAD_URL}")
set(OBS_DOWNLOAD_HASH "${${PREFIX}OBS_DOWNLOAD_HASH}")
endif()
download_project(
PROJ qt
URL "${_DOWNLOAD_QT_URL}"
URL_HASH "${_DOWNLOAD_QT_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
if(OBS_DOWNLOAD_HASH STREQUAL "")
download_project(
PROJ libobs
PREFIX "autodeps"
URL "${OBS_DOWNLOAD_URL}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
else()
download_project(
PROJ libobs
PREFIX "autodeps"
URL "${OBS_DOWNLOAD_URL}"
URL_HASH "SHA256=${OBS_DOWNLOAD_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
endif()
CacheSet(${PREFIX}OBS_PATH "${libobs_SOURCE_DIR}")
endif()
if(NOT EXISTS "${${PREFIX}OBS_PATH}/cmake/LibObs/LibObsConfig.cmake")
message(FATAL_ERROR "${LOGPREFIX} The provided path for libOBS is invalid as it did not contain '/cmake/LibObs/LibObsConfig.cmake'.")
return()
else()
include("${${PREFIX}OBS_PATH}/cmake/LibObs/LibObsConfig.cmake")
endif()
set(Qt5_DIR "${qt_SOURCE_DIR}" CACHE STRING "Path to Qt5")
if (D_PLATFORM_WINDOWS)
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/lib/cmake/Qt5")
elseif (D_PLATFORM_BITS EQUAL 32)
CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/lib/cmake/Qt5")
endif()
endif()
elseif(D_PLATFORM_MAC)
CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/lib/cmake/Qt5")
if (NOT TARGET obs-frontend-api)
if(EXISTS "${${PREFIX}OBS_PATH}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake")
include("${${PREFIX}OBS_PATH}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake")
elseif((EXISTS "${${PREFIX}OBS_PATH}/bin/${D_PLATFORM_BITS}bit/obs-frontend-api.lib") AND (EXISTS "${${PREFIX}OBS_PATH}/include/obs-frontend-api.h"))
add_library(obs-frontend-api SHARED IMPORTED)
set_target_properties(obs-frontend-api PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${${PREFIX}OBS_PATH}/include"
INTERFACE_LINK_LIBRARIES "libobs"
IMPORTED_CONFIGURATIONS RELWITHDEBINFO
IMPORTED_IMPLIB_RELWITHDEBINFO "${${PREFIX}OBS_PATH}/bin/${D_PLATFORM_BITS}bit/obs-frontend-api.lib"
IMPORTED_LOCATION_RELWITHDEBINFO "${${PREFIX}OBS_PATH}/bin/${D_PLATFORM_BITS}bit/obs-frontend-api.dll"
)
else()
message(WARNING "${LOGPREFIX} The provided path for libOBS did not contain obs-frontend-api.")
endif()
endif()
endif()
################################################################################
# Auto-Dependency: OBS Studio Dependencies
################################################################################
if(STANDALONE AND NOT D_PLATFORM_LINUX)
# Options
set(${PREFIX}OBSDEPS_DOWNLOAD TRUE CACHE BOOL "Automatically download pre-built libOBS dependencies?")
set(${PREFIX}OBSDEPS_PATH "" CACHE PATH "Path to pre-build libOBS dependencies, if ${PREFIX}OBSDEPS_DOWNLOAD is not set.")
set(${PREFIX}OBSDEPS_DOWNLOAD_URL "" CACHE STRING "The URL from which to download pre-built libOBS dependencies, if autodetection fails. (Optional)")
set(${PREFIX}OBSDEPS_DOWNLOAD_HASH "" CACHE STRING "The hash string for the given URL. Must be a SHA-256 hash if provided. (Optional)")
mark_as_advanced(
${PREFIX}OBSDEPS_PATH
${PREFIX}OBSDEPS_DOWNLOAD_URL
${PREFIX}OBSDEPS_DOWNLOAD_HASH
)
if(${PREFIX}OBSDEPS_DOWNLOAD)
if(${PREFIX}OBSDEPS_DOWNLOAD_URL STREQUAL "")
# Figure out download URLs and hashes.
if (D_PLATFORM_WINDOWS)
set(DEPS_VERSION "2022-01-31")
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(OBSDEPS_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/win-${DEPS_VERSION}/windows-deps-${DEPS_VERSION}.zip")
set(OBSDEPS_DOWNLOAD_HASH "66E55FE35A507C902C036EB11E691D0257FECA545A8EE57324B69427717026DD")
endif()
endif()
elseif(D_PLATFORM_MAC)
set(DEPS_VERSION "2022-02-13")
if (D_PLATFORM_ARCH_X86 AND D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(OBSDEPS_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-${DEPS_VERSION}-universal.tar.xz")
set(OBSDEPS_DOWNLOAD_HASH "77471B1D345A768E8EFEC3F6AD9DC79F3C7CD34840B66F721B80025D29713F5D")
endif()
elseif (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(OBSDEPS_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-${DEPS_VERSION}-x86_64.tar.xz")
set(OBSDEPS_DOWNLOAD_HASH "1A8715D66E664B857942DEADED0DC46C4F6CD22E88F01ED1188F3BD3FCF632C4")
endif()
elseif (D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(OBSDEPS_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-${DEPS_VERSION}-arm64.tar.xz")
set(OBSDEPS_DOWNLOAD_HASH "2CFCAF05765400C696908F242AEA87B6E1848E1A48CD3EDC2EB7F8CB249C9D48")
endif()
endif()
endif()
# Verify that the platform, architecture and bitness is supported.
if(OBSDEPS_DOWNLOAD_URL STREQUAL "")
message(FATAL_ERROR "${LOGPREFIX} Download for pre-built OBS dependencies failed, as Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
set(OBSDEPS_DOWNLOAD_URL "${${PREFIX}OBSDEPS_DOWNLOAD_URL}")
set(OBSDEPS_DOWNLOAD_HASH "${${PREFIX}OBSDEPS_DOWNLOAD_HASH}")
endif()
if(OBSDEPS_DOWNLOAD_HASH STREQUAL "")
download_project(
PROJ obsdeps
PREFIX "autodeps"
URL "${OBSDEPS_DOWNLOAD_URL}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
else()
download_project(
PROJ obsdeps
PREFIX "autodeps"
URL "${OBSDEPS_DOWNLOAD_URL}"
URL_HASH "SHA256=${OBSDEPS_DOWNLOAD_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
endif()
CacheSet(${PREFIX}OBSDEPS_PATH "${obsdeps_SOURCE_DIR}")
endif()
if (D_PLATFORM_WINDOWS)
set(_OBSDEPS_PATH "${${PREFIX}OBSDEPS_PATH}/win${D_PLATFORM_BITS}")
set(FFmpegPath "${${PREFIX}OBSDEPS_PATH}/win${D_PLATFORM_BITS}")
elseif(D_PLATFORM_MAC)
set(_OBSDEPS_PATH "${${PREFIX}OBSDEPS_PATH}/obsdeps")
set(FFmpegPath "${${PREFIX}OBSDEPS_PATH}/obsdeps")
endif()
endif()
################################################################################
# Auto-Dependency: Qt v5.x
################################################################################
if(STANDALONE AND NOT D_PLATFORM_LINUX)
# Options
set(${PREFIX}QT_DOWNLOAD TRUE CACHE BOOL "Automatically download Qt?")
set(${PREFIX}QT_PATH "" CACHE PATH "Path to Qt, if ${PREFIX}QT_DOWNLOAD is not set.")
set(${PREFIX}QT_DOWNLOAD_URL "" CACHE STRING "The URL from which to download Qt, if autodetection fails. (Optional)")
set(${PREFIX}QT_DOWNLOAD_HASH "" CACHE STRING "The hash string for the given URL. Must be a SHA-256 hash if provided. (Optional)")
mark_as_advanced(
${PREFIX}QT_PATH
${PREFIX}QT_DOWNLOAD_URL
${PREFIX}QT_DOWNLOAD_HASH
)
if(${PREFIX}QT_DOWNLOAD)
if(${PREFIX}QT_DOWNLOAD_URL STREQUAL "")
# Figure out download URLs and hashes.
if (D_PLATFORM_WINDOWS)
set(DEPS_VERSION "5.15.2")
if (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(QT_DOWNLOAD_URL "https://cdn-fastly.obsproject.com/downloads/Qt_${DEPS_VERSION}.7z")
set(QT_DOWNLOAD_HASH "9EF1DFEEBE6AB7FFC55FD285667CC5D9CB2D298646C107C2295D13F14708E64E")
endif()
endif()
elseif(D_PLATFORM_MAC)
set(DEPS_VERSION "2022-02-13")
if (D_PLATFORM_ARCH_X86 AND D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(QT_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-qt-${DEPS_VERSION}-universal.tar.xz")
set(QT_DOWNLOAD_HASH "13FBCC45FD9D08B30E702D481FE4D58B23F93AA06848CEDE4EBE0956C79A5E8A")
endif()
elseif (D_PLATFORM_ARCH_X86)
if (D_PLATFORM_BITS EQUAL 64)
set(QT_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-qt-${DEPS_VERSION}-x86_64.tar.xz")
set(QT_DOWNLOAD_HASH "35A58FEE8DFD70D3D2DCC0AE0B77132C04A451C6F041A02DC41B207B375FC74B")
endif()
elseif (D_PLATFORM_ARCH_ARM)
if (D_PLATFORM_BITS EQUAL 64)
set(QT_DOWNLOAD_URL "https://github.com/obsproject/obs-deps/releases/download/${DEPS_VERSION}/macos-deps-qt-${DEPS_VERSION}-arm64.tar.xz")
set(QT_DOWNLOAD_HASH "E99146B9C7775C245A2D22F2EF24FC111FCCD71BAD0F03B64DB707124FFB8707")
endif()
endif()
endif()
# Verify that the platform, architecture and bitness is supported.
if(QT_DOWNLOAD_URL STREQUAL "")
message(FATAL_ERROR "${LOGPREFIX} Download for Qt failed, as Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
set(QT_DOWNLOAD_URL "${${PREFIX}QT_DOWNLOAD_URL}")
set(QT_DOWNLOAD_HASH "${${PREFIX}QT_DOWNLOAD_HASH}")
endif()
if(QT_DOWNLOAD_HASH STREQUAL "")
download_project(
PROJ qt
PREFIX "autodeps"
URL "${QT_DOWNLOAD_URL}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
else()
download_project(
PROJ qt
PREFIX "autodeps"
URL "${QT_DOWNLOAD_URL}"
URL_HASH "SHA256=${QT_DOWNLOAD_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
endif()
execute_process(COMMAND "xattr" "-r" "-d" "com.apple.quarantine" "${qt_SOURCE_DIR}")
if(D_PLATFORM_WINDOWS)
CacheSet(${PREFIX}QT_PATH "${qt_SOURCE_DIR}/msvc2019_64")
else()
CacheSet(${PREFIX}QT_PATH "${qt_SOURCE_DIR}")
endif()
endif()
set(Qt5_DIR "${${PREFIX}QT_PATH}/lib/cmake/Qt5" CACHE STRING "Path to Qt")
CacheSet(Qt5_DIR "${${PREFIX}QT_PATH}/lib/cmake/Qt5")
endif()
################################################################################
# Auto-Dependency: libAOM
################################################################################
if(D_PLATFORM_WINDOWS)
# Options
set(${PREFIX}AOM_DOWNLOAD TRUE CACHE BOOL "Automatically download AOM?")
set(${PREFIX}AOM_PATH "" CACHE PATH "Path to AOM, if ${PREFIX}AOM_DOWNLOAD is not set.")
set(${PREFIX}AOM_DOWNLOAD_URL "" CACHE STRING "The URL from which to download AOM, if autodetection fails. (Optional)")
set(${PREFIX}AOM_DOWNLOAD_HASH "" CACHE STRING "The hash string for the given URL. Must be a SHA-256 hash if provided. (Optional)")
mark_as_advanced(
${PREFIX}AOM_PATH
${PREFIX}AOM_DOWNLOAD_URL
${PREFIX}AOM_DOWNLOAD_HASH
)
if(${PREFIX}AOM_DOWNLOAD)
if(${PREFIX}AOM_DOWNLOAD_URL STREQUAL "")
set(AOM_VERSION "v3.2.0.1")
# Figure out download URLs and hashes.
if (D_PLATFORM_WINDOWS)
if (D_PLATFORM_ARCH_X86)
set(AOM_DOWNLOAD_URL "https://github.com/Xaymar/aom/releases/download/${AOM_VERSION}/aom-windows-${D_PLATFORM_BITS}-shared.7z")
set(AOM_DOWNLOAD_HASH "2DE0C215C5B00D6761AD2D1FEAFB545C04249B2CBD542F9F7D423E1A26BA59BD")
endif()
endif()
# Verify that the platform, architecture and bitness is supported.
if(AOM_DOWNLOAD_URL STREQUAL "")
message(FATAL_ERROR "${LOGPREFIX} Download for AOM failed, as Platform '${D_PLATFORM_OS}' with architecture '${D_PLATFORM_ARCH}' and bitness '${D_PLATFORM_BITS}' is not supported.")
return()
endif()
else()
set(AOM_DOWNLOAD_URL "${${PREFIX}AOM_DOWNLOAD_URL}")
set(AOM_DOWNLOAD_HASH "${${PREFIX}AOM_DOWNLOAD_HASH}")
endif()
if(AOM_DOWNLOAD_HASH STREQUAL "")
download_project(
PROJ AOM
PREFIX "autodeps"
URL "${AOM_DOWNLOAD_URL}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
else()
download_project(
PROJ AOM
PREFIX "autodeps"
URL "${AOM_DOWNLOAD_URL}"
URL_HASH "SHA256=${AOM_DOWNLOAD_HASH}"
DOWNLOAD_NO_PROGRESS OFF
UPDATE_DISCONNECTED OFF
)
endif()
if(D_PLATFORM_WINDOWS)
CacheSet(${PREFIX}AOM_PATH "${AOM_SOURCE_DIR}/msvc2019_64")
else()
CacheSet(${PREFIX}AOM_PATH "${AOM_SOURCE_DIR}")
endif()
endif()
set(AOM_PATH "${${PREFIX}AOM_PATH}" CACHE STRING "Path to AOM")
endif()
################################################################################
# Components
################################################################################
@ -647,20 +732,20 @@ function(feature_encoder_ffmpeg RESOLVE)
is_feature_enabled(ENCODER_FFMPEG T_CHECK)
if(RESOLVE AND T_CHECK)
if(NOT HAVE_FFMPEG)
message(WARNING "${LOGPREFIX}: FFmpeg Encoder requires FFmpeg. Disabling...")
message(WARNING "${LOGPREFIX} FFmpeg Encoder requires FFmpeg. Disabling...")
set_feature_disabled(ENCODER_FFMPEG ON)
else()
# AMF
is_feature_enabled(ENCODER_FFMPEG_AMF T_CHECK)
if(T_CHECK AND D_PLATFORM_MAC)
message(WARNING "${LOGPREFIX}: FFmpeg Encoder 'AMF' requires Windows or Linux. Disabling...")
message(WARNING "${LOGPREFIX} FFmpeg Encoder 'AMF' requires Windows or Linux. Disabling...")
set_feature_disabled(ENCODER_FFMPEG_AMF ON)
endif()
# NVENC
is_feature_enabled(ENCODER_FFMPEG_NVENC T_CHECK)
if(T_CHECK AND D_PLATFORM_MAC)
message(WARNING "${LOGPREFIX}: FFmpeg Encoder 'NVENC' requires Windows or Linux. Disabling...")
message(WARNING "${LOGPREFIX} FFmpeg Encoder 'NVENC' requires Windows or Linux. Disabling...")
set_feature_disabled(ENCODER_FFMPEG_NVENC ON)
endif()
@ -679,7 +764,7 @@ function(feature_encoder_aom_av1 RESOLVE)
is_feature_enabled(ENCODER_AOM_AV1 T_CHECK)
if(RESOLVE AND T_CHECK)
if(NOT HAVE_AOM)
message(WARNING "${LOGPREFIX}: AOM AV1 encoder missing AOM library. Disabling...")
message(WARNING "${LOGPREFIX} AOM AV1 encoder missing AOM library. Disabling...")
set_feature_disabled(ENCODER_AOM_AV1 ON)
endif()
elseif(T_CHECK)
@ -692,14 +777,14 @@ function(feature_filter_autoframing RESOLVE)
if(RESOLVE AND T_CHECK)
# Verify that the requirements for the providers are available
if(NOT HAVE_NVIDIA_AR_SDK)
message(WARNING "${LOGPREFIX}: 'NVIDIA Augmented Reality SDK' is missing. Disabling NVIDIA provider...")
message(WARNING "${LOGPREFIX} 'NVIDIA Augmented Reality SDK' is missing. Disabling NVIDIA provider...")
set_feature_disabled(FILTER_AUTOFRAMING_NVIDIA ON)
endif()
# Verify that we have at least one provider for Auto-Framing.
is_feature_enabled(FILTER_AUTOFRAMING_NVIDIA T_CHECK_NVIDIA)
if (NOT T_CHECK_NVIDIA)
message(WARNING "${LOGPREFIX}: Auto-Framing has no available providers. Disabling...")
message(WARNING "${LOGPREFIX} Auto-Framing has no available providers. Disabling...")
set_feature_disabled(FILTER_AUTOFRAMING ON)
endif()
elseif(T_CHECK)
@ -721,14 +806,14 @@ function(feature_filter_denoising RESOLVE)
if(RESOLVE AND T_CHECK)
# Verify that the requirements for the providers are available
if(NOT HAVE_NVIDIA_VFX_SDK)
message(WARNING "${LOGPREFIX}: 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider...")
message(WARNING "${LOGPREFIX} 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider...")
set_feature_disabled(FILTER_DENOISING_NVIDIA ON)
endif()
# Verify that we have at least one provider for Video Denoising.
is_feature_enabled(FILTER_DENOISING_NVIDIA T_CHECK_NVIDIA)
if (NOT T_CHECK_NVIDIA)
message(WARNING "${LOGPREFIX}: Denoising has no available providers. Disabling...")
message(WARNING "${LOGPREFIX} Denoising has no available providers. Disabling...")
set_feature_disabled(FILTER_DENOISING ON)
endif()
elseif(T_CHECK)
@ -761,14 +846,14 @@ function(feature_filter_upscaling RESOLVE)
if(RESOLVE AND T_CHECK)
# Verify that the requirements for the providers are available
if(NOT HAVE_NVIDIA_VFX_SDK)
message(WARNING "${LOGPREFIX}: 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider(s)...")
message(WARNING "${LOGPREFIX} 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider(s)...")
set_feature_disabled(FILTER_UPSCALING_NVIDIA ON)
endif()
# Verify that we have at least one provider for Video Super-Resolution.
is_feature_enabled(FILTER_UPSCALING_NVIDIA T_CHECK_NVIDIA)
if (NOT T_CHECK_NVIDIA)
message(WARNING "${LOGPREFIX}: Upscaling has no available providers. Disabling...")
message(WARNING "${LOGPREFIX} Upscaling has no available providers. Disabling...")
set_feature_disabled(FILTER_UPSCALING ON)
endif()
elseif(T_CHECK)
@ -781,14 +866,14 @@ function(feature_filter_virtual_greenscreen RESOLVE)
if(RESOLVE AND T_CHECK)
# Verify that the requirements for the providers are available
if(NOT HAVE_NVIDIA_VFX_SDK)
message(WARNING "${LOGPREFIX}: 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider(s)...")
message(WARNING "${LOGPREFIX} 'NVIDIA Video Effects SDK' is missing. Disabling NVIDIA provider(s)...")
set_feature_disabled(FILTER_VIRTUAL_GREENSCREEN_NVIDIA ON)
endif()
# Verify that we have at least one provider for Video Super-Resolution.
is_feature_enabled(FILTER_VIRTUAL_GREENSCREEN_NVIDIA T_CHECK_NVIDIA)
if (NOT T_CHECK_NVIDIA)
message(WARNING "${LOGPREFIX}: Virtual Greenscreen has no available providers. Disabling...")
message(WARNING "${LOGPREFIX} Virtual Greenscreen has no available providers. Disabling...")
set_feature_disabled(FILTER_VIRTUAL_GREENSCREEN ON)
endif()
elseif(T_CHECK)
@ -812,10 +897,10 @@ function(feature_frontend RESOLVE)
is_feature_enabled(FRONTEND T_CHECK)
if(RESOLVE AND T_CHECK)
if(NOT HAVE_QT)
message(WARNING "${LOGPREFIX}: Front-End requires Qt. Disabling...")
message(WARNING "${LOGPREFIX} Front-End requires Qt. Disabling...")
set_feature_disabled(FRONTEND ON)
elseif(NOT HAVE_OBSFE)
message(WARNING "${LOGPREFIX}: Front-End requires OBS FrontEnd API. Disabling...")
message(WARNING "${LOGPREFIX} Front-End requires OBS FrontEnd API. Disabling...")
set_feature_disabled(FRONTEND ON)
endif()
elseif(T_CHECK)
@ -828,10 +913,10 @@ function(feature_updater RESOLVE)
is_feature_enabled(UPDATER T_CHECK)
if(RESOLVE AND T_CHECK)
if(NOT HAVE_CURL)
message(WARNING "${LOGPREFIX}: Updater requires CURL. Disabling...")
message(WARNING "${LOGPREFIX} Updater requires CURL. Disabling...")
set_feature_disabled(UPDATER ON)
elseif(NOT HAVE_JSON)
message(WARNING "${LOGPREFIX}: Updater requires nlohmann::json. Disabling...")
message(WARNING "${LOGPREFIX} Updater requires nlohmann::json. Disabling...")
set_feature_disabled(UPDATER ON)
endif()
elseif(T_CHECK)
@ -886,33 +971,6 @@ endif()
#- FFmpeg
set(HAVE_FFMPEG OFF)
if(REQUIRE_FFMPEG)
if(D_PLATFORM_WINDOWS AND NOT ${PREFIX}OBS_NATIVE)
find_path(
FFmpegPath "libavcodec/avcodec.h"
HINTS
${OBS_DEPENDENCIES_DIR}
${_OBSDEPS_PATH}
${DepsPath}
${DepsPath32}
${DepsPath64}
PATHS
/usr/include
/usr/local/include
/opt/local/include
/sw/include
PATH_SUFFIXES
win${D_PLATFORM_BITS}
win${D_PLATFORM_BITS}/bin
win${D_PLATFORM_BITS}/include
win${D_PLATFORM_INSTR}
win${D_PLATFORM_INSTR}/bin
win${D_PLATFORM_INSTR}/include
bin
include
)
endif()
find_package(FFmpeg COMPONENTS avutil avcodec swscale)
set(HAVE_FFMPEG ${FFmpeg_FOUND})
endif()
@ -983,15 +1041,8 @@ endif()
#- OBS Front-End API
set(HAVE_OBSFE OFF)
if(REQUIRE_OBSFE)
if(${PREFIX}OBS_NATIVE)
if(TARGET obs-frontend-api)
set(HAVE_OBSFE ON)
endif()
else()
if (EXISTS "${libobs_SOURCE_DIR}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake")
include("${libobs_SOURCE_DIR}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake")
set(HAVE_OBSFE ON)
endif()
if(TARGET obs-frontend-api)
set(HAVE_OBSFE ON)
endif()
endif()
@ -1857,6 +1908,55 @@ set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_EXTENSIONS OFF
)
# C/C++ Compiler Adjustments
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
# MSVC/ClangCL
# - Dynamically link Microsoft C/C++ Redistributable.
# - Enable /W3 and disable useless warnings.
# - Enable C++ exceptions with SEH exceptions.
# - Enable multi-processor compiling.
# - Enable updated __cplusplus macro
message(STATUS "${LOGPREFIX} Applying custom flags for MSVC style build.")
# Build with dynamic MSVC linkage.
target_compile_options(${PROJECT_NAME} PUBLIC
$<$<CONFIG:>:/MD>
$<$<CONFIG:Debug>:/MDd>
$<$<CONFIG:Release>:/MD>
$<$<CONFIG:RelWithDebInfo>:/MD>
$<$<CONFIG:MinSizeRel>:/MD>
)
# Enable most useful warnings.
set(DISABLED_WARNINGS
"/wd4061" "/wd4100" "/wd4180" "/wd4201" "/wd4464" "/wd4505" "/wd4514"
"/wd4571" "/wd4623" "/wd4625" "/wd4626" "/wd4668" "/wd4710" "/wd4774"
"/wd4820" "/wd5026" "/wd5027" "/wd5039" "/wd5045" "/wd26812"
)
target_compile_options(${PROJECT_NAME} PUBLIC "/W3")
foreach(WARN ${DISABLED_WARNINGS})
target_compile_options(${PROJECT_NAME} PUBLIC "${WARN}")
endforeach()
# C++ Exceptions & SEH
target_compile_options(${PROJECT_NAME} PUBLIC "/EHa")
# Multiprocessor compiling
target_compile_options(${PROJECT_NAME} PUBLIC "/MP")
# Updated __cplusplus
target_compile_options(${PROJECT_NAME} PUBLIC "/Zc:__cplusplus")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# Clang/AppleClang/GNU
# - Don't export by default. (Temporarily disabled)
# - Enable all and extra warnings.
message(STATUS "${LOGPREFIX} Applying custom flags for GNU style build.")
target_compile_options(${PROJECT_NAME} PUBLIC "-Wall")
target_compile_options(${PROJECT_NAME} PUBLIC "-Wextra")
# add_compile_options("-fvisibility=hidden")
endif()
# Remove prefix on other platforms.
set_target_properties(${PROJECT_NAME} PROPERTIES
PREFIX ""

View file

@ -1,41 +0,0 @@
# Setup
set(ARCH_INSTR_32 "i386;i686;x86;arm;ARM")
set(ARCH_INSTR_64 "x86_64;AMD64;IA64;arm64;ARM64")
set(ARCH_INSTR_X86 "i386;i686;x86;x86_64;AMD64")
set(ARCH_INSTR_ARM "arm;ARM;arm64;ARM64")
set(ARCH_INSTR_ITANIUM "IA64")
set(ARCH_BITS 0)
set(ARCH_BITS_POINTER 0)
set(ARCH_INST "")
# Bitness
list(FIND ARCH_INSTR_32 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_BITS 32)
endif()
list(FIND ARCH_INSTR_64 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_BITS 64)
endif()
# Pointer Size (bits)
math(EXPR ARCH_BITS_POINTER "8*${CMAKE_SIZEOF_VOID_P}")
# Basic Instruction Set
list(FIND ARCH_INSTR_X86 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_INST "x86")
endif()
list(FIND ARCH_INSTR_ARM "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_INST "ARM")
endif()
list(FIND ARCH_INSTR_ITANIUM "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_INST "Itanium")
endif()
message(STATUS "Targetting ${ARCH_INST} with ${ARCH_BITS}bits and a pointer size of ${ARCH_BITS_POINTER}bit.")