Simplify the CMake file even more

- target_sources(... PUBLIC ...) doesn't do what I thought it did, and has no useful purpose here.
- Experimental features are an Alpha only thing, and Unstable features should not be part of a Candidate release.
- ENABLE_LTO is not a flag anymore, as CMake has a global flag for it.

While we haven't split out Core from the main file yet, and we still keep running into strange duplicate symbol or undefined symbol errors, this will hopefully simplify the CMake file further. End goal is to eventually split StreamFX into smaller sub-plugins that can operate mostly independently. At some point, the goal is to be able to soft-depend on other components, i.e. Blur can softly depend on Dynamic Mask, and then have extra features if the component is installed. This is not quite fleshed out yet, and I have no clear idea on how to make it work.
This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2023-10-05 07:36:34 +02:00 committed by Xaymar
parent 43dbd81d0e
commit e0ffe85a30
2 changed files with 231 additions and 414 deletions

View File

@ -8,6 +8,11 @@
# Copyright (C) 2023 Isaac Nudelman <isaac.nudelman@utexas.edu>
# AUTOGENERATED COPYRIGHT HEADER END
# 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] ")
@ -269,13 +274,13 @@ if(_VERSION_PRERELEASE STREQUAL "a")
set(FEATURE_STABLE ON)
elseif(_VERSION_PRERELEASE STREQUAL "b")
set(FEATURE_DEPRECATED ON)
set(FEATURE_EXPERIMENTAL ON)
set(FEATURE_EXPERIMENTAL OFF)
set(FEATURE_UNSTABLE ON)
set(FEATURE_STABLE ON)
elseif(_VERSION_PRERELEASE STREQUAL "c")
set(FEATURE_DEPRECATED ON)
set(FEATURE_EXPERIMENTAL OFF)
set(FEATURE_UNSTABLE ON)
set(FEATURE_UNSTABLE OFF)
set(FEATURE_STABLE ON)
else()
set(FEATURE_DEPRECATED ON)
@ -288,7 +293,6 @@ endif()
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_LTO ${D_HAS_IPO} CACHE BOOL "Enable Link Time Optimization for faster and smaller binaries.")
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).")
@ -438,308 +442,6 @@ find_package("Qt6"
CONFIG
)
################################################################################
# Code
################################################################################
set(PROJECT_DATA )
set(PROJECT_LIBRARIES )
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 )
set(PROJECT_MEDIA )
# Data
file(GLOB_RECURSE PROJECT_DATA "data/*")
# Media
file(GLOB_RECURSE PROJECT_MEDIA "media/*")
# Templates
file(GLOB_RECURSE PROJECT_TEMPLATES "templates/*")
# 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")
# Minimum Dependencies
list(APPEND PROJECT_LIBRARIES OBS::libobs)
# Dependencies
list(APPEND PROJECT_PRIVATE_SOURCE
"source/util/util-curl.hpp"
"source/util/util-curl.cpp"
)
list(APPEND PROJECT_LIBRARIES CURL::libcurl)
list(APPEND PROJECT_INCLUDE_DIRS ${JSON_INCLUDE_DIR})
if(TRUE) # OpenGL
if(NOT TARGET khronos_glad)
add_library(khronos_glad STATIC
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c"
)
target_include_directories(khronos_glad
PRIVATE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include"
INTERFACE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include"
PUBLIC
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include"
)
if(D_PLATFORM_WINDOWS)
target_sources(khronos_glad
PRIVATE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c"
)
elseif(D_PLATFORM_LINUX)
target_sources(khronos_glad
PRIVATE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.c"
)
endif()
# Requires for shared/static mixing.
set_property(TARGET khronos_glad PROPERTY POSITION_INDEPENDENT_CODE ON)
endif()
list(APPEND PROJECT_LIBRARIES khronos_glad)
endif()
list(APPEND PROJECT_LIBRARIES OBS::obs-frontend-api)
list(APPEND PROJECT_UI_SOURCE
"source/obs/browser/obs-browser-panel.hpp"
)
list(APPEND PROJECT_LIBRARIES Qt6::Core Qt6::Gui Qt6::Widgets)
################################################################################
# Features
################################################################################
# Core
list(APPEND PROJECT_PRIVATE_SOURCE
"source/warning-disable.hpp"
"source/warning-enable.hpp"
"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-util.hpp"
"source/gfx/gfx-util.cpp"
"source/gfx/gfx-mipmapper.hpp"
"source/gfx/gfx-mipmapper.cpp"
"source/gfx/gfx-opengl.hpp"
"source/gfx/gfx-opengl.cpp"
"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-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-signal-handler.hpp"
"source/obs/obs-signal-handler.cpp"
"source/obs/obs-source-tracker.hpp"
"source/obs/obs-source-tracker.cpp"
"source/obs/obs-tools.hpp"
"source/obs/obs-tools.cpp"
# obs_encoder_info_t, obs_encoder_t, obs_weak_encoder_t
"source/obs/obs-encoder-factory.hpp"
"source/obs/obs-encoder-factory.cpp"
# obs_source_info_t, obs_source_t, obs_weak_source_t
"source/obs/obs-source-factory.hpp"
"source/obs/obs-source-factory.cpp"
"source/obs/obs-source.hpp"
"source/obs/obs-source.cpp"
"source/obs/obs-source-active-child.hpp"
"source/obs/obs-source-active-child.cpp"
"source/obs/obs-source-active-reference.hpp"
"source/obs/obs-source-active-reference.cpp"
"source/obs/obs-source-showing-reference.hpp"
"source/obs/obs-source-showing-reference.cpp"
"source/obs/obs-weak-source.hpp"
"source/obs/obs-weak-source.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/standard.effect"
"data/effects/shared.effect"
"data/locale/en-US.ini"
)
list(APPEND PROJECT_INCLUDE_DIRS
"${PROJECT_BINARY_DIR}/generated"
"${PROJECT_SOURCE_DIR}/source"
)
# Profiling
list(APPEND PROJECT_PRIVATE_SOURCE
"source/util/util-profiler.cpp"
"source/util/util-profiler.hpp"
)
# Updater
list(APPEND PROJECT_PRIVATE_SOURCE
"source/updater.hpp"
"source/updater.cpp"
)
# Frontend
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"
"source/ui/ui-obs-browser-widget.hpp"
"source/ui/ui-obs-browser-widget.cpp"
)
list(APPEND PROJECT_INCLUDE_DIRS
"source/ui"
)
list(APPEND PROJECT_UI_SOURCE
"source/ui/ui-updater.hpp"
"source/ui/ui-updater.cpp"
)
list(APPEND PROJECT_UI
"ui/updater.ui"
)
################################################################################
# Parts
################################################################################
# Windows
if(D_PLATFORM_WINDOWS)
# 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()
################################################################################
# Helpers
################################################################################
@ -772,6 +474,7 @@ function(streamfx_add_library TARGET_NAME TARGET_TYPE)
# @rpath in installed binaries
INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/"
)
if(STANDALONE)
set_target_properties(${TARGET_NAME} PROPERTIES
# @rpath in built binaries
@ -1057,7 +760,7 @@ function(streamfx_add_component COMPONENT_NAME)
)
# Always depend on StreamFX::Core
target_link_libraries(${COMPONENT_TARGET} PRIVATE $<LINK_LIBRARY:WHOLE_ARCHIVE,StreamFX_Core>)
target_link_libraries(${COMPONENT_TARGET} PUBLIC $<LINK_LIBRARY:WHOLE_ARCHIVE,StreamFX_Core>)
# Register the component globally.
get_target_property(_DEPENDS StreamFX COMPONENT_DEPENDS)
@ -1118,7 +821,6 @@ function(streamfx_add_component COMPONENT_NAME)
${USERINTERFACE}
${SOURCE_PRIVATE}
${GENERATED_PRIVATE}
PUBLIC
${SOURCE_PUBLIC}
${GENERATED_PUBLIC}
)
@ -1243,12 +945,6 @@ endfunction()
################################################################################
streamfx_add_library(StreamFX MODULE) # We are a module for libOBS.
target_include_directories(StreamFX PRIVATE
"source"
"include"
"${PROJECT_BINARY_DIR}/generated"
)
# Ensure there is at least one file.
if(D_PLATFORM_WINDOWS)
target_sources(StreamFX
@ -1262,6 +958,7 @@ else()
)
endif()
# version.rc (can't be part of a static library)
if(D_PLATFORM_WINDOWS) # Windows-exclusive
# Version Resource
set(PROJECT_PRODUCT_NAME "${PROJECT_FULL_NAME}")
@ -1272,36 +969,17 @@ if(D_PLATFORM_WINDOWS) # Windows-exclusive
configure_file(
"templates/windows/version.rc.in"
"generated/version.rc"
"version.rc"
)
target_sources(StreamFX
PRIVATE
"templates/windows/version.rc.in"
"${PROJECT_BINARY_DIR}/generated/version.rc"
target_sources(StreamFX PRIVATE
"${PROJECT_BINARY_DIR}/version.rc"
)
elseif(D_PLATFORM_MAC) # MacOS exclusive Changes
set_target_properties(StreamFX PROPERTIES
# No automatic code signing in XCode
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ""
XCODE_ATTRIBUTE_CODE_SIGNING_REQUIRED "NO"
# @rpath in installed binaries
INSTALL_RPATH "@executable_path/../Frameworks/;@loader_path/../Frameworks/;@loader_path/../Resources/"
)
if(STANDALONE)
set_target_properties(StreamFX PROPERTIES
# @rpath in built binaries
BUILD_WITH_INSTALL_RPATH ON
)
endif()
endif()
# Set file version
set_target_properties(StreamFX PROPERTIES
# Version
MACHO_COMPATIBILITY_VERSION ${_VERSION_MAJOR}.${_VERSION_MINOR}
MACHO_CURRENT_VERSION ${PROJECT_VERSION}
SOVERSION ${_VERSION_MAJOR}.${_VERSION_MINOR}
MACHO_CURRENT_VERSION ${PROJECT_VERSION}
VERSION ${PROJECT_VERSION}
)
@ -1311,66 +989,188 @@ set_target_properties(StreamFX PROPERTIES
streamfx_add_library(StreamFX_Core STATIC EXCLUDE_FROM_ALL)
add_library(StreamFX::Core ALIAS StreamFX_Core)
# Register the library
target_link_libraries(StreamFX_Core
PRIVATE ${PROJECT_LIBRARIES}
PUBLIC OBS::libobs
)
target_include_directories(StreamFX_Core
PRIVATE ${PROJECT_INCLUDE_DIRS}
PUBLIC
"${PROJECT_SOURCE_DIR}/source"
"${PROJECT_BINARY_DIR}/generated"
)
target_compile_definitions(StreamFX_Core
PRIVATE ${PROJECT_DEFINITIONS}
)
# 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}
# Media
${PROJECT_MEDIA}
)
# 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})
source_group(TREE "${PROJECT_SOURCE_DIR}/media" PREFIX "Media" FILES ${PROJECT_MEDIA})
# Prevent unwanted files from being built as source.
set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_UI} ${PROJECT_MEDIA} PROPERTIES
HEADER_FILE_ONLY ON
)
# Enable Qt if needed
# 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}/generated"
AUTOGEN_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/qt"
)
# Prevent non-UI files from being Qt'd
set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_MEDIA} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} PROPERTIES
# 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})
target_sources(StreamFX_Core PRIVATE ${PROJECT_FILES})
# 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()
# OpenGL via GLAD
if(NOT TARGET StreamFX::GLAD)
add_library(StreamFX_GLAD STATIC
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/gl.c"
)
target_include_directories(StreamFX_GLAD
PUBLIC
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/include"
)
if(D_PLATFORM_WINDOWS)
target_sources(StreamFX_GLAD
PRIVATE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/wgl.c"
)
elseif(D_PLATFORM_LINUX)
target_sources(StreamFX_GLAD
PRIVATE
"${PROJECT_SOURCE_DIR}/third-party/khronos/glad/src/glx.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)
################################################################################
# Components
@ -1510,22 +1310,54 @@ foreach(_ENTITY ${_RESOLVED})
streamfx_enabled_component(${_ENTITY2} T_CHECK)
if(T_CHECK)
target_link_libraries(${RENTITY}
PUBLIC
$<LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY2}>
)
target_link_libraries(${RENTITY} PUBLIC $<LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY2}>)
endif()
endforeach()
endif()
target_link_libraries(StreamFX
PRIVATE
$<LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY}>
)
target_link_libraries(StreamFX PUBLIC $<LINK_LIBRARY:WHOLE_ARCHIVE,${RENTITY}>)
endforeach()
target_link_libraries(StreamFX PUBLIC $<LINK_LIBRARY:WHOLE_ARCHIVE,StreamFX_Core>)
################################################################################
# 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()
# Add all Resources to StreamFX
set_source_files_properties(${PROJECT_DATA} ${PROJECT_MEDIA} PROPERTIES
HEADER_FILE_ONLY ON
)
target_sources(StreamFX PRIVATE ${PROJECT_DATA} ${PROJECT_MEDIA})
################################################################################
# Installation
################################################################################
@ -1596,21 +1428,6 @@ if(STANDALONE)
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_BUNDLE_GUI_IDENTIFIER}"
)
# Proper location for resources in Bundles
foreach(FILE IN LISTS PROJECT_DATA)
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()
# Bundle Icon
set_source_files_properties("media/icon.png" PROPERTIES
MACOSX_PACKAGE_LOCATION "Resources"
)
install(
TARGETS StreamFX
RUNTIME DESTINATION "." COMPONENT StreamFX

View File

@ -28,14 +28,14 @@ struct d3d_info {
ID3D11Resource* target = nullptr;
};
void d3d_initialize(d3d_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, std::shared_ptr<streamfx::obs::gs::texture> target)
static void d3d_initialize(d3d_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, std::shared_ptr<streamfx::obs::gs::texture> target)
{
info.target = reinterpret_cast<ID3D11Resource*>(gs_texture_get_obj(target->get_object()));
info.device = reinterpret_cast<ID3D11Device*>(gs_get_device_obj());
info.device->GetImmediateContext(&info.context);
}
void d3d_copy_subregion(d3d_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, uint32_t mip_level, uint32_t width, uint32_t height)
static void d3d_copy_subregion(d3d_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, uint32_t mip_level, uint32_t width, uint32_t height)
{
D3D11_BOX box = {0, 0, 0, width, height, 1};
auto source_ref = reinterpret_cast<ID3D11Resource*>(gs_texture_get_obj(source->get_object()));
@ -49,7 +49,7 @@ struct opengl_info {
GLuint fbo = 0;
};
std::string opengl_translate_error(GLenum error)
static std::string opengl_translate_error(GLenum error)
{
#define TRANSLATE_CASE(X) \
case X: \
@ -70,7 +70,7 @@ std::string opengl_translate_error(GLenum error)
#undef TRANSLATE_CASE
}
std::string opengl_translate_framebuffer_status(GLenum error)
static std::string opengl_translate_framebuffer_status(GLenum error)
{
#define TRANSLATE_CASE(X) \
case X: \
@ -106,19 +106,19 @@ std::string opengl_translate_framebuffer_status(GLenum error)
throw std::runtime_error(sstr.str()); \
}
void opengl_initialize(opengl_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, std::shared_ptr<streamfx::obs::gs::texture> target)
static void opengl_initialize(opengl_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, std::shared_ptr<streamfx::obs::gs::texture> target)
{
info.target = *reinterpret_cast<GLuint*>(gs_texture_get_obj(target->get_object()));
glGenFramebuffers(1, &info.fbo);
}
void opengl_finalize(opengl_info& info)
static void opengl_finalize(opengl_info& info)
{
glDeleteFramebuffers(1, &info.fbo);
}
void opengl_copy_subregion(opengl_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, uint32_t mip_level, uint32_t width, uint32_t height)
static void opengl_copy_subregion(opengl_info& info, std::shared_ptr<streamfx::obs::gs::texture> source, uint32_t mip_level, uint32_t width, uint32_t height)
{
GLuint source_ref = *reinterpret_cast<GLuint*>(gs_texture_get_obj(source->get_object()));