2023-02-28 01:15:26 +00:00
# AUTOGENERATED COPYRIGHT HEADER START
# Copyright (C) 2017-2023 Michael Fabian 'Xaymar' Dirks <info@xaymar.com>
# Copyright (C) 2019 Cat Stevens <catb0t@protonmail.ch>
# Copyright (C) 2020 Brandon Edens <brandonedens@gmail.com>
# Copyright (C) 2021 Christopher P Yarger <cpyarger@gmail.com>
# Copyright (C) 2022 Carsten Braun <info@braun-cloud.de>
# Copyright (C) 2022 Romain Vigier <romain@romainvigier.fr>
2023-10-04 05:31:29 +00:00
# Copyright (C) 2023 Isaac Nudelman <isaac.nudelman@utexas.edu>
2023-02-28 01:15:26 +00:00
# AUTOGENERATED COPYRIGHT HEADER END
2017-06-28 21:21:42 +00:00
2023-10-05 05:36:34 +00:00
# ToDo:
# - Explore RESOURCE property: https://cmake.org/cmake/help/latest/prop_tgt/RESOURCE.html
# - Explore PUBLIC_HEADER property: https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html
2018-04-24 10:31:43 +00:00
# CMake Setup
2023-05-13 11:28:54 +00:00
cmake_minimum_required ( VERSION 3.26 )
2023-05-03 16:09:05 +00:00
list ( APPEND CMAKE_MESSAGE_INDENT "[StreamFX] " )
project ( StreamFX )
2022-09-03 18:06:33 +00:00
2022-06-21 17:09:45 +00:00
################################################################################
# Modules
################################################################################
# Search Paths
set ( CMAKE_MODULE_PATH
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / m o d u l e s "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / c l a n g "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e / v e r s i o n "
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / c m a k e "
)
2023-05-03 16:09:05 +00:00
# Include required Modules
# - Stock
include ( "CheckIPOSupported" )
# - Custom
include ( "util" )
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/version/version.cmake" )
include ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/version/version.cmake" )
else ( )
message ( FATAL_ERROR "Please ensure you've cloned recursively and try again. Thank you!" )
endif ( )
# Include optional Modules
if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang/Clang.cmake" )
include ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang/Clang.cmake" )
endif ( )
2022-06-21 17:09:45 +00:00
2021-01-31 14:57:42 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
# Bootstrapping
2021-01-31 14:57:42 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
# MacOSX: Require at least MacOSX 10.15 for C++17 support.
if ( APPLE )
if ( CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.15 )
CacheSet ( CMAKE_OSX_DEPLOYMENT_TARGET "10.15" )
endif ( )
endif ( )
# Check if this is standalone or bundled.
2022-05-31 20:33:34 +00:00
set ( STANDALONE ON )
2021-01-31 14:57:42 +00:00
if ( "${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_LIST_DIR}" )
set ( GROUPED OFF )
set ( PREFIX "" )
else ( )
set ( GROUPED ON )
2022-06-02 06:55:40 +00:00
set ( PREFIX "StreamFX_" )
2022-08-06 20:03:38 +00:00
if ( GROUPED AND ( ( TARGET libobs ) OR ( TARGET OBS::libobs ) ) )
2022-05-31 20:33:34 +00:00
set ( STANDALONE OFF )
endif ( )
endif ( )
2020-12-14 16:47:13 +00:00
# Operating System
2020-09-28 19:08:07 +00:00
if ( CMAKE_SYSTEM_NAME STREQUAL "Windows" )
2020-12-14 16:47:13 +00:00
set ( D_PLATFORM_OS "windows" )
2020-09-28 19:08:07 +00:00
set ( D_PLATFORM_WINDOWS 1 )
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Linux" )
2020-12-14 16:47:13 +00:00
set ( D_PLATFORM_OS "linux" )
2020-09-28 19:08:07 +00:00
set ( D_PLATFORM_LINUX 1 )
2020-10-06 09:28:23 +00:00
elseif ( CMAKE_SYSTEM_NAME STREQUAL "Darwin" )
2020-12-14 16:47:13 +00:00
set ( D_PLATFORM_OS "macos" )
2020-09-28 19:08:07 +00:00
set ( D_PLATFORM_MAC 1 )
else ( )
2020-12-14 16:47:13 +00:00
set ( D_PLATFORM_OS "unknown" )
set ( D_PLATFORM_UNKNOWN 1 )
2023-05-03 16:09:05 +00:00
message ( WARNING "The operating system '${CMAKE_SYSTEM_NAME}' is unknown to to this script, continue at your own risk." )
2018-12-23 19:49:18 +00:00
endif ( )
2017-11-02 23:30:53 +00:00
2020-12-14 16:47:13 +00:00
# Architecture
2022-05-10 17:29:58 +00:00
set ( ARCH_INSTR_32 "i386;i686;x86;arm;ARM" )
set ( ARCH_INSTR_64 "x86_64;AMD64;IA64;arm64;ARM64" )
set ( ARCH_INSTR_X86 "i386;i686;x86;x86_64;AMD64" )
set ( ARCH_INSTR_ARM "arm;ARM;arm64;ARM64" )
set ( ARCH_INSTR_ITANIUM "IA64" )
set ( ARCH_BITS 0 )
set ( ARCH_BITS_POINTER 0 )
set ( ARCH_INST "" )
# - Bitness
list ( FIND ARCH_INSTR_32 "${CMAKE_SYSTEM_PROCESSOR}" FOUND )
if ( FOUND GREATER -1 )
set ( ARCH_BITS 32 )
2020-12-14 16:47:13 +00:00
endif ( )
2022-05-10 17:29:58 +00:00
list ( FIND ARCH_INSTR_64 "${CMAKE_SYSTEM_PROCESSOR}" FOUND )
if ( FOUND GREATER -1 )
set ( ARCH_BITS 64 )
endif ( )
2020-12-14 16:47:13 +00:00
set ( D_PLATFORM_BITS ${ ARCH_BITS } )
2022-05-10 17:29:58 +00:00
# - Pointer Size (bits)
math ( EXPR ARCH_BITS_POINTER "8*${CMAKE_SIZEOF_VOID_P}" )
set ( D_PLATFORM_BITS_PTR ${ ARCH_BITS_POINTER } )
2020-09-28 00:07:53 +00:00
2022-05-10 17:29:58 +00:00
# - Basic Instruction Set
list ( FIND ARCH_INSTR_X86 "${CMAKE_SYSTEM_PROCESSOR}" FOUND )
if ( FOUND GREATER -1 )
list ( APPEND ARCH_INST "x86" )
set ( D_PLATFORM_INSTR_X86 ON )
set ( D_PLATFORM_ARCH_X86 ON )
endif ( )
2021-03-22 21:14:19 +00:00
2022-05-10 17:29:58 +00:00
list ( FIND ARCH_INSTR_ARM "${CMAKE_SYSTEM_PROCESSOR}" FOUND )
if ( FOUND GREATER -1 )
list ( APPEND ARCH_INST "ARM" )
set ( D_PLATFORM_INSTR_ARM ON )
set ( D_PLATFORM_ARCH_ARM ON )
endif ( )
2021-03-22 21:14:19 +00:00
2022-05-10 17:29:58 +00:00
list ( FIND ARCH_INSTR_ITANIUM "${CMAKE_SYSTEM_PROCESSOR}" FOUND )
if ( FOUND GREATER -1 )
list ( APPEND ARCH_INST "Itanium" )
set ( D_PLATFORM_INSTR_ITANIUM ON )
set ( D_PLATFORM_ARCH_ITANIUM ON )
2019-09-04 01:32:18 +00:00
endif ( )
2023-05-03 16:09:05 +00:00
# Interprocedural Optimization
2022-05-31 20:33:34 +00:00
check_ipo_supported ( RESULT D_HAS_IPO )
2022-05-10 17:29:58 +00:00
set ( D_PLATFORM_INSTR ${ ARCH_INST } )
set ( D_PLATFORM_ARCH ${ ARCH_INST } )
2023-05-03 16:09:05 +00:00
message ( STATUS "Target is ${D_PLATFORM_BITS}bit ${ARCH_INST} with a pointer size of ${D_PLATFORM_BITS_PTR}bit." )
2022-05-10 17:29:58 +00:00
2020-09-28 19:08:07 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
# Versioning
2020-09-28 19:08:07 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
version ( GENERATE _VERSION COMPRESSED MAJOR 0 MINOR 0 PATCH 0 TWEAK 0 REQUIRE "PATCH;" )
version ( PARSE _VERSION "${_VERSION}" REQUIRE "PATCH;TWEAK" )
# If possible, automatically generate versions from git.
if ( EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git" )
find_program ( GIT
N A M E S
g i t
g i t . e x e
)
if ( EXISTS "${GIT}" )
2023-05-14 03:54:57 +00:00
# Try and calculate the exist version using git.
execute_process ( COMMAND "${GIT}" describe --tags --long --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 )
2023-05-03 16:09:05 +00:00
if ( ( GIT_RESULT EQUAL 0 ) AND ( NOT "${GIT_OUTPUT}" STREQUAL "" ) )
2023-05-14 03:54:57 +00:00
# Result will be MAJOR.MINOR.PATCH-TWEAK-gHASH
string ( REPLACE "-" ";" GIT_OUTPUT "${GIT_OUTPUT}" )
string ( REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}" )
# Split into components
list ( GET GIT_OUTPUT 0 GIT_OUTPUT_MAJOR )
list ( GET GIT_OUTPUT 1 GIT_OUTPUT_MINOR )
list ( GET GIT_OUTPUT 2 GIT_OUTPUT_PATCH )
list ( GET GIT_OUTPUT 3 GIT_OUTPUT_TWEAK )
list ( GET GIT_OUTPUT 4 GIT_OUTPUT_BUILD )
# Special case: Tag contains prerelease
if ( GIT_OUTPUT_PATCH MATCHES "([0-9]+)([a-zA-Z]+)([0-9]*)" )
# Patch requires special parsing.
set ( GIT_OUTPUT_PATCH "${CMAKE_MATCH_1}" )
if ( CMAKE_MATCH_3 GREATER 0 )
set ( GIT_OUTPUT_PRERELEASE "${CMAKE_MATCH_2}" )
else ( )
set ( GIT_OUTPUT_PRERELEASE "a" )
2023-05-03 16:09:05 +00:00
endif ( )
2023-05-14 03:54:57 +00:00
MATH ( EXPR GIT_OUTPUT_TWEAK "${GIT_OUTPUT_TWEAK} + ${CMAKE_MATCH_3}" )
# Modify the global version
version ( MODIFY _VERSION "${_VERSION}" COMPRESS
M A J O R " $ { G I T _ O U T P U T _ M A J O R } "
M I N O R " $ { G I T _ O U T P U T _ M I N O R } "
P A T C H " $ { G I T _ O U T P U T _ P A T C H } "
T W E A K " $ { G I T _ O U T P U T _ T W E A K } "
B U I L D " $ { G I T _ O U T P U T _ B U I L D } "
P R E R E L E A S E " $ { G I T _ O U T P U T _ P R E R E L E A S E } "
R E Q U I R E " P A T C H ; T W E A K "
)
else ( )
# Modify the global version
version ( MODIFY _VERSION "${_VERSION}" COMPRESS
M A J O R " $ { G I T _ O U T P U T _ M A J O R } "
M I N O R " $ { G I T _ O U T P U T _ M I N O R } "
P A T C H " $ { G I T _ O U T P U T _ P A T C H } "
T W E A K " $ { G I T _ O U T P U T _ T W E A K } "
B U I L D " $ { G I T _ O U T P U T _ B U I L D } "
P R E R E L E A S E " a "
R E Q U I R E " P A T C H ; T W E A K "
)
2023-05-03 16:09:05 +00:00
endif ( )
else ( )
2023-05-14 03:54:57 +00:00
execute_process ( COMMAND "${GIT}" rev-list --count 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 )
2023-05-03 16:09:05 +00:00
if ( ( GIT_RESULT EQUAL 0 ) AND ( NOT "${GIT_OUTPUT}" STREQUAL "" ) )
2023-05-14 03:54:57 +00:00
version ( MODIFY _VERSION "${_VERSION}" COMPRESS
T W E A K " $ { G I T _ O U T P U T } "
P R E R E L E A S E " a "
R E Q U I R E " P A T C H ; T W E A K "
)
# Determine the build using git.
execute_process ( COMMAND "${GIT}" log -1 "--pretty=format:g%h" --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 )
2023-05-03 16:09:05 +00:00
if ( ( GIT_RESULT EQUAL 0 ) AND ( NOT "${GIT_OUTPUT}" STREQUAL "" ) )
version ( MODIFY _VERSION "${_VERSION}" COMPRESS
2023-05-14 03:54:57 +00:00
B U I L D " $ { G I T _ O U T P U T } "
2023-05-03 16:09:05 +00:00
R E Q U I R E " P A T C H ; T W E A K "
)
else ( )
2023-05-14 03:54:57 +00:00
message ( WARNING "Failed to detect build version with 'git'." )
2023-05-03 16:09:05 +00:00
endif ( )
2023-05-14 03:54:57 +00:00
else ( )
message ( WARNING "Failed to automatically detect version with 'git'." )
2023-05-03 16:09:05 +00:00
endif ( )
endif ( )
else ( )
message ( WARNING "'git' not found, automatic version detection disabled." )
endif ( )
else ( )
message ( STATUS "Not a git repository, automatic version detection disabled." )
endif ( )
version ( PARSE _VERSION "${_VERSION}" REQUIRE "PATCH;TWEAK" )
# Allow manual overrides of the detected version.
if ( NOT ( "${${PREFIX}VERSION}" STREQUAL "" ) )
version ( PARSE _VERSION_CFG "${${PREFIX}VERSION}" REQUIRE "PATCH;TWEAK" )
if ( "${_VERSION_CFG_BUILD}" STREQUAL "" )
set ( _VERSION_CFG_BUILD "${_VERSION_BUILD}" )
endif ( )
version ( GENERATE _VERSION COMPRESS
M A J O R " $ { _ V E R S I O N _ C F G _ M A J O R } "
M I N O R " $ { _ V E R S I O N _ C F G _ M I N O R } "
P A T C H " $ { _ V E R S I O N _ C F G _ P A T C H } "
T W E A K " $ { _ V E R S I O N _ C F G _ T W E A K } "
P R E R E L E A S E " $ { _ V E R S I O N _ C F G _ P R E R E L E A S E } "
B U I L D " $ { _ V E R S I O N _ C F G _ B U I L D } "
)
2022-08-06 20:03:38 +00:00
endif ( )
2023-05-03 16:09:05 +00:00
set ( _VERSION_THIN "${_VERSION_MAJOR}.${_VERSION_MINOR}.${_VERSION_PATCH}" )
if ( NOT ( _VERSION_PRERELEASE STREQUAL "" ) )
set ( _VERSION_THIN "${_VERSION_THIN}${_VERSION_PRERELEASE}${_VERSION_TWEAK}" )
endif ( )
if ( NOT ( VERSION_COMMIT STREQUAL "" ) )
set ( _VERSION_THIN "${_VERSION_THIN}-${_VERSION_BUILD}" )
endif ( )
# Parse & Log the detected version.
message ( STATUS "Version ${_VERSION_THIN}" )
################################################################################
# Options
################################################################################
2023-05-03 17:45:07 +00:00
# Don't enable stability affecting features by default.
if ( _VERSION_PRERELEASE STREQUAL "a" )
set ( FEATURE_DEPRECATED ON )
set ( FEATURE_EXPERIMENTAL ON )
set ( FEATURE_UNSTABLE ON )
set ( FEATURE_STABLE ON )
elseif ( _VERSION_PRERELEASE STREQUAL "b" )
set ( FEATURE_DEPRECATED ON )
2023-10-05 05:36:34 +00:00
set ( FEATURE_EXPERIMENTAL OFF )
2023-05-03 17:45:07 +00:00
set ( FEATURE_UNSTABLE ON )
set ( FEATURE_STABLE ON )
elseif ( _VERSION_PRERELEASE STREQUAL "c" )
set ( FEATURE_DEPRECATED ON )
set ( FEATURE_EXPERIMENTAL OFF )
2023-10-05 05:36:34 +00:00
set ( FEATURE_UNSTABLE OFF )
2023-05-03 17:45:07 +00:00
set ( FEATURE_STABLE ON )
else ( )
set ( FEATURE_DEPRECATED ON )
set ( FEATURE_EXPERIMENTAL OFF )
set ( FEATURE_UNSTABLE OFF )
set ( FEATURE_STABLE ON )
endif ( )
2023-05-03 16:09:05 +00:00
# Version override
set ( ${ PREFIX } VERSION "" CACHE STRING "Specify an override for the automatically detected version. Accepts a mixture of SemVer 2.0 and CMake Version." )
2022-08-06 20:03:38 +00:00
2023-09-29 23:34:27 +00:00
# Compile/Link Related
2022-06-02 06:55:40 +00:00
set ( ${ PREFIX } ENABLE_FASTMATH ON CACHE BOOL "Enable fast math optimizations, which sacrifice precision and stability." )
2022-05-31 20:33:34 +00:00
if ( D_PLATFORM_ARCH_X86 )
set ( ${ PREFIX } TARGET_X86_64_V4 OFF CACHE BOOL "Target x86-64-v4 (x86-64-v3, AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL)." )
set ( ${ PREFIX } TARGET_X86_64_V3 OFF CACHE BOOL "Target x86-64-v3 (x86-64-v2, AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, OSXSAVE)." )
set ( ${ PREFIX } TARGET_X86_64_V2_EX ON CACHE BOOL "Target extended x86-64-v2 (x86-64-v2, AVX, BMI1, BMI2, F16C, FMA, MOVBE)." )
set ( ${ PREFIX } TARGET_X86_64_V2 ON CACHE BOOL "Target x86-64-v2 (x86-64, CMPXCHG16B, LAHF-SAHF, POPCNT, SSE3, SSE4.1, SSE4.2, SSSE3)." )
set ( ${ PREFIX } TARGET_X86_64 ON CACHE BOOL "Target x86-64 (CMOV, CX8, FPU, FXSR, MMX, OSFXSR, SCE, SSE, SSE2)." )
endif ( )
if ( NOT MSVC )
set ( ${ PREFIX } TARGET_NATIVE OFF CACHE BOOL "Target the native CPU architecture. Enable it for development or personal builds, but disable it for distribution." )
endif ( )
2022-05-31 20:33:34 +00:00
2021-01-31 21:05:23 +00:00
# Installation / Packaging
if ( STANDALONE )
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?" )
2023-09-03 12:34:26 +00:00
set ( PACKAGE_NAME "StreamFX" CACHE STRING "What should the package be called?" )
2021-01-31 21:05:23 +00:00
set ( PACKAGE_SUFFIX "" CACHE STRING "Any suffix for the package name? (Defaults to the current version string)" )
endif ( )
2023-05-03 16:09:05 +00:00
# Dependencies
if ( STANDALONE )
set ( libobs_DIR "" CACHE PATH "Path to libobs and obs-frontend-api" )
set ( Qt_DIR "" CACHE PATH "Path to Qt6 or Qt5" )
set ( CURL_DIR "" CACHE PATH "Path to CURL" )
set ( FFmpeg_DIR "" CACHE PATH "Path to FFmpeg" )
2020-12-14 16:47:13 +00:00
endif ( )
2023-05-03 16:09:05 +00:00
set ( AOM_DIR "" CACHE PATH "Path to AOM library" )
2020-06-14 02:34:05 +00:00
2020-12-14 16:47:13 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
# Project
2020-12-14 16:47:13 +00:00
################################################################################
2023-05-03 16:09:05 +00:00
# Metadata
version ( GENERATE PROJECT_VERSION
M A J O R " $ { _ V E R S I O N _ M A J O R } "
M I N O R " $ { _ V E R S I O N _ M I N O R } "
P A T C H " $ { _ V E R S I O N _ P A T C H } "
T W E A K " $ { _ V E R S I O N _ T W E A K } "
2023-05-13 11:32:43 +00:00
R E Q U I R E " P A T C H ; T W E A K "
2023-05-03 16:09:05 +00:00
)
project (
S t r e a m F X
V E R S I O N $ { P R O J E C T _ V E R S I O N }
D E S C R I P T I O N " A d d i t i o n a l s o u r c e s , f i l t e r s , t r a n s i t i o n s a n d e n c o d e r s f o r O B S S t u d i o . "
H O M E P A G E _ U R L " h t t p s : / / s t r e a m f x . x a y m a r . c o m / "
)
2023-09-03 12:34:26 +00:00
set ( PROJECT_IDENTIFER "com.xaymar.StreamFX.obs" )
2023-05-03 16:09:05 +00:00
set ( PROJECT_TITLE "StreamFX (for OBS Studio)" )
set ( PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <info@xaymar.com>" )
set ( PROJECT_COPYRIGHT "2017 - 2022, Michael Fabian Dirks. All Rights Reserved" )
set ( PROJECT_TRADEMARKS "" )
list ( APPEND PROJECT_TRADEMARKS
" A M D i s a t r a d e m a r k o f A d v a n c e d M i c r o D e v i c e s I n c . "
" N V I D I A i s a t r a d e m a r k o f N v i d i a C o r p o r a t i o n "
)
# Component search paths
2022-08-06 20:03:38 +00:00
list ( APPEND CMAKE_PREFIX_PATH
" $ { $ { P R E F I X } A O M _ P A T H } "
" $ { $ { P R E F I X } O B S D E P S _ P A T H } "
" $ { $ { P R E F I X } Q T _ P A T H } "
" $ { A O M _ D I R } "
" $ { C U R L _ D I R } "
" $ { D e p s P a t h } "
" $ { F F m p e g _ D I R } "
" $ { l i b o b s _ D I R } "
" $ { Q t _ D I R } "
" $ { Q t 5 _ D I R } "
" $ { Q t 6 _ D I R } "
" $ { Q T D I R } "
)
if ( D_PLATFORM_MAC )
list ( APPEND CMAKE_PREFIX_PATH
" $ { $ { P R E F I X } A O M _ P A T H } / F r a m e w o r k s "
" $ { $ { P R E F I X } O B S D E P S _ P A T H } / F r a m e w o r k s "
" $ { $ { P R E F I X } Q T _ P A T H } / F r a m e w o r k s "
" $ { A O M _ D I R } / F r a m e w o r k s "
" $ { C U R L _ D I R } / F r a m e w o r k s "
" $ { D e p s P a t h } / F r a m e w o r k s "
" $ { F F m p e g _ D I R } / F r a m e w o r k s "
" $ { l i b o b s _ D I R } / F r a m e w o r k s "
" $ { Q t _ D I R } / F r a m e w o r k s "
" $ { Q t 5 _ D I R } / F r a m e w o r k s "
" $ { Q t 6 _ D I R } / F r a m e w o r k s "
" $ { Q T D I R } / F r a m e w o r k s "
)
2018-12-23 19:49:18 +00:00
endif ( )
2018-04-24 10:31:43 +00:00
2023-09-03 10:09:33 +00:00
set_property ( GLOBAL PROPERTY AUTOGEN_SOURCE_GROUP "User-Interface Files/Generated" )
2020-12-14 16:47:13 +00:00
################################################################################
2023-09-29 23:34:27 +00:00
# Dependencies
2020-12-14 16:47:13 +00:00
################################################################################
2022-05-31 20:33:34 +00:00
#- OBS: Library
if ( STANDALONE )
2022-08-06 20:03:38 +00:00
find_package ( "libobs" REQUIRED CONFIG )
elseif ( NOT TARGET OBS::libobs )
# Add the missing OBS::libobs alias target if possible.
add_library ( OBS::libobs ALIAS libobs )
2022-05-31 20:33:34 +00:00
endif ( )
2022-08-20 05:50:19 +00:00
if ( D_PLATFORM_MAC )
# We may need to reconstruct the include directories on MacOS.
get_target_property ( libobs_INTERFACE_INCLUDE_DIRECTORIES OBS::libobs INTERFACE_INCLUDE_DIRECTORIES )
if ( "${libobs_INTERFACE_INCLUDE_DIRECTORIES}" STREQUAL "libobs_INTERFACE_INCLUDE_DIRECTORIES-NOTFOUND" )
get_target_property ( libobs_IMPORTED_LOCATION_RELEASE OBS::libobs IMPORTED_LOCATION_RELEASE )
get_filename_component ( libobs_IMPORTED_LOCATION_RELEASE "${libobs_IMPORTED_LOCATION_RELEASE}" DIRECTORY )
get_filename_component ( libobs_IMPORTED_LOCATION_RELEASE "${libobs_IMPORTED_LOCATION_RELEASE}" DIRECTORY )
get_filename_component ( libobs_IMPORTED_LOCATION_RELEASE "${libobs_IMPORTED_LOCATION_RELEASE}" DIRECTORY )
set ( libobs_IMPORTED_LOCATION_RELEASE "${libobs_IMPORTED_LOCATION_RELEASE}/Headers" )
set_target_properties ( OBS::libobs PROPERTIES
I N T E R F A C E _ I N C L U D E _ D I R E C T O R I E S
" $ { l i b o b s _ I M P O R T E D _ L O C A T I O N _ R E L E A S E } "
)
endif ( )
endif ( )
2022-05-31 20:33:34 +00:00
#- OBS: Front-End API
2023-09-29 23:34:27 +00:00
if ( STANDALONE )
find_package ( "obs-frontend-api" CONFIG )
set ( obs-frontend-api_FOUND "${obs-frontend-api_FOUND}" )
elseif ( TARGET obs-frontend-api )
set ( obs-frontend-api_FOUND ON )
endif ( )
if ( NOT TARGET OBS::obs-frontend-api )
add_library ( OBS::obs-frontend-api ALIAS obs-frontend-api )
2022-05-31 20:33:34 +00:00
endif ( )
2021-03-22 21:14:19 +00:00
#- CURL
2023-09-29 23:34:27 +00:00
find_package ( "CURL" )
2020-09-28 19:08:07 +00:00
2021-03-22 21:14:19 +00:00
#- JSON
2023-09-29 23:34:27 +00:00
if ( NOT EXISTS "${PROJECT_SOURCE_DIR}/third-party/nlohmann-json/single_include" )
message ( FATAL_ERROR "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" )
2020-09-28 19:08:07 +00:00
endif ( )
2023-09-29 23:34:27 +00:00
#- Qt 6
find_package ( "Qt6"
C O M P O N E N T S C o r e G u i W i d g e t s
C O N F I G
)
2020-09-28 19:08:07 +00:00
2020-12-14 16:47:13 +00:00
################################################################################
2023-09-03 10:09:33 +00:00
# Helpers
2020-12-14 16:47:13 +00:00
################################################################################
2023-09-03 10:09:33 +00:00
define_property ( TARGET PROPERTY COMPONENT_LABEL )
define_property ( TARGET PROPERTY COMPONENT_NAME )
define_property ( TARGET PROPERTY COMPONENT_OPTION )
2023-09-30 02:45:20 +00:00
define_property ( TARGET PROPERTY COMPONENT_RESOLVER )
2023-09-03 10:09:33 +00:00
define_property ( TARGET PROPERTY COMPONENT_DEPENDS )
function ( streamfx_add_library TARGET_NAME TARGET_TYPE )
add_library ( ${ TARGET_NAME } ${ TARGET_TYPE } )
set_target_properties ( ${ TARGET_NAME } PROPERTIES
# Always generate position independent code.
P O S I T I O N _ I N D E P E N D E N T _ C O D E O N
# Set C++ Standard and Extensions
C _ S T A N D A R D 1 7
C _ S T A N D A R D _ R E Q U I R E D O N
C X X _ S T A N D A R D 1 7
C X X _ S T A N D A R D _ R E Q U I R E D O N
C X X _ E X T E N S I O N S O F F
# Remove prefix from generated files.
P R E F I X " "
I M P O R T _ P R E F I X " "
)
if ( D_PLATFORM_MAC )
set_target_properties ( ${ TARGET_NAME } PROPERTIES
# @rpath in installed binaries
I N S T A L L _ R P A T H " @ e x e c u t a b l e _ p a t h / . . / F r a m e w o r k s / ; @ l o a d e r _ p a t h / . . / F r a m e w o r k s / ; @ l o a d e r _ p a t h / . . / R e s o u r c e s / "
)
2023-10-05 05:36:34 +00:00
2023-09-03 10:09:33 +00:00
if ( STANDALONE )
set_target_properties ( ${ TARGET_NAME } PROPERTIES
# @rpath in built binaries
B U I L D _ W I T H _ I N S T A L L _ R P A T H O N
)
endif ( )
endif ( )
2020-12-14 16:47:13 +00:00
2023-09-03 10:09:33 +00:00
target_compile_definitions ( ${ TARGET_NAME } PRIVATE
_ _ S T D C _ W A N T _ L I B _ E X T 1 _ _ = 1
2020-12-14 16:47:13 +00:00
)
2023-09-07 01:29:11 +00:00
if ( D_PLATFORM_WINDOWS )
target_compile_definitions ( ${ TARGET_NAME }
P U B L I C
# Microsoft Visual C++
_ C R T _ S E C U R E _ N O _ W A R N I N G S
_ E N A B L E _ E X T E N D E D _ A L I G N E D _ S T O R A G E
P U B L I C
# windows.h
# - Disable MIN/MAX macro as this breaks a lot of code.
N O M I N M A X
# - Disable IN/OUT macro as this breaks a lot of code.
N O I N O U T
)
endif ( )
2020-12-14 16:47:13 +00:00
2023-09-03 10:09:33 +00:00
# C/C++ Compiler Adjustments
if ( D_PLATFORM_WINDOWS AND ( ( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" ) OR ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) ) )
# MSVC/ClangCL
2022-05-31 20:33:34 +00:00
2023-09-03 10:09:33 +00:00
# - Dynamically link Microsoft C/C++ Redistributable.
target_compile_options ( ${ TARGET_NAME } PRIVATE
$ < $ < C O N F I G : > : / M D >
$ < $ < C O N F I G : D e b u g > : / M D d >
$ < $ < C O N F I G : R e l e a s e > : / M D >
$ < $ < C O N F I G : R e l W i t h D e b I n f o > : / M D >
$ < $ < C O N F I G : M i n S i z e R e l > : / M D >
)
2020-12-14 16:47:13 +00:00
2023-09-03 10:09:33 +00:00
# - Treat Warnings as Errors
target_compile_options ( ${ TARGET_NAME } PRIVATE "/Wall" )
# - Explicitly disable treating all Warnings as Errors
target_compile_options ( ${ TARGET_NAME } PRIVATE "/WX-" )
# - Disable useless warnings
set ( DISABLED_WARNINGS
# Don't warn about unused variables, parameters, labels, functions, or typedefs.
" 4 1 0 0 "
" 4 1 0 1 "
" 4 1 0 2 "
" 4 5 0 5 "
" 4 5 1 4 "
" 5 2 4 5 "
2023-10-05 07:02:51 +00:00
" 5 2 6 4 "
2023-09-03 10:09:33 +00:00
# Don't warn about unreferenced variables or parameters which are assigned/initialized.
" 4 1 8 9 "
# Don't warn about not-explicitly-handled enumeration identifiers
" 4 0 6 1 "
# Ignore automatic padding warnings.
" 4 8 2 0 "
# Ignore assignment/move/copy being implicit '= delete;'.
" 4 6 2 3 "
" 4 6 2 5 "
" 4 6 2 6 "
" 5 0 2 6 "
" 5 0 2 7 "
# Relative include paths are fine.
" 4 4 6 4 "
# Buggy warning: printf expects string literal
" 4 7 7 4 "
# Buggy warning: subobject initialization should be wrapped in braces
" 5 2 4 6 "
# Ignore undefined, unused or unreferenced pre-processor macros
" 4 6 8 8 "
# Ignore non-inlined functions
" 4 7 1 0 "
# Ignore Spectre mitigation insertions
" 5 0 4 5 "
# Ignore inserted padding.
" 4 3 2 4 "
2023-10-05 07:02:51 +00:00
# Ignore non-standard nameless struct/union.
" 4 2 0 1 "
# Intended behavior: Replace undefined macros with 0
" 4 6 6 8 "
2023-09-03 10:09:33 +00:00
)
foreach ( WARN ${ DISABLED_WARNINGS } )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/wd${WARN}" )
endforeach ( )
2022-06-02 06:55:40 +00:00
2023-09-03 10:09:33 +00:00
# - Require enabled instruction sets.
if ( D_PLATFORM_ARCH_X86 )
if ( ${ PREFIX } TARGET_X86_64_V4 )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/arch:AVX512" )
elseif ( ${ PREFIX } TARGET_X86_64_V3 )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/arch:AVX2" )
elseif ( ${ PREFIX } TARGET_X86_64_V2_EX )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/arch:AVX" )
elseif ( ${ PREFIX } TARGET_X86_64_V2 )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/d2archSSE42" )
elseif ( ${ PREFIX } TARGET_X86_64 )
#target_compile_options(${TARGET_NAME} PRIVATE "/arch:SSE2")
endif ( )
2022-05-31 20:33:34 +00:00
endif ( )
2022-06-02 06:55:40 +00:00
2023-09-03 10:09:33 +00:00
# - Use fast unordered math if possible.
if ( ${ PREFIX } ENABLE_FASTMATH )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/fp:fast" )
else ( )
target_compile_options ( ${ TARGET_NAME } PRIVATE "/fp:precise" )
if ( MSVC_VERSION GREATER 1930 )
# Keep original behavior in VS2022 and up.
target_compile_options ( ${ TARGET_NAME } PRIVATE "/fp:contract" )
endif ( )
2022-06-02 06:55:40 +00:00
endif ( )
2022-05-10 17:29:58 +00:00
2023-09-03 10:09:33 +00:00
# - Disable incremental builds
target_compile_options ( ${ TARGET_NAME } PRIVATE "/INCREMENTAL:NO" )
# - Enable C++ exceptions with SEH exceptions.
target_compile_options ( ${ TARGET_NAME } PRIVATE "/EHa" )
# - Enable multi-processor compiling.
target_compile_options ( ${ TARGET_NAME } PRIVATE "/MP" )
# - Enable updated __cplusplus macro
target_compile_options ( ${ TARGET_NAME } PRIVATE "/Zc:__cplusplus" )
elseif ( D_PLATFORM_LINUX AND ( ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) OR ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) ) )
# GCC/Clang
# - Enable all warnings.
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wall" )
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wextra" )
# - Disable useless warnings
set ( DISABLED_WARNINGS
# Don't warn about unused variables, parameters, labels, functions, or typedefs.
" u n u s e d - f u n c t i o n "
" u n u s e d - l a b e l "
" u n u s e d - l o c a l - t y p e d e f s "
" u n u s e d - p a r a m e t e r "
" u n u s e d - r e s u l t "
" u n u s e d - c o n s t - v a r i a b l e "
" u n u s e d - v a r i a b l e "
" u n u s e d - v a l u e "
# Don't warn about unreferenced variables or parameters which are assigned/initialized.
" u n u s e d - b u t - s e t - p a r a m e t e r "
" u n u s e d - b u t - s e t - v a r i a b l e "
# Don't warn about not-explicitly-handled enumeration identifiers
" s w i t c h "
# Ignore automatic padding warnings.
" p a d d e d "
# Ignore implicit '= delete;'.
# Ignore extra arguments for printf
" f o r m a t - e x t r a - a r g s "
# Ignore undefined, unused or unreferenced pre-processor macros
" u n u s e d - m a c r o s "
2022-05-31 20:33:34 +00:00
)
2023-09-03 10:09:33 +00:00
foreach ( WARN ${ DISABLED_WARNINGS } )
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wno-${WARN}" )
endforeach ( )
# - Require enabled instruction sets.
if ( ${ PREFIX } TARGET_NATIVE )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = n a t i v e "
2022-05-31 20:33:34 +00:00
)
2023-09-03 10:09:33 +00:00
elseif ( D_PLATFORM_ARCH_X86 )
if ( ${ PREFIX } TARGET_X86_64_V4 )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = x 8 6 - 6 4 - v 4 "
)
elseif ( ${ PREFIX } TARGET_X86_64_V3 )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = x 8 6 - 6 4 - v 3 "
)
elseif ( ${ PREFIX } TARGET_X86_64_V2_EX )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = x 8 6 - 6 4 - v 2 "
" - m a v x "
" - m b m i 2 "
" - m b m i "
" - m f m a "
" - m f 1 6 c "
" - m m o v b e "
" - m p c l m u l "
" - m p o p c n t "
)
elseif ( ${ PREFIX } TARGET_X86_64_V2 )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = x 8 6 - 6 4 - v 2 "
)
elseif ( ${ PREFIX } TARGET_X86_64 )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = x 8 6 - 6 4 "
)
endif ( )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m t u n e = g e n e r i c "
)
else ( )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m t u n e = x 8 6 - 6 4 "
)
endif ( )
2022-05-31 20:33:34 +00:00
endif ( )
2023-09-03 10:09:33 +00:00
# - Use fast unordered math if possible.
if ( ${ PREFIX } ENABLE_FASTMATH )
if ( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - f f a s t - m a t h "
)
else ( )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - f f p - m o d e l = f a s t "
)
endif ( )
2022-06-02 06:55:40 +00:00
else ( )
2023-09-03 10:09:33 +00:00
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - f f p - m o d e l = p r e c i s e "
2022-06-02 06:55:40 +00:00
)
endif ( )
2023-09-03 10:09:33 +00:00
# - Don't export by default, require attributes.
# add_compile_options("-fvisibility=hidden")
elseif ( D_PLATFORM_MAC AND ( CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" ) )
# AppleClang
# - Enable most useful warnings.
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wall" )
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wextra" )
2023-10-05 07:02:51 +00:00
# - Disable useless warnings
set ( DISABLED_WARNINGS
# Don't warn about unused variables, parameters, labels, functions, or typedefs.
" u n u s e d - f u n c t i o n "
" u n u s e d - l a b e l "
" u n u s e d - l o c a l - t y p e d e f s "
" u n u s e d - p a r a m e t e r "
" u n u s e d - r e s u l t "
" u n u s e d - c o n s t - v a r i a b l e "
" u n u s e d - v a r i a b l e "
" u n u s e d - v a l u e "
# Don't warn about unreferenced variables or parameters which are assigned/initialized.
" u n u s e d - b u t - s e t - p a r a m e t e r "
" u n u s e d - b u t - s e t - v a r i a b l e "
# Don't warn about not-explicitly-handled enumeration identifiers
" s w i t c h "
# Ignore automatic padding warnings.
" p a d d e d "
# Ignore implicit '= delete;'.
# Ignore extra arguments for printf
" f o r m a t - e x t r a - a r g s "
# Ignore undefined, unused or unreferenced pre-processor macros
" u n u s e d - m a c r o s "
)
foreach ( WARN ${ DISABLED_WARNINGS } )
target_compile_options ( ${ TARGET_NAME } PRIVATE "-Wno-${WARN}" )
endforeach ( )
2023-09-03 10:09:33 +00:00
# - Require enabled instruction sets.
if ( ${ PREFIX } TARGET_NATIVE )
target_compile_options ( ${ TARGET_NAME } PRIVATE
" - m a r c h = n a t i v e "
2022-06-02 06:55:40 +00:00
)
2023-09-03 10:09:33 +00:00
message ( WARNING "Targeting native architecture. Binaries will not be distributable to other systems!" )
2022-06-02 06:55:40 +00:00
endif ( )
2023-09-03 10:09:33 +00:00
# - Use fast unordered math if possible.
# FIXME: Appears to not be supported.
2022-06-02 06:55:40 +00:00
2023-09-03 10:09:33 +00:00
# - Don't export by default, require attributes.
# add_compile_options("-fvisibility=hidden")
2022-05-31 20:33:34 +00:00
endif ( )
2023-09-03 10:09:33 +00:00
endfunction ( )
2022-05-31 20:33:34 +00:00
2023-09-30 02:45:20 +00:00
function ( streamfx_sanitize_name TEXT _OUTPUT_NAME _OUTPUT_TARGET _OUTPUT_OPTION )
string ( REGEX REPLACE "^[ \t]+" "" TEXT "${TEXT}" )
string ( REGEX REPLACE "[ \t]+$" "" TEXT "${TEXT}" )
string ( REGEX REPLACE "[^a-zA-Z0-9_-]+" "_" TEXT2 "${TEXT}" )
string ( REGEX REPLACE "_[_]+" "_" TEXT2 "${TEXT2}" )
string ( TOUPPER "${TEXT2}" TEXT3 )
set ( ${ _OUTPUT_NAME } "${TEXT}" PARENT_SCOPE )
set ( ${ _OUTPUT_TARGET } "${TEXT2}" PARENT_SCOPE )
set ( ${ _OUTPUT_OPTION } "${TEXT3}" PARENT_SCOPE )
endfunction ( )
2023-09-03 10:09:33 +00:00
2023-09-30 02:45:20 +00:00
function ( streamfx_add_component COMPONENT_NAME )
cmake_parse_arguments ( PARSE_ARGV 1 _ARG
" "
" R E S O L V E R "
" "
)
2023-09-03 10:09:33 +00:00
2023-09-30 02:45:20 +00:00
# Sanitize name for further use.
streamfx_sanitize_name ( "${COMPONENT_NAME}" COMPONENT_NAME COMPONENT_SANITIZED_NAME COMPONENT_OPTION_NAME )
2023-09-03 12:22:28 +00:00
set ( COMPONENT_OPTION "${PREFIX}COMPONENT_${COMPONENT_OPTION_NAME}" )
set ( COMPONENT_OPTION "${COMPONENT_OPTION}" PARENT_SCOPE )
2023-09-03 10:09:33 +00:00
# Define the necessary targets.
2023-09-03 12:22:28 +00:00
set ( COMPONENT_TARGET "StreamFX_${COMPONENT_SANITIZED_NAME}" )
set ( COMPONENT_TARGET "${COMPONENT_TARGET}" PARENT_SCOPE )
set ( COMPONENT_ALIAS "StreamFX::${COMPONENT_SANITIZED_NAME}" )
set ( COMPONENT_ALIAS "${COMPONENT_ALIAS}" PARENT_SCOPE )
2023-09-03 10:09:33 +00:00
2023-10-03 05:13:55 +00:00
streamfx_add_library ( ${ COMPONENT_TARGET } STATIC EXCLUDE_FROM_ALL )
2023-09-03 10:09:33 +00:00
add_library ( ${ COMPONENT_ALIAS } ALIAS ${ COMPONENT_TARGET } )
set_target_properties ( ${ COMPONENT_TARGET } PROPERTIES
2023-09-03 11:51:16 +00:00
C O M P O N E N T _ L A B E L " $ { C O M P O N E N T _ N A M E } "
2023-09-03 10:09:33 +00:00
C O M P O N E N T _ N A M E " $ { C O M P O N E N T _ A L I A S } "
2023-09-03 12:22:28 +00:00
C O M P O N E N T _ O P T I O N " $ { C O M P O N E N T _ O P T I O N } "
2023-09-03 10:09:33 +00:00
)
2023-09-03 12:22:28 +00:00
# Always depend on StreamFX::Core
2023-10-05 05:36:34 +00:00
target_link_libraries ( ${ COMPONENT_TARGET } PUBLIC $< LINK_LIBRARY:WHOLE_ARCHIVE,StreamFX_Core > )
2023-09-03 12:22:28 +00:00
2023-09-03 10:09:33 +00:00
# Register the component globally.
2023-09-03 12:22:28 +00:00
get_target_property ( _DEPENDS StreamFX COMPONENT_DEPENDS )
if ( _DEPENDS )
2023-09-30 02:45:20 +00:00
list ( APPEND _DEPENDS "${COMPONENT_SANITIZED_NAME}" )
2023-09-03 12:22:28 +00:00
else ( )
2023-09-30 02:45:20 +00:00
set ( _DEPENDS "${COMPONENT_SANITIZED_NAME}" )
2023-09-03 12:22:28 +00:00
endif ( )
set_target_properties ( StreamFX PROPERTIES
C O M P O N E N T _ D E P E N D S " $ { _ D E P E N D S } "
)
2023-09-30 02:45:20 +00:00
# If there is a resolver function, register it.
if ( _ARG_RESOLVER )
2023-09-30 03:33:08 +00:00
set_target_properties ( ${ COMPONENT_TARGET } PROPERTIES
2023-09-30 02:45:20 +00:00
C O M P O N E N T _ R E S O L V E R " $ { _ A R G _ R E S O L V E R } "
)
endif ( )
2023-09-03 10:09:33 +00:00
# Allow disabling this component.
2023-09-03 12:22:28 +00:00
set ( ${ COMPONENT_OPTION } ON CACHE BOOL "Enable the ${COMPONENT_NAME} component?" )
2023-09-06 00:48:42 +00:00
set ( ${ COMPONENT_OPTION } _DISABLED OFF CACHE INTERNAL "Disable the ${_NAME} component?" FORCE )
2023-09-03 10:09:33 +00:00
2023-09-07 01:29:11 +00:00
# Add common include directories
target_include_directories ( ${ COMPONENT_TARGET }
P R I V A T E
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / s o u r c e "
P U B L I C
" $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / i n c l u d e "
)
2023-09-03 10:09:33 +00:00
# Add files in common places.
file ( GLOB_RECURSE TEMPLATES FOLLOW_SYMLINKS CONFIGURE_DEPENDS "templates/*" )
source_group ( TREE "${CMAKE_CURRENT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${ TEMPLATES } )
2023-09-07 01:29:11 +00:00
file ( GLOB_RECURSE DATA FOLLOW_SYMLINKS CONFIGURE_DEPENDS "data/*" )
source_group ( TREE "${CMAKE_CURRENT_SOURCE_DIR}/data" PREFIX "Data" FILES ${ DATA } )
2023-09-03 10:09:33 +00:00
file ( GLOB_RECURSE SOURCE_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "ui/*" )
2023-09-07 01:29:11 +00:00
source_group ( TREE "${CMAKE_CURRENT_SOURCE_DIR}/ui" PREFIX "User-Interface Files" FILES ${ USERINTERFACE } )
2023-09-03 10:09:33 +00:00
file ( GLOB_RECURSE SOURCE_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "source/*" )
source_group ( TREE "${CMAKE_CURRENT_SOURCE_DIR}/source" PREFIX "Private Files" FILES ${ SOURCE_PRIVATE } )
2023-09-07 01:29:11 +00:00
file ( GLOB_RECURSE UI_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "source/ui/*" )
2023-09-03 10:09:33 +00:00
file ( GLOB_RECURSE GENERATED_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/source/*" )
source_group ( TREE "${CMAKE_CURRENT_BINARY_DIR}/source" PREFIX "Private Files/Generated" FILES ${ GENERATED_PRIVATE } )
file ( GLOB_RECURSE SOURCE_PUBLIC FOLLOW_SYMLINKS CONFIGURE_DEPENDS "include/*" )
source_group ( TREE "${CMAKE_CURRENT_SOURCE_DIR}/include" PREFIX "Public Files" FILES ${ SOURCE_PUBLIC } )
2023-09-07 01:29:11 +00:00
file ( GLOB_RECURSE UI_PUBLIC FOLLOW_SYMLINKS CONFIGURE_DEPENDS "include/ui/*" )
2023-09-03 10:09:33 +00:00
file ( GLOB_RECURSE GENERATED_PUBLIC FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/include/*" )
source_group ( TREE "${CMAKE_CURRENT_BINARY_DIR}/include" PREFIX "Public Files/Generated" FILES ${ GENERATED_PUBLIC } )
target_sources ( ${ COMPONENT_TARGET }
P R I V A T E
2023-09-07 01:29:11 +00:00
$ { D A T A }
2023-09-03 10:09:33 +00:00
$ { T E M P L A T E S }
2023-09-07 01:29:11 +00:00
$ { U S E R I N T E R F A C E }
2023-09-03 10:09:33 +00:00
$ { S O U R C E _ P R I V A T E }
$ { G E N E R A T E D _ P R I V A T E }
$ { S O U R C E _ P U B L I C }
$ { G E N E R A T E D _ P U B L I C }
)
# Ignore data only files.
set_source_files_properties (
2023-09-07 01:29:11 +00:00
$ { D A T A }
2023-09-03 10:09:33 +00:00
$ { T E M P L A T E S }
2023-09-07 01:29:11 +00:00
$ { U S E R I N T E R F A C E }
2023-09-03 10:09:33 +00:00
P R O P E R T I E S
H E A D E R _ F I L E _ O N L Y O N
)
2023-09-03 12:58:59 +00:00
# Enable Qt if needed
set_target_properties ( ${ TARGET_NAME } PROPERTIES
A U T O U I C O N
A U T O U I C _ S E A R C H _ P A T H S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } ; $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / u i "
A U T O M O C O N
A U T O R C C O N
A U T O G E N _ B U I L D _ D I R " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / g e n e r a t e d "
)
2023-09-03 10:09:33 +00:00
set_source_files_properties (
$ { T E M P L A T E S }
$ { S O U R C E _ P R I V A T E }
$ { G E N E R A T E D _ P R I V A T E }
$ { S O U R C E _ P U B L I C }
$ { G E N E R A T E D _ P U B L I C }
P R O P E R T I E S
S K I P _ A U T O G E N O N
S K I P _ A U T O M O C O N
S K I P _ A U T O R C C O N
S K I P _ A U T O U I C O N
2023-09-07 01:29:11 +00:00
)
set_source_files_properties (
$ { U I _ P R I V A T E }
$ { U I _ P U B L I C }
P R O P E R T I E S
S K I P _ A U T O G E N O F F
S K I P _ A U T O M O C O F F
S K I P _ A U T O R C C O F F
S K I P _ A U T O U I C O F F
)
2023-09-03 10:09:33 +00:00
endfunction ( )
2022-06-02 06:55:40 +00:00
2023-09-30 02:45:20 +00:00
function ( streamfx_has_component _NAME _OUTPUT )
streamfx_sanitize_name ( "${_NAME}" _NAME _TARGET _OPTION )
set ( ${ _OUTPUT } OFF PARENT_SCOPE )
if ( TARGET "StreamFX_${_TARGET}" )
set ( ${ _OUTPUT } ON PARENT_SCOPE )
endif ( )
endfunction ( )
function ( streamfx_enabled_component _NAME _OUTPUT )
streamfx_sanitize_name ( "${_NAME}" _NAME _TARGET _OPTION )
if ( NOT TARGET "StreamFX_${_TARGET}" )
message ( FATAL_ERROR "Unknown component '${_NAME}'." )
endif ( )
get_target_property ( _OPTION "StreamFX_${_TARGET}" COMPONENT_OPTION )
set ( ${ _OUTPUT } OFF PARENT_SCOPE )
if ( ${ _OPTION } AND NOT ( ${ _OPTION } _DISABLED ) )
set ( ${ _OUTPUT } ON PARENT_SCOPE )
endif ( )
endfunction ( )
# Use this to add a dependency on another component.
2023-09-03 11:28:08 +00:00
function ( streamfx_add_component_dependency _NAME )
2023-09-30 02:45:20 +00:00
cmake_parse_arguments ( PARSE_ARGV 1 _ARG
" O P T I O N A L "
" "
" "
)
streamfx_sanitize_name ( "${_NAME}" _NAME _TARGET _OPTION )
set ( DEPENDENCY "${_TARGET}" )
if ( _ARG_OPTIONAL )
list ( APPEND DEPENDENCY "OPTIONAL" )
endif ( )
string ( REPLACE ";" "\\;" DEPENDENCY "${DEPENDENCY}" )
get_target_property ( DEPENDS "${COMPONENT_TARGET}" COMPONENT_DEPENDS )
if ( DEPENDS )
list ( APPEND DEPENDS "${DEPENDENCY}" )
else ( )
set ( DEPENDS "${DEPENDENCY}" )
endif ( )
set_target_properties ( "${COMPONENT_TARGET}" PROPERTIES COMPONENT_DEPENDS "${DEPENDS}" )
2023-09-03 10:09:33 +00:00
endfunction ( )
2023-09-30 02:45:20 +00:00
# Use this to disable a component via script.
function ( streamfx_disable_component _NAME )
cmake_parse_arguments ( PARSE_ARGV 1 _ARG
" "
" R E A S O N "
" "
)
streamfx_sanitize_name ( "${_NAME}" _NAME _TARGET _OPTION )
2023-09-30 03:33:08 +00:00
if ( NOT ( _TARGET MATCHES "^StreamFX_" ) )
set ( _TARGET "StreamFX_${_TARGET}" )
endif ( )
2023-09-30 02:45:20 +00:00
2023-09-06 00:48:42 +00:00
# If the component doesn't exist, skip it.
2023-09-30 02:45:20 +00:00
if ( NOT TARGET ${ _TARGET } )
message ( WARNING "Not disabling invalid component '${_NAME}'." )
2023-09-06 00:48:42 +00:00
return ( )
endif ( )
2023-09-30 02:45:20 +00:00
get_target_property ( _LABEL ${ _TARGET } COMPONENT_LABEL )
get_target_property ( _OPTION ${ _TARGET } COMPONENT_OPTION )
2023-09-06 00:48:42 +00:00
CacheSet ( ${ _OPTION } _DISABLED ON )
2023-09-30 02:45:20 +00:00
if ( _ARG_REASON )
message ( STATUS "[${_LABEL}] Disabled due to: ${_ARG_REASON}" )
2023-09-06 00:48:42 +00:00
endif ( )
endfunction ( )
2023-09-03 10:09:33 +00:00
################################################################################
# Register Library
################################################################################
2023-09-03 12:34:26 +00:00
streamfx_add_library ( StreamFX MODULE ) # We are a module for libOBS.
2019-04-19 05:15:18 +00:00
2023-09-03 13:17:23 +00:00
# Ensure there is at least one file.
if ( D_PLATFORM_WINDOWS )
target_sources ( StreamFX
P R I V A T E
" s o u r c e / w i n d l l . c p p "
)
else ( )
target_sources ( StreamFX
P R I V A T E
" / d e v / n u l l "
)
endif ( )
2023-10-05 05:36:34 +00:00
# version.rc (can't be part of a static library)
2023-10-04 04:32:12 +00:00
if ( D_PLATFORM_WINDOWS ) # Windows-exclusive
2023-09-03 13:17:23 +00:00
# Version Resource
2023-09-03 11:28:08 +00:00
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 (
" t e m p l a t e s / w i n d o w s / v e r s i o n . r c . i n "
2023-10-05 05:36:34 +00:00
" v e r s i o n . r c "
2023-09-03 11:28:08 +00:00
)
2023-10-05 05:36:34 +00:00
target_sources ( StreamFX PRIVATE
" $ { P R O J E C T _ B I N A R Y _ D I R } / v e r s i o n . r c "
2021-02-19 09:59:24 +00:00
)
endif ( )
2023-09-03 13:17:23 +00:00
set_target_properties ( StreamFX PROPERTIES
2023-10-05 05:36:34 +00:00
# Version
2023-09-03 13:17:23 +00:00
M A C H O _ C O M P A T I B I L I T Y _ V E R S I O N $ { _ V E R S I O N _ M A J O R } . $ { _ V E R S I O N _ M I N O R }
S O V E R S I O N $ { _ V E R S I O N _ M A J O R } . $ { _ V E R S I O N _ M I N O R }
2023-10-05 05:36:34 +00:00
M A C H O _ C U R R E N T _ V E R S I O N $ { P R O J E C T _ V E R S I O N }
2023-09-03 13:17:23 +00:00
V E R S I O N $ { P R O J E C T _ V E R S I O N }
)
2020-12-14 16:47:13 +00:00
################################################################################
2023-09-03 10:09:33 +00:00
# Add Core
2017-06-28 21:21:42 +00:00
################################################################################
2023-09-03 12:34:26 +00:00
streamfx_add_library ( StreamFX_Core STATIC EXCLUDE_FROM_ALL )
add_library ( StreamFX::Core ALIAS StreamFX_Core )
2023-10-05 05:36:34 +00:00
# Enable Qt
set_target_properties ( StreamFX_Core PROPERTIES
A U T O U I C O N
A U T O U I C _ S E A R C H _ P A T H S " $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } ; $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } / u i "
A U T O M O C O N
A U T O R C C O N
A U T O G E N _ B U I L D _ D I R " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / q t "
)
# Default Links
2023-09-03 12:58:59 +00:00
target_link_libraries ( StreamFX_Core
2023-10-05 05:36:34 +00:00
P U B L I C
C U R L : : l i b c u r l
Q t 6 : : C o r e
Q t 6 : : G u i
Q t 6 : : W i d g e t s
O B S : : o b s - f r o n t e n d - a p i
O B S : : l i b o b s
2023-09-03 12:34:26 +00:00
)
2023-10-05 05:36:34 +00:00
# Default Include Dirs
2023-09-03 12:58:59 +00:00
target_include_directories ( StreamFX_Core
2023-10-05 05:36:34 +00:00
P R I V A T E
" $ { P R O J E C T _ S O U R C E _ D I R } / s o u r c e / u i "
" $ { P R O J E C T _ B I N A R Y _ D I R } / q t "
2023-09-03 12:34:26 +00:00
P U B L I C
" $ { P R O J E C T _ S O U R C E _ D I R } / s o u r c e "
2023-10-05 05:36:34 +00:00
" $ { P R O J E C T _ S O U R C E _ D I R } / i n c l u d e "
2023-09-03 12:34:26 +00:00
" $ { P R O J E C T _ B I N A R Y _ D I R } / g e n e r a t e d "
2023-10-05 05:36:34 +00:00
$ { J S O N _ I N C L U D E _ D I R }
2023-09-03 12:58:59 +00:00
)
2017-06-28 21:21:42 +00:00
2023-10-05 05:36:34 +00:00
# Templates
file ( GLOB_RECURSE PROJECT_TEMPLATES FOLLOW_SYMLINKS CONFIGURE_DEPENDS "templates/*" )
2023-09-03 10:09:33 +00:00
source_group ( TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES ${ PROJECT_TEMPLATES } )
2023-10-05 05:36:34 +00:00
set_source_files_properties ( ${ PROJECT_TEMPLATES } PROPERTIES
2023-09-03 10:09:33 +00:00
H E A D E R _ F I L E _ O N L Y O N
2023-10-05 05:36:34 +00:00
S K I P _ A U T O G E N O N
S K I P _ A U T O M O C O N
S K I P _ A U T O R C C O N
S K I P _ A U T O U I C O N
2023-09-03 10:09:33 +00:00
)
2023-10-05 05:36:34 +00:00
target_sources ( StreamFX_Core PRIVATE ${ PROJECT_TEMPLATES } )
2022-05-31 20:33:34 +00:00
2023-10-05 05:36:34 +00:00
# Generated
#- config.hpp
configure_file (
" t e m p l a t e s / c o n f i g . h p p . i n "
" g e n e r a t e d / c o n f i g . h p p "
2023-09-29 23:34:27 +00:00
)
2023-10-05 05:36:34 +00:00
#- version.hpp
configure_file (
" t e m p l a t e s / v e r s i o n . h p p . i n "
" g e n e r a t e d / v e r s i o n . h p p "
)
#- module.cpp
configure_file (
" t e m p l a t e s / m o d u l e . c p p . i n "
" g e n e r a t e d / m o d u l e . c p p "
)
#- Add all generated files
file ( GLOB_RECURSE PROJECT_PRIVATE_GENERATED FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_BINARY_DIR}/generated/*" )
source_group ( TREE "${PROJECT_BINARY_DIR}/generated" PREFIX "Private Files/Generated" FILES ${ PROJECT_PRIVATE_GENERATED } )
set_source_files_properties ( ${ PROJECT_PRIVATE_GENERATED } PROPERTIES
S K I P _ A U T O G E N O N
S K I P _ A U T O M O C O N
S K I P _ A U T O R C C O N
S K I P _ A U T O U I C O N
)
target_sources ( StreamFX_Core PRIVATE ${ PROJECT_PRIVATE_GENERATED } )
2023-09-03 12:58:59 +00:00
2023-10-05 05:36:34 +00:00
# Source
file ( GLOB_RECURSE PROJECT_PRIVATE FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/*" )
list ( REMOVE_ITEM PROJECT_PRIVATE "${PROJECT_SOURCE_DIR}/source/windll.cpp" ) # Only used by StreamFX, not part of StreamFX::Core
source_group ( TREE "${PROJECT_SOURCE_DIR}/source" PREFIX "Private Files" FILES ${ PROJECT_PRIVATE } )
set_source_files_properties ( ${ PROJECT_PRIVATE } PROPERTIES
2023-09-29 23:34:27 +00:00
S K I P _ A U T O G E N O N
S K I P _ A U T O M O C O N
S K I P _ A U T O R C C O N
S K I P _ A U T O U I C O N
)
2023-10-05 05:36:34 +00:00
target_sources ( StreamFX_Core PRIVATE ${ PROJECT_PRIVATE } )
# User-Interface Source
file ( GLOB_RECURSE PROJECT_PRIVATE_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/source/ui/*" )
list ( APPEND PROJECT_PRIVATE_UI "${PROJECT_SOURCE_DIR}/source/obs/browser/obs-browser-panel.hpp" )
set_source_files_properties ( ${ PROJECT_PRIVATE_UI } PROPERTIES
S K I P _ A U T O G E N O F F
S K I P _ A U T O M O C O F F
S K I P _ A U T O R C C O F F
S K I P _ A U T O U I C O F F
)
# User-Interface Definitions
file ( GLOB_RECURSE PROJECT_UI FOLLOW_SYMLINKS CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/ui/*" )
source_group ( TREE "${PROJECT_SOURCE_DIR}/ui" PREFIX "User-Interface Files" FILES ${ PROJECT_UI } )
set_source_files_properties ( ${ PROJECT_UI } PROPERTIES
H E A D E R _ F I L E _ O N L Y O N
)
target_sources ( StreamFX_Core PRIVATE ${ PROJECT_UI } )
# Windows
if ( D_PLATFORM_WINDOWS )
# Disable/Enable a ton of things.
target_compile_definitions ( StreamFX_Core PRIVATE
# Microsoft Visual C++
_ C R T _ S E C U R E _ N O _ W A R N I N G S
_ E N A B L E _ E X T E N D E D _ A L I G N E D _ S T O R A G E
# windows.h
W I N 3 2 _ L E A N _ A N D _ M E A N
N O G P I C A P M A S K S
N O V I R T U A L K E Y C O D E S
#NOWINMESSAGES
N O W I N S T Y L E S
N O S Y S M E T R I C S
N O M E N U S
N O I C O N S
N O K E Y S T A T E S
N O S Y S C O M M A N D S
N O R A S T E R O P S
#NOSHOWWINDOW
N O A T O M
N O C L I P B O A R D
N O C O L O R
#NOCTLMGR
N O D R A W T E X T
#NOGDI
N O K E R N E L
#NOUSER
#NONLS
N O M B
N O M E M M G R
N O M E T A F I L E
N O M I N M A X
#NOMSG
N O O P E N F I L E
N O S C R O L L
N O S E R V I C E
N O S O U N D
#NOTEXTMETRIC
N O W H
N O W I N O F F S E T S
N O C O M M
N O K A N J I
#NOHELP
N O P R O F I L E R
N O D E F E R W I N D O W P O S
N O M C X
N O I M E
N O M D I
N O I N O U T
)
endif ( )
2021-01-31 21:05:23 +00:00
2023-10-05 05:36:34 +00:00
# OpenGL via GLAD
if ( NOT TARGET StreamFX::GLAD )
add_library ( StreamFX_GLAD STATIC
" $ { P R O J E C T _ S O U R C E _ D I R } / t h i r d - p a r t y / k h r o n o s / g l a d / s r c / g l . c "
)
target_include_directories ( StreamFX_GLAD
P U B L I C
" $ { P R O J E C T _ S O U R C E _ D I R } / t h i r d - p a r t y / k h r o n o s / g l a d / i n c l u d e "
)
if ( D_PLATFORM_WINDOWS )
target_sources ( StreamFX_GLAD
P R I V A T E
" $ { P R O J E C T _ S O U R C E _ D I R } / t h i r d - p a r t y / k h r o n o s / g l a d / s r c / w g l . c "
)
elseif ( D_PLATFORM_LINUX )
target_sources ( StreamFX_GLAD
P R I V A T E
" $ { P R O J E C T _ S O U R C E _ D I R } / t h i r d - p a r t y / k h r o n o s / g l a d / s r c / g l x . c "
)
endif ( )
# Requires for shared/static mixing.
set_property ( TARGET StreamFX_GLAD PROPERTY POSITION_INDEPENDENT_CODE ON )
add_library ( StreamFX::GLAD ALIAS StreamFX_GLAD )
endif ( )
target_link_libraries ( StreamFX_Core PUBLIC StreamFX::GLAD )
2023-09-03 10:09:33 +00:00
2021-01-31 21:05:23 +00:00
################################################################################
2023-09-03 10:09:33 +00:00
# Components
2021-01-31 21:05:23 +00:00
################################################################################
2023-09-03 10:09:33 +00:00
# As the above monolithic approach started to show its weaknesses, it was time
# for an improved system which suffers under less issues. This new component
# system should address the main necessary parts,
2023-09-29 23:43:44 +00:00
#- Registration
2023-09-03 10:09:33 +00:00
file ( GLOB COMPONENTS RELATIVE ${ PROJECT_SOURCE_DIR } CONFIGURE_DEPENDS ${ PROJECT_SOURCE_DIR } /components/* )
foreach ( COMPONENT ${ COMPONENTS } )
2023-09-29 23:43:44 +00:00
# Ignore directories with no CMakeLists.txt
if ( EXISTS "${PROJECT_SOURCE_DIR}/${COMPONENT}/CMakeLists.txt" )
add_subdirectory ( ${ COMPONENT } EXCLUDE_FROM_ALL )
endif ( )
2023-09-03 10:09:33 +00:00
endforeach ( )
2023-09-30 02:45:20 +00:00
get_target_property ( _UNRESOLVED StreamFX COMPONENT_DEPENDS )
set ( _RESOLVED "" )
set ( _DISABLED "" )
#- Cleanup
list ( REMOVE_DUPLICATES _UNRESOLVED )
foreach ( _ENTITY ${ _UNRESOLVED } )
# Remove any invalid entries.
if ( NOT TARGET "StreamFX_${_ENTITY}" )
message ( WARNING "Encountered invalid component '${_ENTITY}', removing..." )
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
continue ( )
endif ( )
endforeach ( )
2023-09-03 11:51:16 +00:00
2023-09-30 02:45:20 +00:00
#- Resolve Dependencies in a loop
set ( _UNRESOLVED_LOOP 0 )
while ( _UNRESOLVED )
MATH ( EXPR _UNRESOLVED_LOOP "${_UNRESOLVED_LOOP}+1" )
if ( _UNRESOLVED_LOOP GREATER_EQUAL 10 )
message ( FATAL_ERROR "Infinite loop while resolving components: ${_UNRESOLVED}" )
endif ( )
2023-09-03 11:28:08 +00:00
2023-09-30 02:45:20 +00:00
# Attempt to resolve while there are still unresolved entries.
foreach ( _ENTITY ${ _UNRESOLVED } )
set ( RENTITY "StreamFX_${_ENTITY}" )
2023-09-30 03:33:08 +00:00
get_target_property ( _ALIAS "${RENTITY}" COMPONENT_NAME )
2023-09-30 02:45:20 +00:00
get_target_property ( _LABEL "${RENTITY}" COMPONENT_LABEL )
get_target_property ( _OPTION "${RENTITY}" COMPONENT_OPTION )
get_target_property ( _DEPENDS "${RENTITY}" COMPONENT_DEPENDS )
get_target_property ( _RESOLVER "${RENTITY}" COMPONENT_RESOLVER )
# Remove any that have been disabled.
2023-09-03 12:22:28 +00:00
if ( NOT ${ _OPTION } )
2023-09-30 02:45:20 +00:00
message ( STATUS "[${_LABEL}] Disabled by user." )
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
list ( APPEND _DISABLED "${_ENTITY}" )
2023-09-03 12:22:28 +00:00
continue ( )
2023-09-30 02:45:20 +00:00
elseif ( ${ _OPTION } _DISABLED ) # Test for pre-resolve disabling.
message ( STATUS "[${_LABEL}] Disabled by build script." )
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
list ( APPEND _DISABLED "${_ENTITY}" )
2023-09-03 12:22:28 +00:00
continue ( )
endif ( )
2023-09-29 23:43:44 +00:00
2023-09-30 02:45:20 +00:00
# Check if all dependencies are resolved.
set ( _HAS_UNRESOLVED_DEPENDS OFF )
set ( _HAS_DISABLED_DEPENDS OFF )
set ( _HAS_UNRESOLVED_OPTIONAL_DEPENDS OFF )
if ( _DEPENDS )
foreach ( _DEPEND ${ _DEPENDS } )
list ( GET _DEPEND 0 _ENTITY2 )
set ( RENTITY2 "StreamFX_${_ENTITY2}" )
get_target_property ( _ENTITY2_LABEL "${RENTITY2}" COMPONENT_LABEL )
if ( NOT ( "OPTIONAL" IN_LIST _DEPEND ) )
if ( "${_ENTITY2}" IN_LIST _DISABLED )
message ( "[${_LABEL}] Required dependency '${_ENTITY2_LABEL}' is disabled." )
set ( _HAS_DISABLED_DEPENDS ON )
endif ( )
if ( "${_ENTITY2}" IN_LIST _UNRESOLVED )
set ( _HAS_UNRESOLVED_DEPENDS ON )
endif ( )
else ( )
if ( "${_ENTITY2}" IN_LIST _UNRESOLVED )
set ( _HAS_UNRESOLVED_OPTIONAL_DEPENDS ON )
endif ( )
endif ( )
endforeach ( )
list ( JOIN _DEPENDS ", " _DEPENDS )
else ( )
set ( _DEPENDS "" )
endif ( )
if ( _HAS_DISABLED_DEPENDS ) # A required dependency is disabled, so disable this entry.
message ( STATUS "[${_LABEL}] Disabled by dependency." )
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
list ( APPEND _DISABLED "${_ENTITY}" )
streamfx_disable_component ( ${ _ENTITY } )
continue ( )
elseif ( _HAS_UNRESOLVED_DEPENDS )
continue ( )
elseif ( _HAS_UNRESOLVED_OPTIONAL_DEPENDS AND ( _UNRESOLVED_LOOP LESS 8 ) )
# Temporarily skip this element while there are still remaining loops.
2023-09-29 23:43:44 +00:00
continue ( )
endif ( )
2023-09-30 02:45:20 +00:00
# Call Resolver function
if ( _RESOLVER )
2023-09-30 03:33:08 +00:00
set ( COMPONENT_TARGET "${RENTITY}" )
set ( COMPONENT_ALIAS "${_ALIAS}" )
set ( COMPONENT_OPTION "${_OPTION}" )
2023-09-30 02:45:20 +00:00
cmake_language ( CALL ${ _RESOLVER } )
endif ( )
if ( ${ _OPTION } _DISABLED ) # Test for resolve disabling.
message ( STATUS "[${_LABEL}] Disabled by resolver." )
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
list ( APPEND _DISABLED "${_ENTITY}" )
2023-09-03 11:51:16 +00:00
continue ( )
endif ( )
2023-09-30 02:45:20 +00:00
# Finally, if everything went well, we now have a resolved entity.
list ( REMOVE_ITEM _UNRESOLVED "${_ENTITY}" )
list ( APPEND _RESOLVED "${_ENTITY}" )
message ( STATUS "[${_LABEL}] Enabled. Depends: ${_DEPENDS}" )
2023-09-03 12:22:28 +00:00
endforeach ( )
2023-09-30 02:45:20 +00:00
endwhile ( )
2023-09-03 11:28:08 +00:00
2023-09-30 02:45:20 +00:00
#- Linking
foreach ( _ENTITY ${ _RESOLVED } )
2023-09-30 06:08:11 +00:00
set ( RENTITY "StreamFX_${_ENTITY}" )
get_target_property ( _DEPENDS "${RENTITY}" COMPONENT_DEPENDS )
2023-09-30 02:45:20 +00:00
# Finally if everything is correct, do things.
2023-09-30 06:08:11 +00:00
if ( _DEPENDS )
foreach ( _DEPEND ${ _DEPENDS } )
list ( GET _DEPEND 0 _ENTITY2 )
set ( RENTITY2 "StreamFX_${_ENTITY2}" )
streamfx_enabled_component ( ${ _ENTITY2 } T_CHECK )
if ( T_CHECK )
2023-10-05 05:36:34 +00:00
target_link_libraries ( ${ RENTITY } PUBLIC $< LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY2} > )
2023-09-30 06:08:11 +00:00
endif ( )
endforeach ( )
endif ( )
2023-10-01 04:16:56 +00:00
2023-10-05 05:36:34 +00:00
target_link_libraries ( StreamFX PUBLIC $< LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY} > )
2023-09-30 02:45:20 +00:00
endforeach ( )
2023-09-29 23:43:44 +00:00
2023-10-03 05:13:55 +00:00
target_link_libraries ( StreamFX PUBLIC $< LINK_LIBRARY:WHOLE_ARCHIVE,StreamFX_Core > )
2023-10-05 05:36:34 +00:00
################################################################################
# Resources
################################################################################
# This needs to be handled separately, as CMake does not propagate Resources
# between dependencies. This feels like a bug in CMake, but it is better than
# not doing anything at all. Might eventually need to revise this when we start
# generating data files.
# Data
file ( GLOB_RECURSE PROJECT_DATA "data/*" )
source_group ( TREE "${PROJECT_SOURCE_DIR}/data" PREFIX "Data" FILES ${ PROJECT_DATA } )
if ( D_PLATFORM_MAC )
foreach ( FILE IN LISTS PROJECT_DATA ) # Data location
cmake_path ( ABSOLUTE_PATH FILE OUTPUT_VARIABLE FILE_PATH )
cmake_path ( RELATIVE_PATH FILE_PATH BASE_DIRECTORY "${PROJECT_SOURCE_DIR}/data/" )
cmake_path ( GET FILE_PATH PARENT_PATH FILE_PATH )
set_source_files_properties ( "${FILE}" PROPERTIES
M A C O S X _ P A C K A G E _ L O C A T I O N " R e s o u r c e s / $ { F I L E _ P A T H } "
)
endforeach ( )
endif ( )
# Media
file ( GLOB_RECURSE PROJECT_MEDIA "media/*" )
source_group ( TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${ PROJECT_MEDIA } )
if ( D_PLATFORM_MAC )
#- Bundle Icon location
set_source_files_properties ( "media/icon.png" PROPERTIES
M A C O S X _ P A C K A G E _ L O C A T I O N " R e s o u r c e s "
)
endif ( )
# Add all Resources to StreamFX
set_source_files_properties ( ${ PROJECT_DATA } ${ PROJECT_MEDIA } PROPERTIES
H E A D E R _ F I L E _ O N L Y O N
)
target_sources ( StreamFX PRIVATE ${ PROJECT_DATA } ${ PROJECT_MEDIA } )
2023-09-03 12:50:33 +00:00
################################################################################
# Installation
################################################################################
2023-09-03 10:09:33 +00:00
2023-09-03 11:28:08 +00:00
if ( STANDALONE )
2023-10-04 04:35:20 +00:00
if ( D_PLATFORM_WINDOWS )
2023-09-03 12:50:33 +00:00
install (
T A R G E T S S t r e a m F X
R U N T I M E D E S T I N A T I O N " o b s - p l u g i n s / $ { D _ P L A T F O R M _ B I T S } b i t / " C O M P O N E N T S t r e a m F X
L I B R A R Y D E S T I N A T I O N " o b s - p l u g i n s / $ { D _ P L A T F O R M _ B I T S } b i t / " C O M P O N E N T S t r e a m F X
)
install (
D I R E C T O R Y " d a t a / "
D E S T I N A T I O N " d a t a / o b s - p l u g i n s / S t r e a m F X / "
)
if ( MSVC )
install (
F I L E S $ < T A R G E T _ P D B _ F I L E : S t r e a m F X >
D E S T I N A T I O N " o b s - p l u g i n s / $ { D _ P L A T F O R M _ B I T S } b i t / "
O P T I O N A L
)
endif ( )
elseif ( D_PLATFORM_LINUX )
if ( STRUCTURE_PACKAGEMANAGER )
install (
T A R G E T S S t r e a m F X
R U N T I M E D E S T I N A T I O N " l i b / o b s - p l u g i n s / " C O M P O N E N T S t r e a m F X
L I B R A R Y D E S T I N A T I O N " l i b / o b s - p l u g i n s / " C O M P O N E N T S t r e a m F X
P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
)
install (
D I R E C T O R Y " d a t a / "
D E S T I N A T I O N " s h a r e / o b s / o b s - p l u g i n s / S t r e a m F X "
C O M P O N E N T S t r e a m F X
F I L E _ P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
D I R E C T O R Y _ P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
)
else ( )
install (
T A R G E T S S t r e a m F X
R U N T I M E D E S T I N A T I O N " p l u g i n s / S t r e a m F X / b i n / $ { D _ P L A T F O R M _ B I T S } b i t / " C O M P O N E N T S t r e a m F X
L I B R A R Y D E S T I N A T I O N " p l u g i n s / S t r e a m F X / b i n / $ { D _ P L A T F O R M _ B I T S } b i t / " C O M P O N E N T S t r e a m F X
P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
)
install (
D I R E C T O R Y " d a t a / "
D E S T I N A T I O N " p l u g i n s / S t r e a m F X / d a t a / "
C O M P O N E N T S t r e a m F X
F I L E _ P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
D I R E C T O R Y _ P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
)
endif ( )
elseif ( D_PLATFORM_MAC )
2023-10-04 04:32:12 +00:00
# Bundle Information
set ( MACOSX_BUNDLE_BUNDLE_NAME "StreamFX" )
set ( MACOSX_BUNDLE_BUNDLE_VERSION "${PROJECT_VERSION}" )
set ( MACOSX_BUNDLE_COPYRIGHT "${PROJECT_COPYRIGHT}" )
set ( MACOSX_BUNDLE_GUI_IDENTIFIER "${PROJECT_IDENTIFER}" )
set ( MACOSX_BUNDLE_ICON_FILE "icon.png" )
set ( MACOSX_BUNDLE_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}" )
set ( MACOSX_BUNDLE_LONG_VERSION_STRING "${_VERSION}" )
set ( MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" )
set_target_properties ( StreamFX PROPERTIES
B U N D L E O N
B U N D L E _ E X T E N S I O N " p l u g i n "
O U T P U T _ N A M E S t r e a m F X
M A C O S X _ B U N D L E _ I N F O _ P L I S T " $ { P R O J E C T _ S O U R C E _ D I R } / t e m p l a t e s / m a c o s / I n f o . p l i s t . i n "
X C O D E _ A T T R I B U T E _ P R O D U C T _ B U N D L E _ I D E N T I F I E R " $ { M A C O S X _ B U N D L E _ G U I _ I D E N T I F I E R } "
)
install (
T A R G E T S S t r e a m F X
R U N T I M E D E S T I N A T I O N " . " C O M P O N E N T S t r e a m F X
L I B R A R Y D E S T I N A T I O N " . " C O M P O N E N T S t r e a m F X
B U N D L E D E S T I N A T I O N " . " C O M P O N E N T S t r e a m F X
P E R M I S S I O N S W O R L D _ E X E C U T E ; W O R L D _ R E A D ; O W N E R _ E X E C U T E ; O W N E R _ R E A D ; O W N E R _ W R I T E ; G R O U P _ E X E C U T E ; G R O U P _ R E A D ; G R O U P _ W R I T E
)
2023-09-03 12:50:33 +00:00
endif ( )
2023-09-03 11:28:08 +00:00
else ( )
if ( COMMAND setup_plugin_target )
2023-09-03 12:34:26 +00:00
setup_plugin_target ( StreamFX )
2023-09-03 11:28:08 +00:00
# Seems like we lost the ability to customize which directoy resources are in, and instead are forced to use '/data'.
elseif ( COMMAND install_obs_plugin_with_data )
2023-09-03 12:34:26 +00:00
install_obs_plugin_with_data ( StreamFX data )
2023-09-03 11:28:08 +00:00
endif ( )
endif ( )
2023-09-03 10:09:33 +00:00
2023-09-03 12:50:33 +00:00
################################################################################
# Packaging
################################################################################
if ( STANDALONE )
# Packaging
if ( NOT PACKAGE_SUFFIX )
set ( _PACKAGE_SUFFIX_OVERRIDE "${_VERSION_THIN}" )
else ( )
set ( _PACKAGE_SUFFIX_OVERRIDE "${PACKAGE_SUFFIX}" )
endif ( )
set ( _PACKAGE_FULL_NAME "${PACKAGE_PREFIX}/${PACKAGE_NAME}-${_PACKAGE_SUFFIX_OVERRIDE}" )
2023-10-04 04:35:20 +00:00
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 (
" t e m p l a t e s / w i n d o w s / i n s t a l l e r . i s s . i n "
" i n s t a l l e r . i s s "
2023-09-03 12:50:33 +00:00
)
2023-10-04 04:35:20 +00:00
elseif ( D_PLATFORM_MAC )
# .pkg Installer
set ( PACKAGES_PATH_NAME "StreamFX" )
set ( PACKAGES_PATH_NAME "${PACKAGES_PATH_NAME}.plugin" )
configure_file (
" t e m p l a t e s / m a c o s / i n s t a l l e r . p k g p r o j . i n "
" i n s t a l l e r . p k g p r o j "
2023-09-03 12:50:33 +00:00
)
2023-10-04 04:35:20 +00:00
elseif ( D_PLATFORM_LINUX )
2023-09-03 12:50:33 +00:00
add_custom_target (
2023-10-04 04:35:20 +00:00
P A C K A G E
$ { C M A K E _ C O M M A N D } - E t a r c f v " $ { _ P A C K A G E _ F U L L _ N A M E } . 7 z " - - f o r m a t = 7 z i p - -
2023-09-03 12:50:33 +00:00
" . "
W O R K I N G _ D I R E C T O R Y " $ { C M A K E _ I N S T A L L _ P R E F I X } "
)
endif ( )
endif ( )