mirror of
https://github.com/Xaymar/obs-StreamFX
synced 2024-11-28 22:33:00 +00:00
e436d22367
There is hardly any reason for us to recalculate everything all the time. LUTs can cache the work once, and then re-use it every time necessary, drastically reducing the impact of Color Grading by almost 60% (on some GPUs even more). Additionally this fixes the negative gamma issue, which plagued the filter for a while. In the future, once PR 4199 (https://github.com/obsproject/obs-studio/pull/4199) has been merged, we can cut away one intermediate rendering step currently required to make the effect work. Hopefully this will be with the 27.x release of OBS Studio.
1688 lines
50 KiB
CMake
1688 lines
50 KiB
CMake
# StreamFX - The premier VFX plugin for OBS Studio.
|
|
# Copyright (C) 2017 - 2020 Michael Fabian Dirks
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
# CMake Setup
|
|
cmake_minimum_required(VERSION 3.8...4.0)
|
|
|
|
################################################################################
|
|
# Configure Type
|
|
################################################################################
|
|
|
|
# Detect if we are building by ourselves or as part of something else.
|
|
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_LIST_DIR}")
|
|
set(GROUPED OFF)
|
|
set(PREFIX "")
|
|
else()
|
|
set(GROUPED ON)
|
|
set(PREFIX "StreamFX_")
|
|
endif()
|
|
set(LOGPREFIX "StreamFX:")
|
|
|
|
################################################################################
|
|
# Versioning
|
|
################################################################################
|
|
|
|
set(VERSION_MAJOR 0)
|
|
set(VERSION_MINOR 10)
|
|
set(VERSION_PATCH 0)
|
|
set(VERSION_TWEAK 0)
|
|
set(VERSION_SUFFIX "a")
|
|
set(VERSION_COMMIT "00000000")
|
|
|
|
# Check if we are in a git repository.
|
|
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git")
|
|
# Try and figure out where git is.
|
|
find_program(GIT git
|
|
PATHS
|
|
/bin
|
|
/sbin
|
|
/usr/bin
|
|
/usr/local/bin
|
|
)
|
|
|
|
if(GIT)
|
|
set(GIT_RESULT)
|
|
set(GIT_OUTPUT)
|
|
set(GIT_ERROR)
|
|
|
|
execute_process(
|
|
COMMAND "${GIT}" describe --tags --match "[0-9]*.[0-9]*.[0-9]*" --abbrev=8 HEAD
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
|
|
RESULT_VARIABLE GIT_RESULT
|
|
OUTPUT_VARIABLE GIT_OUTPUT
|
|
ERROR_VARIABLE GIT_ERROR
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
ERROR_STRIP_TRAILING_WHITESPACE
|
|
ERROR_QUIET
|
|
)
|
|
|
|
if(GIT_RESULT EQUAL 0)
|
|
string(REPLACE "-" "." GIT_OUTPUT "${GIT_OUTPUT}")
|
|
string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}")
|
|
|
|
# Parse Version
|
|
list(GET GIT_OUTPUT 0 VERSION_MAJOR)
|
|
list(GET GIT_OUTPUT 1 VERSION_MINOR)
|
|
list(GET GIT_OUTPUT 2 VERSION_PATCH)
|
|
list(GET GIT_OUTPUT 3 VERSION_BUILD)
|
|
list(GET GIT_OUTPUT 4 VERSION_COMMIT)
|
|
|
|
# Patch needs additional parsing.
|
|
# This may be a [0-9]*[a-z]*[0-9]+ string.
|
|
string(REGEX MATCHALL "([0-9]+)([a-z0-9]+)" T_MATCHES "${VERSION_PATCH}")
|
|
set(VERSION_PATCH "${CMAKE_MATCH_1}")
|
|
if(CMAKE_MATCH_2)
|
|
set(VERSION_SUFFIX "${CMAKE_MATCH_2}")
|
|
else()
|
|
set(VERSION_SUFFIX "")
|
|
endif()
|
|
else()
|
|
message(WARNING "${LOGPREFIX} Failed to detect version, using default instead.")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Allow manual overrides of the detected version.
|
|
set(${PREFIX}VERSION "" CACHE STRING "Override StreamFX version with this string. Format: Major.Minor.Patch[Suffix][-Tweak[-Commit8c]]")
|
|
if(${PREFIX}VERSION)
|
|
string(REPLACE "-" "." T_VERSION "${${PREFIX}VERSION}")
|
|
string(REPLACE "." ";" T_VERSION "${${PREFIX}VERSION}")
|
|
|
|
list(LENGTH T_VERSION T_VERSIONLEN)
|
|
list(GET T_VERSION 0 VERSION_MAJOR)
|
|
list(GET T_VERSION 1 VERSION_MINOR)
|
|
list(GET T_VERSION 2 VERSION_PATCH)
|
|
if (T_VERSIONLEN GREATER_EQUAL 3)
|
|
list(GET T_VERSION 3 VERSION_BUILD)
|
|
else()
|
|
set(VERSION_BUILD 0)
|
|
endif()
|
|
if (T_VERSIONLEN GREATER_EQUAL 4)
|
|
list(GET T_VERSION 4 VERSION_COMMIT)
|
|
else()
|
|
# set(VERSION_COMMIT "00000000")
|
|
endif()
|
|
|
|
# Patch needs additional parsing.
|
|
# This may be a [0-9]*[a-z]*[0-9]+ string.
|
|
string(REGEX MATCHALL "([0-9]+)([a-z0-9]+)" T_MATCHES "${VERSION_PATCH}")
|
|
set(VERSION_PATCH "${CMAKE_MATCH_1}")
|
|
if(CMAKE_MATCH_2)
|
|
set(VERSION_SUFFIX "${CMAKE_MATCH_2}")
|
|
else()
|
|
set(VERSION_SUFFIX "")
|
|
endif()
|
|
endif()
|
|
|
|
# Generate Version String
|
|
if(VERSION_COMMIT)
|
|
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}-${VERSION_COMMIT}")
|
|
else()
|
|
set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}")
|
|
endif()
|
|
|
|
# Log the detected version.
|
|
message(STATUS "${LOGPREFIX} Version ${VERSION_STRING}")
|
|
|
|
################################################################################
|
|
# Project
|
|
################################################################################
|
|
project(
|
|
StreamFX
|
|
VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}
|
|
DESCRIPTION "Additional sources, filters, transitions and encoders for OBS Studio."
|
|
HOMEPAGE_URL "https://streamfx.xaymar.com/"
|
|
)
|
|
|
|
# Full Project Name
|
|
set(PROJECT_FULL_NAME "StreamFX (for OBS Studio)")
|
|
|
|
# Description
|
|
set(PROJECT_DESCRIPTION "Better Production Quality, for free.")
|
|
|
|
# Authors (TODO: Generate this from AUTHORS)
|
|
set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>")
|
|
|
|
# Copyright Years (TODO: Update every year)
|
|
set(PROJECT_COPYRIGHT_YEARS "2018 - 2020")
|
|
|
|
# Versioning
|
|
set(PROJECT_VERSION_STRING ${VERSION_STRING})
|
|
|
|
################################################################################
|
|
# Modules
|
|
################################################################################
|
|
|
|
# Search Paths
|
|
set(CMAKE_MODULE_PATH
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
|
|
)
|
|
|
|
# Include
|
|
include("Architecture") # Architecture Detection
|
|
include("util") # CacheClear, CacheSet
|
|
include("DownloadProject") # DownloadProject
|
|
|
|
################################################################################
|
|
# Platform Setup
|
|
################################################################################
|
|
|
|
# Operating System
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|
set(D_PLATFORM_OS "windows")
|
|
set(D_PLATFORM_WINDOWS 1)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
set(D_PLATFORM_OS "linux")
|
|
set(D_PLATFORM_LINUX 1)
|
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
set(D_PLATFORM_OS "macos")
|
|
set(D_PLATFORM_MAC 1)
|
|
else()
|
|
set(D_PLATFORM_OS "unknown")
|
|
set(D_PLATFORM_UNKNOWN 1)
|
|
message(WARNING "${LOGPREFIX} The operating system '${CMAKE_SYSTEM_NAME}' is unknown to to this script, continue at your own risk.")
|
|
endif()
|
|
|
|
# Architecture
|
|
set(D_PLATFORM_INSTR ${ARCH_INST})
|
|
if(ARCH_INST STREQUAL "x86")
|
|
set(D_PLATFORM_INSTR_X86 ON)
|
|
elseif(ARCH_INST STREQUAL "ARM")
|
|
set(D_PLATFORM_INSTR_ARM ON)
|
|
elseif(ARCH_INST STREQUAL "IA64")
|
|
set(D_PLATFORM_INSTR_ITANIUM ON)
|
|
endif()
|
|
|
|
# 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()
|
|
|
|
################################################################################
|
|
# Detect if we are building with OBS Studio (different from Grouped builds)
|
|
################################################################################
|
|
|
|
set(STANDALONE ON)
|
|
if(GROUPED AND (TARGET libobs))
|
|
set(STANDALONE OFF)
|
|
endif()
|
|
if(STANDALONE)
|
|
message(STATUS "${LOGPREFIX} This is a standalone build, please make sure you've followed the instructions.")
|
|
set(${PREFIX}OBS_NATIVE OFF)
|
|
if (TARGET obs-frontend-api)
|
|
set(HAVE_OBS_FRONTEND ON)
|
|
endif()
|
|
else()
|
|
message(STATUS "${LOGPREFIX} This is a combined build.")
|
|
set(${PREFIX}OBS_NATIVE ON)
|
|
set(HAVE_OBS_FRONTEND ON)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Options
|
|
################################################################################
|
|
|
|
# Features
|
|
## Encoders
|
|
set(${PREFIX}ENABLE_ENCODER_FFMPEG ON CACHE BOOL "Enable FFmpeg Encoder integration.")
|
|
set(${PREFIX}ENABLE_ENCODER_FFMPEG_AMF ON CACHE BOOL "Enable AMF Encoder in FFmpeg.")
|
|
set(${PREFIX}ENABLE_ENCODER_FFMPEG_NVENC ON CACHE BOOL "Enable NVENC Encoder in FFmpeg.")
|
|
set(${PREFIX}ENABLE_ENCODER_FFMPEG_PRORES ON CACHE BOOL "Enable ProRes Encoder in FFmpeg.")
|
|
|
|
## Filters
|
|
set(${PREFIX}ENABLE_FILTER_BLUR ON CACHE BOOL "Enable Blur Filter")
|
|
set(${PREFIX}ENABLE_FILTER_COLOR_GRADE ON CACHE BOOL "Enable Color Grade Filter")
|
|
set(${PREFIX}ENABLE_FILTER_DISPLACEMENT ON CACHE BOOL "Enable Displacement Filter")
|
|
set(${PREFIX}ENABLE_FILTER_DYNAMIC_MASK ON CACHE BOOL "Enable Dynamic Mask Filter")
|
|
set(${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING ON CACHE BOOL "Enable NVidia Face Tracking Filter")
|
|
set(${PREFIX}ENABLE_FILTER_SDF_EFFECTS ON CACHE BOOL "Enable SDF Effects Filter")
|
|
set(${PREFIX}ENABLE_FILTER_SHADER ON CACHE BOOL "Enable Shader Filter")
|
|
set(${PREFIX}ENABLE_FILTER_TRANSFORM ON CACHE BOOL "Enable Transform Filter")
|
|
|
|
## Sources
|
|
set(${PREFIX}ENABLE_SOURCE_MIRROR ON CACHE BOOL "Enable Mirror Source")
|
|
set(${PREFIX}ENABLE_SOURCE_SHADER ON CACHE BOOL "Enable Shader Source")
|
|
|
|
## Transitions
|
|
set(${PREFIX}ENABLE_TRANSITION_SHADER ON CACHE BOOL "Enable Shader Transition")
|
|
|
|
## FrontEnd & UI
|
|
set(${PREFIX}ENABLE_FRONTEND ON CACHE BOOL "Enable Frontend code.")
|
|
set(${PREFIX}ENABLE_UPDATER ON CACHE BOOL "Enable automatic update checks.")
|
|
|
|
## Code Related
|
|
set(${PREFIX}ENABLE_CLANG ON CACHE BOOL "Enable Clang integration for supported compilers.")
|
|
set(${PREFIX}ENABLE_PROFILING OFF CACHE BOOL "Enable CPU and GPU performance tracking, which has a non-zero overhead at all times. Do not enable this for release builds.")
|
|
|
|
# Installation / Packaging
|
|
if(STANDALONE)
|
|
set(STRUCTURE_UNIFIED CACHE BOOL "Install for use in a Plugin Manager")
|
|
if(D_PLATFORM_LINUX)
|
|
set(STRUCTURE_PACKAGEMANAGER CACHE BOOL "Install for use in a Package Manager (system-wide installation)")
|
|
endif()
|
|
|
|
set(PACKAGE_PREFIX "${CMAKE_BINARY_DIR}" CACHE PATH "Where to place the packages?")
|
|
set(PACKAGE_NAME "{PROJECT_NAME}" CACHE STRING "What should the package be called?")
|
|
set(PACKAGE_SUFFIX "" CACHE STRING "Any suffix for the package name? (Defaults to the current version string)")
|
|
endif()
|
|
|
|
################################################################################
|
|
# Clang
|
|
################################################################################
|
|
|
|
if(${PREFIX}ENABLE_CLANG AND (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang/Clang.cmake"))
|
|
include("Clang")
|
|
set(HAVE_CLANG ON)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Standalone Build: OBS Studio
|
|
################################################################################
|
|
|
|
if(NOT ${PREFIX}OBS_NATIVE)
|
|
# Options
|
|
set(${PREFIX}DOWNLOAD_OBS_VERSION "" CACHE STRING "(Optional) OBS Studio version to build against.")
|
|
set(${PREFIX}DOWNLOAD_OBS_HASH_32 "" CACHE STRING "")
|
|
set(${PREFIX}DOWNLOAD_OBS_HASH_64 "" CACHE STRING "")
|
|
mark_as_advanced(
|
|
${PREFIX}DOWNLOAD_OBS_VERSION
|
|
${PREFIX}DOWNLOAD_OBS_HASH_32
|
|
${PREFIX}DOWNLOAD_OBS_HASH_64
|
|
)
|
|
|
|
# Operating System
|
|
set(OBS_DOWNLOAD_OS "unknown")
|
|
if (D_PLATFORM_WINDOWS)
|
|
set(OBS_DOWNLOAD_OS "windows")
|
|
elseif(D_PLATFORM_LINUX)
|
|
set(OBS_DOWNLOAD_OS "ubuntu")
|
|
elseif(D_PLATFORM_MAC)
|
|
set(OBS_DOWNLOAD_OS "macos")
|
|
endif()
|
|
|
|
# Bitness
|
|
set(OBS_DOWNLOAD_BITS 0)
|
|
if(D_PLATFORM_BITS EQUAL 32)
|
|
set(OBS_DOWNLOAD_BITS 32)
|
|
else()
|
|
set(OBS_DOWNLOAD_BITS 64)
|
|
endif()
|
|
|
|
# OBS Architecture String
|
|
if(D_PLATFORM_INSTR_X86)
|
|
if(D_PLATFORM_BITS EQUAL 64)
|
|
set(OBS_DOWNLOAD_ARCH "x64")
|
|
else()
|
|
set(OBS_DOWNLOAD_ARCH "x86")
|
|
endif()
|
|
elseif(D_PLATFORM_INSTR_ARM)
|
|
if(D_PLATFORM_BITS EQUAL 64)
|
|
set(OBS_DOWNLOAD_ARCH "arm64")
|
|
else()
|
|
set(OBS_DOWNLOAD_ARCH "arm32")
|
|
endif()
|
|
endif()
|
|
|
|
# Allow overriding what version we build against.
|
|
if(${PREFIX}DOWNLOAD_OBS_VERSION)
|
|
set(_DOWNLOAD_OBS_VERSION ${PREFIX}DOWNLOAD_OBS_VERSION)
|
|
set(_DOWNLOAD_OBS_HASH_32 ${PREFIX}DOWNLOAD_OBS_HASH_32)
|
|
set(_DOWNLOAD_OBS_HASH_64 ${PREFIX}DOWNLOAD_OBS_HASH_64)
|
|
else()
|
|
set(_DOWNLOAD_OBS_VERSION "26.0.2-ci")
|
|
if(D_PLATFORM_WINDOWS)
|
|
set(_DOWNLOAD_OBS_HASH_32 "SHA512=468A999ECC8C826683E208B8758FBAE2FD3C9C034A73A147F6BE0F40B6E0AF0B0C9A99DFCB8D3A856206A26FC45F5F0A3B1FF781949B3EF68B765FECEB5CEB55")
|
|
set(_DOWNLOAD_OBS_HASH_64 "SHA512=571B4196DF5CFBD3A8E113C97C7890000C490DDF1C6747529DE0F06063F928E7488095775919017104DE7A693CCF51A7A82BD04BCE62D6B3F0ED1F74A5F32B32")
|
|
elseif(D_PLATFORM_LINUX)
|
|
set(_DOWNLOAD_OBS_HASH_32 "")
|
|
set(_DOWNLOAD_OBS_HASH_64 "SHA512=62EAD42890CEF953806F5780ED37304D6BD110F65D3ED83A88ADA462B0A0E46E9DEE477A76D456C444102EBA4F9F9A9EAAA299DCFDB2872233E2B35F775CCD0D")
|
|
elseif(D_PLATFORM_MAC)
|
|
set(_DOWNLOAD_OBS_HASH_32 "")
|
|
set(_DOWNLOAD_OBS_HASH_64 "SHA512=2A7E312666FAABF539740DAD8E30788DEB5882BE8D2FF062848741FD6F8C2077FB237CFB399634BC9C3DE38CF78B3043B1EAE92D833CE6A8B32F5E1EB92D6618")
|
|
else()
|
|
message(FATAL_ERROR "No prebuilt packages available for this operating system.")
|
|
return()
|
|
endif()
|
|
endif()
|
|
|
|
# Download libOBS
|
|
download_project(
|
|
PROJ libobs
|
|
URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBS_VERSION}/obs-studio-${OBS_DOWNLOAD_ARCH}-0.0.0.0-${OBS_DOWNLOAD_OS}-${OBS_DOWNLOAD_BITS}.7z"
|
|
URL_HASH "${_DOWNLOAD_OBS_HASH_${BITS}}"
|
|
DOWNLOAD_NAME "libobs.7z"
|
|
DOWNLOAD_NO_PROGRESS OFF
|
|
UPDATE_DISCONNECTED OFF
|
|
)
|
|
|
|
include("${libobs_SOURCE_DIR}/cmake/LibObs/LibObsConfig.cmake")
|
|
|
|
if(D_PLATFORM_WINDOWS)
|
|
set(${PREFIX}DOWNLOAD_OBSDEPS_VERSION "" CACHE STRING "(Optional) OBS Studio dependencies version to build against.")
|
|
set(${PREFIX}DOWNLOAD_OBSDEPS_HASH "" CACHE STRING "")
|
|
mark_as_advanced(
|
|
${PREFIX}DOWNLOAD_OBSDEPS_VERSION
|
|
${PREFIX}DOWNLOAD_OBSDEPS_HASH
|
|
)
|
|
|
|
if(${PREFIX}DOWNLOAD_OBSDEPS_VERSION)
|
|
set(_DOWNLOAD_OBSDEPS_VERSION ${PREFIX}DOWNLOAD_OBSDEPS_VERSION)
|
|
set(_DOWNLOAD_OBSDEPS_HASH ${PREFIX}DOWNLOAD_OBSDEPS_HASH)
|
|
else()
|
|
set(_DOWNLOAD_OBSDEPS_VERSION "26.0.0")
|
|
set(_DOWNLOAD_OBSDEPS_HASH "SHA512=2D47E7579DE3FBD88C52BB62C2CA4D649BD958FBAE8E5B01EE263D7583B4D8EEEA8CE13C543BEF110FAC9142891C031973A1BC20AC6EED596E6AB97CCC669D16")
|
|
endif()
|
|
|
|
download_project(
|
|
PROJ obsdeps
|
|
URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBSDEPS_VERSION}/dependencies_${OBS_DOWNLOAD_OS}.7z"
|
|
URL_HASH "${_DOWNLOAD_OBSDEPS_HASH}"
|
|
DOWNLOAD_NAME "obsdeps.7z"
|
|
DOWNLOAD_NO_PROGRESS OFF
|
|
UPDATE_DISCONNECTED OFF
|
|
)
|
|
else()
|
|
message(STATUS "${LOGPREFIX} Please make sure that you have installed all required packages to build StreamFX.")
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
# Standalone Build: Qt v5.x
|
|
################################################################################
|
|
|
|
if(D_PLATFORM_WINDOWS AND (NOT ${PREFIX}OBS_NATIVE))
|
|
set(${PREFIX}DOWNLOAD_QT OFF CACHE BOOL "Download Qt?")
|
|
|
|
if(${PREFIX}DOWNLOAD_QT)
|
|
set(${PREFIX}DOWNLOAD_QT_VERSION "" CACHE STRING "(Optional) Qt Version to build against.")
|
|
set(${PREFIX}DOWNLOAD_QT_HASH "" CACHE STRING "")
|
|
mark_as_advanced(
|
|
${PREFIX}DOWNLOAD_OBSDEPS_VERSION
|
|
${PREFIX}DOWNLOAD_OBSDEPS_HASH
|
|
)
|
|
|
|
download_project(
|
|
PROJ qt
|
|
URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBSDEPS_VERSION}/qt_${_DOWNLOAD_QT_VERSION}_${OBS_DOWNLOAD_OS}.7z"
|
|
URL_HASH "${_DOWNLOAD_QT_HASH}"
|
|
DOWNLOAD_NAME "qt.7z"
|
|
DOWNLOAD_NO_PROGRESS ON
|
|
UPDATE_DISCONNECTED ON
|
|
QUIET
|
|
)
|
|
|
|
set(Qt5_DIR "${qt_SOURCE_DIR}" CACHE STRING "Path to Qt5")
|
|
if("${BITS}" STREQUAL "32")
|
|
CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/msvc2017/lib/cmake/Qt5/")
|
|
else()
|
|
CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/msvc2017_64/lib/cmake/Qt5/")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
# Components
|
|
################################################################################
|
|
|
|
# Component resolving:
|
|
# 1. Check which features are enabled. For each feature, set what they require to ON.
|
|
# 2. Try and find required items.
|
|
# 3. Again check which features are enabled, if their requirements are missing, warn about it and disable them.
|
|
# TODO: Consider making this an error instead.
|
|
|
|
function(is_feature_enabled FEATURE OUTPUT)
|
|
set(T_ENABLED ${${PREFIX}ENABLE_${FEATURE}})
|
|
set(T_DISABLED ${${PREFIX}DISABLE_${FEATURE}})
|
|
if(T_ENABLED AND NOT T_DISABLED)
|
|
set(${OUTPUT} ON PARENT_SCOPE)
|
|
else()
|
|
set(${PREFIX}DISABLE_${FEATURE} ON PARENT_SCOPE)
|
|
set(${OUTPUT} OFF PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(set_feature_disabled FEATURE DISABLED)
|
|
set(${PREFIX}DISABLE_${FEATURE} ${DISABLED} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# Features
|
|
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...")
|
|
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...")
|
|
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...")
|
|
set_feature_disabled(ENCODER_FFMPEG_NVENC ON)
|
|
endif()
|
|
|
|
# ProRes
|
|
is_feature_enabled(ENCODER_FFMPEG_PRORES T_CHECK)
|
|
endif()
|
|
elseif(T_CHECK)
|
|
set(REQUIRE_FFMPEG ON PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(feature_filter_blur RESOLVE)
|
|
is_feature_enabled(FILTER_BLUR T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_color_grade RESOLVE)
|
|
is_feature_enabled(FILTER_COLOR_GRADE T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_displacement RESOLVE)
|
|
is_feature_enabled(FILTER_DISPLACEMENT T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_dynamic_mask RESOLVE)
|
|
is_feature_enabled(FILTER_DYNAMIC_MASK T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_nvidia_face_tracking RESOLVE)
|
|
is_feature_enabled(FILTER_NVIDIA_FACE_TRACKING T_CHECK)
|
|
if(RESOLVE AND T_CHECK)
|
|
if(NOT D_PLATFORM_WINDOWS)
|
|
message(WARNING "${LOGPREFIX}: NVIDIA Face Tracking requires Windows. Disabling...")
|
|
set_feature_disabled(FILTER_NVIDIA_FACE_TRACKING ON)
|
|
elseif(NOT HAVE_NVIDIA_ARSDK)
|
|
message(WARNING "${LOGPREFIX}: NVIDIA Face Tracking requires NVIDIA AR SDK. Disabling...")
|
|
set_feature_disabled(FILTER_NVIDIA_FACE_TRACKING ON)
|
|
elseif(NOT HAVE_NVIDIA_CUDA)
|
|
message(WARNING "${LOGPREFIX}: NVIDIA Face Tracking requires NVIDIA CUDA. Disabling...")
|
|
set_feature_disabled(FILTER_NVIDIA_FACE_TRACKING ON)
|
|
endif()
|
|
elseif(T_CHECK)
|
|
set(REQUIRE_NVIDIA_ARSDK ON PARENT_SCOPE)
|
|
set(REQUIRE_NVIDIA_CUDA ON PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(feature_filter_sdf_effects RESOLVE)
|
|
is_feature_enabled(FILTER_SDF_EFFECTS T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_shader RESOLVE)
|
|
is_feature_enabled(FILTER_SHADER T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_filter_transform RESOLVE)
|
|
is_feature_enabled(FILTER_TRANSFORM T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_source_mirror RESOLVE)
|
|
is_feature_enabled(SOURCE_MIRROR T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_source_shader RESOLVE)
|
|
is_feature_enabled(SOURCE_SHADER T_CHECK)
|
|
endfunction()
|
|
|
|
function(feature_transition_shader RESOLVE)
|
|
is_feature_enabled(TRANSITION_SHADER T_CHECK)
|
|
endfunction()
|
|
|
|
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...")
|
|
set_feature_disabled(FRONTEND ON)
|
|
elseif(NOT HAVE_OBSFE)
|
|
message(WARNING "${LOGPREFIX}: Front-End requires OBS FrontEnd API. Disabling...")
|
|
set_feature_disabled(FRONTEND ON)
|
|
endif()
|
|
elseif(T_CHECK)
|
|
set(REQUIRE_QT ON PARENT_SCOPE)
|
|
set(REQUIRE_OBSFE ON PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
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...")
|
|
set_feature_disabled(UPDATER ON)
|
|
elseif(NOT HAVE_JSON)
|
|
message(WARNING "${LOGPREFIX}: Updater requires nlohmann::json. Disabling...")
|
|
set_feature_disabled(UPDATER ON)
|
|
endif()
|
|
elseif(T_CHECK)
|
|
set(REQUIRE_CURL ON PARENT_SCOPE)
|
|
set(REQUIRE_JSON ON PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
# Set Requirements
|
|
feature_encoder_ffmpeg(OFF)
|
|
feature_filter_blur(OFF)
|
|
feature_filter_color_grade(OFF)
|
|
feature_filter_displacement(OFF)
|
|
feature_filter_dynamic_mask(OFF)
|
|
feature_filter_nvidia_face_tracking(OFF)
|
|
feature_filter_sdf_effects(OFF)
|
|
feature_filter_shader(OFF)
|
|
feature_filter_transform(OFF)
|
|
feature_source_mirror(OFF)
|
|
feature_source_shader(OFF)
|
|
feature_transition_shader(OFF)
|
|
feature_frontend(OFF)
|
|
feature_updater(OFF)
|
|
|
|
# Fulfill Requirements
|
|
set(HAVE_CURL OFF)
|
|
if(REQUIRE_CURL)
|
|
if(D_PLATFORM_WINDOWS)
|
|
if(${PREFIX}OBS_NATIVE) # Already defined by OBS
|
|
set(CURL_LIBRARIES "${CURL_LIB}")
|
|
set(CURL_INCLUDE_DIRS "${CURL_INCLUDE_DIR}")
|
|
else()
|
|
set(CURL_LIBRARIES "${obsdeps_SOURCE_DIR}/win${D_PLATFORM_BITS}/bin/libcurl.lib")
|
|
set(CURL_INCLUDE_DIRS "${obsdeps_SOURCE_DIR}/win${D_PLATFORM_BITS}/include")
|
|
endif()
|
|
set(CURL_LIBRARY_DEBUG ${CURL_LIBRARIES})
|
|
set(CURL_LIBRARY_RELEASE ${CURL_LIBRARIES})
|
|
set(CURL_INCLUDE_DIR ${CURL_INCLUDE_DIRS})
|
|
set(CURL_FOUND ON)
|
|
else()
|
|
find_package(CURL)
|
|
endif()
|
|
|
|
set(HAVE_CURL ${CURL_FOUND})
|
|
endif()
|
|
|
|
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_SOURCE_DIR}
|
|
${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()
|
|
|
|
set(HAVE_JSON OFF)
|
|
if(REQUIRE_JSON)
|
|
if(NOT EXISTS "${PROJECT_SOURCE_DIR}/third-party/nlohmann-json/single_include")
|
|
message(FATAL_ERROR "${LOGPREFIX} Please make sure to update git submodules to their latest supported version.")
|
|
return()
|
|
else()
|
|
set(JSON_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/third-party/nlohmann-json/single_include")
|
|
set(HAVE_JSON ON)
|
|
endif()
|
|
endif()
|
|
|
|
set(HAVE_NVIDIA_ARSDK OFF)
|
|
if(REQUIRE_NVIDIA_ARSDK)
|
|
if(EXISTS "${PROJECT_SOURCE_DIR}/third-party/nvidia-arsdk/version.h")
|
|
set(NVAR_ROOT "${PROJECT_SOURCE_DIR}/third-party/nvidia-arsdk")
|
|
endif()
|
|
|
|
find_package(NVAR)
|
|
|
|
set(HAVE_NVIDIA_ARSDK ${NVAR_FOUND})
|
|
endif()
|
|
|
|
set(HAVE_NVIDIA_CUDA OFF)
|
|
if(REQUIRE_NVIDIA_CUDA)
|
|
set(HAVE_NVIDIA_CUDA ON)
|
|
endif()
|
|
|
|
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()
|
|
endif()
|
|
endif()
|
|
|
|
set(HAVE_QT OFF)
|
|
if(REQUIRE_QT)
|
|
find_package(Qt5
|
|
COMPONENTS Widgets Core REQUIRED
|
|
)
|
|
set(HAVE_QT ${Qt5_FOUND})
|
|
endif()
|
|
|
|
# Verify Requirements
|
|
feature_encoder_ffmpeg(ON)
|
|
feature_filter_blur(ON)
|
|
feature_filter_color_grade(ON)
|
|
feature_filter_displacement(ON)
|
|
feature_filter_dynamic_mask(ON)
|
|
feature_filter_nvidia_face_tracking(ON)
|
|
feature_filter_sdf_effects(ON)
|
|
feature_filter_shader(ON)
|
|
feature_filter_transform(ON)
|
|
feature_source_mirror(ON)
|
|
feature_source_shader(ON)
|
|
feature_transition_shader(ON)
|
|
feature_frontend(ON)
|
|
feature_updater(ON)
|
|
|
|
################################################################################
|
|
# Code
|
|
################################################################################
|
|
set(PROJECT_DATA_LOCALE )
|
|
set(PROJECT_DATA_EFFECTS )
|
|
set(PROJECT_DATA_SHADERS )
|
|
set(PROJECT_LIBRARIES )
|
|
set(PROJECT_LIBRARIES_DELAYED )
|
|
set(PROJECT_INCLUDE_DIRS )
|
|
set(PROJECT_TEMPLATES )
|
|
set(PROJECT_PRIVATE_GENERATED )
|
|
set(PROJECT_PRIVATE_SOURCE )
|
|
set(PROJECT_UI )
|
|
set(PROJECT_UI_SOURCE )
|
|
set(PROJECT_DEFINITIONS )
|
|
|
|
# Configure Files
|
|
configure_file(
|
|
"templates/config.hpp.in"
|
|
"generated/config.hpp"
|
|
)
|
|
LIST(APPEND PROJECT_TEMPLATES "templates/config.hpp.in")
|
|
LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/config.hpp")
|
|
|
|
configure_file(
|
|
"templates/version.hpp.in"
|
|
"generated/version.hpp"
|
|
)
|
|
LIST(APPEND PROJECT_TEMPLATES "templates/version.hpp.in")
|
|
LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/version.hpp")
|
|
|
|
configure_file(
|
|
"templates/module.cpp.in"
|
|
"generated/module.cpp"
|
|
)
|
|
LIST(APPEND PROJECT_TEMPLATES "templates/module.cpp.in")
|
|
LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/module.cpp")
|
|
|
|
if(D_PLATFORM_WINDOWS) # Windows Support
|
|
set(PROJECT_PRODUCT_NAME "${PROJECT_FULL_NAME}")
|
|
set(PROJECT_COMPANY_NAME "${PROJECT_AUTHORS}")
|
|
set(PROJECT_COPYRIGHT "${PROJECT_AUTHORS} © ${PROJECT_COPYRIGHT_YEARS}")
|
|
set(PROJECT_LEGAL_TRADEMARKS_1 "")
|
|
set(PROJECT_LEGAL_TRADEMARKS_2 "")
|
|
|
|
configure_file(
|
|
"templates/version.rc.in"
|
|
"generated/version.rc"
|
|
@ONLY
|
|
)
|
|
LIST(APPEND PROJECT_TEMPLATES "templates/version.rc.in")
|
|
LIST(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/version.rc")
|
|
|
|
if(NOT ${PREFIX}OBS_NATIVE)
|
|
## Installer (InnoSetup)
|
|
get_filename_component(ISS_FILES_DIR "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_FILES_DIR}" ISS_FILES_DIR)
|
|
|
|
get_filename_component(ISS_PACKAGE_DIR "${CMAKE_PACKAGE_PREFIX}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_PACKAGE_DIR}" ISS_PACKAGE_DIR)
|
|
|
|
get_filename_component(ISS_SOURCE_DIR "${PROJECT_SOURCE_DIR}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_SOURCE_DIR}" ISS_SOURCE_DIR)
|
|
|
|
get_filename_component(ISS_MSVCHELPER_PATH "${msvc-redist-helper_BUILD_DIR}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_MSVCHELPER_PATH}" ISS_MSVCHELPER_PATH)
|
|
|
|
configure_file(
|
|
"templates/installer.iss.in"
|
|
"installer.iss"
|
|
)
|
|
list(APPEND PROJECT_TEMPLATES
|
|
"templates/installer.iss.in"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
# Minimum Dependencies
|
|
list(APPEND PROJECT_LIBRARIES libobs)
|
|
|
|
# Components
|
|
if(HAVE_CURL)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/util/util-curl.hpp"
|
|
"source/util/util-curl.cpp"
|
|
)
|
|
list(APPEND PROJECT_LIBRARIES ${CURL_LIBRARY_RELEASE})
|
|
list(APPEND PROJECT_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
|
|
endif()
|
|
|
|
if(HAVE_FFMPEG)
|
|
list(APPEND PROJECT_LIBRARIES
|
|
${FFMPEG_LIBRARIES}
|
|
)
|
|
list(APPEND PROJECT_INCLUDE_DIRS
|
|
${FFMPEG_INCLUDE_DIRS}
|
|
)
|
|
endif()
|
|
|
|
if(HAVE_JSON)
|
|
list(APPEND PROJECT_INCLUDE_DIRS ${JSON_INCLUDE_DIR})
|
|
endif()
|
|
|
|
if(HAVE_NVIDIA_ARSDK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/nvidia/ar/nvidia-ar.hpp"
|
|
"source/nvidia/ar/nvidia-ar.cpp"
|
|
"source/nvidia/ar/nvidia-ar-feature.hpp"
|
|
"source/nvidia/ar/nvidia-ar-feature.cpp"
|
|
)
|
|
list(APPEND PROJECT_LIBRARIES
|
|
nvARProxy
|
|
)
|
|
endif()
|
|
|
|
if(HAVE_NVIDIA_CUDA)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/nvidia/cuda/nvidia-cuda.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda.cpp"
|
|
"source/nvidia/cuda/nvidia-cuda-context.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda-context.cpp"
|
|
"source/nvidia/cuda/nvidia-cuda-context-stack.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda-context-stack.cpp"
|
|
"source/nvidia/cuda/nvidia-cuda-gs-texture.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda-gs-texture.cpp"
|
|
"source/nvidia/cuda/nvidia-cuda-memory.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda-memory.cpp"
|
|
"source/nvidia/cuda/nvidia-cuda-stream.hpp"
|
|
"source/nvidia/cuda/nvidia-cuda-stream.cpp"
|
|
)
|
|
endif()
|
|
|
|
if(REQUIRE_OBSFE AND HAVE_OBSFE)
|
|
list(APPEND PROJECT_LIBRARIES obs-frontend-api)
|
|
endif()
|
|
|
|
if(REQUIRE_QT AND HAVE_QT)
|
|
list(APPEND PROJECT_LIBRARIES Qt5::Core Qt5::Widgets)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Features
|
|
################################################################################
|
|
|
|
# Core
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/configuration.hpp"
|
|
"source/configuration.cpp"
|
|
"source/common.hpp"
|
|
"source/strings.hpp"
|
|
"source/plugin.hpp"
|
|
"source/plugin.cpp"
|
|
"source/util/utility.hpp"
|
|
"source/util/utility.cpp"
|
|
"source/util/util-bitmask.hpp"
|
|
"source/util/util-event.hpp"
|
|
"source/util/util-library.cpp"
|
|
"source/util/util-library.hpp"
|
|
"source/util/util-threadpool.cpp"
|
|
"source/util/util-threadpool.hpp"
|
|
"source/gfx/gfx-source-texture.hpp"
|
|
"source/gfx/gfx-source-texture.cpp"
|
|
"source/obs/gs/gs-helper.hpp"
|
|
"source/obs/gs/gs-helper.cpp"
|
|
"source/obs/gs/gs-effect.hpp"
|
|
"source/obs/gs/gs-effect.cpp"
|
|
"source/obs/gs/gs-effect-parameter.hpp"
|
|
"source/obs/gs/gs-effect-parameter.cpp"
|
|
"source/obs/gs/gs-effect-pass.hpp"
|
|
"source/obs/gs/gs-effect-pass.cpp"
|
|
"source/obs/gs/gs-effect-technique.hpp"
|
|
"source/obs/gs/gs-effect-technique.cpp"
|
|
"source/obs/gs/gs-indexbuffer.hpp"
|
|
"source/obs/gs/gs-indexbuffer.cpp"
|
|
"source/obs/gs/gs-limits.hpp"
|
|
"source/obs/gs/gs-mipmapper.hpp"
|
|
"source/obs/gs/gs-mipmapper.cpp"
|
|
"source/obs/gs/gs-rendertarget.hpp"
|
|
"source/obs/gs/gs-rendertarget.cpp"
|
|
"source/obs/gs/gs-sampler.hpp"
|
|
"source/obs/gs/gs-sampler.cpp"
|
|
"source/obs/gs/gs-texture.hpp"
|
|
"source/obs/gs/gs-texture.cpp"
|
|
"source/obs/gs/gs-vertex.hpp"
|
|
"source/obs/gs/gs-vertex.cpp"
|
|
"source/obs/gs/gs-vertexbuffer.hpp"
|
|
"source/obs/gs/gs-vertexbuffer.cpp"
|
|
"source/obs/obs-encoder-factory.hpp"
|
|
"source/obs/obs-encoder-factory.cpp"
|
|
"source/obs/obs-signal-handler.hpp"
|
|
"source/obs/obs-signal-handler.cpp"
|
|
"source/obs/obs-source.hpp"
|
|
"source/obs/obs-source.cpp"
|
|
"source/obs/obs-source-factory.hpp"
|
|
"source/obs/obs-source-factory.cpp"
|
|
"source/obs/obs-source-tracker.hpp"
|
|
"source/obs/obs-source-tracker.cpp"
|
|
"source/obs/obs-tools.hpp"
|
|
"source/obs/obs-tools.cpp"
|
|
)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/color_conversion_rgb_hsl.effect"
|
|
"data/effects/color_conversion_rgb_hsv.effect"
|
|
"data/effects/color_conversion_rgb_yuv.effect"
|
|
"data/effects/mipgen.effect"
|
|
"data/effects/pack-unpack.effect"
|
|
"data/effects/shared.effect"
|
|
"data/locale/en-US.ini"
|
|
)
|
|
list(APPEND PROJECT_INCLUDE_DIRS
|
|
"${PROJECT_BINARY_DIR}/generated"
|
|
"${PROJECT_SOURCE_DIR}/source"
|
|
)
|
|
file(GLOB_RECURSE PROJECT_EXAMPLES "data/examples/*")
|
|
list(APPEND PROJECT_DATA ${PROJECT_EXAMPLES})
|
|
|
|
# Encoder/FFmpeg
|
|
is_feature_enabled(ENCODER_FFMPEG T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
# FFmpeg
|
|
"source/ffmpeg/avframe-queue.cpp"
|
|
"source/ffmpeg/avframe-queue.hpp"
|
|
"source/ffmpeg/swscale.hpp"
|
|
"source/ffmpeg/swscale.cpp"
|
|
"source/ffmpeg/tools.hpp"
|
|
"source/ffmpeg/tools.cpp"
|
|
"source/ffmpeg/hwapi/base.hpp"
|
|
"source/ffmpeg/hwapi/base.cpp"
|
|
"source/ffmpeg/hwapi/d3d11.hpp"
|
|
"source/ffmpeg/hwapi/d3d11.cpp"
|
|
|
|
# Encoders
|
|
"source/encoders/encoder-ffmpeg.hpp"
|
|
"source/encoders/encoder-ffmpeg.cpp"
|
|
|
|
# Encoders/Codecs
|
|
"source/encoders/codecs/hevc.hpp"
|
|
"source/encoders/codecs/hevc.cpp"
|
|
"source/encoders/codecs/h264.hpp"
|
|
"source/encoders/codecs/h264.cpp"
|
|
"source/encoders/codecs/prores.hpp"
|
|
"source/encoders/codecs/prores.cpp"
|
|
|
|
# Encoders/Handlers
|
|
"source/encoders/handlers/handler.hpp"
|
|
"source/encoders/handlers/handler.cpp"
|
|
"source/encoders/handlers/debug_handler.hpp"
|
|
"source/encoders/handlers/debug_handler.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_ENCODER_FFMPEG
|
|
)
|
|
|
|
# AMF
|
|
is_feature_enabled(ENCODER_FFMPEG_AMF T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/encoders/handlers/amf_shared.hpp"
|
|
"source/encoders/handlers/amf_shared.cpp"
|
|
"source/encoders/handlers/amf_h264_handler.hpp"
|
|
"source/encoders/handlers/amf_h264_handler.cpp"
|
|
"source/encoders/handlers/amf_hevc_handler.hpp"
|
|
"source/encoders/handlers/amf_hevc_handler.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_ENCODER_FFMPEG_AMF
|
|
)
|
|
endif()
|
|
|
|
# NVENC
|
|
is_feature_enabled(ENCODER_FFMPEG_NVENC T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/encoders/handlers/nvenc_shared.hpp"
|
|
"source/encoders/handlers/nvenc_shared.cpp"
|
|
"source/encoders/handlers/nvenc_h264_handler.hpp"
|
|
"source/encoders/handlers/nvenc_h264_handler.cpp"
|
|
"source/encoders/handlers/nvenc_hevc_handler.hpp"
|
|
"source/encoders/handlers/nvenc_hevc_handler.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_ENCODER_FFMPEG_NVENC
|
|
)
|
|
endif()
|
|
|
|
# ProRES
|
|
is_feature_enabled(ENCODER_FFMPEG_PRORES T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/encoders/handlers/prores_aw_handler.hpp"
|
|
"source/encoders/handlers/prores_aw_handler.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_ENCODER_FFMPEG_PRORES
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
# Filter/Blur
|
|
is_feature_enabled(FILTER_BLUR T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/mask.effect"
|
|
"data/effects/blur/box.effect"
|
|
"data/effects/blur/box-linear.effect"
|
|
"data/effects/blur/dual-filtering.effect"
|
|
"data/effects/blur/gaussian.effect"
|
|
"data/effects/blur/gaussian-linear.effect"
|
|
)
|
|
list (APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/gfx/blur/gfx-blur-base.hpp"
|
|
"source/gfx/blur/gfx-blur-base.cpp"
|
|
"source/gfx/blur/gfx-blur-box.hpp"
|
|
"source/gfx/blur/gfx-blur-box.cpp"
|
|
"source/gfx/blur/gfx-blur-box-linear.hpp"
|
|
"source/gfx/blur/gfx-blur-box-linear.cpp"
|
|
"source/gfx/blur/gfx-blur-dual-filtering.hpp"
|
|
"source/gfx/blur/gfx-blur-dual-filtering.cpp"
|
|
"source/gfx/blur/gfx-blur-gaussian.hpp"
|
|
"source/gfx/blur/gfx-blur-gaussian.cpp"
|
|
"source/gfx/blur/gfx-blur-gaussian-linear.hpp"
|
|
"source/gfx/blur/gfx-blur-gaussian-linear.cpp"
|
|
"source/filters/filter-blur.hpp"
|
|
"source/filters/filter-blur.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_BLUR
|
|
)
|
|
endif()
|
|
|
|
# Filter/Color Grade
|
|
is_feature_enabled(FILTER_COLOR_GRADE T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/color-grade.effect"
|
|
)
|
|
list (APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-color-grade.hpp"
|
|
"source/filters/filter-color-grade.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_COLOR_GRADE
|
|
)
|
|
set(REQUIRE_LUT ON)
|
|
endif()
|
|
|
|
# Filter/Displacement
|
|
is_feature_enabled(FILTER_DISPLACEMENT T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/displace.effect"
|
|
)
|
|
list (APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-displacement.hpp"
|
|
"source/filters/filter-displacement.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_DISPLACEMENT
|
|
)
|
|
endif()
|
|
|
|
# Filter/Dynamic Mask
|
|
is_feature_enabled(FILTER_DYNAMIC_MASK T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/channel-mask.effect"
|
|
)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-dynamic-mask.hpp"
|
|
"source/filters/filter-dynamic-mask.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_DYNAMIC_MASK
|
|
)
|
|
endif()
|
|
|
|
# Filter/NVIDIA Face Tracking
|
|
is_feature_enabled(FILTER_NVIDIA_FACE_TRACKING T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-nv-face-tracking.hpp"
|
|
"source/filters/filter-nv-face-tracking.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_NVIDIA_FACE_TRACKING
|
|
)
|
|
endif()
|
|
|
|
# Filter/SDF Effects
|
|
is_feature_enabled(FILTER_SDF_EFFECTS T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/sdf/sdf-producer.effect"
|
|
"data/effects/sdf/sdf-consumer.effect"
|
|
)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-sdf-effects.hpp"
|
|
"source/filters/filter-sdf-effects.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_SDF_EFFECTS
|
|
)
|
|
endif()
|
|
|
|
# Filter/Shader
|
|
is_feature_enabled(FILTER_SHADER T_CHECK)
|
|
if(T_CHECK)
|
|
set(REQUIRE_PART_SHADER ON)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-shader.hpp"
|
|
"source/filters/filter-shader.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_SHADER
|
|
)
|
|
endif()
|
|
|
|
# Filter/Transform
|
|
is_feature_enabled(FILTER_TRANFORM T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/filters/filter-transform.hpp"
|
|
"source/filters/filter-transform.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FILTER_TRANSFORM
|
|
)
|
|
endif()
|
|
|
|
# Source/Mirror
|
|
is_feature_enabled(SOURCE_MIRROR T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/sources/source-mirror.hpp"
|
|
"source/sources/source-mirror.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_SOURCE_MIRROR
|
|
)
|
|
endif()
|
|
|
|
# Source/Shader
|
|
is_feature_enabled(SOURCE_SHADER T_CHECK)
|
|
if(T_CHECK)
|
|
set(REQUIRE_PART_SHADER ON)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/sources/source-shader.hpp"
|
|
"source/sources/source-shader.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_SOURCE_SHADER
|
|
)
|
|
endif()
|
|
|
|
# Transition/Shader
|
|
is_feature_enabled(TRANSITION_SHADER T_CHECK)
|
|
if(T_CHECK)
|
|
set(REQUIRE_PART_SHADER ON)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/transitions/transition-shader.hpp"
|
|
"source/transitions/transition-shader.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_TRANSITION_SHADER
|
|
)
|
|
endif()
|
|
|
|
# Profiling
|
|
is_feature_enabled(PROFILING T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/util/util-profiler.cpp"
|
|
"source/util/util-profiler.hpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_PROFILING
|
|
)
|
|
endif()
|
|
|
|
# Updater
|
|
is_feature_enabled(UPDATER T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/updater.hpp"
|
|
"source/updater.cpp"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_UPDATER
|
|
)
|
|
endif()
|
|
|
|
# Frontend
|
|
is_feature_enabled(FRONTEND T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_UI
|
|
"ui/streamfx.qrc"
|
|
"ui/about.ui"
|
|
"ui/about-entry.ui"
|
|
)
|
|
list(APPEND PROJECT_UI_SOURCE
|
|
"source/ui/ui-common.hpp"
|
|
"source/ui/ui.hpp"
|
|
"source/ui/ui.cpp"
|
|
"source/ui/ui-about.hpp"
|
|
"source/ui/ui-about.cpp"
|
|
"source/ui/ui-about-entry.hpp"
|
|
"source/ui/ui-about-entry.cpp"
|
|
)
|
|
list(APPEND PROJECT_INCLUDE_DIRS
|
|
"source/ui"
|
|
)
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
ENABLE_FRONTEND
|
|
)
|
|
|
|
is_feature_enabled(UPDATER T_CHECK)
|
|
if(T_CHECK)
|
|
list(APPEND PROJECT_UI_SOURCE
|
|
"source/ui/ui-updater.hpp"
|
|
"source/ui/ui-updater.cpp"
|
|
)
|
|
list(APPEND PROJECT_UI
|
|
"ui/updater.ui"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
# Parts
|
|
################################################################################
|
|
|
|
# Shaders
|
|
if(REQUIRE_PART_SHADER)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/gfx/shader/gfx-shader.hpp"
|
|
"source/gfx/shader/gfx-shader.cpp"
|
|
"source/gfx/shader/gfx-shader-param.hpp"
|
|
"source/gfx/shader/gfx-shader-param.cpp"
|
|
"source/gfx/shader/gfx-shader-param-audio.hpp"
|
|
"source/gfx/shader/gfx-shader-param-audio.cpp"
|
|
"source/gfx/shader/gfx-shader-param-basic.hpp"
|
|
"source/gfx/shader/gfx-shader-param-basic.cpp"
|
|
"source/gfx/shader/gfx-shader-param-matrix.hpp"
|
|
"source/gfx/shader/gfx-shader-param-matrix.cpp"
|
|
"source/gfx/shader/gfx-shader-param-texture.hpp"
|
|
"source/gfx/shader/gfx-shader-param-texture.cpp"
|
|
)
|
|
endif()
|
|
|
|
# LUT
|
|
if(REQUIRE_LUT)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/gfx/lut/gfx-lut.hpp"
|
|
"source/gfx/lut/gfx-lut.cpp"
|
|
"source/gfx/lut/gfx-lut-consumer.hpp"
|
|
"source/gfx/lut/gfx-lut-consumer.cpp"
|
|
"source/gfx/lut/gfx-lut-producer.hpp"
|
|
"source/gfx/lut/gfx-lut-producer.cpp"
|
|
)
|
|
list(APPEND PROJECT_DATA
|
|
"data/effects/lut.effect"
|
|
"data/effects/lut-consumer.effect"
|
|
"data/effects/lut-producer.effect"
|
|
)
|
|
endif()
|
|
|
|
# Windows
|
|
if(D_PLATFORM_WINDOWS)
|
|
list(APPEND PROJECT_PRIVATE_SOURCE
|
|
"source/windll.cpp"
|
|
)
|
|
list(APPEND PROJECT_LIBRARIES
|
|
Delayimp.lib
|
|
)
|
|
# Disable/Enable a ton of things.
|
|
list(APPEND PROJECT_DEFINITIONS
|
|
# Microsoft Visual C++
|
|
_CRT_SECURE_NO_WARNINGS
|
|
_ENABLE_EXTENDED_ALIGNED_STORAGE
|
|
# windows.h
|
|
WIN32_LEAN_AND_MEAN
|
|
NOGPICAPMASKS
|
|
NOVIRTUALKEYCODES
|
|
#NOWINMESSAGES
|
|
NOWINSTYLES
|
|
NOSYSMETRICS
|
|
NOMENUS
|
|
NOICONS
|
|
NOKEYSTATES
|
|
NOSYSCOMMANDS
|
|
NORASTEROPS
|
|
NOSHOWWINDOW
|
|
NOATOM
|
|
NOCLIPBOARD
|
|
NOCOLOR
|
|
#NOCTLMGR
|
|
NODRAWTEXT
|
|
#NOGDI
|
|
NOKERNEL
|
|
#NOUSER
|
|
#NONLS
|
|
NOMB
|
|
NOMEMMGR
|
|
NOMETAFILE
|
|
NOMINMAX
|
|
#NOMSG
|
|
NOOPENFILE
|
|
NOSCROLL
|
|
NOSERVICE
|
|
NOSOUND
|
|
#NOTEXTMETRIC
|
|
NOWH
|
|
NOWINOFFSETS
|
|
NOCOMM
|
|
NOKANJI
|
|
#NOHELP
|
|
NOPROFILER
|
|
NODEFERWINDOWPOS
|
|
NOMCX
|
|
NOIME
|
|
NOMDI
|
|
NOINOUT
|
|
)
|
|
endif()
|
|
|
|
# GCC before 9.0, Clang before 9.0
|
|
if((CMAKE_C_COMPILER_ID STREQUAL "GNU")
|
|
OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
|
OR (CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
|
OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
|
|
list(APPEND PROJECT_LIBRARIES
|
|
"stdc++fs"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
# Register Library
|
|
################################################################################
|
|
|
|
# Combine all variables that matter.
|
|
set(PROJECT_FILES
|
|
# Always exist
|
|
${PROJECT_DATA}
|
|
${PROJECT_PRIVATE_GENERATED}
|
|
${PROJECT_PRIVATE_SOURCE}
|
|
${PROJECT_TEMPLATES}
|
|
# UI-only (empty if not enabled)
|
|
${PROJECT_UI}
|
|
${PROJECT_UI_SOURCE}
|
|
)
|
|
|
|
# Set source groups for IDE generators.
|
|
source_group(TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${PROJECT_DATA})
|
|
source_group(TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Source" FILES ${PROJECT_PRIVATE_SOURCE} ${PROJECT_UI_SOURCE})
|
|
source_group(TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Source" FILES ${PROJECT_PRIVATE_GENERATED})
|
|
source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${PROJECT_TEMPLATES})
|
|
source_group(TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User Interface" FILES ${PROJECT_UI})
|
|
|
|
# Prevent unwanted files from being built as source.
|
|
set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_UI} PROPERTIES
|
|
HEADER_FILE_ONLY ON
|
|
)
|
|
|
|
# Prevent non-UI files from being Qt'd
|
|
if(HAVE_QT)
|
|
set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} PROPERTIES
|
|
SKIP_AUTOGEN ON
|
|
SKIP_AUTOMOC ON
|
|
SKIP_AUTORCC ON
|
|
SKIP_AUTOUIC ON
|
|
)
|
|
endif()
|
|
|
|
# Register the library
|
|
add_library(${PROJECT_NAME} MODULE ${PROJECT_FILES}) # We are a module for libOBS.
|
|
target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_INCLUDE_DIRS})
|
|
target_compile_definitions(${PROJECT_NAME} PRIVATE ${PROJECT_DEFINITIONS})
|
|
target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBRARIES})
|
|
|
|
# Set C++ Standard and Extensions
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
CXX_STANDARD 17
|
|
CXX_STANDARD_REQUIRED ON
|
|
CXX_EXTENSIONS OFF
|
|
)
|
|
|
|
# Remove prefix on other platforms.
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
PREFIX ""
|
|
IMPORT_PREFIX ""
|
|
)
|
|
|
|
# Set file version (on anything but MacOS)
|
|
if(NOT D_PLATFORM_MAC)
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
|
|
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK}
|
|
)
|
|
endif()
|
|
|
|
# Delay-Loading on Microsoft Visual C++
|
|
if(D_PLATFORM_WINDOWS)
|
|
foreach(DELAYLOAD ${PROJECT_LIBRARIES_DELAYED})
|
|
get_target_property(_lf ${PROJECT_NAME} LINK_FLAGS)
|
|
if (NOT _lf)
|
|
set(_lf "")
|
|
endif()
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${_lf} /DELAYLOAD:${DELAYLOAD}")
|
|
add_link_options("/DELAYLOAD:${DELAYLOAD}")
|
|
endforeach()
|
|
endif()
|
|
|
|
# Enable Qt if needed
|
|
if(HAVE_QT)
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
AUTOUIC ON
|
|
AUTOUIC_SEARCH_PATHS "${PROJECT_SOURCE_DIR};${PROJECT_SOURCE_DIR}/ui"
|
|
AUTOMOC ON
|
|
AUTORCC ON
|
|
AUTOGEN_BUILD_DIR "${PROJECT_BINARY_DIR}/generated"
|
|
)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Extra Tools
|
|
################################################################################
|
|
|
|
# Clang
|
|
is_feature_enabled(CLANG T_CHECK)
|
|
if(T_CHECK AND HAVE_CLANG)
|
|
generate_compile_commands_json(
|
|
TARGETS ${PROJECT_NAME}
|
|
)
|
|
clang_tidy(
|
|
TARGETS ${PROJECT_NAME}
|
|
VERSION 9.0.0
|
|
)
|
|
clang_format(
|
|
TARGETS ${PROJECT_NAME}
|
|
DEPENDENCY
|
|
VERSION 9.0.0
|
|
)
|
|
endif()
|
|
|
|
################################################################################
|
|
# Installation
|
|
################################################################################
|
|
|
|
if(${PREFIX}OBS_NATIVE)
|
|
# Grouped builds don't offer standalone services.
|
|
install_obs_plugin_with_data(${PROJECT_NAME} data)
|
|
else()
|
|
if(STRUCTURE_UNIFIED)
|
|
install(
|
|
DIRECTORY "data/"
|
|
DESTINATION "data/"
|
|
FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
|
|
if(D_PLATFORM_WINDOWS)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "bin/windows-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "bin/windows-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
if(MSVC)
|
|
install(
|
|
FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
|
|
DESTINATION "bin/windows-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/"
|
|
COMPONENT StreamFX
|
|
OPTIONAL
|
|
)
|
|
endif()
|
|
elseif(D_PLATFORM_LINUX)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "bin/linux-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "bin/linux-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
elseif(D_PLATFORM_MAC)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "bin/mac-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "bin/mac-${D_PLATFORM_INSTR}-${D_PLATFORM_BITS}/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
endif()
|
|
|
|
install(
|
|
FILES LICENSE
|
|
DESTINATION "LICENSE"
|
|
COMPONENT StreamFX
|
|
)
|
|
install(
|
|
FILES icon.png
|
|
DESTINATION "icon.png"
|
|
COMPONENT StreamFX
|
|
)
|
|
elseif(D_PLATFORM_WINDOWS)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "obs-plugins/${D_PLATFORM_BITS}bit/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "obs-plugins/${D_PLATFORM_BITS}bit/" COMPONENT StreamFX
|
|
)
|
|
install(
|
|
DIRECTORY "data/"
|
|
DESTINATION "data/obs-plugins/${PROJECT_NAME}/"
|
|
)
|
|
if(MSVC)
|
|
install(
|
|
FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
|
|
DESTINATION "obs-plugins/${D_PLATFORM_BITS}bit/"
|
|
OPTIONAL
|
|
)
|
|
endif()
|
|
elseif(D_PLATFORM_LINUX)
|
|
if(STRUCTURE_PACKAGEMANAGER)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "lib/obs-plugins/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "lib/obs-plugins/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
install(
|
|
DIRECTORY "data/"
|
|
DESTINATION "share/obs/obs-plugins/${PROJECT_NAME}"
|
|
COMPONENT StreamFX
|
|
FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
else()
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "plugins/${PROJECT_NAME}/bin/${D_PLATFORM_BITS}bit/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "plugins/${PROJECT_NAME}/bin/${D_PLATFORM_BITS}bit/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
install(
|
|
DIRECTORY "data/"
|
|
DESTINATION "plugins/${PROJECT_NAME}/data/"
|
|
COMPONENT StreamFX
|
|
FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
endif()
|
|
elseif(D_PLATFORM_MAC)
|
|
install(
|
|
TARGETS ${PROJECT_NAME}
|
|
RUNTIME DESTINATION "Library/Application Support/obs-studio/plugins/${PROJECT_NAME}/bin/" COMPONENT StreamFX
|
|
LIBRARY DESTINATION "Library/Application Support/obs-studio/plugins/${PROJECT_NAME}/bin/" COMPONENT StreamFX
|
|
PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
install(
|
|
DIRECTORY "data/"
|
|
DESTINATION "Library/Application Support/obs-studio/plugins/${PROJECT_NAME}/data/"
|
|
COMPONENT StreamFX
|
|
FILE_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
DIRECTORY_PERMISSIONS WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_READ;GROUP_WRITE
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
################################################################################
|
|
# Packaging
|
|
################################################################################
|
|
|
|
if(NOT ${PREFIX}OBS_NATIVE)
|
|
# Packaging
|
|
if(NOT PACKAGE_SUFFIX)
|
|
set(_PACKAGE_SUFFIX_OVERRIDE "${VERSION_STRING}")
|
|
else()
|
|
set(_PACKAGE_SUFFIX_OVERRIDE "${PACKAGE_SUFFIX}")
|
|
endif()
|
|
set(_PACKAGE_FULL_NAME "${PACKAGE_PREFIX}/${PACKAGE_NAME}-${_PACKAGE_SUFFIX_OVERRIDE}")
|
|
|
|
if(STRUCTURE_UNIFIED)
|
|
add_custom_target(
|
|
PACKAGE_ZIP
|
|
${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.obs" --format=zip --
|
|
"."
|
|
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
|
)
|
|
else()
|
|
add_custom_target(
|
|
PACKAGE_7Z
|
|
${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.7z" --format=7zip --
|
|
"."
|
|
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
|
)
|
|
add_custom_target(
|
|
PACKAGE_ZIP
|
|
${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.zip" --format=zip --
|
|
"."
|
|
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
|
|
)
|
|
|
|
# Windows
|
|
if(D_PLATFORM_WINDOWS)
|
|
## Installer (InnoSetup)
|
|
get_filename_component(ISS_FILES_DIR "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_FILES_DIR}" ISS_FILES_DIR)
|
|
get_filename_component(ISS_PACKAGE_DIR "${PACKAGE_PREFIX}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_PACKAGE_DIR}" ISS_PACKAGE_DIR)
|
|
get_filename_component(ISS_SOURCE_DIR "${PROJECT_SOURCE_DIR}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_SOURCE_DIR}" ISS_SOURCE_DIR)
|
|
get_filename_component(ISS_MSVCHELPER_PATH "${msvc-redist-helper_BUILD_DIR}" ABSOLUTE)
|
|
file(TO_NATIVE_PATH "${ISS_MSVCHELPER_PATH}" ISS_MSVCHELPER_PATH)
|
|
configure_file(
|
|
"templates/installer.iss.in"
|
|
"${PROJECT_BINARY_DIR}/installer.iss"
|
|
)
|
|
endif()
|
|
endif()
|
|
endif()
|