CMakeLists
CMakeLists
# 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
# CMake Setup
cmake_minimum_required(VERSION 3.26)
list(APPEND CMAKE_MESSAGE_INDENT "[StreamFX] ")
project(StreamFX)
################################################################################
# Modules
################################################################################
# Search Paths
set(CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/version"
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
)
################################################################################
# Bootstrapping
################################################################################
# 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 "The operating system '${CMAKE_SYSTEM_NAME}' is unknown to to
this script, continue at your own risk.")
endif()
# Architecture
set(ARCH_INSTR_32 "i386;i686;x86;arm;ARM")
set(ARCH_INSTR_64 "x86_64;AMD64;IA64;arm64;ARM64")
set(ARCH_INSTR_X86 "i386;i686;x86;x86_64;AMD64")
set(ARCH_INSTR_ARM "arm;ARM;arm64;ARM64")
set(ARCH_INSTR_ITANIUM "IA64")
set(ARCH_BITS 0)
set(ARCH_BITS_POINTER 0)
set(ARCH_INST "")
# - Bitness
list(FIND ARCH_INSTR_32 "${CMAKE_SYSTEM_PROCESSOR}" FOUND)
if(FOUND GREATER -1)
set(ARCH_BITS 32)
endif()
# Interprocedural Optimization
check_ipo_supported(RESULT D_HAS_IPO)
set(D_PLATFORM_INSTR ${ARCH_INST})
set(D_PLATFORM_ARCH ${ARCH_INST})
message(STATUS "Target is ${D_PLATFORM_BITS}bit ${ARCH_INST} with a pointer size of
${D_PLATFORM_BITS_PTR}bit.")
################################################################################
# Versioning
################################################################################
if(EXISTS "${GIT}")
# 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)
if((GIT_RESULT EQUAL 0) AND (NOT "${GIT_OUTPUT}" STREQUAL ""))
# Result will be MAJOR.MINOR.PATCH-TWEAK-gHASH
string(REPLACE "-" ";" GIT_OUTPUT "${GIT_OUTPUT}")
string(REPLACE "." ";" GIT_OUTPUT "${GIT_OUTPUT}")
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()
################################################################################
# Options
################################################################################
# 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.")
# Compile/Link Related
set(${PREFIX}ENABLE_FASTMATH ON CACHE BOOL "Enable fast math optimizations, which
sacrifice precision and stability.")
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()
# Installation / Packaging
if(STANDALONE)
if(D_PLATFORM_LINUX)
set(STRUCTURE_PACKAGEMANAGER CACHE BOOL "Install for use in a Package
Manager (system-wide installation)")
endif()
# 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")
endif()
set(AOM_DIR "" CACHE PATH "Path to AOM library")
################################################################################
# Project
################################################################################
# Metadata
version(GENERATE PROJECT_VERSION
MAJOR "${_VERSION_MAJOR}"
MINOR "${_VERSION_MINOR}"
PATCH "${_VERSION_PATCH}"
TWEAK "${_VERSION_TWEAK}"
REQUIRE "PATCH;TWEAK"
)
project(
StreamFX
VERSION ${PROJECT_VERSION}
DESCRIPTION "Additional sources, filters, transitions and encoders for OBS
Studio."
HOMEPAGE_URL "https://streamfx.xaymar.com/"
)
set(PROJECT_IDENTIFER "com.xaymar.StreamFX.obs")
set(PROJECT_TITLE "StreamFX (for OBS Studio)")
set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks <[email protected]>")
set(PROJECT_COPYRIGHT "2017 - 2022, Michael Fabian Dirks. All Rights Reserved")
set(PROJECT_TRADEMARKS "")
list(APPEND PROJECT_TRADEMARKS
"AMD is a trademark of Advanced Micro Devices Inc."
"NVIDIA is a trademark of Nvidia Corporation"
)
################################################################################
# Dependencies
################################################################################
#- OBS: Library
if(STANDALONE)
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)
endif()
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
INTERFACE_INCLUDE_DIRECTORIES
"${libobs_IMPORTED_LOCATION_RELEASE}"
)
endif()
endif()
#- CURL
find_package("CURL")
#- JSON
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")
endif()
#- Qt 6
find_package("Qt6"
COMPONENTS Core Gui Widgets
CONFIG
)
################################################################################
# Helpers
################################################################################
define_property(TARGET PROPERTY COMPONENT_LABEL)
define_property(TARGET PROPERTY COMPONENT_NAME)
define_property(TARGET PROPERTY COMPONENT_OPTION)
define_property(TARGET PROPERTY COMPONENT_RESOLVER)
define_property(TARGET PROPERTY COMPONENT_DEPENDS)
set_target_properties(${TARGET_NAME} PROPERTIES
# Always generate position independent code.
POSITION_INDEPENDENT_CODE ON
if(STANDALONE)
set_target_properties(${TARGET_NAME} PROPERTIES
# @rpath in built binaries
BUILD_WITH_INSTALL_RPATH ON
)
endif()
endif()
target_compile_definitions(${TARGET_NAME} PRIVATE
__STDC_WANT_LIB_EXT1__=1
)
if(D_PLATFORM_WINDOWS)
target_compile_definitions(${TARGET_NAME}
PUBLIC
# Microsoft Visual C++
_CRT_SECURE_NO_WARNINGS
_ENABLE_EXTENDED_ALIGNED_STORAGE
PUBLIC
# windows.h
# - Disable MIN/MAX macro as this breaks a lot of code.
NOMINMAX
# - Disable IN/OUT macro as this breaks a lot of code.
NOINOUT
)
endif()
function(streamfx_add_component COMPONENT_NAME)
cmake_parse_arguments(PARSE_ARGV 1 _ARG
""
"RESOLVER"
""
)
target_sources(${COMPONENT_TARGET}
PRIVATE
${DATA}
${TEMPLATES}
${USERINTERFACE}
${SOURCE_PRIVATE}
${GENERATED_PRIVATE}
${SOURCE_PUBLIC}
${GENERATED_PUBLIC}
)
set(DEPENDENCY "${_TARGET}")
if(_ARG_OPTIONAL)
list(APPEND DEPENDENCY "OPTIONAL")
endif()
string(REPLACE ";" "\\;" DEPENDENCY "${DEPENDENCY}")
CacheSet(${_OPTION}_DISABLED ON)
if(_ARG_REASON)
message(STATUS "[${_LABEL}] Disabled due to: ${_ARG_REASON}")
endif()
endfunction()
################################################################################
# Register Library
################################################################################
streamfx_add_library(StreamFX MODULE) # We are a module for libOBS.
configure_file(
"templates/windows/version.rc.in"
"version.rc"
)
target_sources(StreamFX PRIVATE
"${PROJECT_BINARY_DIR}/version.rc"
)
endif()
set_target_properties(StreamFX PROPERTIES
# Version
MACHO_COMPATIBILITY_VERSION ${_VERSION_MAJOR}.${_VERSION_MINOR}
SOVERSION ${_VERSION_MAJOR}.${_VERSION_MINOR}
MACHO_CURRENT_VERSION ${PROJECT_VERSION}
VERSION ${PROJECT_VERSION}
)
################################################################################
# Add Core
################################################################################
streamfx_add_library(StreamFX_Core STATIC EXCLUDE_FROM_ALL)
add_library(StreamFX::Core ALIAS StreamFX_Core)
# Enable Qt
set_target_properties(StreamFX_Core PROPERTIES
AUTOUIC ON
AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR};$
{CMAKE_CURRENT_SOURCE_DIR}/ui"
AUTOMOC ON
AUTORCC ON
AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt"
)
# Default Links
target_link_libraries(StreamFX_Core
PUBLIC
CURL::libcurl
Qt6::Core
Qt6::Gui
Qt6::Widgets
OBS::obs-frontend-api
OBS::libobs
)
# Default Include Dirs
target_include_directories(StreamFX_Core
PRIVATE
"${PROJECT_SOURCE_DIR}/source/ui"
"${PROJECT_BINARY_DIR}/qt"
PUBLIC
"${PROJECT_SOURCE_DIR}/source"
"${PROJECT_SOURCE_DIR}/include"
"${PROJECT_BINARY_DIR}/generated"
${JSON_INCLUDE_DIR}
)
# Templates
file(GLOB_RECURSE PROJECT_TEMPLATES FOLLOW_SYMLINKS CONFIGURE_DEPENDS
"templates/*")
source_group(TREE "${PROJECT_SOURCE_DIR}/templates" PREFIX "Templates" FILES $
{PROJECT_TEMPLATES})
set_source_files_properties(${PROJECT_TEMPLATES} PROPERTIES
HEADER_FILE_ONLY ON
SKIP_AUTOGEN ON
SKIP_AUTOMOC ON
SKIP_AUTORCC ON
SKIP_AUTOUIC ON
)
target_sources(StreamFX_Core PRIVATE ${PROJECT_TEMPLATES})
# Generated
#- config.hpp
configure_file(
"templates/config.hpp.in"
"generated/config.hpp"
)
#- version.hpp
configure_file(
"templates/version.hpp.in"
"generated/version.hpp"
)
#- module.cpp
configure_file(
"templates/module.cpp.in"
"generated/module.cpp"
)
#- 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
SKIP_AUTOGEN ON
SKIP_AUTOMOC ON
SKIP_AUTORCC ON
SKIP_AUTOUIC ON
)
target_sources(StreamFX_Core PRIVATE ${PROJECT_PRIVATE_GENERATED})
# 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
SKIP_AUTOGEN ON
SKIP_AUTOMOC ON
SKIP_AUTORCC ON
SKIP_AUTOUIC ON
)
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
SKIP_AUTOGEN OFF
SKIP_AUTOMOC OFF
SKIP_AUTORCC OFF
SKIP_AUTOUIC OFF
)
# 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
HEADER_FILE_ONLY ON
)
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++
_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()
################################################################################
# Components
################################################################################
# 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,
#- Registration
file(GLOB COMPONENTS RELATIVE ${PROJECT_SOURCE_DIR} CONFIGURE_DEPENDS $
{PROJECT_SOURCE_DIR}/components/*)
foreach(COMPONENT ${COMPONENTS})
# Ignore directories with no CMakeLists.txt
if(EXISTS "${PROJECT_SOURCE_DIR}/${COMPONENT}/CMakeLists.txt")
add_subdirectory(${COMPONENT} EXCLUDE_FROM_ALL)
endif()
endforeach()
#- 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()
get_target_property(_ENTITY2_LABEL "${RENTITY2}"
COMPONENT_LABEL)
#- Linking
foreach(_ENTITY ${_RESOLVED})
set(RENTITY "StreamFX_${_ENTITY}")
get_target_property(_DEPENDS "${RENTITY}" COMPONENT_DEPENDS)
streamfx_enabled_component(${_ENTITY2} T_CHECK)
if(T_CHECK)
target_link_libraries(${RENTITY} PUBLIC
$<LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY2}>)
endif()
endforeach()
endif()
################################################################################
# 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
MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}"
)
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
MACOSX_PACKAGE_LOCATION "Resources"
)
endif()
################################################################################
# Installation
################################################################################
if(STANDALONE)
if(D_PLATFORM_WINDOWS)
install(
TARGETS StreamFX
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/StreamFX/"
)
if(MSVC)
install(
FILES $<TARGET_PDB_FILE:StreamFX>
DESTINATION "obs-plugins/${D_PLATFORM_BITS}bit/"
OPTIONAL
)
endif()
elseif(D_PLATFORM_LINUX)
if(STRUCTURE_PACKAGEMANAGER)
install(
TARGETS StreamFX
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_R
EAD;GROUP_WRITE
)
install(
DIRECTORY "data/"
DESTINATION "share/obs/obs-plugins/StreamFX"
COMPONENT StreamFX
FILE_PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
DIRECTORY_PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
)
else()
install(
TARGETS StreamFX
RUNTIME DESTINATION "plugins/StreamFX/bin/$
{D_PLATFORM_BITS}bit/" COMPONENT StreamFX
LIBRARY DESTINATION "plugins/StreamFX/bin/$
{D_PLATFORM_BITS}bit/" COMPONENT StreamFX
PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
)
install(
DIRECTORY "data/"
DESTINATION "plugins/StreamFX/data/"
COMPONENT StreamFX
FILE_PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
DIRECTORY_PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
)
endif()
elseif(D_PLATFORM_MAC)
# 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
BUNDLE ON
BUNDLE_EXTENSION "plugin"
OUTPUT_NAME StreamFX
MACOSX_BUNDLE_INFO_PLIST
"${PROJECT_SOURCE_DIR}/templates/macos/Info.plist.in"
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "$
{MACOSX_BUNDLE_GUI_IDENTIFIER}"
)
install(
TARGETS StreamFX
RUNTIME DESTINATION "." COMPONENT StreamFX
LIBRARY DESTINATION "." COMPONENT StreamFX
BUNDLE DESTINATION "." COMPONENT StreamFX
PERMISSIONS
WORLD_EXECUTE;WORLD_READ;OWNER_EXECUTE;OWNER_READ;OWNER_WRITE;GROUP_EXECUTE;GROUP_R
EAD;GROUP_WRITE
)
endif()
else()
if(COMMAND setup_plugin_target)
setup_plugin_target(StreamFX)
# 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)
install_obs_plugin_with_data(StreamFX data)
endif()
endif()
################################################################################
# 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}")
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_MSVCHELPER_PATH "${msvc-redist-
helper_BUILD_DIR}" ABSOLUTE)
file(TO_NATIVE_PATH "${ISS_MSVCHELPER_PATH}" ISS_MSVCHELPER_PATH)
configure_file(
"templates/windows/installer.iss.in"
"installer.iss"
)
elseif(D_PLATFORM_MAC)
# .pkg Installer
set(PACKAGES_PATH_NAME "StreamFX")
set(PACKAGES_PATH_NAME "${PACKAGES_PATH_NAME}.plugin")
configure_file(
"templates/macos/installer.pkgproj.in"
"installer.pkgproj"
)
elseif(D_PLATFORM_LINUX)
add_custom_target(
PACKAGE
${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.7z" --
format=7zip --
"."
WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}"
)
endif()
endif()