Explorar el Código

cmake: Update CMakeLists.txt to use modern target-based semantics

PatTheMav hace 3 años
padre
commit
cdc6df7c3a
Se han modificado 2 ficheros con 355 adiciones y 149 borrados
  1. 81 149
      CMakeLists.txt
  2. 274 0
      external/ObsPluginHelpers.cmake

+ 81 - 149
CMakeLists.txt

@@ -1,8 +1,9 @@
-cmake_minimum_required(VERSION 3.10)
+cmake_minimum_required(VERSION 3.16)
 
 # Change obs-plugintemplate to your plugin's name in a machine-readable format
 # (e.g.: obs-myawesomeplugin) and set 
 project(obs-plugintemplate VERSION 1.0.0)
+add_library(${CMAKE_PROJECT_NAME} MODULE)
 
 # Replace `Your Name Here` with the name (yours or your organization's) you want
 # to see as the author of the plugin (in the plugin's metadata itself and in the installers)
@@ -13,181 +14,112 @@ set(PLUGIN_AUTHOR "Your Name Here")
 set(MACOS_BUNDLEID "com.example.obs-plugintemplate")
 
 # Replace `me@contoso.com` with the maintainer email address you want to put in Linux packages
-set(LINUX_MAINTAINER_EMAIL "me@contoso.com")
+set(LINUX_MAINTAINER_EMAIL "me@mymailhost.com")
 
-# TAKE NOTE: No need to edit things past this point
+# Add your custom source files here - header files are optional and only required for visibility
+# e.g. in Xcode or Visual Studio
+target_sources(${CMAKE_PROJECT_NAME}
+	PRIVATE
+		src/plugin-main.c)
 
-set(CMAKE_PREFIX_PATH "${QTDIR}")
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTOUIC ON)
+# /!\ TAKE NOTE: No need to edit things past this point /!\
 
-# In case you need C++
-set(CMAKE_CXX_STANDARD 11)
-set(CMAKE_CXX_STANDARD_REQUIRED ON)
+find_package(libobs REQUIRED)
+find_package(obs-frontend-api REQUIRED)
+include(external/ObsPluginHelpers.cmake)
+find_package(Qt5Core REQUIRED)
+find_package(Qt5Widgets REQUIRED)
 
-if (WIN32 OR APPLE)
-include(external/FindLibObs.cmake)
-endif()
-
-find_package(LibObs REQUIRED)
-find_package(Qt5 REQUIRED COMPONENTS Core Widgets)
-
-configure_file(
-    src/plugin-macros.h.in
-    ../src/plugin-macros.generated.h
-)
-configure_file(
-    installer/installer-macOS.pkgproj.in
-    ../installer/installer-macOS.generated.pkgproj
-)
-configure_file(
-    installer/installer-Windows.iss.in
-    ../installer/installer-Windows.generated.iss
-)
 
 configure_file(
-    ci/ci_includes.sh.in
-    ../ci/ci_includes.generated.sh
-)
-configure_file(
-    ci/ci_includes.cmd.in
-    ../ci/ci_includes.generated.cmd
-)
-
-set(PLUGIN_SOURCES
-	src/plugin-main.c)
+	src/plugin-macros.h.in
+	${CMAKE_SOURCE_DIR}/src/plugin-macros.generated.h)
 
-set(PLUGIN_HEADERS
-	src/plugin-macros.generated.h)
+target_sources(${CMAKE_PROJECT_NAME}
+	PRIVATE
+		src/plugin-macros.generated.h)
 
 # --- Platform-independent build settings ---
-add_library(${CMAKE_PROJECT_NAME} MODULE ${PLUGIN_SOURCES} ${PLUGIN_HEADERS})
 
-include_directories(
-	"${LIBOBS_INCLUDE_DIR}/../UI/obs-frontend-api"
-	${Qt5Core_INCLUDES}
-	${Qt5Widgets_INCLUDES}
-)
+target_include_directories(${CMAKE_PROJECT_NAME}
+	PRIVATE ${CMAKE_SOURCE_DIR}/src)
 
 target_link_libraries(${CMAKE_PROJECT_NAME}
-	libobs
-	Qt5::Core
-	Qt5::Widgets
-)
+	PRIVATE
+		OBS::libobs
+		OBS::obs-frontend-api
+		Qt5::Core
+		Qt5::Widgets)
+
+set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES
+	AUTOMOC ON
+	AUTOUIC ON
+	AUTORCC ON)
+
+target_compile_features(${CMAKE_PROJECT_NAME}
+	PRIVATE
+		cxx_std_17)
 
 # --- End of section ---
 
 # --- Windows-specific build settings and tasks ---
-if(WIN32)
-	if(NOT DEFINED OBS_FRONTEND_LIB)
-		set(OBS_FRONTEND_LIB "OBS_FRONTEND_LIB-NOTFOUND" CACHE FILEPATH "OBS frontend library")
-		message(FATAL_ERROR "Could not find OBS Frontend API\'s library !")
+if(OS_WINDOWS)
+	configure_file(
+		installer/installer-Windows.iss.in
+		${CMAKE_SOURCE_DIR}/installer/installer-Windows.generated.iss)
+
+	configure_file(
+		CI/include/build_environment.ps1.in
+		${CMAKE_SOURCE_DIR}/CI/include/build_environment.ps1)
+
+	if(MSVC)
+		target_compile_options(${CMAKE_PROJECT_NAME}
+			PRIVATE
+				/MP
+				/d2FH4-)
 	endif()
+# --- End of section ---
 
-    # Enable Multicore Builds and disable FH4 (to not depend on VCRUNTIME140_1.DLL when building with VS2019)
-    if (MSVC)
-        add_definitions(/MP /d2FH4-)
-    endif()
-
-	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-		set(ARCH_NAME "64bit")
-		set(OBS_BUILDDIR_ARCH "build64")
-	else()
-		set(ARCH_NAME "32bit")
-		set(OBS_BUILDDIR_ARCH "build32")
-	endif()
+# -- macOS specific build settings and tasks --
+elseif(OS_MACOS)
+	configure_file(
+		bundle/installer-macOS.pkgproj.in
+		${CMAKE_SOURCE_DIR}/bundle/installer-macOS.generated.pkgproj)
 
-	include_directories(
-		"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/UI"
+	configure_file(
+		CI/include/build_environment.sh.in
+		${CMAKE_SOURCE_DIR}/CI/include/build_environment.sh
 	)
 
-	target_link_libraries(${CMAKE_PROJECT_NAME}
-		"${OBS_FRONTEND_LIB}"
-    )
-
-	# --- Release package helper ---
-	# The "release" folder has a structure similar OBS' one on Windows
-	set(RELEASE_DIR "${PROJECT_SOURCE_DIR}/release")
-
-    add_custom_command(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD
-        # If config is Release or RelWithDebInfo, package release files
-        COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
-            "${CMAKE_COMMAND}" -E make_directory
-                "${RELEASE_DIR}/data/obs-plugins/${CMAKE_PROJECT_NAME}"
-                "${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
-        )
-
-        COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
-            "${CMAKE_COMMAND}" -E copy_directory
-                "${PROJECT_SOURCE_DIR}/data"
-                "${RELEASE_DIR}/data/obs-plugins/${CMAKE_PROJECT_NAME}"
-        )
-
-        COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
-            "${CMAKE_COMMAND}" -E copy
-                "$<TARGET_FILE:${CMAKE_PROJECT_NAME}>"
-                "${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
-        )
-
-        # If config is RelWithDebInfo, copy the pdb file
-        COMMAND if $<CONFIG:RelWithDebInfo>==1 (
-            "${CMAKE_COMMAND}" -E copy
-                "$<TARGET_PDB_FILE:${CMAKE_PROJECT_NAME}>"
-                "${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
-        )
-
-        # Copy to obs-studio dev environment for immediate testing
-        COMMAND if $<CONFIG:Debug>==1 (
-            "${CMAKE_COMMAND}" -E copy
-                "$<TARGET_FILE:${CMAKE_PROJECT_NAME}>"
-                "${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/obs-plugins/${ARCH_NAME}"
-        )
-
-        COMMAND if $<CONFIG:Debug>==1 (
-            "${CMAKE_COMMAND}" -E copy
-                "$<TARGET_PDB_FILE:${CMAKE_PROJECT_NAME}>"
-                "${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/obs-plugins/${ARCH_NAME}"
-        )
-
-        COMMAND if $<CONFIG:Debug>==1 (
-            "${CMAKE_COMMAND}" -E make_directory
-                "${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/data/obs-plugins/${CMAKE_PROJECT_NAME}"
-        )
-
-        COMMAND if $<CONFIG:Debug>==1 (
-            "${CMAKE_COMMAND}" -E copy_directory
-                "${PROJECT_SOURCE_DIR}/data"
-                "${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/data/obs-plugins/${CMAKE_PROJECT_NAME}"
-        )
-    )
-	# --- End of sub-section ---
+	set(MACOSX_PLUGIN_GUI_IDENTIFIER "${MACOS_BUNDLEID}")
+	set(MACOSX_PLUGIN_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION}")
+	set(MACOSX_PLUGIN_SHORT_VERSION_STRING "1")
 
-endif()
-# --- End of section ---
-
-# --- Linux-specific build settings and tasks ---
-if(UNIX AND NOT APPLE)
-    include(GNUInstallDirs)
+	target_compile_options(${CMAKE_PROJECT_NAME}
+		PRIVATE
+			-Wall
+			-Wextra
+			-Werror-implicit-function-declaration
+			-stdlib=libc++
+			-fvisibility=default)
 
 	set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES PREFIX "")
-	target_link_libraries(${CMAKE_PROJECT_NAME} obs-frontend-api)
+# --- End of section ---
 
-	file(GLOB locale_files data/locale/*.ini)
+# --- Linux-specific build settings and tasks ---
+else()
+	configure_file(
+		CI/include/build_environment.sh.in
+		${CMAKE_SOURCE_DIR}/CI/include/build_environment.sh
+	)
 
-	install(TARGETS ${CMAKE_PROJECT_NAME}
-		LIBRARY DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/obs-plugins")
+	target_compile_options(${CMAKE_PROJECT_NAME}
+		PRIVATE
+			-Wall
+			-Wextra)
 
-	install(FILES ${locale_files}
-		DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/obs/obs-plugins/${CMAKE_PROJECT_NAME}/locale")
+	set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES PREFIX "")
 endif()
 # --- End of section ---
 
-# -- OS X specific build settings and tasks --
-if(APPLE)
-	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -fvisibility=default")
-
-	set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES PREFIX "")
-	target_link_libraries(${CMAKE_PROJECT_NAME} "${OBS_FRONTEND_LIB}")
-endif()
-# -- End of section --
+setup_plugin_target(${CMAKE_PROJECT_NAME})

+ 274 - 0
external/ObsPluginHelpers.cmake

@@ -0,0 +1,274 @@
+if(POLICY CMP0087)
+	cmake_policy(SET CMP0087 NEW)
+endif()
+
+set(OBS_STANDALONE_PLUGIN_DIR "${CMAKE_SOURCE_DIR}/release")
+set(INCLUDED_LIBOBS_CMAKE_MODULES ON)
+
+include(GNUInstallDirs)
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
+	set(OS_MACOS ON)
+	set(OS_POSIX ON)
+elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux|FreeBSD|OpenBSD")
+	set(OS_POSIX ON)
+	string(TOUPPER "${CMAKE_SYSTEM_NAME}" _SYSTEM_NAME_U)
+	set(OS_${_SYSTEM_NAME_U} ON)
+elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
+	set(OS_WINDOWS ON)
+	set(OS_POSIX OFF)
+endif()
+
+# Old-Style plugin detected, find "modern" libobs variant instead and set
+# global include directories to fix "bad" plugin behaviour
+if(DEFINED LIBOBS_INCLUDE_DIR AND NOT TARGET OBS::libobs)
+	message(DEPRECATION "You are using an outdated method of adding 'libobs' to your project. Refer to the updated wiki on how to build and export 'libobs' and use it in your plugin projects.")
+	find_package(libobs REQUIRED)
+	if(TARGET OBS::libobs)
+		set_target_properties(OBS::libobs PROPERTIES IMPORTED_GLOBAL TRUE)
+		message(STATUS "OBS: Using modern libobs target")
+
+		add_library(libobs ALIAS OBS::libobs)
+		if(OS_WINDOWS)
+			add_library(w32-pthreads ALIAS OBS::w32-pthreads)
+		endif()
+	endif()
+endif()
+
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND (OS_WINDOWS OR OS_MACOS))
+	set(CMAKE_INSTALL_PREFIX "${OBS_STANDALONE_PLUGIN_DIR}" CACHE STRING "Directory to install OBS plugin after building" FORCE)
+endif()
+
+if(NOT CMAKE_BUILD_TYPE)
+	set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
+		"OBS build type [Release, RelWithDebInfo, Debug, MinSizeRel]" FORCE)
+	set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release RelWithDebInfo Debug MinSizeRel)
+endif()
+
+file(RELATIVE_PATH RELATIVE_INSTALL_PATH "${CMAKE_SOURCE_DIR}" "${CMAKE_INSTALL_PREFIX}")
+file(RELATIVE_PATH RELATIVE_BUILD_PATH "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}")
+
+# Set-up OS-specific environment and helper functions
+if(OS_MACOS)
+	if(NOT CMAKE_OSX_ARCHITECTURES)
+		set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "OBS plugin build architecture for macOS - x86_64 required at least" FORCE)
+	endif()
+
+	if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
+		set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13" CACHE STRING "OBS plugin deployment target for macOS - 10.13+ required" FORCE)
+	endif()
+
+	if(NOT DEFINED OBS_CODESIGN_LINKER)
+		set(OBS_CODESIGN_LINKER ON CACHE BOOL "Enable linker code-signing on macOS (v11+ required" FORCE)
+	endif()
+
+	if(NOT DEFINED OBS_BUNDLE_CODESIGN_IDENTITY)
+		set(OBS_BUNDLE_CODESIGN_IDENTITY "-" CACHE STRING "Codesign identity for macOS" FORCE)
+	endif()
+
+	# Xcode configuration
+	if(XCODE)
+		# Tell Xcode to pretend the linker signed binaries so that
+		# editing with install_name_tool preserves ad-hoc signatures.
+		# See CMake Issue 21854.
+		# This option is supported by codesign on macOS 11 or higher.
+		set(CMAKE_XCODE_GENERATE_SCHEME ON)
+		if(OBS_CODESIGN_LINKER)
+			set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed")
+		endif()
+	endif()
+
+	# Set default options for bundling on macOS
+	set(CMAKE_MACOSX_RPATH ON)
+	set(CMAKE_SKIP_BUILD_RPATH OFF)
+	set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF)
+	set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks/")
+	set(CMAKE_INSTALL_RPATH_USE_LINK_PATH OFF)
+
+	function(setup_plugin_target target)
+		if(NOT DEFINED MACOSX_PLUGIN_GUI_IDENTIFIER)
+			message(FATAL_ERROR "No 'MACOSX_PLUGIN_GUI_IDENTIFIER' set, but is required to build plugin bundles on macOS - example: 'com.yourname.pluginname'")
+		endif()
+
+		if(NOT DEFINED MACOSX_PLUGIN_BUNDLE_VERSION)
+			message(FATAL_ERROR "No 'MACOSX_PLUGIN_BUNDLE_VERSION' set, but is required to build plugin bundles on macOS - example: '25'")
+		endif()
+
+		if(NOT DEFINED MACOSX_PLUGIN_SHORT_VERSION_STRING)
+			message(FATAL_ERROR "No 'MACOSX_PLUGIN_SHORT_VERSION_STRING' set, but is required to build plugin bundles on macOS - example: '1.0.2'")
+		endif()
+
+		set(MACOSX_PLUGIN_BUNDLE_NAME "${target}" PARENT_SCOPE)
+		set(MACOSX_PLUGIN_BUNDLE_VERSION "${MACOSX_BUNDLE_BUNDLE_VERSION}" PARENT_SCOPE)
+		set(MACOSX_PLUGIN_SHORT_VERSION_STRING "${MACOSX_BUNDLE_SHORT_VERSION_STRING}" PARENT_SCOPE)
+		set(MACOSX_PLUGIN_EXECUTABLE_NAME "${target}" PARENT_SCOPE)
+		set(MACOSX_PLUGIN_BUNDLE_TYPE "BNDL" PARENT_SCOPE)
+
+		install(TARGETS ${target}
+			LIBRARY DESTINATION "."
+				COMPONENT obs_plugins
+				NAMELINK_COMPONENT ${target}_Development)
+
+		install(CODE
+			"execute_process(COMMAND /bin/sh -c \"install_name_tool \\
+			-change ${CMAKE_PREFIX_PATH}/lib/QtWidgets.framework/Versions/5/QtWidgets @rpath/QtWidgets.framework/Versions/5/QtWidgets \\
+			-change ${CMAKE_PREFIX_PATH}/lib/QtCore.framework/Versions/5/QtCore @rpath/QtCore.framework/Versions/5/QtCore \\
+			-change ${CMAKE_PREFIX_PATH}/lib/QtGui.framework/Versions/5/QtGui @rpath/QtGui.framework/Versions/5/QtGui \\
+			${CMAKE_INSTALL_PREFIX}/${target}.plugin/Contents/MacOS/${target}\")")
+
+		if(NOT XCODE)
+			install(CODE
+				"execute_process(COMMAND /bin/sh -c \"/usr/bin/codesign --force --sign \\\"${OBS_BUNDLE_CODESIGN_IDENTITY}\\\" --options runtime --entitlements ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/entitlements.plist ${CMAKE_INSTALL_PREFIX}/${target}.plugin\")")
+		endif()
+
+		set_target_properties(${target} PROPERTIES
+			BUNDLE ON
+			BUNDLE_EXTENSION "plugin"
+			OUTPUT_NAME ${target}
+			MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/Plugin-Info.plist.in"
+			XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${MACOSX_PLUGIN_GUI_IDENTIFIER}"
+			XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "${OBS_BUNDLE_CODESIGN_IDENTITY}"
+			XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../bundle/macOS/entitlements.plist")
+
+		add_custom_command(TARGET ${target} POST_BUILD
+			COMMAND /bin/sh -c "codesign --force --sign \"-\" $<$<BOOL:${OBS_CODESIGN_LINKER}>:--options linker-signed >\"$<TARGET_BUNDLE_DIR:${target}>\""
+			COMMENT "Codesigning ${target}"
+			VERBATIM)
+
+		install_bundle_resources(${target})
+	endfunction()
+
+	function(install_bundle_resources target)
+		if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
+			file(GLOB_RECURSE _DATA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/data/*")
+			foreach(_DATA_FILE IN LISTS _DATA_FILES)
+				file(RELATIVE_PATH _RELATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/data/ ${_DATA_FILE})
+				get_filename_component(_RELATIVE_PATH "${_RELATIVE_PATH}" PATH)
+				target_sources(${target}
+					PRIVATE ${_DATA_FILE})
+				set_source_files_properties(${_DATA_FILE} PROPERTIES
+					MACOSX_PACKAGE_LOCATION "Resources/${_RELATIVE_PATH}")
+				string(REPLACE "\\" "\\\\" _GROUP_NAME "${_RELATIVE_PATH}")
+				source_group("Resources\\${_GROUP_NAME}" FILES ${_DATA_FILE})
+			endforeach()
+		endif()
+	endfunction()
+else()
+	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+		set(_ARCH_SUFFIX 64)
+	else()
+		set(_ARCH_SUFFIX 32)
+	endif()
+	set(OBS_OUTPUT_DIR "${CMAKE_BINARY_DIR}/rundir")
+
+	if(OS_POSIX)
+		IF(NOT LINUX_PORTABLE)
+			set(OBS_LIBRARY_DESTINATION "${CMAKE_INSTALL_LIBDIR}")
+			set(OBS_PLUGIN_DESTINATION "${OBS_LIBRARY_DESTINATION}/obs-plugins")
+			set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+			set(OBS_DATA_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/obs")
+		else()
+			set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit")
+			set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit")
+			set(CMAKE_INSTALL_RPATH "$ORIGIN/" "${CMAKE_INSTALL_PREFIX}/${OBS_LIBRARY_DESTINATION}")
+			set(OBS_DATA_DESTINATION "data")
+		endif()
+
+		if(OS_LINUX)
+			set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
+			set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${LINUX_MAINTAINER_EMAIL}")
+			set(CPACK_PACKAGE_VERSION "${CMAKE_PROJECT_VERSION}")
+
+			set(CPACK_GENERATOR "DEB")
+			set(CPACK_DEBIAN_PACKAGE_DEPENDS
+				"obs-studio (>= 27.0.0), libqt5core5a (>= 5.9.0~beta), \
+				libqt5gui5 (>= 5.3.0), libqt5widgets5 (>= 5.7.0)")
+
+			if(NOT LINUX_PORTABLE)
+				set(CPACK_SET_DESTDIR ON)
+			endif()
+			include(CPack)
+		endif()
+	else()
+		set(OBS_LIBRARY_DESTINATION "bin/${_ARCH_SUFFIX}bit")
+		set(OBS_LIBRARY32_DESTINATION "bin/32bit")
+		set(OBS_LIBRARY64_DESTINATION "bin/64bit")
+		set(OBS_PLUGIN_DESTINATION "obs-plugins/${_ARCH_SUFFIX}bit")
+		set(OBS_PLUGIN32_DESTINATION "obs-plugins/32bit")
+		set(OBS_PLUGIN64_DESTINATION "obs-plugins/64bit")
+
+		set(OBS_DATA_DESTINATION "data")
+	endif()
+
+	function(setup_plugin_target target)
+		set_target_properties(${target} PROPERTIES
+			PREFIX "")
+
+		install(TARGETS ${target}
+			RUNTIME DESTINATION "${OBS_PLUGIN_DESTINATION}"
+				COMPONENT ${target}_Runtime
+			LIBRARY DESTINATION "${OBS_PLUGIN_DESTINATION}"
+				COMPONENT ${target}_Runtime
+				NAMELINK_COMPONENT ${target}_Development)
+
+		add_custom_command(TARGET ${target} POST_BUILD
+			COMMAND "${CMAKE_COMMAND}" -E copy
+				"$<TARGET_FILE:${target}>"
+				"${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/$<TARGET_FILE_NAME:${target}>"
+			VERBATIM)
+
+		if(OS_WINDOWS)
+			add_custom_command(TARGET ${target} POST_BUILD
+				COMMAND "${CMAKE_COMMAND}" -E "$<IF:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,copy,true>"
+					"$<TARGET_PDB_FILE:${target}>"
+					"${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/"
+				VERBATIM)
+		endif()
+
+		if(MSVC)
+			target_link_options(${target}
+				PRIVATE
+					"LINKER:/OPT:REF"
+					"$<$<NOT:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>>:LINKER\:/SAFESEH\:NO>"
+					"$<$<CONFIG:DEBUG>:LINKER\:/INCREMENTAL:NO>"
+					"$<$<CONFIG:RELWITHDEBINFO>:LINKER\:/INCREMENTAL:NO>")
+		endif()
+
+		setup_target_resources("${target}" "obs-plugins/${target}")
+
+		if(OS_WINDOWS AND DEFINED OBS_BUILD_DIR)
+			setup_target_for_testing(${target})
+		endif()
+	endfunction()
+
+	function(setup_target_resources target destination)
+		if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/data")
+			install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/data/"
+				DESTINATION "${OBS_DATA_DESTINATION}/${destination}"
+				USE_SOURCE_PERMISSIONS)
+
+			add_custom_command(TARGET ${target} POST_BUILD
+				COMMAND "${CMAKE_COMMAND}" -E copy_directory
+					"${CMAKE_CURRENT_SOURCE_DIR}/data"
+					"${OBS_OUTPUT_DIR}/$<CONFIG>/${OBS_DATA_DESTINATION}/${destination}"
+				VERBATIM)
+		endif()
+	endfunction()
+
+	if(OS_WINDOWS)
+		function(setup_target_for_testing target)
+			add_custom_command(TARGET ${target} POST_BUILD
+				COMMAND "${CMAKE_COMMAND}" -E copy
+					"$<TARGET_FILE:${target}>"
+					"${OBS_BUILD_DIR}/rundir/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/$<TARGET_FILE_NAME:${target}>"
+				COMMAND "${CMAKE_COMMAND}" -E "$<IF:$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>,copy,true>"
+					"$<TARGET_PDB_FILE:${target}>"
+					"${OBS_BUILD_DIR}/rundir/$<CONFIG>/${OBS_PLUGIN_DESTINATION}/$<TARGET_FILE_NAME:${target}>"
+				COMMAND "${CMAKE_COMMAND}" -E make_directory
+					"${OBS_BUILD_DIR}/rundir/$<CONFIG>/${OBS_DATA_DESTINATION}/obs-plugins/${target}"
+				COMMAND "${CMAKE_COMMAND}" -E copy_directory
+					"${CMAKE_CURRENT_SOURCE_DIR}/data"
+					"${OBS_BUILD_DIR}/rundir/$<CONFIG>/${OBS_DATA_DESTINATION}/obs-plugins/${target}"
+				VERBATIM)
+		endfunction()
+	endif()
+endif()