# Experimental new Sources, Filters and Transitions for OBS Studio # Copyright (C) 2017 - 2018 Michael Fabian Dirks # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # CMake Setup cmake_minimum_required(VERSION 3.8...3.12) # Automatic Versioning set(VERSION_MAJOR 0) set(VERSION_MINOR 9) set(VERSION_PATCH 0) set(VERSION_TWEAK 0) set(VERSION_SUFFIX "") if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/.git") set(GIT_RESULT "") set(GIT_OUTPUT "") # Get commit index execute_process( COMMAND git rev-list --count --topo-order ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}${VERSION_SUFFIX}..HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(GIT_RESULT EQUAL 0) set(VERSION_TWEAK ${GIT_OUTPUT}) endif() # Get commit hash execute_process( COMMAND git rev-parse --short=8 HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} RESULT_VARIABLE GIT_RESULT OUTPUT_VARIABLE GIT_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) if(GIT_RESULT EQUAL 0) set(VERSION_COMMIT ${GIT_OUTPUT}) else() set(VERSION_COMMIT "") endif() endif() if(VERSION_COMMIT) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}-${VERSION_COMMIT}") else() set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK}${VERSION_SUFFIX}") endif() # Define Project project( StreamFX VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_TWEAK} ) set(PROJECT_FULL_NAME "StreamFX for OBS Studio") set(PROJECT_DESCRIPTION "Better Production Quality, for free.") set(PROJECT_AUTHORS "Michael Fabian 'Xaymar' Dirks ") set(PROJECT_COPYRIGHT_YEARS "2018 - 2020") ################################################################################ # Setup / Bootstrap ################################################################################ # Detect Project Type (solo, combined) if("${CMAKE_SOURCE_DIR}" STREQUAL "${PROJECT_SOURCE_DIR}") set(PREFIX "") else() set(PREFIX "${PROJECT_NAME}_") endif() # Search Path set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake") # CMake Modules include("util") ## Clang Integration if(${PREFIX}ENABLE_CLANG AND (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/clang/Clang.cmake")) include("Clang") set(HAVE_CLANG ON) endif() ## Download Project include("DownloadProject") # Detect Platform & Architecture math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") if(BITS EQUAL 32) set(D_PLATFORM_BITS 32) set(ARCH "x86") elseif(BITS EQUAL 64) set(D_PLATFORM_BITS 64) set(ARCH "x64") else() message(FATAL_ERROR "Unknown architecture, please file a bug with your exact setup if you believe this to be an error.") return() endif() if(CMAKE_SYSTEM_NAME STREQUAL "Windows") set(D_PLATFORM_WINDOWS 1) elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") set(D_PLATFORM_LINUX 1) elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") set(D_PLATFORM_MAC 1) else() message(FATAL_ERROR "Unknown platform, please file a bug with your exact setup if you believe this to be an error.") return() endif() ################################################################################ # C/C++ Compiler Adjustments ################################################################################ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" OR (WIN32 AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")) message(STATUS "Applying custom flags for MSVC style build.") # MSVC/ClangCL # - Dynamically link Microsoft C/C++ Redistributable. # - Enable /W3 and disable useless warnings. # - Enable C++ exceptions with SEH exceptions. # - Enable multi-processor compiling. # Build with dynamic MSVC linkage. add_compile_options( $<$:/MD> $<$:/MDd> $<$:/MD> $<$:/MD> $<$:/MD> ) # Enable most useful warnings. set(DISABLED_WARNINGS "/wd4061" "/wd4100" "/wd4180" "/wd4201" "/wd4464" "/wd4505" "/wd4514" "/wd4571" "/wd4623" "/wd4625" "/wd4626" "/wd4668" "/wd4710" "/wd4774" "/wd4820" "/wd5026" "/wd5027" "/wd5039" "/wd5045" "/wd26812" ) add_compile_options("/W3") foreach(WARN ${DISABLED_WARNINGS}) add_compile_options("${WARN}") endforeach() # C++ Exceptions & SEH add_compile_options("/EHa") # Multiprocessor compiling add_compile_options("/MP") elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU") message(STATUS "Applying custom flags for GNU style build.") # Clang/AppleClang/GNU # - Don't export by default. (Temporarily disabled) # - Enable all and extra warnings. add_compile_options("-Wall") add_compile_options("-Wextra") # add_compile_options("-fvisibility=hidden") endif() # C++ Standard and Extensions ## Use C++17 and no non-standard extensions. set(_CXX_STANDARD 17) set(_CXX_EXTENSIONS OFF) ################################################################################ # Resolve Plugin Build Type ################################################################################ if(TARGET libobs) # Plugin is built together with libOBS. message(STATUS "${PROJECT_NAME}: Using native libOBS.") set(${PREFIX}OBS_NATIVE TRUE) if (TARGET obs-frontend-api) set(HAVE_OBS_FRONTEND TRUE) endif() else() # Plugin is built by itself. message(STATUS "${PROJECT_NAME}: Using downloaded libOBS.") if(NOT WIN32) message(STATUS "${PROJECT_NAME}: Linux builds require preinstalled development packages. Refer to the manual for more information.") endif() set(${PREFIX}OBS_NATIVE FALSE) endif() ################################################################################ # Options ################################################################################ # Configuration by build type if(${PREFIX}OBS_NATIVE) else() # Packaging set(CMAKE_PACKAGE_PREFIX "${CMAKE_BINARY_DIR}" CACHE PATH "Path for generated archives.") set(CMAKE_PACKAGE_NAME "${PROJECT_NAME}" CACHE STRING "Name for the generated archives.") set(CMAKE_PACKAGE_SUFFIX_OVERRIDE "" CACHE STRING "Override for the suffix.") # Unix builds if(UNIX) set(UNIX_LOCAL_STRUCTURE TRUE CACHE BOOL "Package for a local linux install.") endif() endif() # Features ## Encoders set(${PREFIX}ENABLE_ENCODER_FFMPEG TRUE CACHE BOOL "Enable FFmpeg Encoder") ## Filters set(${PREFIX}ENABLE_FILTER_BLUR TRUE CACHE BOOL "Enable Blur Filter") set(${PREFIX}ENABLE_FILTER_COLOR_GRADE TRUE CACHE BOOL "Enable Color Grade Filter") set(${PREFIX}ENABLE_FILTER_DISPLACEMENT TRUE CACHE BOOL "Enable Displacement Filter") set(${PREFIX}ENABLE_FILTER_DYNAMIC_MASK TRUE CACHE BOOL "Enable Dynamic Mask Filter") set(${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING TRUE CACHE BOOL "Enable NVidia Face Tracking Filter") set(${PREFIX}ENABLE_FILTER_SDF_EFFECTS TRUE CACHE BOOL "Enable SDF Effects Filter") set(${PREFIX}ENABLE_FILTER_SHADER TRUE CACHE BOOL "Enable Shader Filter") set(${PREFIX}ENABLE_FILTER_TRANSFORM TRUE CACHE BOOL "Enable Transform Filter") ## Sources set(${PREFIX}ENABLE_SOURCE_MIRROR TRUE CACHE BOOL "Enable Mirror Source") set(${PREFIX}ENABLE_SOURCE_SHADER TRUE CACHE BOOL "Enable Shader Source") ## Transitions set(${PREFIX}ENABLE_TRANSITION_SHADER TRUE CACHE BOOL "Enable Shader Transition") ## FrontEnd / UI set(${PREFIX}ENABLE_FRONTEND TRUE CACHE BOOL "Enable Frontend code.") ## Code Related set(${PREFIX}ENABLE_CLANG TRUE CACHE BOOL "Enable Clang integration for supported compilers.") set(${PREFIX}ENABLE_PROFILING FALSE CACHE BOOL "Enable CPU and GPU performance tracking, which has a non-zero overhead at all times. Do not enable this for release builds.") set(${PREFIX}ENABLE_UPDATER TRUE CACHE BOOL "Enable automatic update checks.") # Code Signing set(${PREFIX}SIGN_ENABLED FALSE CACHE BOOL "Enable signing builds.") set(${PREFIX}SIGN_KEY "" CACHE FILEPATH "Path to the private key with which to sign.") set(${PREFIX}SIGN_PASSWORD "" CACHE STRING "Password for the private key.") # Not-Native Components if(NOT ${PREFIX}OBS_NATIVE) set(${PREFIX}DOWNLOAD_OBS_VERSION "" CACHE STRING "(Optional) OBS Studio version to build against.") set(${PREFIX}DOWNLOAD_OBS_HASH_32 "" CACHE STRING "") set(${PREFIX}DOWNLOAD_OBS_HASH_64 "" CACHE STRING "") mark_as_advanced( ${PREFIX}DOWNLOAD_OBS_VERSION ${PREFIX}DOWNLOAD_OBS_HASH_32 ${PREFIX}DOWNLOAD_OBS_HASH_64 ) if(WIN32) set(${PREFIX}DOWNLOAD_OBSDEPS_VERSION "" CACHE STRING "(Optional) OBS Studio dependencies version to build against.") set(${PREFIX}DOWNLOAD_OBSDEPS_HASH "" CACHE STRING "") set(${PREFIX}DOWNLOAD_QT_VERSION "" CACHE STRING "(Optional) Qt Version to build against.") set(${PREFIX}DOWNLOAD_QT_HASH "" CACHE STRING "") mark_as_advanced( ${PREFIX}DOWNLOAD_OBSDEPS_VERSION ${PREFIX}DOWNLOAD_OBSDEPS_HASH ${PREFIX}DOWNLOAD_QT_VERSION ${PREFIX}DOWNLOAD_QT_HASH ) endif() endif() ################################################################################ # CMake / Compiler Dependencies ################################################################################ # Configure Files configure_file( "templates/config.hpp.in" "${PROJECT_BINARY_DIR}/generated/config.hpp" ) configure_file( "templates/version.hpp.in" "${PROJECT_BINARY_DIR}/generated/version.hpp" ) configure_file( "templates/module.cpp.in" "${PROJECT_BINARY_DIR}/generated/module.cpp" ) if(WIN32) # Windows Resource Definition set(PROJECT_PRODUCT_NAME "${PROJECT_FULL_NAME}") set(PROJECT_COMPANY_NAME "${PROJECT_AUTHORS}") set(PROJECT_COPYRIGHT "${PROJECT_AUTHORS} © ${PROJECT_COPYRIGHT_YEARS}") set(PROJECT_LEGAL_TRADEMARKS_1 "") set(PROJECT_LEGAL_TRADEMARKS_2 "") configure_file( "templates/version.rc.in" "${PROJECT_BINARY_DIR}/generated/version.rc" @ONLY ) endif() ################################################################################ # Code & Dependencies ################################################################################ function(refresh_components) # CURL if((${PREFIX}ENABLE_UPDATER AND NOT ${PREFIX}DISABLE_UPDATER)) set(REQUIRE_CURL TRUE PARENT_SCOPE) else() set(REQUIRE_CURL FALSE PARENT_SCOPE) endif() # FFmpeg if(${PREFIX}ENABLE_ENCODER_FFMPEG AND NOT ${PREFIX}DISABLE_ENCODER_FFMPEG) set(REQUIRE_FFMPEG TRUE PARENT_SCOPE) else() set(REQUIRE_FFMPEG FALSE PARENT_SCOPE) endif() # JSON if((${PREFIX}ENABLE_UPDATER AND NOT ${PREFIX}DISABLE_UPDATER)) set(REQUIRE_JSON TRUE PARENT_SCOPE) else() set(REQUIRE_JSON FALSE PARENT_SCOPE) endif() # OBS Frontend API if((${PREFIX}ENABLE_FRONTEND AND NOT ${PREFIX}DISABLE_FRONTEND)) set(REQUIRE_OBSFE TRUE PARENT_SCOPE) else() set(REQUIRE_OBSFE FALSE PARENT_SCOPE) endif() # Qt if((${PREFIX}ENABLE_FRONTEND AND NOT ${PREFIX}DISABLE_FRONTEND)) set(REQUIRE_QT TRUE PARENT_SCOPE) else() set(REQUIRE_QT FALSE PARENT_SCOPE) endif() # NVIDIA Broadcast/Augmented Reality if((${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING AND NOT ${PREFIX}DISABLE_FILTER_NVIDIA_FACE_TRACKING)) set(REQUIRE_NVAR TRUE PARENT_SCOPE) else() set(REQUIRE_NVAR FALSE PARENT_SCOPE) endif() # NVIDIA CUDA if((${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING AND NOT ${PREFIX}DISABLE_FILTER_NVIDIA_FACE_TRACKING)) set(REQUIRE_NVCUDA TRUE PARENT_SCOPE) else() set(REQUIRE_NVCUDA FALSE PARENT_SCOPE) endif() endfunction() function(resolve_components) # Resolve features by dependencies if(${PREFIX}ENABLE_ENCODER_FFMPEG AND HAVE_FFMPEG) set(${PREFIX}DISABLE_ENCODER_FFMPEG FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_ENCODER_FFMPEG TRUE PARENT_SCOPE) if(${PREFIX}ENABLE_ENCODER_FFMPEG) message(WARNING "Encoder 'FFmpeg' requires FFmpeg.") endif() endif() if(${PREFIX}ENABLE_FILTER_BLUR) set(${PREFIX}DISABLE_FILTER_BLUR FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_BLUR TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FILTER_COLOR_GRADE) set(${PREFIX}DISABLE_FILTER_COLOR_GRADE FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_COLOR_GRADE TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FILTER_DISPLACEMENT) set(${PREFIX}DISABLE_FILTER_DISPLACEMENT FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_DISPLACEMENT TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FILTER_DYNAMIC_MASK) set(${PREFIX}DISABLE_FILTER_DYNAMIC_MASK FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_DYNAMIC_MASK TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING AND WIN32 AND HAVE_NVCUDA AND HAVE_NVAR) set(${PREFIX}DISABLE_FILTER_NVIDIA_FACE_TRACKING FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_NVIDIA_FACE_TRACKING TRUE PARENT_SCOPE) if(${PREFIX}ENABLE_FILTER_NVIDIA_FACE_TRACKING) message(WARNING "Filter 'NVIDIA Face Tracking' requires Windows, NVIDIA CUDA and NVIDIA AR SDK.") endif() endif() if(${PREFIX}ENABLE_FILTER_SDF_EFFECTS) set(${PREFIX}DISABLE_FILTER_SDF_EFFECTS FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_SDF_EFFECTS TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FILTER_SHADER) set(${PREFIX}DISABLE_FILTER_SHADER FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FILTER_SHADER TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_SOURCE_MIRROR) set(${PREFIX}DISABLE_SOURCE_MIRROR FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_SOURCE_MIRROR TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_SOURCE_SHADER) set(${PREFIX}DISABLE_SOURCE_SHADER FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_SOURCE_SHADER TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_TRANSITION_SHADER) set(${PREFIX}DISABLE_TRANSITION_SHADER FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_TRANSITION_SHADER TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_FRONTEND AND HAVE_QT AND HAVE_OBSFE) set(${PREFIX}DISABLE_FRONTEND FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_FRONTEND TRUE PARENT_SCOPE) if(${PREFIX}ENABLE_FRONTEND) message(WARNING "Front-End requires Qt5 and OBS Frontend API.") endif() endif() if(${PREFIX}ENABLE_PROFILING) set(${PREFIX}DISABLE_PROFILING FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_PROFILING TRUE PARENT_SCOPE) endif() if(${PREFIX}ENABLE_UPDATER AND HAVE_CURL AND HAVE_JSON) set(${PREFIX}DISABLE_UPDATER FALSE PARENT_SCOPE) else() set(${PREFIX}DISABLE_UPDATER TRUE PARENT_SCOPE) if(${PREFIX}ENABLE_UPDATER) message(WARNING "Updater requires CURL and nlohmann/json") endif() endif() endfunction() # Update Required Parts refresh_components() # OBS (Always first) if(NOT ${PREFIX}OBS_NATIVE) if(NOT ${PREFIX}DOWNLOAD_OBS_VERSION STREQUAL "") set(_DOWNLOAD_OBS_VERSION ${PREFIX}DOWNLOAD_OBS_VERSION) set(_DOWNLOAD_OBS_HASH_32 ${PREFIX}DOWNLOAD_OBS_HASH_32) set(_DOWNLOAD_OBS_HASH_64 ${PREFIX}DOWNLOAD_OBS_HASH_64) else() set(_DOWNLOAD_OBS_VERSION "26.0.2-ci") if(D_PLATFORM_WINDOWS) set(_DOWNLOAD_OBS_HASH_32 "SHA512=468A999ECC8C826683E208B8758FBAE2FD3C9C034A73A147F6BE0F40B6E0AF0B0C9A99DFCB8D3A856206A26FC45F5F0A3B1FF781949B3EF68B765FECEB5CEB55") set(_DOWNLOAD_OBS_HASH_64 "SHA512=571B4196DF5CFBD3A8E113C97C7890000C490DDF1C6747529DE0F06063F928E7488095775919017104DE7A693CCF51A7A82BD04BCE62D6B3F0ED1F74A5F32B32") elseif(D_PLATFORM_LINUX) set(_DOWNLOAD_OBS_HASH_32 "") set(_DOWNLOAD_OBS_HASH_64 "SHA512=62EAD42890CEF953806F5780ED37304D6BD110F65D3ED83A88ADA462B0A0E46E9DEE477A76D456C444102EBA4F9F9A9EAAA299DCFDB2872233E2B35F775CCD0D") elseif(D_PLATFORM_MAC) set(_DOWNLOAD_OBS_HASH_32 "") set(_DOWNLOAD_OBS_HASH_64 "SHA512=2A7E312666FAABF539740DAD8E30788DEB5882BE8D2FF062848741FD6F8C2077FB237CFB399634BC9C3DE38CF78B3043B1EAE92D833CE6A8B32F5E1EB92D6618") else() message(FATAL_ERROR "No prebuilt packages available for this operating system.") return() endif() endif() if(WIN32) if(NOT ${PREFIX}DOWNLOAD_OBSDEPS_VERSION STREQUAL "") set(_DOWNLOAD_OBSDEPS_VERSION ${PREFIX}DOWNLOAD_OBSDEPS_VERSION) set(_DOWNLOAD_OBSDEPS_HASH ${PREFIX}DOWNLOAD_OBSDEPS_HASH) else() set(_DOWNLOAD_OBSDEPS_VERSION "26.0.0") set(_DOWNLOAD_OBSDEPS_HASH "SHA512=2D47E7579DE3FBD88C52BB62C2CA4D649BD958FBAE8E5B01EE263D7583B4D8EEEA8CE13C543BEF110FAC9142891C031973A1BC20AC6EED596E6AB97CCC669D16") endif() if(NOT ${PREFIX}DOWNLOAD_QT_VERSION STREQUAL "") set(_DOWNLOAD_QT_VERSION ${PREFIX}DOWNLOAD_QT_VERSION) set(_DOWNLOAD_QT_HASH ${PREFIX}DOWNLOAD_QT_HASH) else() set(_DOWNLOAD_QT_VERSION "5.10.1") set(_DOWNLOAD_QT_HASH "SHA512=848B9AC00B06FCA1F1A85BD4EFEA4138D278E8EC96823C5C36CC988DDE5D27E2F91300B02F2F0E71F075CCB0D791D3C888CDA6A5048DDFE6F946A8697DFEF1E9") endif() endif() if(D_PLATFORM_WINDOWS) set(DLSUFFIX "windows${BITS}") elseif(D_PLATFORM_LINUX) set(DLSUFFIX "ubuntu${BITS}") elseif(D_PLATFORM_MAC) set(DLSUFFIX "macos${BITS}") else() message(FATAL_ERROR "Standalone builds are not supported for this platform. Please consider submitting the necessary changes to make them work.") endif() # Library download_project( PROJ libobs URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBS_VERSION}/obs-studio-${ARCH}-0.0.0.0-${DLSUFFIX}.7z" URL_HASH "${_DOWNLOAD_OBS_HASH_${BITS}}" DOWNLOAD_NAME "libobs.7z" DOWNLOAD_NO_PROGRESS OFF UPDATE_DISCONNECTED OFF ) # Dependencies if(D_PLATFORM_WINDOWS) download_project( PROJ obsdeps URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBSDEPS_VERSION}/dependencies.7z" URL_HASH "${_DOWNLOAD_OBSDEPS_HASH}" DOWNLOAD_NAME "obsdeps.7z" DOWNLOAD_NO_PROGRESS OFF UPDATE_DISCONNECTED OFF ) else() # Unix systems use system packages instead. message(STATUS "StreamFX: Builds on non-Windows platforms require that you install the necessary packages.") endif() # Include config file. include("${libobs_SOURCE_DIR}/cmake/LibObs/LibObsConfig.cmake") endif() # CURL if(REQUIRE_CURL) if(WIN32) # CURL built by OBS Project is not compatible with find modules. if(${PREFIX}OBS_NATIVE) # Already defined by OBS set(CURL_LIBRARIES "${CURL_LIB}") set(CURL_INCLUDE_DIRS "${CURL_INCLUDE_DIR}") else() set(CURL_LIBRARIES "${obsdeps_SOURCE_DIR}/win${BITS}/bin/libcurl.lib") set(CURL_INCLUDE_DIRS "${obsdeps_SOURCE_DIR}/win${BITS}/include") endif() set(CURL_LIBRARY_DEBUG ${CURL_LIBRARIES}) set(CURL_LIBRARY_RELEASE ${CURL_LIBRARIES}) set(CURL_INCLUDE_DIR ${CURL_INCLUDE_DIRS}) set(CURL_FOUND ON) else() find_package(CURL) endif() set(HAVE_CURL ${CURL_FOUND}) else() set(HAVE_CURL FALSE) endif() if(NOT HAVE_CURL AND REQUIRE_CURL) message(WARNING "CURL could not be found.") endif() # FFmpeg if(REQUIRE_FFMPEG) if(WIN32 AND NOT ${PREFIX}OBS_NATIVE) find_path( FFmpegPath "libavcodec/avcodec.h" HINTS ${OBS_DEPENDENCIES_DIR} ${obsdeps_SOURCE_DIR} ${DepsPath} ${DepsPath32} ${DepsPath64} PATHS /usr/include /usr/local/include /opt/local/include /sw/include PATH_SUFFIXES win${BITS} win${BITS}/bin win${BITS}/include win${ARCH} win${ARCH}/bin win${ARCH}/include bin include ) endif() find_package(FFmpeg COMPONENTS avutil avcodec swscale) set(HAVE_FFMPEG ${FFmpeg_FOUND}) else() set(HAVE_FFMPEG FALSE) endif() if(NOT HAVE_FFMPEG AND REQUIRE_FFMPEG) message(WARNING "FFmpeg could not be found.") endif() # JSON if(REQUIRE_JSON AND EXISTS "${PROJECT_SOURCE_DIR}/third-party/nlohmann-json/single_include") set(JSON_INCLUDE_DIR "${PROJECT_SOURCE_DIR}/third-party/nlohmann-json/single_include") set(HAVE_JSON TRUE) else() set(HAVE_JSON FALSE) endif() if(NOT HAVE_JSON AND REQUIRE_JSON) message(WARNING "nlohmann/json was not found.") endif() # Qt if(REQUIRE_QT) if(WIN32 AND NOT ${PREFIX}OBS_NATIVE) download_project( PROJ qt URL "https://github.com/Xaymar/obs-studio/releases/download/${_DOWNLOAD_OBSDEPS_VERSION}/qt_${_DOWNLOAD_QT_VERSION}.7z" URL_HASH "${_DOWNLOAD_QT_HASH}" DOWNLOAD_NAME "qt.7z" DOWNLOAD_NO_PROGRESS ON UPDATE_DISCONNECTED ON QUIET ) set(Qt5_DIR "${qt_SOURCE_DIR}" CACHE STRING "Path to Qt5") if("${BITS}" STREQUAL "32") CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/msvc2017/lib/cmake/Qt5/") else() CacheSet(Qt5_DIR "${qt_SOURCE_DIR}/msvc2017_64/lib/cmake/Qt5/") endif() endif() find_package(Qt5 COMPONENTS Core Widgets) set(HAVE_QT ${Qt5_FOUND}) else() set(HAVE_QT FALSE) endif() if(NOT HAVE_QT AND REQUIRE_QT) message(WARNING "Qt5 was not found.") endif() # OBS Frontend API if(REQUIRE_OBSFE) if(NOT ${PREFIX}OBS_NATIVE) if (EXISTS "${libobs_SOURCE_DIR}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake") include("${libobs_SOURCE_DIR}/cmake/obs-frontend-api/obs-frontend-apiConfig.cmake") set(HAVE_OBSFE TRUE) else() set(HAVE_OBSFE FALSE) endif() else() if(TARGET obs-frontend-api) set(HAVE_OBSFE TRUE) else() set(HAVE_OBSFE FALSE) endif() endif() endif() if(NOT HAVE_OBSFE AND REQUIRE_OBSFE) message(WARNING "obs-frontend-api was as not found.") endif() # NVIDIA CUDA if(REQUIRE_NVCUDA) # CUDA is provided by the NVIDIA Driver, we just load it dynamically. set(HAVE_NVCUDA TRUE) else() set(HAVE_NVCUDA FALSE) endif() if(NOT HAVE_NVCUDA AND REQUIRE_NVCUDA) message(WARNING "NVIDIA CUDA was as not found.") endif() # NVIDIA Broadcast / Augmented Reality if(REQUIRE_NVAR AND EXISTS "${PROJECT_SOURCE_DIR}/third-party/nvidia-arsdk/version.h") set(NVAR_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third-party/nvidia-arsdk") find_package(NVAR) set(HAVE_NVAR ${NVAR_FOUND}) else() set(HAVE_NVAR FALSE) endif() if(NOT HAVE_NVAR AND REQUIRE_NVAR) message(WARNING "NVIDIA AR was as not found.") endif() # Update selected Components resolve_components() refresh_components() ################################################################################ # Code ################################################################################ set(PROJECT_DATA_LOCALE ) set(PROJECT_DATA_EFFECTS ) set(PROJECT_DATA_SHADERS ) set(PROJECT_LIBRARIES ) set(PROJECT_LIBRARIES_DELAYED ) set(PROJECT_INCLUDE_DIRS ) set(PROJECT_TEMPLATES ) set(PROJECT_PRIVATE_GENERATED ) set(PROJECT_PRIVATE_SOURCE ) set(PROJECT_UI ) set(PROJECT_UI_SOURCE ) set(PROJECT_DEFINITIONS ) # Dependencies list(APPEND PROJECT_LIBRARIES libobs) if(REQUIRE_QT AND HAVE_QT) list(APPEND PROJECT_LIBRARIES Qt5::Core Qt5::Widgets) endif() if(REQUIRE_OBSFE AND HAVE_OBSFE) list(APPEND PROJECT_LIBRARIES obs-frontend-api) endif() if(REQUIRE_JSON AND HAVE_JSON) list(APPEND PROJECT_INCLUDE_DIRS ${JSON_INCLUDE_DIR}) endif() if(REQUIRE_CURL AND HAVE_CURL) list(APPEND PROJECT_PRIVATE_SOURCE "source/util/util-curl.hpp" "source/util/util-curl.cpp" ) list(APPEND PROJECT_LIBRARIES ${CURL_LIBRARY_RELEASE}) list(APPEND PROJECT_INCLUDE_DIRS ${CURL_INCLUDE_DIR}) endif() if(REQUIRE_FFMPEG AND HAVE_FFMPEG) list(APPEND PROJECT_LIBRARIES ${FFMPEG_LIBRARIES} ) list(APPEND PROJECT_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} ) endif() if(REQUIRE_NVCUDA AND HAVE_NVCUDA) list(APPEND PROJECT_PRIVATE_SOURCE "source/nvidia/cuda/nvidia-cuda.hpp" "source/nvidia/cuda/nvidia-cuda.cpp" "source/nvidia/cuda/nvidia-cuda-context.hpp" "source/nvidia/cuda/nvidia-cuda-context.cpp" "source/nvidia/cuda/nvidia-cuda-context-stack.hpp" "source/nvidia/cuda/nvidia-cuda-context-stack.cpp" "source/nvidia/cuda/nvidia-cuda-gs-texture.hpp" "source/nvidia/cuda/nvidia-cuda-gs-texture.cpp" "source/nvidia/cuda/nvidia-cuda-memory.hpp" "source/nvidia/cuda/nvidia-cuda-memory.cpp" "source/nvidia/cuda/nvidia-cuda-stream.hpp" "source/nvidia/cuda/nvidia-cuda-stream.cpp" ) endif() if(REQUIRE_NVAR AND HAVE_NVAR) list(APPEND PROJECT_PRIVATE_SOURCE "source/nvidia/ar/nvidia-ar.hpp" "source/nvidia/ar/nvidia-ar.cpp" "source/nvidia/ar/nvidia-ar-feature.hpp" "source/nvidia/ar/nvidia-ar-feature.cpp" ) list(APPEND PROJECT_LIBRARIES nvARProxy ) endif() # Core list(APPEND PROJECT_PRIVATE_SOURCE "source/configuration.hpp" "source/configuration.cpp" "source/common.hpp" "source/strings.hpp" "source/plugin.hpp" "source/plugin.cpp" "source/util/utility.hpp" "source/util/utility.cpp" "source/util/util-bitmask.hpp" "source/util/util-event.hpp" "source/util/util-library.cpp" "source/util/util-library.hpp" "source/util/util-threadpool.cpp" "source/util/util-threadpool.hpp" "source/gfx/gfx-source-texture.hpp" "source/gfx/gfx-source-texture.cpp" "source/obs/gs/gs-helper.hpp" "source/obs/gs/gs-helper.cpp" "source/obs/gs/gs-effect.hpp" "source/obs/gs/gs-effect.cpp" "source/obs/gs/gs-effect-parameter.hpp" "source/obs/gs/gs-effect-parameter.cpp" "source/obs/gs/gs-effect-pass.hpp" "source/obs/gs/gs-effect-pass.cpp" "source/obs/gs/gs-effect-technique.hpp" "source/obs/gs/gs-effect-technique.cpp" "source/obs/gs/gs-indexbuffer.hpp" "source/obs/gs/gs-indexbuffer.cpp" "source/obs/gs/gs-limits.hpp" "source/obs/gs/gs-mipmapper.hpp" "source/obs/gs/gs-mipmapper.cpp" "source/obs/gs/gs-rendertarget.hpp" "source/obs/gs/gs-rendertarget.cpp" "source/obs/gs/gs-sampler.hpp" "source/obs/gs/gs-sampler.cpp" "source/obs/gs/gs-texture.hpp" "source/obs/gs/gs-texture.cpp" "source/obs/gs/gs-vertex.hpp" "source/obs/gs/gs-vertex.cpp" "source/obs/gs/gs-vertexbuffer.hpp" "source/obs/gs/gs-vertexbuffer.cpp" "source/obs/obs-encoder-factory.hpp" "source/obs/obs-encoder-factory.cpp" "source/obs/obs-signal-handler.hpp" "source/obs/obs-signal-handler.cpp" "source/obs/obs-source.hpp" "source/obs/obs-source.cpp" "source/obs/obs-source-factory.hpp" "source/obs/obs-source-factory.cpp" "source/obs/obs-source-tracker.hpp" "source/obs/obs-source-tracker.cpp" "source/obs/obs-tools.hpp" "source/obs/obs-tools.cpp" ) list(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/module.cpp" "${PROJECT_BINARY_DIR}/generated/version.hpp" "${PROJECT_BINARY_DIR}/generated/config.hpp" ) list(APPEND PROJECT_TEMPLATES "templates/version.hpp.in" "templates/module.cpp.in" "templates/config.hpp.in" ) list(APPEND PROJECT_DATA "data/locale/en-US.ini" "data/effects/color-conversion.effect" "data/effects/mipgen.effect" "data/effects/pack-unpack.effect" ) if(WIN32) list(APPEND PROJECT_TEMPLATES "templates/version.rc.in" ) list(APPEND PROJECT_PRIVATE_SOURCE "source/windll.cpp" ) list(APPEND PROJECT_PRIVATE_GENERATED "${PROJECT_BINARY_DIR}/generated/version.rc" ) if(NOT ${PREFIX}OBS_NATIVE) list(APPEND PROJECT_TEMPLATES "templates/installer.iss.in" ) endif() endif() # Old Compiler Support 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() ################################################################################ # Components ################################################################################ # Component: Profiling if(NOT ${PREFIX}DISABLE_PROFILING) list(APPEND PROJECT_PRIVATE_SOURCE "source/util/util-profiler.cpp" "source/util/util-profiler.hpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_PROFILING ) endif() # Component: Updater if(NOT ${PREFIX}DISABLE_UPDATER) list(APPEND PROJECT_PRIVATE_SOURCE "source/updater.hpp" "source/updater.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_UPDATER ) endif() # Component: Encoder/FFmpeg if(NOT ${PREFIX}DISABLE_ENCODER_FFMPEG) list(APPEND PROJECT_PRIVATE_SOURCE # FFmpeg "source/ffmpeg/avframe-queue.cpp" "source/ffmpeg/avframe-queue.hpp" "source/ffmpeg/swscale.hpp" "source/ffmpeg/swscale.cpp" "source/ffmpeg/tools.hpp" "source/ffmpeg/tools.cpp" "source/ffmpeg/hwapi/base.hpp" "source/ffmpeg/hwapi/base.cpp" "source/ffmpeg/hwapi/d3d11.hpp" "source/ffmpeg/hwapi/d3d11.cpp" # Encoders "source/encoders/encoder-ffmpeg.hpp" "source/encoders/encoder-ffmpeg.cpp" # Encoders/Codecs "source/encoders/codecs/hevc.hpp" "source/encoders/codecs/hevc.cpp" "source/encoders/codecs/h264.hpp" "source/encoders/codecs/h264.cpp" "source/encoders/codecs/prores.hpp" "source/encoders/codecs/prores.cpp" # Encoders/Handlers "source/encoders/handlers/handler.hpp" "source/encoders/handlers/handler.cpp" "source/encoders/handlers/debug_handler.hpp" "source/encoders/handlers/debug_handler.cpp" "source/encoders/handlers/prores_aw_handler.hpp" "source/encoders/handlers/prores_aw_handler.cpp" "source/encoders/handlers/nvenc_shared.hpp" "source/encoders/handlers/nvenc_shared.cpp" "source/encoders/handlers/nvenc_h264_handler.hpp" "source/encoders/handlers/nvenc_h264_handler.cpp" "source/encoders/handlers/nvenc_hevc_handler.hpp" "source/encoders/handlers/nvenc_hevc_handler.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_ENCODER_FFMPEG ) endif() # Component: Filter/Blur if(NOT ${PREFIX}DISABLE_FILTER_BLUR) list(APPEND PROJECT_DATA "data/effects/mask.effect" "data/effects/blur/box.effect" "data/effects/blur/box-linear.effect" "data/effects/blur/dual-filtering.effect" "data/effects/blur/gaussian.effect" "data/effects/blur/gaussian-linear.effect" ) list (APPEND PROJECT_PRIVATE_SOURCE "source/gfx/blur/gfx-blur-base.hpp" "source/gfx/blur/gfx-blur-base.cpp" "source/gfx/blur/gfx-blur-box.hpp" "source/gfx/blur/gfx-blur-box.cpp" "source/gfx/blur/gfx-blur-box-linear.hpp" "source/gfx/blur/gfx-blur-box-linear.cpp" "source/gfx/blur/gfx-blur-dual-filtering.hpp" "source/gfx/blur/gfx-blur-dual-filtering.cpp" "source/gfx/blur/gfx-blur-gaussian.hpp" "source/gfx/blur/gfx-blur-gaussian.cpp" "source/gfx/blur/gfx-blur-gaussian-linear.hpp" "source/gfx/blur/gfx-blur-gaussian-linear.cpp" "source/filters/filter-blur.hpp" "source/filters/filter-blur.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_BLUR ) endif() # Component: Filter/Color Grade if(NOT ${PREFIX}DISABLE_FILTER_COLOR_GRADE) list(APPEND PROJECT_DATA "data/effects/color-grade.effect" ) list (APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-color-grade.hpp" "source/filters/filter-color-grade.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_COLOR_GRADE ) endif() # Component: Filter/Displacement if(NOT ${PREFIX}DISABLE_FILTER_DISPLACEMENT) list(APPEND PROJECT_DATA "data/effects/displace.effect" ) list (APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-displacement.hpp" "source/filters/filter-displacement.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_DISPLACEMENT ) endif() # Component: Filter/Dynamic Mask if(NOT ${PREFIX}DISABLE_FILTER_DYNAMIC_MASK) list(APPEND PROJECT_DATA "data/effects/channel-mask.effect" ) list(APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-dynamic-mask.hpp" "source/filters/filter-dynamic-mask.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_DYNAMIC_MASK ) endif() # Component: Filter/NVIDIA Face Tracking if(NOT ${PREFIX}DISABLE_FILTER_NVIDIA_FACE_TRACKING) list(APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-nv-face-tracking.hpp" "source/filters/filter-nv-face-tracking.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_NVIDIA_FACE_TRACKING ) endif() # Component: Filter/SDF Effects if(NOT ${PREFIX}DISABLE_FILTER_SDF_EFFECTS) list(APPEND PROJECT_DATA "data/effects/sdf/sdf-producer.effect" "data/effects/sdf/sdf-consumer.effect" ) list(APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-sdf-effects.hpp" "source/filters/filter-sdf-effects.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_SDF_EFFECTS ) endif() # Component: Filter/Shader if(NOT ${PREFIX}DISABLE_FILTER_SHADER) set(REQUIRE_SHADER_CODE ON) list(APPEND PROJECT_DATA "data/examples/shaders/filter/crt-curvature.effect" "data/examples/shaders/filter/crt-scanlines.effect" "data/examples/shaders/filter/drunk.effect" "data/examples/shaders/filter/hexagonize.effect" "data/examples/shaders/filter/semiline.effect" ) list(APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-shader.hpp" "source/filters/filter-shader.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_SHADER ) endif() # Component: Filter/Transform if(NOT ${PREFIX}DISABLE_FILTER_TRANSFORM) list(APPEND PROJECT_PRIVATE_SOURCE "source/filters/filter-transform.hpp" "source/filters/filter-transform.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FILTER_TRANSFORM ) endif() # Component: Source/Mirror if(NOT ${PREFIX}DISABLE_SOURCE_MIRROR) list(APPEND PROJECT_PRIVATE_SOURCE "source/sources/source-mirror.hpp" "source/sources/source-mirror.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_SOURCE_MIRROR ) endif() # Component: Source/Shader if(NOT ${PREFIX}DISABLE_SOURCE_SHADER) list(APPEND PROJECT_PRIVATE_SOURCE "source/sources/source-shader.hpp" "source/sources/source-shader.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_SOURCE_SHADER ) endif() # Component: Transition/Shader if(NOT ${PREFIX}DISABLE_TRANSITION_SHADER) list(APPEND PROJECT_PRIVATE_SOURCE "source/transitions/transition-shader.hpp" "source/transitions/transition-shader.cpp" ) list(APPEND PROJECT_DEFINITIONS ENABLE_TRANSITION_SHADER ) endif() # Component: Frontend if(NOT ${PREFIX}DISABLE_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" ) list(APPEND PROJECT_INCLUDE_DIRS "source/ui" ) list(APPEND PROJECT_DEFINITIONS ENABLE_FRONTEND ) if(NOT ${PREFIX}DISABLE_UPDATER) list(APPEND PROJECT_UI_SOURCE "source/ui/ui-updater.hpp" "source/ui/ui-updater.cpp" ) list(APPEND PROJECT_UI "ui/updater.ui" ) endif() endif() # Extra Parts if(NOT ${PREFIX}DISABLE_FILTER_SHADER OR NOT ${PREFIX}DISABLE_SOURCE_SHADER OR NOT ${PREFIX}DISABLE_TRANSITION_SHADER) list(APPEND PROJECT_PRIVATE_SOURCE "source/gfx/shader/gfx-shader.hpp" "source/gfx/shader/gfx-shader.cpp" "source/gfx/shader/gfx-shader-param.hpp" "source/gfx/shader/gfx-shader-param.cpp" "source/gfx/shader/gfx-shader-param-audio.hpp" "source/gfx/shader/gfx-shader-param-audio.cpp" "source/gfx/shader/gfx-shader-param-basic.hpp" "source/gfx/shader/gfx-shader-param-basic.cpp" "source/gfx/shader/gfx-shader-param-matrix.hpp" "source/gfx/shader/gfx-shader-param-matrix.cpp" "source/gfx/shader/gfx-shader-param-texture.hpp" "source/gfx/shader/gfx-shader-param-texture.cpp" ) list(APPEND PROJECT_DATA "data/examples/shaders/feature-test.effect" ) endif() # Combine it all set(PROJECT_FILES # Always exists ${PROJECT_TEMPLATES} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} ${PROJECT_DATA} # UI-only (empty if not enabled) ${PROJECT_UI} ${PROJECT_UI_SOURCE} ) 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}) if(NOT ${PREFIX}DISABLE_FRONTEND) set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} ${PROJECT_PRIVATE_GENERATED} ${PROJECT_PRIVATE_SOURCE} PROPERTIES SKIP_AUTOUIC TRUE SKIP_AUTOGEN TRUE ) endif() set_source_files_properties(${PROJECT_DATA} ${PROJECT_TEMPLATES} PROPERTIES HEADER_FILE_ONLY TRUE ) ################################################################################ # Target ################################################################################ # Set up add_library(${PROJECT_NAME} MODULE ${PROJECT_FILES} ) target_include_directories(${PROJECT_NAME} PRIVATE "${PROJECT_BINARY_DIR}/generated" "${PROJECT_SOURCE_DIR}/source" ${PROJECT_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} ${PROJECT_LIBRARIES} ) target_compile_definitions(${PROJECT_NAME} PRIVATE ${PROJECT_DEFINITIONS}) # Extra Changes set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" IMPORT_PREFIX "" ) if(WIN32) # /DELAYLOAD MSVC target_link_libraries(${PROJECT_NAME} Delayimp.lib ) foreach(DELAYLOAD ${PROJECT_LIBRARIES_DELAYED}) get_target_property(_lf ${PROJECT_NAME} LINK_FLAGS) if (NOT _lf) set(_lf "") endif() set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${_lf} /DELAYLOAD:${DELAYLOAD}") add_link_options("/DELAYLOAD:${DELAYLOAD}") endforeach() # Windows.h shrinking target_compile_definitions(${PROJECT_NAME} PRIVATE _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() # C++ Standard and Extensions set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD ${_CXX_STANDARD} CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS ${_CXX_EXTENSIONS} ) # File Version if(NOT APPLE) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}.${PROJECT_VERSION_TWEAK} ) endif() # UI if(NOT ${PREFIX}DISABLE_FRONTEND) set_target_properties(${PROJECT_NAME} PROPERTIES AUTOUIC TRUE AUTOUIC_SEARCH_PATHS "${PROJECT_SOURCE_DIR};${PROJECT_SOURCE_DIR}/ui" AUTOMOC TRUE AUTORCC TRUE AUTOGEN_BUILD_DIR "${PROJECT_BINARY_DIR}/generated" AUTOGEN_SOURCE_GROUP "Qt/GEN" AUTOMOC_SOURCE_GROUP "Qt/MOC" AUTORCC_SOURCE_GROUP "Qt/RCC" ) endif() # Clang Tools if(${PREFIX}ENABLE_CLANG AND HAVE_CLANG) generate_compile_commands_json( TARGETS ${PROJECT_NAME} ) clang_tidy( TARGETS ${PROJECT_NAME} VERSION 9.0.0 ) clang_format( TARGETS ${PROJECT_NAME} DEPENDENCY VERSION 9.0.0 ) endif() # Signing if(${PREFIX}SIGN_ENABLED) # Investigate: https://github.com/Monetra/mstdlib/blob/master/CMakeModules/CodeSign.cmake if(MSVC) find_program(${PREFIX}SIGN_TOOL NAMES "signtool" DOC "Path to the signing tool." REQUIRED ) if(${PREFIX}SIGN_TOOL) message(STATUS "${PROJECT_NAME}: Signing enabled") add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${${PREFIX}SIGN_TOOL} ARGS sign /p "${${PREFIX}SIGN_PASSWORD}" /f "${${PREFIX}SIGN_KEY}" $ ) endif() endif() endif() ################################################################################ # Installation ################################################################################ if(${PREFIX}OBS_NATIVE) install_obs_plugin_with_data(${PROJECT_NAME} data) else() # Packaging if("${CMAKE_PACKAGE_SUFFIX_OVERRIDE}" STREQUAL "") set(_PACKAGE_SUFFIX_OVERRIDE "${VERSION_STRING}") else() set(_PACKAGE_SUFFIX_OVERRIDE "${CMAKE_PACKAGE_SUFFIX_OVERRIDE}") endif() set(_PACKAGE_FULL_NAME "${CMAKE_PACKAGE_PREFIX}/${CMAKE_PACKAGE_NAME}-${_PACKAGE_SUFFIX_OVERRIDE}") if(UNIX_LOCAL_STRUCTURE) install( TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "./plugins/${PROJECT_NAME}/bin/${BITS}bit/" COMPONENT Runtime LIBRARY DESTINATION "./plugins/${PROJECT_NAME}/bin/${BITS}bit/" COMPONENT Runtime ) install( DIRECTORY "data/" DESTINATION "./plugins/${PROJECT_NAME}/data/" ) add_custom_target( PACKAGE_7Z ${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.7z" --format=7zip -- "${CMAKE_INSTALL_PREFIX}/plugins/${PROJECT_NAME}" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" ) add_custom_target( PACKAGE_ZIP ${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.zip" --format=zip -- "${CMAKE_INSTALL_PREFIX}/plugins/${PROJECT_NAME}" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" ) else() install( TARGETS ${PROJECT_NAME} RUNTIME DESTINATION "./obs-plugins/${BITS}bit/" COMPONENT Runtime LIBRARY DESTINATION "./obs-plugins/${BITS}bit/" COMPONENT Runtime ) if(MSVC) install( FILES $ DESTINATION "./obs-plugins/${BITS}bit/" OPTIONAL ) endif() install( DIRECTORY "data/" DESTINATION "./data/obs-plugins/${PROJECT_NAME}/" ) add_custom_target( PACKAGE_7Z ${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.7z" --format=7zip -- "${CMAKE_INSTALL_PREFIX}/obs-plugins" "${CMAKE_INSTALL_PREFIX}/data" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" ) add_custom_target( PACKAGE_ZIP ${CMAKE_COMMAND} -E tar cfv "${_PACKAGE_FULL_NAME}.zip" --format=zip -- "${CMAKE_INSTALL_PREFIX}/obs-plugins" "${CMAKE_INSTALL_PREFIX}/data" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}" ) # Windows if(WIN32) ## Installer (InnoSetup) get_filename_component(ISS_FILES_DIR "${CMAKE_INSTALL_PREFIX}" ABSOLUTE) file(TO_NATIVE_PATH "${ISS_FILES_DIR}" ISS_FILES_DIR) get_filename_component(ISS_PACKAGE_DIR "${CMAKE_PACKAGE_PREFIX}" ABSOLUTE) file(TO_NATIVE_PATH "${ISS_PACKAGE_DIR}" ISS_PACKAGE_DIR) get_filename_component(ISS_SOURCE_DIR "${PROJECT_SOURCE_DIR}" ABSOLUTE) file(TO_NATIVE_PATH "${ISS_SOURCE_DIR}" ISS_SOURCE_DIR) get_filename_component(ISS_MSVCHELPER_PATH "${msvc-redist-helper_BUILD_DIR}" ABSOLUTE) file(TO_NATIVE_PATH "${ISS_MSVCHELPER_PATH}" ISS_MSVCHELPER_PATH) configure_file( "templates/installer.iss.in" "${PROJECT_BINARY_DIR}/installer.iss" ) endif() endif() endif()