1991 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			CMake
		
	
	
	
			
		
		
	
	
			1991 lines
		
	
	
		
			62 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 11)
 | |
| set(VERSION_PATCH 0)
 | |
| set(VERSION_TWEAK 0)
 | |
| set(VERSION_SUFFIX "a3")
 | |
| 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 --long --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_TWEAK)
 | |
| 			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-z]+[0-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()
 | |
| else()
 | |
| 	message(STATUS "${LOGPREFIX} Not a git repository, automatic version detection disabled.")
 | |
| 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(NOT (${PREFIX}VERSION STREQUAL ""))
 | |
| 	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_TWEAK)
 | |
| 	else()
 | |
| 		set(VERSION_BUILD 0)
 | |
| 	endif()
 | |
| 	if (T_VERSIONLEN GREATER_EQUAL 4)
 | |
| 		list(GET T_VERSION 4 VERSION_COMMIT)
 | |
| 	else()
 | |
| 		set(VERSION_COMMIT "")
 | |
| 	endif()
 | |
| 
 | |
| 	# Patch needs additional parsing.
 | |
| 	# This may be a [0-9]*[a-z]*[0-9]+ string.
 | |
| 	string(REGEX MATCHALL "^([0-9]+)([a-z]+[0-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(NOT (VERSION_COMMIT STREQUAL ""))
 | |
| 	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)
 | |
| 	set(D_PLATFORM_ARCH_X86 ON)
 | |
| elseif(ARCH_INST STREQUAL "ARM")
 | |
| 	set(D_PLATFORM_INSTR_ARM ON)
 | |
| 	set(D_PLATFORM_ARCH_ARM ON)
 | |
| elseif(ARCH_INST STREQUAL "IA64")
 | |
| 	set(D_PLATFORM_INSTR_ITANIUM ON)
 | |
| 	set(D_PLATFORM_ARCH_ITANIUM ON)
 | |
| endif()
 | |
| 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()
 | |
| 
 | |
| ################################################################################
 | |
| # 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)
 | |
| else()
 | |
| 	message(STATUS "${LOGPREFIX} This is a combined build.")
 | |
| 	set(${PREFIX}OBS_NATIVE 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.")
 | |
| set(${PREFIX}ENABLE_ENCODER_AOM_AV1 ON CACHE BOOL "Enable AOM AV1 Encoder.")
 | |
| 
 | |
| ## 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")
 | |
| set(${PREFIX}ENABLE_FILTER_VIDEO_SUPERRESOLUTION ON CACHE BOOL "Enable Video Super-Resolution filter")
 | |
| set(${PREFIX}ENABLE_FILTER_VIDEO_SUPERRESOLUTION_NVIDIA ON CACHE BOOL "Enable NVIDIA Video Super-Resolution for Video Super-Resolution 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_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.")
 | |
| 	mark_as_advanced(
 | |
| 		${PREFIX}DOWNLOAD_OBS_URL
 | |
| 		${PREFIX}DOWNLOAD_OBS_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 (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()
 | |
| 					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()
 | |
| 					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.")
 | |
| 				return()
 | |
| 			endif()
 | |
| 		endif()
 | |
| 
 | |
| 		download_project(
 | |
| 			PROJ qt
 | |
| 			URL "${_DOWNLOAD_QT_URL}"
 | |
| 			URL_HASH "${_DOWNLOAD_QT_HASH}"
 | |
| 			DOWNLOAD_NO_PROGRESS OFF
 | |
| 			UPDATE_DISCONNECTED OFF
 | |
| 		)
 | |
| 
 | |
| 		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")
 | |
| 		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()
 | |
| 
 | |
| macro(set_feature_disabled FEATURE DISABLED)
 | |
| 	set(${PREFIX}DISABLE_${FEATURE} ${DISABLED} PARENT_SCOPE)
 | |
| endmacro()
 | |
| 
 | |
| # 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_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...")
 | |
| 			set_feature_disabled(ENCODER_AOM_AV1 ON)
 | |
| 		endif()
 | |
| 	elseif(T_CHECK)
 | |
| 		set(REQUIRE_AOM 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_filter_video_superresolution RESOLVE)
 | |
| 	is_feature_enabled(FILTER_VIDEO_SUPERRESOLUTION T_CHECK)
 | |
| 	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 Video Super-Resolution provider...")
 | |
| 			set_feature_disabled(FILTER_VIDEO_SUPERRESOLUTION_NVIDIA ON)
 | |
| 		endif()
 | |
| 
 | |
| 		# Verify that we have at least one provider for Video Super-Resolution.
 | |
| 		is_feature_enabled(FILTER_VIDEO_SUPERRESOLUTION_NVIDIA T_CHECK_NVIDIA)
 | |
| 		if (NOT T_CHECK_NVIDIA)
 | |
| 			message(WARNING "${LOGPREFIX}: Video Super-Resolution has no available providers. Disabling...")
 | |
| 			set_feature_disabled(FILTER_VIDEO_SUPERRESOLUTION ON)
 | |
| 		endif()
 | |
| 	elseif(T_CHECK)
 | |
| 		set(REQUIRE_NVIDIA_VFX_SDK ON PARENT_SCOPE)
 | |
| 	endif()
 | |
| 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_encoder_aom_av1(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_filter_video_superresolution(OFF)
 | |
| feature_source_mirror(OFF)
 | |
| feature_source_shader(OFF)
 | |
| feature_transition_shader(OFF)
 | |
| feature_frontend(OFF)
 | |
| feature_updater(OFF)
 | |
| 
 | |
| # Fulfill Requirements
 | |
| #- CURL
 | |
| 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_PATH}/bin/libcurl.lib")
 | |
| 			set(CURL_INCLUDE_DIRS "${_OBSDEPS_PATH}/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()
 | |
| 
 | |
| #- 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()
 | |
| 
 | |
| #- AOM
 | |
| set(HAVE_AOM OFF)
 | |
| if(REQUIRE_AOM)
 | |
| 	if(NOT D_PLATFORM_MAC)
 | |
| 		find_package(AOM)
 | |
| 		set(HAVE_AOM ${AOM_FOUND})
 | |
| 	endif()
 | |
| endif()
 | |
| 
 | |
| #- JSON
 | |
| 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()
 | |
| 
 | |
| #- NVIDIA Augmented Reality SDK (Windows)
 | |
| set(HAVE_NVIDIA_ARSDK OFF)
 | |
| if(REQUIRE_NVIDIA_ARSDK AND D_PLATFORM_WINDOWS)
 | |
| 	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()
 | |
| 
 | |
| #- NVIDIA Video Effects SDK
 | |
| set(HAVE_NVIDIA_VFX_SDK OFF)
 | |
| if(REQUIRE_NVIDIA_VFX_SDK AND D_PLATFORM_WINDOWS)
 | |
| 	if(EXISTS "${PROJECT_SOURCE_DIR}/third-party/nvidia-maxine-vfx-sdk/version.h")
 | |
| 		set(HAVE_NVIDIA_VFX_SDK ON)
 | |
| 	endif()
 | |
| 
 | |
| 	if(NOT TARGET NVIDIA::VFX)
 | |
| 		add_library(NVIDIA::VFX IMPORTED INTERFACE)
 | |
| 		target_include_directories(nvARProxy
 | |
| 			INTERFACE
 | |
| 				"${PROJECT_SOURCE_DIR}/third-party/nvidia-maxine-vfx-sdk/nvvfx/include/"
 | |
| 				"${PROJECT_SOURCE_DIR}/third-party/nvidia-maxine-vfx-sdk/nvvfx/source/"
 | |
| 		)
 | |
| 	endif()
 | |
| endif()
 | |
| 
 | |
| #- NVIDIA CUDA (Windows)
 | |
| set(HAVE_NVIDIA_CUDA OFF)
 | |
| if(REQUIRE_NVIDIA_CUDA AND D_PLATFORM_WINDOWS)
 | |
| 	set(HAVE_NVIDIA_CUDA ON)
 | |
| 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()
 | |
| 	endif()
 | |
| endif()
 | |
| 
 | |
| #- Qt5
 | |
| 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_encoder_aom_av1(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_filter_video_superresolution(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")
 | |
| 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_ARSDK OR HAVE_NVIDIA_VFX_SDK)
 | |
| 	list(APPEND PROJECT_PRIVATE_SOURCE
 | |
| 		"source/nvidia/cv/nvidia-cv.hpp"
 | |
| 		"source/nvidia/cv/nvidia-cv.cpp"
 | |
| 		"source/nvidia/cv/nvidia-cv-image.hpp"
 | |
| 		"source/nvidia/cv/nvidia-cv-image.cpp"
 | |
| 		"source/nvidia/cv/nvidia-cv-texture.hpp"
 | |
| 		"source/nvidia/cv/nvidia-cv-texture.cpp"
 | |
| 	)
 | |
| endif()
 | |
| 
 | |
| if(HAVE_NVIDIA_VFX_SDK)
 | |
| 	list(APPEND PROJECT_PRIVATE_SOURCE
 | |
| 		"source/nvidia/vfx/nvidia-vfx.hpp"
 | |
| 		"source/nvidia/vfx/nvidia-vfx.cpp"
 | |
| 		"source/nvidia/vfx/nvidia-vfx-effect.hpp"
 | |
| 		"source/nvidia/vfx/nvidia-vfx-effect.cpp"
 | |
| 		"source/nvidia/vfx/nvidia-vfx-superresolution.hpp"
 | |
| 		"source/nvidia/vfx/nvidia-vfx-superresolution.cpp"
 | |
| 	)
 | |
| 	list(APPEND PROJECT_LIBRARIES
 | |
| 		NVIDIA::VFX
 | |
| 	)
 | |
| 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-obs.hpp"
 | |
| 		"source/nvidia/cuda/nvidia-cuda-obs.cpp"
 | |
| 		"source/nvidia/cuda/nvidia-cuda-context.hpp"
 | |
| 		"source/nvidia/cuda/nvidia-cuda-context.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"
 | |
| 	)
 | |
| 	list(APPEND PROJECT_DEFINITIONS
 | |
| 		ENABLE_NVIDIA_CUDA
 | |
| 	)
 | |
| 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-logging.cpp"
 | |
| 	"source/util/util-logging.hpp"
 | |
| 	"source/util/util-platform.hpp"
 | |
| 	"source/util/util-platform.cpp"
 | |
| 	"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()
 | |
| 
 | |
| # Encoder/AOM-AV1
 | |
| is_feature_enabled(ENCODER_AOM_AV1 T_CHECK)
 | |
| if(T_CHECK)
 | |
| 	list (APPEND PROJECT_PRIVATE_SOURCE
 | |
| 		"source/encoders/codecs/av1.hpp"
 | |
| 		"source/encoders/codecs/av1.cpp"
 | |
| 		"source/encoders/encoder-aom-av1.hpp"
 | |
| 		"source/encoders/encoder-aom-av1.cpp"
 | |
| 	)
 | |
| 	list (APPEND PROJECT_INCLUDE_DIRS
 | |
| 		${AOM_INCLUDE_DIR}
 | |
| 	)
 | |
| 	list(APPEND PROJECT_DEFINITIONS
 | |
| 		ENABLE_ENCODER_AOM_AV1
 | |
| 	)
 | |
| endif()
 | |
| 
 | |
| # Filter/Blur
 | |
| is_feature_enabled(FILTER_BLUR T_CHECK)
 | |
| if(T_CHECK)
 | |
| 	list(APPEND PROJECT_DATA
 | |
| 		"data/effects/mask.effect"
 | |
| 		"data/effects/blur/common.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_TRANSFORM 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()
 | |
| 
 | |
| # Filter/Video Super-Resolution
 | |
| is_feature_enabled(FILTER_VIDEO_SUPERRESOLUTION T_CHECK)
 | |
| if(T_CHECK)
 | |
| 	list(APPEND PROJECT_PRIVATE_SOURCE
 | |
| 		"source/filters/filter-video-superresolution.hpp"
 | |
| 		"source/filters/filter-video-superresolution.cpp"
 | |
| 	)
 | |
| 	list(APPEND PROJECT_DEFINITIONS
 | |
| 		ENABLE_FILTER_VIDEO_SUPERRESOLUTION
 | |
| 	)
 | |
| 	is_feature_enabled(FILTER_VIDEO_SUPERRESOLUTION_NVIDIA T_CHECK)
 | |
| 	if (T_CHECK)
 | |
| 		list(APPEND PROJECT_DEFINITIONS
 | |
| 			ENABLE_FILTER_VIDEO_SUPERRESOLUTION_NVIDIA
 | |
| 		)
 | |
| 	endif()
 | |
| 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()
 | |
| 
 | |
| # MacOS: Disable automatic Code Signing in Xcode
 | |
| if(D_PLATFORM_MAC)
 | |
| 	set_target_properties(${PROJECT_NAME} PROPERTIES
 | |
| 		XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
 | |
| 		XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
 | |
| 	)
 | |
| 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()
 | |
| 
 | |
| # Apple otool
 | |
| if(D_PLATFORM_MAC)
 | |
| 	# OBS
 | |
| 	mac_get_linker_id(TARGET libobs OUTPUT T_OBS_LINK)
 | |
| 	add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
 | |
| 		COMMAND install_name_tool ARGS -change "${T_OBS_LINK}" "@executable_path/../Frameworks/libobs.0.dylib" $<TARGET_FILE:${PROJECT_NAME}>
 | |
| 	)
 | |
| 	message(STATUS "${LOGPREFIX} Added post-build step for adjusting libobs linking path.")
 | |
| 
 | |
| 	# OBS Front-End API
 | |
| 	if(REQUIRE_OBSFE AND HAVE_OBSFE)
 | |
| 		mac_get_linker_id(TARGET obs-frontend-api OUTPUT T_OBSFE_LINK)
 | |
| 		add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
 | |
| 			COMMAND install_name_tool ARGS -change "${T_OBSFE_LINK}" "@executable_path/../Frameworks/libobs-frontend-api.dylib" $<TARGET_FILE:${PROJECT_NAME}>
 | |
| 		)
 | |
| 		message(STATUS "${LOGPREFIX} Added post-build step for adjusting libobs-frontend-api linking path.")
 | |
| 	endif()
 | |
| 
 | |
| 	# Qt5
 | |
| 	if(REQUIRE_QT AND HAVE_QT)
 | |
| 		# Figure out the linker location for Qt5::Core
 | |
| 		mac_get_linker_id(TARGET Qt5::Core OUTPUT T_QT5CORE_LINK)
 | |
| 
 | |
| 		# Figure out the linker location for Qt5::Gui
 | |
| 		mac_get_linker_id(TARGET Qt5::Gui OUTPUT T_QT5GUI_LINK)
 | |
| 
 | |
| 		# Figure out the linker location for Qt5::Widsgets
 | |
| 		mac_get_linker_id(TARGET Qt5::Widgets OUTPUT T_QT5WIDGETS_LINK)
 | |
| 
 | |
| 		add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
 | |
| 		# - QtCore
 | |
| 			COMMAND install_name_tool ARGS -change "${T_QT5CORE_LINK}" "@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore" $<TARGET_FILE:${PROJECT_NAME}>
 | |
| 		# - QtGui
 | |
| 			COMMAND install_name_tool ARGS -change "${T_QT5GUI_LINK}" "@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui" $<TARGET_FILE:${PROJECT_NAME}>
 | |
| 		# - QtWidgets
 | |
| 			COMMAND install_name_tool ARGS -change "${T_QT5WIDGETS_LINK}" "@executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets" $<TARGET_FILE:${PROJECT_NAME}>
 | |
| 		)
 | |
| 		message(STATUS "${LOGPREFIX} Added post-build step for adjusting Qt5::Core linking path (Found: ${Qt5_DIR} resolved to ${T_QT5CORE_LINK}).")
 | |
| 		message(STATUS "${LOGPREFIX} Added post-build step for adjusting Qt5::Gui linking path (Found: ${Qt5_DIR} resolved to ${T_QT5GUI_LINK}).")
 | |
| 		message(STATUS "${LOGPREFIX} Added post-build step for adjusting Qt5::Widgets linking path (Found: ${Qt5_DIR} resolved to ${T_QT5WIDGETS_LINK}).")
 | |
| 	endif()
 | |
| endif()
 | |
| 
 | |
| ################################################################################
 | |
| # Installation
 | |
| ################################################################################
 | |
| 
 | |
| if(${PREFIX}OBS_NATIVE)
 | |
| 	# Grouped builds don't offer standalone services.
 | |
| 	install_obs_plugin_with_data(${PROJECT_NAME} data)
 | |
| 
 | |
| 	# Dependency: AOM
 | |
| 	if(HAVE_AOM AND AOM_BINARY AND D_PLATFORM_WINDOWS)
 | |
| 		add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
 | |
| 			COMMAND "${CMAKE_COMMAND}" -E copy
 | |
| 				"${AOM_BINARY}"
 | |
| 				"${CMAKE_BINARY_DIR}/rundir/$<CONFIGURATION>/data/obs-plugins/${PROJECT_NAME}"
 | |
| 			VERBATIM)
 | |
| 	endif()
 | |
| 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()
 | |
| 
 | |
| 			# Dependency: AOM
 | |
| 			if(HAVE_AOM AND AOM_BINARY AND D_PLATFORM_WINDOWS)
 | |
| 				install(
 | |
| 					FILES ${AOM_BINARY}
 | |
| 					DESTINATION "data/" COMPONENT StreamFX
 | |
| 				)
 | |
| 			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()
 | |
| 
 | |
| 		# Dependency: AOM
 | |
| 		if(HAVE_AOM AND AOM_BINARY AND D_PLATFORM_WINDOWS)
 | |
| 			install(
 | |
| 				FILES ${AOM_BINARY}
 | |
| 				DESTINATION "data/obs-plugins/${PROJECT_NAME}/" COMPONENT StreamFX
 | |
| 			)
 | |
| 		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 "${PROJECT_NAME}/bin/" COMPONENT StreamFX
 | |
| 			LIBRARY DESTINATION "${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 "${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"
 | |
| 				"installer.iss"
 | |
| 			)
 | |
| 		endif()
 | |
| 
 | |
| 		# Apple MacOS
 | |
| 		if(D_PLATFORM_MAC)
 | |
| 			# .pkg Installer
 | |
| 			configure_file(
 | |
| 				"templates/installer.pkgproj.in"
 | |
| 				"installer.pkgproj"
 | |
| 				@ONLY
 | |
| 			)
 | |
| 		endif()
 | |
| 	endif()
 | |
| endif()
 |