浏览代码

plugins: Update CMakeLists.txt for included plugins

PatTheMav 3 年之前
父节点
当前提交
49e9d49943
共有 62 个文件被更改,包括 1927 次插入2308 次删除
  1. 85 78
      plugins/CMakeLists.txt
  2. 52 95
      plugins/aja/CMakeLists.txt
  3. 47 37
      plugins/coreaudio-encoder/CMakeLists.txt
  4. 106 0
      plugins/decklink/CMakeLists.txt
  5. 1 1
      plugins/decklink/DecklinkOutput.hpp
  6. 1 1
      plugins/decklink/decklink-device-instance.hpp
  7. 2 2
      plugins/decklink/decklink-output.cpp
  8. 0 72
      plugins/decklink/linux/CMakeLists.txt
  9. 0 84
      plugins/decklink/mac/CMakeLists.txt
  10. 0 77
      plugins/decklink/win/CMakeLists.txt
  11. 18 20
      plugins/image-source/CMakeLists.txt
  12. 11 26
      plugins/linux-alsa/CMakeLists.txt
  13. 64 92
      plugins/linux-capture/CMakeLists.txt
  14. 13 28
      plugins/linux-jack/CMakeLists.txt
  15. 18 29
      plugins/linux-pulseaudio/CMakeLists.txt
  16. 26 53
      plugins/linux-v4l2/CMakeLists.txt
  17. 26 36
      plugins/mac-avcapture/CMakeLists.txt
  18. 16 27
      plugins/mac-capture/CMakeLists.txt
  19. 70 71
      plugins/mac-syphon/CMakeLists.txt
  20. 7 0
      plugins/mac-virtualcam/CMakeLists.txt
  21. 50 86
      plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt
  22. 22 23
      plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt
  23. 14 20
      plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm
  24. 17 20
      plugins/mac-vth264/CMakeLists.txt
  25. 1 1
      plugins/obs-browser
  26. 61 64
      plugins/obs-ffmpeg/CMakeLists.txt
  27. 11 17
      plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt
  28. 1 1
      plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
  29. 156 113
      plugins/obs-filters/CMakeLists.txt
  30. 2 2
      plugins/obs-filters/noise-suppress-filter.c
  31. 1 1
      plugins/obs-filters/obs-filters-config.h.in
  32. 2 3
      plugins/obs-filters/obs-filters.c
  33. 13 21
      plugins/obs-libfdk/CMakeLists.txt
  34. 165 179
      plugins/obs-outputs/CMakeLists.txt
  35. 1 1
      plugins/obs-outputs/obs-outputs-config.h.in
  36. 2 4
      plugins/obs-outputs/obs-outputs.c
  37. 116 98
      plugins/obs-qsv11/CMakeLists.txt
  38. 18 21
      plugins/obs-text/CMakeLists.txt
  39. 25 22
      plugins/obs-transitions/CMakeLists.txt
  40. 23 24
      plugins/obs-x264/CMakeLists.txt
  41. 20 30
      plugins/oss-audio/CMakeLists.txt
  42. 44 57
      plugins/rtmp-services/CMakeLists.txt
  43. 1 1
      plugins/rtmp-services/lookup-config.h.in
  44. 1 1
      plugins/rtmp-services/rtmp-services-main.c
  45. 11 26
      plugins/sndio/CMakeLists.txt
  46. 40 80
      plugins/text-freetype2/CMakeLists.txt
  47. 26 39
      plugins/vlc-video/CMakeLists.txt
  48. 41 40
      plugins/win-capture/CMakeLists.txt
  49. 28 30
      plugins/win-capture/get-graphics-offsets/CMakeLists.txt
  50. 56 61
      plugins/win-capture/graphics-hook/CMakeLists.txt
  51. 2 2
      plugins/win-capture/graphics-hook/graphics-hook.c
  52. 2 4
      plugins/win-capture/graphics-hook/graphics-hook.h
  53. 16 24
      plugins/win-capture/inject-helper/CMakeLists.txt
  54. 164 128
      plugins/win-dshow/CMakeLists.txt
  55. 4 2
      plugins/win-dshow/dshow-plugin.cpp
  56. 1 1
      plugins/win-dshow/virtualcam-guid.h.in
  57. 75 72
      plugins/win-dshow/virtualcam-module/CMakeLists.txt
  58. 47 49
      plugins/win-ivcam/CMakeLists.txt
  59. 29 38
      plugins/win-ivcam/seg_service/CMakeLists.txt
  60. 37 52
      plugins/win-mf/CMakeLists.txt
  61. 4 5
      plugins/win-mf/mf-plugin.cpp
  62. 14 16
      plugins/win-wasapi/CMakeLists.txt

+ 85 - 78
plugins/CMakeLists.txt

@@ -1,84 +1,92 @@
-option(DISABLE_PLUGINS "Disable building of OBS plugins" OFF)
-if(DISABLE_PLUGINS)
-	message(STATUS "DISABLE_PLUGINS is set; building of plugins is disabled.")
-	return()
+option(ENABLE_PLUGINS "Enable building OBS plugins" ON)
+if(NOT ENABLE_PLUGINS)
+  message(STATUS "OBS: building with plugins disabled")
+  return()
 endif()
 
-if(WIN32)
-	option(BUILD_CA_ENCODER "Build CoreAudio encoder module" ON)
-	if (BUILD_CA_ENCODER)
-		add_subdirectory(coreaudio-encoder)
-	endif()
-	add_subdirectory(win-wasapi)
-	add_subdirectory(win-dshow)
-	add_subdirectory(win-capture)
-	add_subdirectory(decklink/win)
-	add_subdirectory(win-mf)
-	add_subdirectory(obs-qsv11)
-	add_subdirectory(vlc-video)
-	if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/enc-amf/CMakeLists.txt")
-		add_subdirectory(enc-amf)
-	else()
-		message(STATUS "enc-amf submodule not found!  Please fetch submodules.  enc-amf plugin disabled.")
-	endif()
-	if (MSVC)
-		add_subdirectory(win-ivcam)
-	endif()
-elseif(APPLE)
-	add_subdirectory(coreaudio-encoder)
-	add_subdirectory(mac-avcapture)
-	add_subdirectory(mac-capture)
-	add_subdirectory(mac-vth264)
-	add_subdirectory(mac-syphon)
-	option(BUILD_VIRTUALCAM "Build Virtualcam" ON)
-	if(BUILD_VIRTUALCAM)
-		add_subdirectory(mac-virtualcam)
-	endif()
-	add_subdirectory(decklink/mac)
-	add_subdirectory(vlc-video)
-	add_subdirectory(linux-jack)
-elseif("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
-	add_subdirectory(linux-capture)
-	add_subdirectory(linux-pulseaudio)
-	add_subdirectory(linux-v4l2)
-	add_subdirectory(linux-jack)
-	add_subdirectory(linux-alsa)
-	add_subdirectory(decklink/linux)
-	add_subdirectory(vlc-video)
-	add_subdirectory(sndio)
-elseif("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD")
-	add_subdirectory(linux-capture)
-	add_subdirectory(linux-pulseaudio)
-	add_subdirectory(linux-v4l2)
-	add_subdirectory(linux-jack)
-	add_subdirectory(linux-alsa)
-	add_subdirectory(vlc-video)
-	add_subdirectory(oss-audio)
-	add_subdirectory(sndio)
-elseif("${CMAKE_SYSTEM_NAME}" MATCHES "OpenBSD")
-	add_subdirectory(linux-capture)
-	add_subdirectory(sndio)
-endif()
+function(check_obs_browser)
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt)
+    add_subdirectory(obs-browser)
+  else()
+    message(FATAL_ERROR "OBS: obs-browser submodule not available")
+  endif()
+endfunction()
 
-option(BUILD_BROWSER "Build browser plugin" ON)
-if (BUILD_BROWSER)
-	if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-browser/CMakeLists.txt")
-		add_subdirectory(obs-browser)
-		set(BROWSER_AVAILABLE_INTERNAL ON CACHE BOOL "Internal global cmake variable" FORCE)
-	else()
-		message(FATAL_ERROR "obs-browser submodule not found! Please fetch submodules or set BUILD_BROWSER=OFF.")
-	endif()
-else()
-	set(BROWSER_AVAILABLE_INTERNAL OFF CACHE BOOL "Internal global cmake variable" FORCE)
-endif()
+function(check_obs_vst)
+  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt)
+    add_subdirectory(obs-vst)
+  else()
+    message(FATAL_ERROR "OBS: obs-vst submodule not available")
+  endif()
+endfunction()
+
+# APPLE/WIN32/UNIX are soft-deprecated:
+# https://discourse.cmake.org/t/platform-id-vs-win32-vs-cmake-system-name/1226/2
+if(OS_WINDOWS)
+  add_subdirectory(coreaudio-encoder)
+  add_subdirectory(win-wasapi)
+  add_subdirectory(win-dshow)
+  add_subdirectory(win-capture)
+  add_subdirectory(decklink)
+  add_subdirectory(win-mf)
+  add_subdirectory(obs-qsv11)
+  add_subdirectory(obs-text)
+  add_subdirectory(vlc-video)
+
+  if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/enc-amf/CMakeLists.txt")
+    add_subdirectory(enc-amf)
+  else()
+    message(WARNING "OBS: enc-amf plugin not found")
+  endif()
+  if(MSVC)
+    add_subdirectory(win-ivcam)
+  endif()
+
+  check_obs_browser()
+  check_obs_vst()
+elseif(OS_MACOS)
+  add_subdirectory(coreaudio-encoder)
+  add_subdirectory(mac-avcapture)
+  add_subdirectory(mac-capture)
+  add_subdirectory(mac-vth264)
+  add_subdirectory(mac-syphon)
+  add_subdirectory(mac-virtualcam)
+  add_subdirectory(decklink)
+  add_subdirectory(vlc-video)
+  add_subdirectory(linux-jack)
+
+  check_obs_browser()
+  check_obs_vst()
+elseif(OS_LINUX)
+  add_subdirectory(linux-capture)
+  add_subdirectory(linux-pulseaudio)
+  add_subdirectory(linux-v4l2)
+  add_subdirectory(linux-jack)
+  add_subdirectory(linux-alsa)
+  add_subdirectory(decklink)
+  add_subdirectory(vlc-video)
+  add_subdirectory(sndio)
+
+  check_obs_browser()
+  check_obs_vst()
+elseif(OS_FREEBSD)
+  add_subdirectory(linux-capture)
+  add_subdirectory(linux-pulseaudio)
+  add_subdirectory(linux-v4l2)
+  add_subdirectory(linux-jack)
+  add_subdirectory(linux-alsa)
+  add_subdirectory(vlc-video)
+  add_subdirectory(oss-audio)
+  add_subdirectory(sndio)
+
+  message(STATUS "OBS: obs-browser plugin not available")
+  message(STATUS "OBS: obs-vst plugin not available")
+elseif(OS_OPENBSD)
+  add_subdirectory(linux-capture)
+  add_subdirectory(sndio)
 
-option(BUILD_VST "Build VST plugin" ON)
-if(BUILD_VST)
-	if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/obs-vst/CMakeLists.txt")
-		add_subdirectory(obs-vst)
-	else()
-		message(FATAL_ERROR "obs-vst submodule not found! Please fetch submodules or set BUILD_VST=OFF.")
-	endif()
+  message(STATUS "OBS: obs-browser plugin not available")
+  message(STATUS "OBS: obs-vst plugin not available")
 endif()
 
 add_subdirectory(image-source)
@@ -88,7 +96,6 @@ add_subdirectory(obs-ffmpeg)
 add_subdirectory(obs-outputs)
 add_subdirectory(obs-filters)
 add_subdirectory(obs-transitions)
-add_subdirectory(obs-text)
 add_subdirectory(rtmp-services)
 add_subdirectory(text-freetype2)
 add_subdirectory(aja)

+ 52 - 95
plugins/aja/CMakeLists.txt

@@ -1,111 +1,68 @@
 project(aja)
 
-if(DISABLE_AJA)
-	message(STATUS "aja plugin disabled")
-	return()
+option(ENABLE_AJA "Build OBS with aja support" ON)
+if(NOT ENABLE_AJA)
+  message(STATUS "OBS:  DISABLED   aja")
+  return()
 endif()
 
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-	find_package(LibAJANTV2)
-	if (NOT LIBAJANTV2_FOUND)
-		message(STATUS "aja plugin disabled (deps not found)")
-		return()
-	else()
-		message("aja plugin includes: ${LIBAJANTV2_INCLUDE_DIRS}")
-		message("aja plugin libs: ${LIBAJANTV2_LIBRARIES}")
-		message("aja plugin debug libs: ${LIBAJANTV2_DEBUG_LIBRARIES}")
-	endif()
-else()
-	message(STATUS "aja plugin disabled (32-bit not supported)")
-	return()
+if(NOT OS_MACOS AND NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
+  message(
+    STATUS "OBS:             aja support not enabled (32-bit not supported)")
+  set(ENABLE_AJA
+      OFF
+      CACHE BOOL "Build OBS with aja support" FORCE)
+  return()
 endif()
 
-set(aja_INCLUDE_DIRS
-	${LIBAJANTV2_INCLUDE_DIRS})
-set(aja_LIBRARIES
-	$<IF:$<CONFIG:Debug>,${LIBAJANTV2_DEBUG_LIBRARIES},${LIBAJANTV2_LIBRARIES}>
-	libobs)
+find_package(LibAJANTV2 REQUIRED)
 
-set(aja_SOURCES
-	main.cpp
-	aja-card-manager.cpp
-	aja-common.cpp
-	aja-output.cpp
-	aja-presets.cpp
-	aja-props.cpp
-	aja-routing.cpp
-	aja-source.cpp
-	aja-vpid-data.cpp
-	aja-widget-io.cpp)
+add_library(aja MODULE)
+add_library(OBS::aja ALIAS aja)
 
-set(aja_HEADERS
-	aja-card-manager.hpp
-	aja-common.hpp
-	aja-enums.hpp
-	aja-ui-props.hpp
-	aja-output.hpp
-	aja-presets.hpp
-	aja-props.hpp
-	aja-routing.hpp
-	aja-source.hpp
-	aja-vpid-data.hpp
-	aja-widget-io.hpp)
+target_sources(
+  aja
+  PRIVATE main.cpp
+          aja-card-manager.cpp
+          aja-common.cpp
+          aja-common.hpp
+          aja-output.cpp
+          aja-enums.hpp
+          aja-output.hpp
+          aja-presets.cpp
+          aja-presets.hpp
+          aja-props.cpp
+          aja-props.hpp
+          aja-routing.cpp
+          aja-routing.hpp
+          aja-source.cpp
+          aja-source.hpp
+          aja-vpid-data.cpp
+          aja-vpid-data.hpp
+          aja-widget-io.cpp
+          aja-widget-io.hpp
+          aja-card-manager.hpp
+          aja-ui-props.hpp)
 
-# macOS
-if(APPLE)
-	set(aja_COMPILE_DEFS
-		AJAMac
-		AJA_MAC)
+target_link_libraries(aja PRIVATE OBS::libobs AJA::LibAJANTV2)
 
-	find_library(IOKIT_FRAMEWORK Iokit)
-	find_library(COREFOUNDATION_LIBRARY CoreFoundation)
-	find_library(APPKIT_FRAMEWORK AppKit)
+if(OS_MACOS)
+  find_library(IOKIT IOKit)
+  find_library(COREFOUNDATION CoreFoundation)
+  find_library(APPKIT AppKit)
 
-	list(APPEND aja_LIBRARIES
-		${IOKIT_FRAMEWORK}
-		${COREFOUNDATION_LIBRARY}
-		${APPKIT_FRAMEWORK})
-# Windows
-elseif(WIN32)
-	set(aja_COMPILE_DEFS
-		AJA_WINDOWS
-		_WINDOWS
-		WIN32
-		MSWindows)
+  target_link_libraries(aja PRIVATE ${IOKIT} ${COREFOUNDATION} ${APPKIT})
+elseif(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS AJA Windows module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 win-aja.rc)
 
-	if(CMAKE_BUILD_TYPE STREQUAL Debug)
-		list(APPEND aja_COMPILE_DEFS
-			_DEBUG)
-	else()
-		list(APPEND aja_COMPILE_DEFS
-			NDEBUG)
-	endif()
+  target_sources(aja PRIVATE win-aja.rc)
 
-	list(APPEND aja_LIBRARIES
-		ws2_32.lib
-		setupapi.lib
-		Winmm.lib
-		netapi32.lib
-		Shlwapi.lib)
-
-	set(MODULE_DESCRIPTION "OBS AJA Windows module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-aja.rc)
-	list(APPEND aja_SOURCES
-		win-aja.rc)
-# Linux
-elseif(UNIX AND NOT APPLE)
-	set(aja_COMPILE_DEFS
-		AJA_LINUX
-		AJALinux)
+  target_link_libraries(aja PRIVATE ws2_32.lib setupapi.lib Winmm.lib
+                                    netapi32.lib Shlwapi.lib)
 endif()
 
-add_library(aja MODULE ${aja_SOURCES} ${aja_HEADERS})
-
-target_include_directories(aja PUBLIC ${aja_INCLUDE_DIRS})
-target_link_libraries(aja PUBLIC ${aja_LIBRARIES})
-target_compile_definitions(aja PUBLIC ${aja_COMPILE_DEFS})
-
-set_target_properties(aja PROPERTIES FOLDER
-		"plugins")
+set_target_properties(aja PROPERTIES FOLDER "plugins/aja" PREFIX "")
 
-install_obs_plugin_with_data(aja data)
+setup_plugin_target(aja)

+ 47 - 37
plugins/coreaudio-encoder/CMakeLists.txt

@@ -1,43 +1,53 @@
 project(coreaudio-encoder)
 
-set(coreaudio-encoder_SOURCES
-	encoder.cpp)
-
-if (WIN32)
-	# Set compiler flag before adding resource file
-	if (MINGW)
-		set_source_files_properties(${coreaudio-encoder_SOURCES}
-			PROPERTIES COMPILE_FLAGS "-Wno-multichar")
-	endif()
-
-	set(MODULE_DESCRIPTION "OBS Core Audio encoder")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in coreaudio-encoder.rc)
-	list(APPEND coreaudio-encoder_SOURCES
-		coreaudio-encoder.rc)
-	set(coreaudio-encoder_HEADERS windows-imports.h)
-	set(coreaudio-encoder_LIBS )
-else()
-	find_library(COREFOUNDATION CoreFoundation)
-	find_library(COREAUDIO CoreAudio)
-	find_library(AUDIOTOOLBOX AudioToolbox)
-	set(coreaudio-encoder_HEADERS )
-	set(coreaudio-encoder_LIBS
-		${COREFOUNDATION}
-		${COREAUDIO}
-		${AUDIOTOOLBOX})
-
-	include_directories(${COREFOUNDATION}
-		${COREAUDIO}
-		${AUDIOTOOLBOX})
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
+  option(ENABLE_COREAUDIO_ENCODER
+         "Enable building with CoreAudio encoder (Windows)" ON)
+  if(NOT ENABLE_COREAUDIO_ENCODER)
+    message(STATUS "OBS:  DISABLED   coreaudio-encoder")
+    return()
+  endif()
 endif()
 
-add_library(coreaudio-encoder MODULE
-	${coreaudio-encoder_SOURCES}
-	${coreaudio-encoder_HEADERS})
+add_library(coreaudio-encoder MODULE)
+add_library(OBS::coreaudio-encoder ALIAS coreaudio-encoder)
 
-target_link_libraries(coreaudio-encoder
-	libobs
-	${coreaudio-encoder_LIBS})
-set_target_properties(coreaudio-encoder PROPERTIES FOLDER "plugins")
+target_sources(coreaudio-encoder PRIVATE encoder.cpp)
 
-install_obs_plugin_with_data(coreaudio-encoder data)
+set_target_properties(
+  coreaudio-encoder
+  PROPERTIES OUTPUT_NAME "coreaudio-encoder"
+             FOLDER "plugins"
+             PREFIX "")
+
+target_compile_features(coreaudio-encoder PRIVATE cxx_std_11)
+
+target_link_libraries(coreaudio-encoder PRIVATE OBS::libobs)
+
+if(OS_MACOS)
+  find_library(COREFOUNDATION CoreFoundation)
+  find_library(COREAUDIO CoreAudio)
+  find_library(AUDIOTOOLBOX AudioToolbox)
+
+  mark_as_advanced(AUDIOTOOLBOX COREAUDIO COREFOUNDATION)
+
+  target_link_libraries(coreaudio-encoder PRIVATE ${COREFOUNDATION}
+                                                  ${COREAUDIO} ${AUDIOTOOLBOX})
+
+elseif(OS_WINDOWS)
+  if(MINGW)
+    set_source_files_properties(encoder.cpp PROPERTIES COMPILE_FLAGS
+                                                       -Wno-multichar)
+  endif()
+
+  target_compile_definitions(coreaudio-encoder PRIVATE UNICODE _UNICODE)
+
+  set(MODULE_DESCRIPTION "OBS CoreAudio encoder")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 coreaudio-encoder.rc)
+
+  target_sources(coreaudio-encoder PRIVATE coreaudio-encoder.rc
+                                           windows-imports.h)
+endif()
+
+setup_plugin_target(coreaudio-encoder)

+ 106 - 0
plugins/decklink/CMakeLists.txt

@@ -0,0 +1,106 @@
+project(decklink)
+
+option(ENABLE_DECKLINK "Build OBS with Decklink support" ON)
+if(NOT ENABLE_DECKLINK)
+  message(STATUS "OBS:  DISABLED   decklink support")
+  return()
+endif()
+
+if(OS_WINDOWS)
+  include(IDLFileHelper)
+  add_idl_files(win-decklink-sdk_GENERATED_FILES
+                win/decklink-sdk/DeckLinkAPI.idl)
+endif()
+
+add_library(decklink MODULE)
+add_library(OBS::decklink ALIAS decklink)
+
+add_library(decklink-sdk INTERFACE)
+add_library(Decklink::SDK ALIAS decklink-sdk)
+
+target_sources(
+  decklink
+  PRIVATE OBSVideoFrame.cpp
+          OBSVideoFrame.h
+          audio-repack.c
+          audio-repack.h
+          audio-repack.hpp
+          const.h
+          decklink-device.cpp
+          decklink-device.hpp
+          decklink-devices.cpp
+          decklink-devices.hpp
+          decklink-device-discovery.cpp
+          decklink-device-discovery.hpp
+          decklink-device-instance.cpp
+          decklink-device-instance.hpp
+          decklink-device-mode.cpp
+          decklink-device-mode.hpp
+          decklink-output.cpp
+          decklink-source.cpp
+          DecklinkBase.cpp
+          DecklinkBase.h
+          DecklinkInput.cpp
+          DecklinkInput.hpp
+          DecklinkOutput.cpp
+          DecklinkOutput.hpp
+          platform.hpp
+          plugin-main.cpp
+          util.cpp
+          util.hpp)
+
+target_include_directories(decklink-sdk INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
+
+target_link_libraries(decklink PRIVATE OBS::libobs OBS::caption Decklink::SDK)
+
+set_target_properties(decklink PROPERTIES FOLDER "plugins/decklink")
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS DeckLink Windows module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 win-decklink.rc)
+
+  target_sources(decklink PRIVATE win/platform.cpp win-decklink.rc)
+
+  target_sources(decklink-sdk INTERFACE win/decklink-sdk/DeckLinkAPIVersion.h
+                                        ${win-decklink-sdk_GENERATED_FILES})
+
+elseif(OS_MACOS)
+  find_library(COREFOUNDATION CoreFoundation)
+  mark_as_advanced(COREFOUNDATION)
+
+  target_sources(decklink PRIVATE mac/platform.cpp)
+
+  target_sources(
+    decklink-sdk
+    INTERFACE mac/decklink-sdk/DeckLinkAPIDispatch.cpp
+              mac/decklink-sdk/DeckLinkAPI.h
+              mac/decklink-sdk/DeckLinkAPIConfiguration.h
+              mac/decklink-sdk/DeckLinkAPIDeckControl.h
+              mac/decklink-sdk/DeckLinkAPIDiscovery.h
+              mac/decklink-sdk/DeckLinkAPIModes.h
+              mac/decklink-sdk/DeckLinkAPIStreaming.h
+              mac/decklink-sdk/DeckLinkAPITypes.h
+              mac/decklink-sdk/DeckLinkAPIVersion.h)
+
+  target_link_libraries(decklink PRIVATE ${COREFOUNDATION})
+
+  target_compile_features(decklink PRIVATE cxx_auto_type)
+elseif(OS_POSIX)
+  target_sources(decklink PRIVATE linux/platform.cpp)
+
+  target_sources(
+    decklink-sdk
+    INTERFACE linux/decklink-sdk/DeckLinkAPIDispatch.cpp
+              linux/decklink-sdk/DeckLinkAPI.h
+              linux/decklink-sdk/DeckLinkAPIConfiguration.h
+              linux/decklink-sdk/DeckLinkAPIDeckControl.h
+              linux/decklink-sdk/DeckLinkAPIDiscovery.h
+              linux/decklink-sdk/DeckLinkAPIModes.h
+              linux/decklink-sdk/DeckLinkAPITypes.h
+              linux/decklink-sdk/DeckLinkAPIVersion.h
+              linux/decklink-sdk/LinuxCOM.h)
+endif()
+
+setup_plugin_target(decklink)
+setup_target_resources(decklink "obs-plugins/decklink")

+ 1 - 1
plugins/decklink/DecklinkOutput.hpp

@@ -2,7 +2,7 @@
 
 #include "DecklinkBase.h"
 
-#include "../../libobs/media-io/video-scaler.h"
+#include <media-io/video-scaler.h>
 
 class DeckLinkOutput : public DecklinkBase {
 protected:

+ 1 - 1
plugins/decklink/decklink-device-instance.hpp

@@ -4,8 +4,8 @@
 	blog(level, "%s: " message, "decklink", ##__VA_ARGS__)
 
 #include <obs-module.h>
+#include <media-io/video-scaler.h>
 #include "decklink-device.hpp"
-#include "../../libobs/media-io/video-scaler.h"
 #include "OBSVideoFrame.h"
 
 class AudioRepacker;

+ 2 - 2
plugins/decklink/decklink-output.cpp

@@ -8,8 +8,8 @@
 #include "decklink-device-discovery.hpp"
 #include "decklink-devices.hpp"
 
-#include "../../libobs/media-io/video-scaler.h"
-#include "../../libobs/util/util_uint64.h"
+#include <media-io/video-scaler.h>
+#include <util/util_uint64.h>
 
 static void decklink_output_destroy(void *data)
 {

+ 0 - 72
plugins/decklink/linux/CMakeLists.txt

@@ -1,72 +0,0 @@
-project(linux-decklink)
-
-if(DISABLE_DECKLINK)
-	message(STATUS "decklink plugin disabled")
-	return()
-endif()
-
-include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption)
-
-set(linux-decklink-sdk_HEADERS
-	decklink-sdk/DeckLinkAPI.h
-	decklink-sdk/DeckLinkAPIConfiguration.h
-	decklink-sdk/DeckLinkAPIDeckControl.h
-	decklink-sdk/DeckLinkAPIDiscovery.h
-	decklink-sdk/DeckLinkAPIModes.h
-	decklink-sdk/DeckLinkAPITypes.h
-	decklink-sdk/DeckLinkAPIVersion.h
-	decklink-sdk/LinuxCOM.h
-	)
-
-set(linux-decklink-sdk_SOURCES
-	decklink-sdk/DeckLinkAPIDispatch.cpp
-	)
-
-set(linux-decklink_HEADERS
-	../decklink-devices.hpp
-	../const.h
-	../DecklinkOutput.hpp
-	../platform.hpp
-	../DecklinkInput.hpp
-	../DecklinkBase.h
-	../decklink-device-instance.hpp
-	../decklink-device-discovery.hpp
-	../decklink-device.hpp
-	../decklink-device-mode.hpp
-	../audio-repack.h
-	../audio-repack.hpp
-	../util.hpp
-	../OBSVideoFrame.h
-	)
-
-set(linux-decklink_SOURCES
-	../plugin-main.cpp
-	../decklink-devices.cpp
-	../decklink-source.cpp
-	../decklink-output.cpp
-	../DecklinkOutput.cpp
-	../DecklinkInput.cpp
-	../DecklinkBase.cpp
-	../decklink-device-instance.cpp
-	../decklink-device-discovery.cpp
-	../decklink-device.cpp
-	../decklink-device-mode.cpp
-	../audio-repack.c
-	platform.cpp
-	../util.cpp
-	../OBSVideoFrame.cpp
-	)
-
-add_library(linux-decklink MODULE
-	${linux-decklink_SOURCES}
-	${linux-decklink_HEADERS}
-	${linux-decklink-sdk_HEADERS}
-	${linux-decklink-sdk_SOURCES}
-	)
-
-target_link_libraries(linux-decklink
-	libobs
-	caption)
-set_target_properties(linux-decklink PROPERTIES FOLDER "plugins/decklink")
-
-install_obs_plugin_with_data(linux-decklink ../data)

+ 0 - 84
plugins/decklink/mac/CMakeLists.txt

@@ -1,84 +0,0 @@
-project(mac-decklink)
-
-if(DISABLE_DECKLINK)
-	message(STATUS "decklink plugin disabled")
-	return()
-endif()
-
-set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}")
-
-find_library(COREFOUNDATION CoreFoundation)
-
-include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption)
-
-set(mac-decklink-sdk_HEADERS
-	decklink-sdk/DeckLinkAPI.h
-	decklink-sdk/DeckLinkAPIConfiguration.h
-	decklink-sdk/DeckLinkAPIDeckControl.h
-	decklink-sdk/DeckLinkAPIDiscovery.h
-	decklink-sdk/DeckLinkAPIModes.h
-	decklink-sdk/DeckLinkAPIStreaming.h
-	decklink-sdk/DeckLinkAPITypes.h
-	decklink-sdk/DeckLinkAPIVersion.h)
-
-set(mac-decklink-sdk_SOURCES
-	decklink-sdk/DeckLinkAPIDispatch.cpp
-	)
-
-set(mac-decklink_HEADERS
-	../decklink-devices.hpp
-	../const.h
-	../DecklinkOutput.hpp
-	../platform.hpp
-	../DecklinkInput.hpp
-	../DecklinkBase.h
-	../decklink-device-instance.hpp
-	../decklink-device-discovery.hpp
-	../decklink-device.hpp
-	../decklink-device-mode.hpp
-	../audio-repack.h
-	../audio-repack.hpp
-	../util.hpp
-	../OBSVideoFrame.h
-	)
-
-set(mac-decklink_SOURCES
-	../plugin-main.cpp
-	../decklink-devices.cpp
-	../decklink-output.cpp
-	../decklink-source.cpp
-	../DecklinkOutput.cpp
-	../DecklinkInput.cpp
-	../DecklinkBase.cpp
-	../decklink-device-instance.cpp
-	../decklink-device-discovery.cpp
-	../decklink-device.cpp
-	../decklink-device-mode.cpp
-	../audio-repack.c
-	platform.cpp
-	../util.cpp
-	../OBSVideoFrame.cpp
-	)
-
-list(APPEND decklink_HEADERS ${decklink_UI_HEADERS})
-
-include_directories(
-	${COREFOUNDATION}
-)
-
-list(APPEND mac-decklink_HEADERS ${decklink_UI_HEADERS})
-
-add_library(mac-decklink MODULE
-	${mac-decklink_SOURCES}
-	${mac-decklink_HEADERS}
-	${mac-decklink-sdk_HEADERS}
-	${mac-decklink-sdk_SOURCES}
-	)
-
-target_link_libraries(mac-decklink
-	libobs
-	${COREFOUNDATION}
-	caption)
-set_target_properties(mac-decklink PROPERTIES FOLDER "plugins/decklink")
-
-install_obs_plugin_with_data(mac-decklink ../data)

+ 0 - 77
plugins/decklink/win/CMakeLists.txt

@@ -1,77 +0,0 @@
-project(win-decklink)
-
-if(DISABLE_DECKLINK)
-	message(STATUS "decklink plugin disabled")
-	return()
-endif()
-
-include(IDLFileHelper)
-
-include_directories(${CMAKE_SOURCE_DIR}/deps/libcaption)
-
-set(win-decklink-sdk_IDLS
-	decklink-sdk/DeckLinkAPI.idl
-	)
-
-set(win-decklink-sdk_HEADERS
-	decklink-sdk/DeckLinkAPIVersion.h
-	)
-
-set(win-decklink_HEADERS
-	../decklink-devices.hpp
-	../DecklinkOutput.hpp
-	../const.h
-	../platform.hpp
-	../DecklinkInput.hpp
-	../DecklinkBase.h
-	../decklink-device-instance.hpp
-	../decklink-device-discovery.hpp
-	../decklink-device.hpp
-	../decklink-device-mode.hpp
-	../audio-repack.h
-	../audio-repack.hpp
-	../util.hpp
-	../OBSVideoFrame.h
-	)
-
-set(MODULE_DESCRIPTION "OBS DeckLink Windows module")
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-decklink.rc)
-set(win-decklink_SOURCES
-	../plugin-main.cpp
-	../decklink-devices.cpp
-	../DecklinkOutput.cpp
-	../decklink-source.cpp
-	../decklink-output.cpp
-	../DecklinkInput.cpp
-	../DecklinkBase.cpp
-	../decklink-device-instance.cpp
-	../decklink-device-discovery.cpp
-	../decklink-device.cpp
-	../decklink-device-mode.cpp
-	../audio-repack.c
-	platform.cpp
-	../util.cpp
-	win-decklink.rc
-	../OBSVideoFrame.cpp)
-
-add_idl_files(win-decklink-sdk_GENERATED_FILES
-	${win-decklink-sdk_IDLS}
-	)
-
-include_directories(
-	${CMAKE_CURRENT_BINARY_DIR}
-)
-
-add_library(win-decklink MODULE
-	${win-decklink_SOURCES}
-	${win-decklink_HEADERS}
-	${win-decklink-sdk_HEADERS}
-	${win-decklink-sdk_GENERATED_FILES}
-	)
-
-target_link_libraries(win-decklink
-	libobs
-	caption)
-set_target_properties(win-decklink PROPERTIES FOLDER "plugins/decklink")
-
-install_obs_plugin_with_data(win-decklink ../data)

+ 18 - 20
plugins/image-source/CMakeLists.txt

@@ -1,27 +1,25 @@
 project(image-source)
 
-if(MSVC)
-	set(image-source_PLATFORM_DEPS
-		w32-pthreads)
-endif()
+add_library(image-source MODULE)
+add_library(OBS::image-source ALIAS image-source)
+
+target_sources(image-source PRIVATE image-source.c color-source.c
+                                    obs-slideshow.c)
+
+target_link_libraries(image-source PRIVATE OBS::libobs)
+
+if(OS_WINDOWS)
+  if(MSVC)
+    target_link_libraries(image-source PRIVATE OBS::w32-pthreads)
+  endif()
 
-set(image-source_SOURCES
-	image-source.c
-	color-source.c
-	obs-slideshow.c)
+  set(MODULE_DESCRIPTION "OBS image module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 image-source.rc)
 
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS image module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in image-source.rc)
-	list(APPEND image-source_SOURCES
-		image-source.rc)
+  target_sources(image-source PRIVATE image-source.rc)
 endif()
 
-add_library(image-source MODULE
-	${image-source_SOURCES})
-target_link_libraries(image-source
-	libobs
-	${image-source_PLATFORM_DEPS})
-set_target_properties(image-source PROPERTIES FOLDER "plugins")
+set_target_properties(image-source PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(image-source data)
+setup_plugin_target(image-source)

+ 11 - 26
plugins/linux-alsa/CMakeLists.txt

@@ -1,35 +1,20 @@
 project(linux-alsa)
 
-if(DISABLE_ALSA)
-	message(STATUS "ALSA support disabled")
-	return()
+option(ENABLE_ALSA "Build OBS with ALSA support" ON)
+if(NOT ENABLE_ALSA)
+  message(STATUS "OBS:  DISABLED   alsa")
+  return()
 endif()
 
-find_package(ALSA)
-if(NOT ALSA_FOUND AND ENABLE_ALSA)
-	message(FATAL_ERROR "ALSA not found but set as enabled")
-elseif(NOT ALSA_FOUND)
-	message(STATUS "ALSA not found, disabling ALSA plugin")
-	return()
-endif()
+find_package(ALSA REQUIRED)
+
+add_library(linux-alsa MODULE)
+add_library(OBS::alsa ALIAS linux-alsa)
 
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs"
-	${ALSA_INCLUDE_DIR}
-)
+target_sources(linux-alsa PRIVATE linux-alsa.c alsa-input.c)
 
-set(linux-alsa_SOURCES
-	linux-alsa.c
-	alsa-input.c
-)
+target_link_libraries(linux-alsa PRIVATE OBS::libobs ALSA::ALSA)
 
-add_library(linux-alsa MODULE
-	${linux-alsa_SOURCES}
-)
-target_link_libraries(linux-alsa
-	libobs
-	${ALSA_LIBRARY}
-)
 set_target_properties(linux-alsa PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(linux-alsa data)
+setup_plugin_target(linux-alsa)

+ 64 - 92
plugins/linux-capture/CMakeLists.txt

@@ -1,107 +1,79 @@
 project(linux-capture)
 
+option(ENABLE_PIPEWIRE "Enable PipeWire support" ON)
+if(NOT ENABLE_PIPEWIRE)
+  message(STATUS "OBS:    -        PipeWire support disabled")
+endif()
+
 find_package(X11 REQUIRED)
-if(NOT X11_Xcomposite_FOUND)
-	message(STATUS "Xcomposite library not found, linux-capture plugin disabled")
-	return()
+if(NOT TARGET X11::Xcomposite)
+  message(
+    FATAL_ERROR "OBS:  DISABLED   linux-capture - Xcomposite library not found")
 endif()
+find_package(XCB COMPONENTS XCB XFIXES RANDR SHM XINERAMA)
 
-find_package(XCB COMPONENTS XCB RANDR SHM XFIXES XINERAMA REQUIRED)
-find_package(X11_XCB REQUIRED)
+add_library(linux-capture MODULE)
+add_library(OBS::capture ALIAS linux-capture)
 
-set(linux-capture_INCLUDES
-	"${CMAKE_SOURCE_DIR}/libobs"
-	${X11_Xcomposite_INCLUDE_PATH}
-	${X11_X11_INCLUDE_PATH}
-	${XCB_INCLUDE_DIRS}
-)
+target_sources(
+  linux-capture
+  PRIVATE linux-capture.c
+          xcursor.c
+          xcursor.h
+          xcursor-xcb.c
+          xcursor-xcb.h
+          xhelpers.c
+          xhelpers.h
+          xshm-input.c
+          xcomposite-main.cpp
+          xcompcap-main.cpp
+          xcompcap-main.hpp
+          xcompcap-helper.cpp
+          xcompcap-helper.hpp)
 
-set(linux-capture_SOURCES
-	linux-capture.c
-	xcursor.c
-	xcursor-xcb.c
-	xhelpers.c
-	xshm-input.c
-	xcomposite-main.cpp
-	xcompcap-main.cpp
-	xcompcap-helper.cpp
-)
-set(linux-capture_HEADERS
-	xcursor.h
-	xcursor-xcb.h
-	xhelpers.h
-	xcompcap-main.hpp
-	xcompcap-helper.hpp
-)
+target_link_libraries(
+  linux-capture
+  PRIVATE OBS::libobs
+          OBS::obsglad
+          X11::X11
+          X11::Xfixes
+          X11::Xcomposite
+          XCB::XCB
+          XCB::XFIXES
+          XCB::RANDR
+          XCB::SHM
+          XCB::XINERAMA)
 
-set(linux-capture_LIBRARIES
-	libobs
-	glad
-	${X11_LIBRARIES}
-	${X11_Xfixes_LIB}
-	${X11_X11_LIB}
-	${X11_Xcomposite_LIB}
-	${XCB_LIBRARIES}
-)
+set_target_properties(linux-capture PROPERTIES FOLDER "plugins")
 
-option(ENABLE_PIPEWIRE "Enable PipeWire support" ON)
 if(ENABLE_PIPEWIRE)
-	find_package(PipeWire 0.3.32 QUIET)
-	find_package(Libdrm QUIET) # we require libdrm/drm_fourcc.h to build
-	find_package(Gio QUIET)
+  find_package(PipeWire 0.3.32 QUIET)
+  find_package(Gio QUIET)
+  find_package(Libdrm QUIET)
 
-	if(NOT PIPEWIRE_FOUND)
-		message(FATAL_ERROR "PipeWire library not found! Please install PipeWire or set ENABLE_PIPEWIRE=OFF")
-	elseif(NOT GIO_FOUND)
-		message(FATAL_ERROR "Gio library not found! Please install GLib2 (or Gio) or set ENABLE_PIPEWIRE=OFF")
-	elseif(NOT LIBDRM_INCLUDE_DIRS)
-		message(FATAL_ERROR "libdrm headers not found! Please install libdrm or set ENABLE_PIPEWIRE=OFF")
-	endif()
+  if(NOT TARGET PipeWire::PipeWire)
+    message(
+      FATAL_ERROR
+        "OBS:    -        PipeWire library not found! Please install PipeWire or set ENABLE_PIPEWIRE=OFF"
+    )
+  elseif(NOT TARGET GIO::GIO)
+    message(
+      FATAL_ERROR
+        "OBS:    -        Gio library not found! Please install GLib2 (or Gio) or set ENABLE_PIPEWIRE=OFF"
+    )
+  elseif(NOT TARGET Libdrm::Libdrm)
+    message(
+      FATAL_ERROR
+        "OBS:    -        libdrm headers not found! Please install libdrm or set ENABLE_PIPEWIRE=OFF"
+    )
+  endif()
 
-	add_definitions(-DENABLE_PIPEWIRE)
+  target_sources(linux-capture PRIVATE pipewire.c pipewire.h pipewire-capture.c
+                                       pipewire-capture.h portal.c portal.h)
 
-	set(linux-capture_INCLUDES
-		${linux-capture_INCLUDES}
-		${GIO_INCLUDE_DIRS}
-		${PIPEWIRE_INCLUDE_DIRS}
-		${DRM_INCLUDE_DIRS}
-	)
-
-	add_definitions(
-		${GIO_DEFINITIONS}
-		${PIPEWIRE_DEFINITIONS}
-	)
-
-	set(linux-capture_SOURCES
-		${linux-capture_SOURCES}
-		pipewire.c
-		pipewire-capture.c
-		portal.c
-	)
-	set(linux-capture_HEADERS
-		${linux-capture_HEADERS}
-		pipewire.h
-		pipewire-capture.h
-		portal.h
-	)
-	set(linux-capture_LIBRARIES
-		${linux-capture_LIBRARIES}
-		${GIO_LIBRARIES}
-		${PIPEWIRE_LIBRARIES}
-	)
+  target_link_libraries(linux-capture PRIVATE PipeWire::PipeWire GIO::GIO
+                                              Libdrm::Libdrm)
+  target_compile_definitions(linux-capture PRIVATE ENABLE_PIPEWIRE)
 endif()
 
-include_directories(SYSTEM
-	${linux-capture_INCLUDES}
-)
-add_library(linux-capture MODULE
-	${linux-capture_SOURCES}
-	${linux-capture_HEADERS}
-)
-target_link_libraries(linux-capture
-	${linux-capture_LIBRARIES}
-)
-
-set_target_properties(linux-capture PROPERTIES FOLDER "plugins")
-
-install_obs_plugin_with_data(linux-capture data)
+setup_plugin_target(linux-capture)

+ 13 - 28
plugins/linux-jack/CMakeLists.txt

@@ -1,36 +1,21 @@
 project(linux-jack)
 
-if(DISABLE_JACK)
-	message(STATUS "JACK support disabled")
-	return()
+option(ENABLE_JACK "Build OBS with JACK support" OFF)
+if(NOT ENABLE_JACK)
+  message(STATUS "OBS:  DISABLED   linux-jack")
+  return()
 endif()
 
-find_package(Jack)
-if(NOT JACK_FOUND AND ENABLE_JACK)
-	message(FATAL_ERROR "JACK Audio Connection Kit not found but set as enabled")
-elseif(NOT JACK_FOUND)
-	message(STATUS "JACK Audio Connection Kit not found, disabling JACK plugin")
-	return()
-endif()
+find_package(Jack REQUIRED)
+
+add_library(linux-jack MODULE)
+add_library(OBS::jack ALIAS linux-jack)
 
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs"
-	${JACK_INCLUDE_DIR}
-)
+target_sources(linux-jack PRIVATE linux-jack.c jack-wrapper.c jack-input.c)
 
-set(linux-jack_SOURCES
-	linux-jack.c
-	jack-wrapper.c
-	jack-input.c
-)
+target_link_libraries(linux-jack PRIVATE OBS::libobs Jack::Jack)
 
-add_library(linux-jack MODULE
-	${linux-jack_SOURCES}
-)
-target_link_libraries(linux-jack
-	libobs
-	${JACK_LIBRARIES}
-)
-set_target_properties(linux-jack PROPERTIES FOLDER "plugins")
+set_target_properties(linux-jack PROPERTIES FOLDER "plugins" PROJECT_LABEL
+                                                             "JACK Audio")
 
-install_obs_plugin_with_data(linux-jack data)
+setup_plugin_target(linux-jack)

+ 18 - 29
plugins/linux-pulseaudio/CMakeLists.txt

@@ -1,36 +1,25 @@
 project(linux-pulseaudio)
 
-if(DISABLE_PULSEAUDIO)
-	message(STATUS "PulseAudio support disabled")
-	return()
-endif()
+option(ENABLE_PULSEAUDIO "Enable PulseAudio support" ON)
 
-find_package(PulseAudio)
-if(NOT PULSEAUDIO_FOUND AND ENABLE_PULSEAUDIO)
-	message(FATAL_ERROR "PulseAudio not found but set as enabled")
-elseif(NOT PULSEAUDIO_FOUND)
-	message(STATUS "PulseAudio not found, disabling PulseAudio plugin")
-	return()
+if(NOT ENABLE_PULSEAUDIO)
+  message(STATUS "OBS:  DISABLED   linux-pulseaudio")
+  return()
 endif()
 
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs"
-	${PULSEAUDIO_INCLUDE_DIR}
-)
-
-set(linux-pulseaudio_SOURCES
-	linux-pulseaudio.c
-	pulse-wrapper.c
-	pulse-input.c
-)
-
-add_library(linux-pulseaudio MODULE
-	${linux-pulseaudio_SOURCES}
-)
-target_link_libraries(linux-pulseaudio
-	libobs
-	${PULSEAUDIO_LIBRARY}
-)
+find_package(PulseAudio REQUIRED)
+
+add_library(linux-pulseaudio MODULE)
+add_library(OBS::pulseaudio ALIAS linux-pulseaudio)
+
+target_sources(linux-pulseaudio PRIVATE linux-pulseaudio.c pulse-wrapper.c
+                                        pulse-input.c)
+
+target_include_directories(linux-pulseaudio PRIVATE ${PULSEAUDIO_INCLUDE_DIR})
+
+target_link_libraries(linux-pulseaudio PRIVATE OBS::libobs
+                                               ${PULSEAUDIO_LIBRARY})
+
 set_target_properties(linux-pulseaudio PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(linux-pulseaudio data)
+setup_plugin_target(linux-pulseaudio)

+ 26 - 53
plugins/linux-v4l2/CMakeLists.txt

@@ -1,62 +1,35 @@
 project(linux-v4l2)
 
-if(DISABLE_V4L2)
-	message(STATUS "v4l2 plugin disabled")
-	return()
+option(ENABLE_V4L2 "Build OBS with v4l2 support" ON)
+if(NOT ENABLE_V4L2)
+  message(STATUS "OBS:  DISABLED   linux-v4l2")
+  return()
 endif()
 
+option(ENABLE_UDEV "Build linux-v4l2 with UDEV support" ON)
 
-if(ENABLE_V4L2)
-	find_package(Libv4l2 REQUIRED)
-else()
-	find_package(Libv4l2)
-	if(NOT LIBV4L2_FOUND)
-		message(STATUS "libv4l2 not found, disabling v4l2 plugin")
-		return()
-	endif()
-endif()
+find_package(Libv4l2 REQUIRED)
+find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
 
-if(DISABLE_UDEV)
-	add_definitions(-DHAVE_UDEV)
-else()
-	find_package(UDev)
-	if(NOT UDEV_FOUND)
-		message(STATUS "udev disabled for v4l2 plugin")
-	else()
-		set(linux-v4l2-udev_SOURCES
-			v4l2-udev.c
-		)
-	endif()
-endif()
+add_library(linux-v4l2 MODULE)
+add_library(OBS::v4l2 ALIAS linux-v4l2)
+
+target_sources(linux-v4l2 PRIVATE linux-v4l2.c v4l2-controls.c v4l2-input.c
+                                  v4l2-helpers.c v4l2-output.c v4l2-mjpeg.c)
+
+target_link_libraries(
+  linux-v4l2 PRIVATE OBS::libobs LIB4L2::LIB4L2 FFmpeg::avcodec
+                     FFmpeg::avformat FFmpeg::avutil)
 
-find_package(FFmpeg REQUIRED
-        COMPONENTS avcodec avutil avformat)
-
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs"
-	${LIBV4L2_INCLUDE_DIRS}
-	${FFMPEG_INCLUDE_DIRS}
-)
-
-set(linux-v4l2_SOURCES
-	linux-v4l2.c
-	v4l2-controls.c
-	v4l2-input.c
-	v4l2-helpers.c
-	v4l2-output.c
-	v4l2-mjpeg.c
-	${linux-v4l2-udev_SOURCES}
-)
-
-add_library(linux-v4l2 MODULE
-	${linux-v4l2_SOURCES}
-)
-target_link_libraries(linux-v4l2
-	libobs
-	${LIBV4L2_LIBRARIES}
-	${UDEV_LIBRARIES}
-	${FFMPEG_LIBRARIES}
-)
 set_target_properties(linux-v4l2 PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(linux-v4l2 data)
+if(NOT ENABLE_UDEV)
+  target_compile_definitions(linux-v4l2 PRIVATE HAVE_UDEV)
+else()
+  find_package(Udev REQUIRED)
+  target_sources(linux-v4l2 PRIVATE v4l2-udev.c)
+
+  target_link_libraries(linux-v4l2 PRIVATE Udev::Udev)
+endif()
+
+setup_plugin_target(linux-v4l2)

+ 26 - 36
plugins/mac-avcapture/CMakeLists.txt

@@ -5,41 +5,31 @@ find_library(COCOA Cocoa)
 find_library(COREFOUNDATION CoreFoundation)
 find_library(COREMEDIA CoreMedia)
 find_library(COREVIDEO CoreVideo)
-find_library(COCOA Cocoa)
 find_library(COREMEDIAIO CoreMediaIO)
 
-include_directories(${AVFOUNDATION}
-                    ${COCOA}
-                    ${COREFOUNDATION}
-                    ${COREMEDIA}
-                    ${COREVIDEO}
-                    ${COREMEDIAIO}
-		    ${COCOA})
-
-set(mac-avcapture_HEADERS
-	left-right.hpp
-	scope-guard.hpp
-	)
-
-set(mac-avcapture_SOURCES
-	av-capture.mm)
-
-set_source_files_properties(av-capture.mm
-	PROPERTIES COMPILE_FLAGS "-fobjc-arc")
-
-add_library(mac-avcapture MODULE
-	${mac-avcapture_SOURCES}
-	${mac-avcapture_HEADERS})
-
-target_link_libraries(mac-avcapture
-	libobs
-	${AVFOUNDATION}
-	${COCOA}
-	${COREFOUNDATION}
-	${COREMEDIA}
-	${COREVIDEO}
-	${COREMEDIAIO}
-	${COCOA})
-set_target_properties(mac-avcapture PROPERTIES FOLDER "plugins")
-
-install_obs_plugin_with_data(mac-avcapture data)
+mark_as_advanced(AVFOUNDATION COCOA COREFOUNDATION COREMEDIA COREMEDIAIO
+                 COREVIDEO)
+
+add_library(mac-avcapture MODULE)
+add_library(OBS::avcapture ALIAS mac-avcapture)
+
+target_sources(mac-avcapture PRIVATE av-capture.mm left-right.hpp
+                                     scope-guard.hpp)
+
+target_compile_features(mac-avcapture PRIVATE cxx_std_11)
+
+set_source_files_properties(av-capture.mm PROPERTIES COMPILE_FLAGS -fobjc-arc)
+
+target_link_libraries(
+  mac-avcapture
+  PRIVATE OBS::libobs
+          ${AVFOUNDATION}
+          ${COCOA}
+          ${COREFOUNDATION}
+          ${COREMEDIA}
+          ${COREVIDEO}
+          ${COREMEDIAIO})
+
+set_target_properties(mac-avcapture PROPERTIES FOLDER "plugins" PREFIX "")
+
+setup_plugin_target(mac-avcapture)

+ 16 - 27
plugins/mac-capture/CMakeLists.txt

@@ -6,34 +6,23 @@ find_library(COREFOUNDATION CoreFoundation)
 find_library(IOSURF IOSurface)
 find_library(COCOA Cocoa)
 
-include_directories(${COREAUDIO}
-                    ${AUDIOUNIT}
-                    ${COREFOUNDATION}
-		    ${IOSURF}
-		    ${COCOA})
+add_library(mac-capture MODULE)
+add_library(OBS::capture ALIAS mac-capture)
 
-set(mac-capture_HEADERS
-	audio-device-enum.h
-	window-utils.h)
+target_sources(
+  mac-capture
+  PRIVATE plugin-main.c
+          audio-device-enum.c
+          audio-device-enum.h
+          mac-audio.c
+          mac-display-capture.m
+          mac-window-capture.m
+          window-utils.m
+          window-utils.h)
 
-set(mac-capture_SOURCES
-	plugin-main.c
-	audio-device-enum.c
-	mac-audio.c
-	mac-display-capture.m
-	mac-window-capture.m
-	window-utils.m)
+target_link_libraries(mac-capture PRIVATE OBS::libobs ${COREAUDIO} ${AUDIOUNIT}
+                                          ${COREFOUNDATION} ${IOSURF} ${COCOA})
 
-add_library(mac-capture MODULE
-	${mac-capture_SOURCES}
-	${mac-capture_HEADERS})
-target_link_libraries(mac-capture
-	libobs
-	${COREAUDIO}
-	${AUDIOUNIT}
-	${COREFOUNDATION}
-	${IOSURF}
-	${COCOA})
-set_target_properties(mac-capture PROPERTIES FOLDER "plugins")
+set_target_properties(mac-capture PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(mac-capture data)
+setup_plugin_target(mac-capture)

+ 70 - 71
plugins/mac-syphon/CMakeLists.txt

@@ -1,87 +1,86 @@
 project(mac-syphon)
 
+find_package(OpenGL REQUIRED)
+
 find_library(COCOA Cocoa)
 find_library(IOSURF IOSurface)
 find_library(SCRIPTINGBRIDGE ScriptingBridge)
-find_package(OpenGL REQUIRED)
 
-include_directories(${COCOA}
-		    ${IOSURF}
-		    ${SCRIPTINGBIRDGE}
-		    ${OPENGL_INCLUDE_DIR})
+mark_as_advanced(COCOA IOSURF SCRIPTINGBRIDGE)
+
+add_library(mac-syphon MODULE)
+add_library(OBS::syphon ALIAS mac-syphon)
+
+add_library(syphon-framework STATIC)
+add_library(Syphon::Framework ALIAS syphon-framework)
 
-set(syphon_HEADERS
-	syphon-framework/Syphon_Prefix.pch
-	syphon-framework/Syphon.h
-	syphon-framework/SyphonBuildMacros.h
-	syphon-framework/SyphonCFMessageReceiver.h
-	syphon-framework/SyphonCFMessageSender.h
-	syphon-framework/SyphonClient.h
-	syphon-framework/SyphonClientConnectionManager.h
-	syphon-framework/SyphonDispatch.h
-	syphon-framework/SyphonIOSurfaceImage.h
-	syphon-framework/SyphonImage.h
-	syphon-framework/SyphonMachMessageReceiver.h
-	syphon-framework/SyphonMachMessageSender.h
-	syphon-framework/SyphonMessageQueue.h
-	syphon-framework/SyphonMessageReceiver.h
-	syphon-framework/SyphonMessageSender.h
-	syphon-framework/SyphonMessaging.h
-	syphon-framework/SyphonOpenGLFunctions.h
-	syphon-framework/SyphonPrivate.h
-	syphon-framework/SyphonServer.h
-	syphon-framework/SyphonServerConnectionManager.h
-	syphon-framework/SyphonServerDirectory.h
-	)
+target_sources(mac-syphon PRIVATE syphon.m plugin-main.c)
 
-set(syphon_SOURCES
-	syphon-framework/SyphonCFMessageReceiver.m
-	syphon-framework/SyphonCFMessageSender.m
-	syphon-framework/SyphonClient.m
-	syphon-framework/SyphonClientConnectionManager.m
-	syphon-framework/SyphonDispatch.c
-	syphon-framework/SyphonImage.m
-	syphon-framework/SyphonIOSurfaceImage.m
-	syphon-framework/SyphonMachMessageReceiver.m
-	syphon-framework/SyphonMachMessageSender.m
-	syphon-framework/SyphonMessageQueue.m
-	syphon-framework/SyphonMessageReceiver.m
-	syphon-framework/SyphonMessageSender.m
-	syphon-framework/SyphonMessaging.m
-	syphon-framework/SyphonOpenGLFunctions.c
-	syphon-framework/SyphonPrivate.m
-	syphon-framework/SyphonServer.m
-	syphon-framework/SyphonServerConnectionManager.m
-	syphon-framework/SyphonServerDirectory.m
-	)
+target_sources(
+  syphon-framework
+  PRIVATE syphon-framework/Syphon_Prefix.pch
+          syphon-framework/Syphon.h
+          syphon-framework/SyphonBuildMacros.h
+          syphon-framework/SyphonCFMessageReceiver.m
+          syphon-framework/SyphonCFMessageReceiver.h
+          syphon-framework/SyphonCFMessageSender.h
+          syphon-framework/SyphonCFMessageSender.m
+          syphon-framework/SyphonClient.m
+          syphon-framework/SyphonClient.h
+          syphon-framework/SyphonClientConnectionManager.m
+          syphon-framework/SyphonClientConnectionManager.h
+          syphon-framework/SyphonDispatch.c
+          syphon-framework/SyphonDispatch.h
+          syphon-framework/SyphonIOSurfaceImage.m
+          syphon-framework/SyphonIOSurfaceImage.h
+          syphon-framework/SyphonImage.m
+          syphon-framework/SyphonImage.h
+          syphon-framework/SyphonMachMessageReceiver.m
+          syphon-framework/SyphonMachMessageReceiver.h
+          syphon-framework/SyphonMachMessageSender.m
+          syphon-framework/SyphonMachMessageSender.h
+          syphon-framework/SyphonMessageQueue.m
+          syphon-framework/SyphonMessageQueue.h
+          syphon-framework/SyphonMessageReceiver.m
+          syphon-framework/SyphonMessageReceiver.h
+          syphon-framework/SyphonMessageSender.m
+          syphon-framework/SyphonMessageSender.h
+          syphon-framework/SyphonMessaging.m
+          syphon-framework/SyphonMessaging.h
+          syphon-framework/SyphonOpenGLFunctions.c
+          syphon-framework/SyphonOpenGLFunctions.h
+          syphon-framework/SyphonPrivate.m
+          syphon-framework/SyphonPrivate.h
+          syphon-framework/SyphonServer.m
+          syphon-framework/SyphonServer.h
+          syphon-framework/SyphonServerConnectionManager.m
+          syphon-framework/SyphonServerConnectionManager.h
+          syphon-framework/SyphonServerDirectory.m
+          syphon-framework/SyphonServerDirectory.h)
 
-add_library(syphon-framework ${syphon_HEADERS}
-	${syphon_SOURCES})
+target_link_libraries(mac-syphon PRIVATE OBS::libobs Syphon::Framework
+                                         ${SCRIPTINGBRIDGE})
 
-set(mac-syphon_HEADERS
-	)
+target_link_libraries(syphon-framework PUBLIC OpenGL::GL ${COCOA} ${IOSURF})
 
-set(mac-syphon_SOURCES
-	syphon.m
-	plugin-main.c)
+target_compile_options(
+  mac-syphon
+  PRIVATE -include
+          ${CMAKE_CURRENT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch
+          -fobjc-arc)
 
-add_definitions(-DSYPHON_UNIQUE_CLASS_NAME_PREFIX=OBS_ -include
-	${PROJECT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch)
+target_compile_options(
+  syphon-framework
+  PRIVATE -include
+          ${CMAKE_CURRENT_SOURCE_DIR}/syphon-framework/Syphon_Prefix.pch
+          -Wno-deprecated-declarations)
 
-add_library(mac-syphon MODULE
-	${mac-syphon_SOURCES}
-	${mac-syphon_HEADERS})
+target_compile_definitions(syphon-framework
+                           PUBLIC "SYPHON_UNIQUE_CLASS_NAME_PREFIX=OBS_")
 
-target_link_libraries(mac-syphon
-	libobs
-	syphon-framework
-	${COCOA}
-	${IOSURF}
-	${SCRIPTINGBRIDGE}
-	${OPENGL_gl_LIBRARY})
+set_target_properties(mac-syphon PROPERTIES FOLDER "plugins" PREFIX "")
 
-set_property (TARGET mac-syphon APPEND_STRING PROPERTY
-	COMPILE_FLAGS "-fobjc-arc")
-set_target_properties(mac-syphon PROPERTIES FOLDER "plugins")
+set_target_properties(syphon-framework PROPERTIES FOLDER "plugins/mac-syphon"
+                                                  PREFIX "")
 
-install_obs_plugin_with_data(mac-syphon data)
+setup_plugin_target(mac-syphon)

+ 7 - 0
plugins/mac-virtualcam/CMakeLists.txt

@@ -1,2 +1,9 @@
+option(ENABLE_VIRTUALCAM "Build OBS Virtualcam" ON)
+
+if(NOT ENABLE_VIRTUALCAM)
+  message(STATUS "OBS:  DISABLED   mac-virtualcam")
+  return()
+endif()
+
 add_subdirectory(src/obs-plugin)
 add_subdirectory(src/dal-plugin)

+ 50 - 86
plugins/mac-virtualcam/src/dal-plugin/CMakeLists.txt

@@ -1,101 +1,65 @@
-# Universal build for Apple Silicon
+# Build DAL plugin universal to ensure compatibility with Rosetta-translated
+# apps on arm64 hosts
 set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64")
 
 project(mac-dal-plugin)
 
-find_library(APPKIT AppKit)
-find_library(COREFOUNDATION CoreFoundation)
-find_library(COREVIDEO CoreVideo)
+find_library(COCOA Cocoa)
 find_library(COREMEDIA CoreMedia)
 find_library(COREMEDIAIO CoreMediaIO)
-find_library(IOKIT IOKit)
-
-include_directories(${APPKIT}
-					${COREFOUNDATION}
-					${COREVIDEO}
-					${COREMEDIA}
-					${COREMEDIAIO}
-					${IOSURFACE}
-					./
-					../common)
-
-set(mac-dal-plugin_HEADERS
-	Defines.h
-	Logging.h
-	OBSDALPlugInInterface.h
-	OBSDALObjectStore.h
-	OBSDALPlugIn.h
-	OBSDALDevice.h
-	OBSDALStream.h
-	CMSampleBufferUtils.h
-	OBSDALMachClient.h
-	../common/MachProtocol.h)
+find_library(COREVIDEO CoreVideo)
 
-set(mac-dal-plugin_SOURCES
-	OBSDALPlugInMain.mm
-	OBSDALPlugInInterface.mm
-	OBSDALObjectStore.mm
-	OBSDALPlugIn.mm
-	OBSDALDevice.mm
-	OBSDALStream.mm
-	CMSampleBufferUtils.mm
-	OBSDALMachClient.mm)
+mark_as_advanced(COCOA COREMEDIA COREMEDIAIO COREVIDEO)
 
-add_library(mac-dal-plugin MODULE
-	${mac-dal-plugin_SOURCES}
-	${mac-dal-plugin_HEADERS})
+add_library(mac-dal-plugin MODULE)
+add_library(OBS::mac-dal-plugin ALIAS mac-dal-plugin)
 
-set_target_properties(mac-dal-plugin PROPERTIES
-	FOLDER "plugins"
-	BUNDLE TRUE
-	OUTPUT_NAME "obs-mac-virtualcam"
-	COMPILE_FLAGS "-std=gnu++14 -stdlib=libc++ -fobjc-arc -fobjc-weak")
+target_sources(
+  mac-dal-plugin
+  PRIVATE OBSDALPlugIn.mm
+          OBSDALPlugIn.h
+          OBSDALPlugInMain.mm
+          OBSDALPlugInInterface.mm
+          OBSDALPlugInInterface.h
+          OBSDALObjectStore.mm
+          OBSDALObjectStore.h
+          OBSDALDevice.mm
+          OBSDALDevice.h
+          OBSDALMachClient.mm
+          OBSDALMachClient.h
+          CMSampleBufferUtils.mm
+          OBSDALStream.mm
+          OBSDALStream.h
+          CMSampleBufferUtils.h
+          Defines.h
+          Logging.h
+          ${CMAKE_CURRENT_SOURCE_DIR}/../common/MachProtocol.h)
 
-if (XCODE)
-	set(TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}/Debug")
-else (XCODE)
-	set(TARGET_DIR "${CMAKE_CURRENT_BINARY_DIR}")
-endif (XCODE)
+target_include_directories(
+  mac-dal-plugin
+  PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/../common")
 
-target_link_libraries(mac-dal-plugin
-	${APPKIT}
-	${COREFOUNDATION}
-	${COREVIDEO}
-	${COREMEDIA}
-	${COREMEDIAIO}
-	${IOKIT})
+target_compile_options(mac-dal-plugin PRIVATE -fobjc-arc -fobjc-weak)
 
-add_custom_command(TARGET mac-dal-plugin
-	POST_BUILD
-	COMMAND rm -rf ${TARGET_DIR}/obs-mac-virtualcam.plugin || true
-	COMMAND ${CMAKE_COMMAND} -E copy_directory ${TARGET_DIR}/obs-mac-virtualcam.bundle ${TARGET_DIR}/obs-mac-virtualcam.plugin
-	COMMENT "Rename bundle to plugin"
-)
+target_link_libraries(mac-dal-plugin PRIVATE ${COCOA} ${COREMEDIA}
+                                             ${COREMEDIAIO} ${COREVIDEO})
 
-# Note: Xcode seems to run a command `builtin-infoPlistUtility` to generate the Info.plist, but I'm
-# not sure where to find that binary. If we had access to it, the command would look something like:
-# builtin-infoPlistUtility ${PROJECT_SOURCE_DIR}/../common/CoreMediaIO/DeviceAbstractionLayer/Devices/Sample/PlugIn/SampleVCam-Info.plist -producttype com.apple.product-type.bundle -expandbuildsettings -platform macosx -o mac-virtualcam.bundle/Contents/Info.plist
-# Instead, just copy in one that was already generated from Xcode.
-add_custom_command(TARGET mac-dal-plugin
-	POST_BUILD
-	COMMAND cp ${PROJECT_SOURCE_DIR}/Info.plist ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist
-    COMMAND mkdir ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Resources
-    COMMAND cp ${PROJECT_SOURCE_DIR}/placeholder.png ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Resources/placeholder.png
-	COMMAND /usr/bin/plutil -insert CFBundleVersion -string "${OBS_VERSION}" ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist
-	COMMAND /usr/bin/plutil -insert CFBundleShortVersionString -string "${OBS_VERSION}" ${TARGET_DIR}/obs-mac-virtualcam.plugin/Contents/Info.plist
-	DEPENDS {PROJECT_SOURCE_DIR}/Info.plist
-	COMMENT "Copy in Info.plist"
-)
+set(MACOSX_PLUGIN_BUNDLE_TYPE "BNDL")
+target_sources(mac-dal-plugin PRIVATE placeholder.png)
+set_source_files_properties(placeholder.png PROPERTIES MACOSX_PACKAGE_LOCATION
+                                                       "Resources")
+source_group("Resources" FILES placeholder.png)
 
-add_custom_command(TARGET mac-dal-plugin
-	POST_BUILD
-	COMMAND /usr/bin/codesign --force --deep --sign - --timestamp=none ${TARGET_DIR}/obs-mac-virtualcam.plugin
-	COMMENT "Codesign plugin"
-)
+set_target_properties(
+  mac-dal-plugin
+  PROPERTIES BUNDLE ON
+             BUNDLE_EXTENSION "plugin"
+             OUTPUT_NAME "obs-mac-virtualcam"
+             FOLDER "plugins"
+             VERSION "0"
+             SOVERSION "0"
+             LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../"
+             MACOSX_BUNDLE_INFO_PLIST
+             "${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Virtualcam-Info.plist.in")
 
-add_custom_command(TARGET mac-dal-plugin
-	POST_BUILD
-	COMMAND rm -rf "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-mac-virtualcam.plugin" || true
-	COMMAND ${CMAKE_COMMAND} -E copy_directory ${TARGET_DIR}/obs-mac-virtualcam.plugin "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin"
-	COMMENT "Copy plugin to destination"
-)
+setup_binary_target(mac-dal-plugin)

+ 22 - 23
plugins/mac-virtualcam/src/obs-plugin/CMakeLists.txt

@@ -1,33 +1,32 @@
 project(mac-virtualcam)
 
 find_library(APPKIT AppKit)
-find_library(COREFOUNDATION CoreFoundation)
 
-include_directories(${APPKIT}
-					${COREFOUNDATION}
-					../common)
+mark_as_advanced(APPKIT)
 
-set(mac-virtualcam_HEADERS
-	Defines.h
-	OBSDALMachServer.h
-	../common/MachProtocol.h)
+add_library(mac-virtualcam MODULE)
+add_library(OBS::virtualcam ALIAS mac-virtualcam)
 
-set(mac-virtualcam_SOURCES
-	plugin-main.mm
-	OBSDALMachServer.mm)
+target_sources(
+  mac-virtualcam PRIVATE Defines.h plugin-main.mm OBSDALMachServer.mm
+                         OBSDALMachServer.h ../common/MachProtocol.h)
 
-add_library(mac-virtualcam MODULE
-	${mac-virtualcam_SOURCES}
-	${mac-virtualcam_HEADERS})
+target_include_directories(
+  mac-virtualcam
+  PRIVATE "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/../common")
 
-target_link_libraries(mac-virtualcam
-	libobs
-	${APPKIT}
-	${COREFOUNDATION})
+target_link_libraries(mac-virtualcam PRIVATE OBS::libobs OBS::frontend-api
+                                             ${APPKIT})
 
-set_target_properties(mac-virtualcam PROPERTIES
-	FOLDER "plugins"
-	COMPILE_FLAGS "-std=gnu++14 -stdlib=libc++ -fobjc-arc -fobjc-weak"
-)
+target_compile_features(mac-virtualcam PRIVATE cxx_deleted_functions
+                                               cxx_rvalue_references cxx_std_17)
 
-install_obs_plugin_with_data(mac-virtualcam data)
+target_compile_options(mac-virtualcam PRIVATE -fobjc-arc -fobjc-weak)
+
+set_target_properties(
+  mac-virtualcam
+  PROPERTIES FOLDER "plugins"
+             PREFIX ""
+             LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../../")
+
+setup_plugin_target(mac-virtualcam)

+ 14 - 20
plugins/mac-virtualcam/src/obs-plugin/plugin-main.mm

@@ -36,34 +36,28 @@ static bool check_dal_plugin()
 						@"/Library/CoreMediaIO/Plug-Ins/DAL/obs-mac-virtualcam.plugin/Contents/Info.plist"]];
 		NSString *dalPluginVersion = [dalPluginInfoPlist
 			valueForKey:@"CFBundleShortVersionString"];
-		const char *obsVersion = obs_get_version_string();
+		NSString *dalPluginBuild =
+			[dalPluginInfoPlist valueForKey:@"CFBundleVersion"];
 
+		NSString *obsVersion = [[[NSBundle mainBundle] infoDictionary]
+			objectForKey:@"CFBundleShortVersionString"];
+		NSString *obsBuild = [[[NSBundle mainBundle] infoDictionary]
+			objectForKey:(NSString *)kCFBundleVersionKey];
 		dalPluginUpdateNeeded =
-			![dalPluginVersion isEqualToString:@(obsVersion)];
+			!([dalPluginVersion isEqualToString:obsVersion] &&
+			  [dalPluginBuild isEqualToString:obsBuild]);
 	}
 
 	if (!dalPluginInstalled || dalPluginUpdateNeeded) {
-		// TODO: Remove this distinction once OBS is built into an app bundle by cmake by default
 		NSString *dalPluginSourcePath;
-		NSRunningApplication *app =
-			[NSRunningApplication currentApplication];
 
-		if ([app bundleIdentifier] != nil) {
-			NSURL *bundleURL = [app bundleURL];
-			NSString *pluginPath =
-				@"Contents/Resources/data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin";
+		NSURL *bundleURL = [[NSBundle mainBundle] bundleURL];
+		NSString *pluginPath =
+			@"Contents/Resources/obs-mac-virtualcam.plugin";
 
-			NSURL *pluginUrl = [bundleURL
-				URLByAppendingPathComponent:pluginPath];
-			dalPluginSourcePath = [pluginUrl path];
-		} else {
-			dalPluginSourcePath = [[[[app executableURL]
-				URLByAppendingPathComponent:
-					@"../data/obs-plugins/mac-virtualcam/obs-mac-virtualcam.plugin"]
-				path]
-				stringByReplacingOccurrencesOfString:@"obs/"
-							  withString:@""];
-		}
+		NSURL *pluginUrl =
+			[bundleURL URLByAppendingPathComponent:pluginPath];
+		dalPluginSourcePath = [pluginUrl path];
 
 		NSString *createPluginDirCmd =
 			(!dalPluginDirExists)

+ 17 - 20
plugins/mac-vth264/CMakeLists.txt

@@ -7,27 +7,24 @@ find_library(COREVIDEO CoreVideo)
 find_library(VIDEOTOOLBOX VideoToolbox)
 find_library(COREMEDIA CoreMedia)
 
-include_directories(${AVFOUNDATION}
-	${COCOA}
-	${COREFOUNDATION}
-	${COREVIDEO}
-	${VIDEOTOOLBOX}
-	${COREMEDIA})
+mark_as_advanced(AVFOUNDATION COCOA COREFOUNDATION COREVIDEO VIDEOTOOLBOX
+                 COREMEDIA)
 
-set(mac-vth264_SOURCES
-	encoder.c)
+add_library(mac-vth264 MODULE)
+add_library(OBS::vth264 ALIAS mac-vth264)
 
-add_library(mac-vth264 MODULE
-	${mac-vth264_SOURCES})
+target_sources(mac-vth264 PRIVATE encoder.c)
 
-target_link_libraries(mac-vth264
-	libobs
-	${AVFOUNDATION}
-	${COCOA}
-	${COREFOUNDATION}
-	${COREVIDEO}
-	${VIDEOTOOLBOX}
-	${COREMEDIA})
-set_target_properties(mac-vth264 PROPERTIES FOLDER "plugins")
+target_link_libraries(
+  mac-vth264
+  PRIVATE OBS::libobs
+          ${AVFOUNDATION}
+          ${COCOA}
+          ${COREFOUNDATION}
+          ${COREVIDEO}
+          ${VIDEOTOOLBOX}
+          ${COREMEDIA})
 
-install_obs_plugin_with_data(mac-vth264 data)
+set_target_properties(mac-vth264 PROPERTIES FOLDER "plugins" PREFIX "")
+
+setup_plugin_target(mac-vth264)

+ 1 - 1
plugins/obs-browser

@@ -1 +1 @@
-Subproject commit cbce71dd826cafb7c75cf99cbc7ce101ea7d03c4
+Subproject commit 7d3ee397a8fc2ff7e26c5e4131ac94d586e329bb

+ 61 - 64
plugins/obs-ffmpeg/CMakeLists.txt

@@ -1,80 +1,77 @@
 project(obs-ffmpeg)
 
-if(MSVC)
-	set(obs-ffmpeg_PLATFORM_DEPS
-		w32-pthreads)
-endif()
-
 option(ENABLE_FFMPEG_LOGGING "Enables obs-ffmpeg logging" OFF)
 
-find_package(FFmpeg REQUIRED
-	COMPONENTS avcodec avfilter avdevice avutil swscale avformat swresample)
-include_directories(${FFMPEG_INCLUDE_DIRS})
-
-if(UNIX AND NOT APPLE)
-        find_package(Libpci REQUIRED)
-        include_directories(${LIBPCI_INCLUDE_DIRS})
-endif()
+find_package(
+  FFmpeg REQUIRED
+  COMPONENTS avcodec
+             avfilter
+             avdevice
+             avutil
+             swscale
+             avformat
+             swresample)
 
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/obs-ffmpeg-config.h.in"
-	"${CMAKE_CURRENT_BINARY_DIR}/obs-ffmpeg-config.h")
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
+add_library(obs-ffmpeg MODULE)
+add_library(OBS::ffmpeg ALIAS obs-ffmpeg)
+add_subdirectory(ffmpeg-mux)
 
-set(obs-ffmpeg_config_HEADERS
-	"${CMAKE_CURRENT_BINARY_DIR}/obs-ffmpeg-config.h")
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs-ffmpeg-config.h.in
+               ${CMAKE_BINARY_DIR}/config/obs-ffmpeg-config.h)
 
-set(obs-ffmpeg_HEADERS
-	obs-ffmpeg-compat.h
-	obs-ffmpeg-formats.h
-	obs-ffmpeg-mux.h)
+target_sources(
+  obs-ffmpeg
+  PRIVATE obs-ffmpeg.c
+          obs-ffmpeg-audio-encoders.c
+          obs-ffmpeg-av1.c
+          obs-ffmpeg-nvenc.c
+          obs-ffmpeg-output.c
+          obs-ffmpeg-mux.c
+          obs-ffmpeg-mux.h
+          obs-ffmpeg-hls-mux.c
+          obs-ffmpeg-source.c
+          obs-ffmpeg-compat.h
+          obs-ffmpeg-formats.h
+          ${CMAKE_BINARY_DIR}/config/obs-ffmpeg-config.h)
 
-set(obs-ffmpeg_SOURCES
-	obs-ffmpeg.c
-	obs-ffmpeg-audio-encoders.c
-	obs-ffmpeg-nvenc.c
-	obs-ffmpeg-av1.c
-	obs-ffmpeg-output.c
-	obs-ffmpeg-mux.c
-	obs-ffmpeg-hls-mux.c
-	obs-ffmpeg-source.c)
+target_include_directories(obs-ffmpeg PRIVATE ${CMAKE_BINARY_DIR}/config)
 
-if(UNIX AND NOT APPLE)
-	list(APPEND obs-ffmpeg_SOURCES
-		obs-ffmpeg-vaapi.c)
-	LIST(APPEND obs-ffmpeg_PLATFORM_DEPS
-		${LIBVA_LBRARIES}
-		${LIBPCI_LIBRARIES})
-endif()
+target_link_libraries(
+  obs-ffmpeg
+  PRIVATE OBS::libobs
+          OBS::media-playback
+          OBS::opts-parser
+          FFmpeg::avcodec
+          FFmpeg::avfilter
+          FFmpeg::avformat
+          FFmpeg::avdevice
+          FFmpeg::avutil
+          FFmpeg::swscale
+          FFmpeg::swresample)
 
 if(ENABLE_FFMPEG_LOGGING)
-	list(APPEND obs-ffmpeg_SOURCES
-		obs-ffmpeg-logging.c)
+  target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-logging.c)
 endif()
 
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS FFmpeg module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-ffmpeg.rc)
-	list(APPEND obs-ffmpeg_SOURCES
-		jim-nvenc.c
-		jim-nvenc-helpers.c
-		obs-ffmpeg.rc)
-	list(APPEND obs-ffmpeg_HEADERS
-		jim-nvenc.h)
-endif()
+set_target_properties(obs-ffmpeg PROPERTIES FOLDER "plugins/obs-ffmpeg" PREFIX
+                                                                        "")
 
-add_library(obs-ffmpeg MODULE
-	${obs-ffmpeg_config_HEADERS}
-	${obs-ffmpeg_HEADERS}
-	${obs-ffmpeg_SOURCES})
-target_link_libraries(obs-ffmpeg
-	libobs
-	opts-parser
-	media-playback
-	${obs-ffmpeg_PLATFORM_DEPS}
-	${FFMPEG_LIBRARIES})
-set_target_properties(obs-ffmpeg PROPERTIES FOLDER "plugins/obs-ffmpeg")
+if(OS_WINDOWS)
+  if(MSVC)
+    target_link_libraries(obs-ffmpeg PRIVATE OBS::w32-pthreads)
+  endif()
 
-install_obs_plugin_with_data(obs-ffmpeg data)
+  set(MODULE_DESCRIPTION "OBS FFmpeg module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-ffmpeg.rc)
 
-add_subdirectory(ffmpeg-mux)
+  target_sources(obs-ffmpeg PRIVATE jim-nvenc.c jim-nvenc.h jim-nvenc-helpers.c
+                                    obs-ffmpeg.rc)
+
+elseif(OS_POSIX AND NOT OS_MACOS)
+  find_package(Libpci REQUIRED)
+  target_sources(obs-ffmpeg PRIVATE obs-ffmpeg-vaapi.c)
+  target_link_libraries(obs-ffmpeg PRIVATE LIBPCI::LIBPCI)
+endif()
+
+setup_plugin_target(obs-ffmpeg)

+ 11 - 17
plugins/obs-ffmpeg/ffmpeg-mux/CMakeLists.txt

@@ -1,27 +1,21 @@
 project(obs-ffmpeg-mux)
 
-if(DEBUG_FFMPEG_MUX)
-	add_definitions(-DDEBUG_FFMPEG)
-endif()
+option(ENABLE_FFMPEG_MUX_DEBUG "Enable FFmpeg-mux debugging" OFF)
 
-find_package(FFmpeg REQUIRED
-	COMPONENTS avcodec avutil avformat)
-include_directories(${FFMPEG_INCLUDE_DIRS})
+find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
 
-set(obs-ffmpeg-mux_SOURCES
-	ffmpeg-mux.c)
+add_executable(obs-ffmpeg-mux)
+add_executable(OBS::ffmpeg-mux ALIAS obs-ffmpeg-mux)
 
-set(obs-ffmpeg-mux_HEADERS
-	ffmpeg-mux.h)
+target_sources(obs-ffmpeg-mux PRIVATE ffmpeg-mux.c ffmpeg-mux.h)
 
-add_executable(obs-ffmpeg-mux
-	${obs-ffmpeg-mux_SOURCES}
-	${obs-ffmpeg-mux_HEADERS})
+target_link_libraries(obs-ffmpeg-mux PRIVATE OBS::libobs FFmpeg::avcodec
+                                             FFmpeg::avutil FFmpeg::avformat)
 
-target_link_libraries(obs-ffmpeg-mux
-	libobs
-	${FFMPEG_LIBRARIES})
+if(ENABLE_FFMPEG_MUX_DEBUG)
+  target_compile_definitions(obs-ffmpeg-mux PRIVATE ENABLE_FFMPEG_MUX_DEBUG)
+endif()
 
 set_target_properties(obs-ffmpeg-mux PROPERTIES FOLDER "plugins/obs-ffmpeg")
 
-install_obs_core(obs-ffmpeg-mux)
+setup_binary_target(obs-ffmpeg-mux)

+ 1 - 1
plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c

@@ -232,7 +232,7 @@ static bool get_audio_params(struct audio_params *audio, int *argc,
 static void ffmpeg_log_callback(void *param, int level, const char *format,
 				va_list args)
 {
-#ifdef DEBUG_FFMPEG
+#ifdef ENABLE_FFMPEG_MUX_DEBUG
 	char out_buffer[4096];
 	struct dstr out = {0};
 

+ 156 - 113
plugins/obs-filters/CMakeLists.txt

@@ -1,131 +1,174 @@
 project(obs-filters)
 
-option(DISABLE_SPEEXDSP "Disable building of the SpeexDSP-based Noise Suppression filter" OFF)
+option(ENABLE_SPEEXDSP
+       "Enable building with SpeexDSP-based noise suppression filter" ON)
+option(ENABLE_RNNOISE "Enable building with RNNoise noise supression filter" ON)
 
-if(DISABLE_SPEEXDSP)
-	message(STATUS "SpeexDSP support disabled")
-	set(LIBSPEEXDSP_FOUND FALSE)
-else()
-	find_package(Libspeexdsp)
-	if(LIBSPEEXDSP_FOUND)
-		add_definitions(-DLIBSPEEXDSP_ENABLED)
-	endif()
+if(OS_WINDOWS)
+  option(
+    ENABLE_NVAFX
+    "Enable building with NVIDIA Audio Effects SDK (requires redistributable to be installed)"
+    ON)
 endif()
 
-find_package(Librnnoise QUIET)
-add_definitions(-DLIBRNNOISE_ENABLED)
-if(NOT LIBRNNOISE_FOUND)
-	file(GLOB rnnoise_SOURCES
-		"rnnoise/src/*.c"
-		"rnnoise/src/*.h"
-		"rnnoise/include/*.h")
-	add_definitions(-DCOMPILE_OPUS)
-	if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux")
-		set_property(SOURCE ${rnnoise_SOURCES} PROPERTY COMPILE_FLAGS "-fvisibility=protected")
-	endif()
-	include_directories("rnnoise/include")
-	source_group("rnnoise" FILES ${rnnoise_SOURCES})
-	set(LIBRNNOISE_FOUND TRUE)
+add_library(obs-filters MODULE)
+add_library(OBS::filters ALIAS obs-filters)
+
+set(HAS_NOISEREDUCTION OFF)
+
+if(NOT ENABLE_SPEEXDSP)
+  message(STATUS "OBS:  DISABLED   SpeexDSP")
+else()
+  find_package(Libspeexdsp REQUIRED)
+
+  target_sources(obs-filters PRIVATE noise-suppress-filter.c)
+
+  target_link_libraries(obs-filters PRIVATE LibspeexDSP::LibspeexDSP)
+
+  target_compile_definitions(obs-filters PRIVATE LIBSPEEXDSP_ENABLED)
+
+  if(OS_WINDOWS)
+    target_link_options(obs-filters PRIVATE "LINKER:/LTCG")
+  endif()
 endif()
 
-if (WIN32)
-	if(DISABLE_NVAFX)
-		message(STATUS "NVIDIA Audio Effects SDK support disabled")
-		set(LIBNVAFX_FOUND FALSE)
-	else()
-		message(STATUS "NVIDIA Audio Effects SDK support enabled; requires redist to be installed by end-user")
-		add_definitions(-DLIBNVAFX_ENABLED)
-		set(LIBNVAFX_FOUND TRUE)
-	endif()
+if(NOT ENABLE_RNNOISE)
+  message(STATUS "OBS:  DISABLED   RNNoise")
+else()
+  find_package(Librnnoise QUIET)
+
+  if(NOT TARGET Librnnoise::Librnnoise)
+    message(STATUS "OBS:    -        using bundled RNNoise library")
+    add_library(obs-rnnoise INTERFACE)
+    add_library(Librnnoise::Librnnoise ALIAS obs-rnnoise)
+
+    set(_RNNOISE_SOURCES
+        rnnoise/src/arch.h
+        rnnoise/src/celt_lpc.c
+        rnnoise/src/celt_lpc.h
+        rnnoise/src/common.h
+        rnnoise/src/denoise.c
+        rnnoise/src/kiss_fft.c
+        rnnoise/src/kiss_fft.h
+        rnnoise/src/opus_types.h
+        rnnoise/src/pitch.c
+        rnnoise/src/pitch.h
+        rnnoise/src/rnn_data.c
+        rnnoise/src/rnn_data.h
+        rnnoise/src/rnn_reader.c
+        rnnoise/src/rnn.c
+        rnnoise/src/rnn.h
+        rnnoise/src/tansig_table.h
+        rnnoise/src/_kiss_fft_guts.h
+        rnnoise/include/rnnoise.h)
+
+    target_sources(obs-rnnoise INTERFACE ${_RNNOISE_SOURCES})
+
+    target_include_directories(
+      obs-rnnoise INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/rnnoise/include")
+
+    target_compile_definitions(obs-rnnoise INTERFACE COMPILE_OPUS)
+
+    if(OS_LINUX)
+      set_property(SOURCE ${_RNNOISE_SOURCES} PROPERTY COMPILE_FLAGS
+                                                       -fvisibility=hidden)
+    endif()
+
+    source_group("rnnoise" FILES ${_RNNOISE_SOURCES})
+  endif()
+
+  target_sources(obs-filters PRIVATE noise-suppress-filter.c)
+
+  target_link_libraries(obs-filters PRIVATE Librnnoise::Librnnoise)
+
+  target_compile_definitions(obs-filters PRIVATE LIBRNNOISE_ENABLED)
 endif()
 
-if(LIBSPEEXDSP_FOUND OR LIBRNNOISE_FOUND OR LIBNVAFX_FOUND)
-	set(obs-filters_NOISEREDUCTION_SOURCES
-		noise-suppress-filter.c)
-	if(LIBNVAFX_FOUND)
-		set(obs-filters_NOISEREDUCTION_HEADERS
-			nvafx-load.h)
-	else()
-		set(obs-filters_NOISEREDUCTION_HEADERS)
-	endif()
-	set(obs-filters_NOISEREDUCTION_LIBRARIES
-		${LIBSPEEXDSP_LIBRARIES} ${LIBRNNOISE_LIBRARIES})
-	set(NOISEREDUCTION_ENABLED TRUE)
+if(NOT ENABLE_NVAFX)
+  message(STATUS "OBS:  DISABLED   NVidia Audio FX support")
+  set(LIBNVAFX_FOUND OFF)
 else()
-	set(NOISEREDUCTION_ENABLED FALSE)
+  message(STATUS "OBS:  ENABLED    NVidia Audio FX support")
+
+  target_compile_definitions(obs-filters PRIVATE LIBNVAFX_ENABLED)
+
+  set(LIBNVAFX_FOUND ON)
+endif()
+
+if(TARGET Librnnoise::Librnnoise
+   OR TARGET LibspeexDSP::LibspeexDSP
+   OR LIBNVAFX_FOUND)
+  target_compile_definitions(obs-filters PRIVATE HAS_NOISEREDUCTION)
 endif()
 
-configure_file("${CMAKE_CURRENT_SOURCE_DIR}/obs-filters-config.h.in"
-	"${CMAKE_BINARY_DIR}/plugins/obs-filters/config/obs-filters-config.h")
+target_sources(
+  obs-filters
+  PRIVATE obs-filters.c
+          color-correction-filter.c
+          async-delay-filter.c
+          gpu-delay.c
+          crop-filter.c
+          scale-filter.c
+          scroll-filter.c
+          chroma-key-filter.c
+          color-key-filter.c
+          color-grade-filter.c
+          sharpness-filter.c
+          gain-filter.c
+          noise-gate-filter.c
+          mask-filter.c
+          invert-audio-polarity.c
+          compressor-filter.c
+          limiter-filter.c
+          expander-filter.c
+          luma-key-filter.c)
+
+if(NOT OS_MACOS)
+  target_sources(
+    obs-filters
+    PRIVATE data/blend_add_filter.effect
+            data/blend_mul_filter.effect
+            data/blend_sub_filter.effect
+            data/chroma_key_filter.effect
+            data/chroma_key_filter_v2.effect
+            data/color_correction_filter.effect
+            data/color_grade_filter.effect
+            data/color_key_filter.effect
+            data/color_key_filter_v2.effect
+            data/crop_filter.effect
+            data/luma_key_filter.effect
+            data/luma_key_filter_v2.effect
+            data/mask_alpha_filter.effect
+            data/mask_color_filter.effect
+            data/sharpness.effect)
 
-set(obs-filters_config_HEADERS
-	"${CMAKE_BINARY_DIR}/plugins/obs-filters/config/obs-filters-config.h")
-include_directories(${LIBSPEEXDSP_INCLUDE_DIRS} ${LIBRNNOISE_INCLUDE_DIRS}
-	"${CMAKE_BINARY_DIR}/plugins/obs-filters/config")
+  get_target_property(_SOURCES obs-filters SOURCES)
+  set(_FILTERS ${_SOURCES})
+  list(FILTER _FILTERS INCLUDE REGEX ".*\\.effect")
 
-if(MSVC)
-	set(obs-filters_PLATFORM_DEPS
-		w32-pthreads)
+  source_group(
+    TREE "${CMAKE_CURRENT_SOURCE_DIR}"
+    PREFIX "Effect Files"
+    FILES ${_FILTERS})
 endif()
 
-set(obs-filters_SOURCES
-	obs-filters.c
-	color-correction-filter.c
-	async-delay-filter.c
-	gpu-delay.c
-	crop-filter.c
-	scale-filter.c
-	scroll-filter.c
-	chroma-key-filter.c
-	color-key-filter.c
-	color-grade-filter.c
-	sharpness-filter.c
-	gain-filter.c
-	noise-gate-filter.c
-	mask-filter.c
-	invert-audio-polarity.c
-	compressor-filter.c
-	limiter-filter.c
-	expander-filter.c
-	luma-key-filter.c)
-
-set(obs-filters_data_EFFECTS
-	data/blend_add_filter.effect
-	data/blend_mul_filter.effect
-	data/blend_sub_filter.effect
-	data/chroma_key_filter.effect
-	data/chroma_key_filter_v2.effect
-	data/color_correction_filter.effect
-	data/color_grade_filter.effect
-	data/color_key_filter.effect
-	data/color_key_filter_v2.effect
-	data/crop_filter.effect
-	data/luma_key_filter.effect
-	data/luma_key_filter_v2.effect
-	data/mask_alpha_filter.effect
-	data/mask_color_filter.effect
-	data/sharpness.effect)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS A/V Filters")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-filters.rc)
-	list(APPEND obs-filters_SOURCES
-		obs-filters.rc)
+target_include_directories(
+  obs-filters PRIVATE $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/config>)
+
+target_link_libraries(obs-filters PRIVATE OBS::libobs)
+
+set_target_properties(obs-filters PROPERTIES FOLDER "plugins" PREFIX "")
+
+if(OS_WINDOWS)
+  if(MSVC)
+    target_link_libraries(obs-filters PRIVATE OBS::w32-pthreads)
+  endif()
+
+  set(MODULE_DESCRIPTION "OBS A/V Filters")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-filters.rc)
+
+  target_sources(obs-filters PRIVATE obs-filters.rc)
 endif()
 
-add_library(obs-filters MODULE
-	${rnnoise_SOURCES}
-	${obs-filters_SOURCES}
-	${obs-filters_config_HEADERS}
-	${obs-filters_data_EFFECTS}
-	${obs-filters_NOISEREDUCTION_SOURCES}
-	${obs-filters_NOISEREDUCTION_HEADERS})
-target_link_libraries(obs-filters
-	libobs
-	${obs-filters_PLATFORM_DEPS}
-	${obs-filters_NOISEREDUCTION_LIBRARIES})
-set_target_properties(obs-filters PROPERTIES FOLDER "plugins")
-
-source_group("data\\Effect Files" FILES ${obs-filters_data_EFFECTS})
-
-install_obs_plugin_with_data(obs-filters data)
+setup_plugin_target(obs-filters)

+ 2 - 2
plugins/obs-filters/noise-suppress-filter.c

@@ -334,8 +334,8 @@ failure:
 }
 
 static inline void alloc_channel(struct noise_suppress_data *ng,
-				 uint32_t sample_rate, size_t channel,
-				 size_t frames)
+				 uint32_t sample_rate OBS_UNUSED,
+				 size_t channel, size_t frames)
 {
 #ifdef LIBSPEEXDSP_ENABLED
 	ng->spx_states[channel] =

+ 1 - 1
plugins/obs-filters/obs-filters-config.h.in

@@ -8,4 +8,4 @@
 #define FALSE 0
 #endif
 
-#define NOISEREDUCTION_ENABLED @NOISEREDUCTION_ENABLED@
+#cmakedefine HAS_NOISEREDUCTION

+ 2 - 3
plugins/obs-filters/obs-filters.c

@@ -1,5 +1,4 @@
 #include <obs-module.h>
-#include "obs-filters-config.h"
 
 OBS_DECLARE_MODULE()
 OBS_MODULE_USE_DEFAULT_LOCALE("obs-filters", "en-US")
@@ -25,7 +24,7 @@ extern struct obs_source_info sharpness_filter_v2;
 extern struct obs_source_info chroma_key_filter;
 extern struct obs_source_info chroma_key_filter_v2;
 extern struct obs_source_info async_delay_filter;
-#if NOISEREDUCTION_ENABLED
+#if defined(HAS_NOISEREDUCTION)
 extern struct obs_source_info noise_suppress_filter;
 extern struct obs_source_info noise_suppress_filter_v2;
 extern bool load_nvafx(void);
@@ -58,7 +57,7 @@ bool obs_module_load(void)
 	obs_register_source(&chroma_key_filter);
 	obs_register_source(&chroma_key_filter_v2);
 	obs_register_source(&async_delay_filter);
-#if NOISEREDUCTION_ENABLED
+#if defined(HAS_NOISEREDUCTION)
 #ifdef LIBNVAFX_ENABLED
 	/* load nvidia audio fx dll */
 	load_nvafx();

+ 13 - 21
plugins/obs-libfdk/CMakeLists.txt

@@ -1,29 +1,21 @@
 project(obs-libfdk)
 
-if(DISABLE_LIBFDK)
-	message(STATUS "Libfdk support disabled")
-	return()
-endif()
+option(ENABLE_LIBFDK "Enable FDK AAC support" OFF)
 
-find_package(Libfdk QUIET)
-if(NOT LIBFDK_FOUND AND ENABLE_LIBFDK)
-	message(FATAL_ERROR "Libfdk not found but set as enabled")
-elseif(NOT LIBFDK_FOUND)
-	message(STATUS "Libfdk not found - obs-libfdk plugin disabled")
-	return()
+if(NOT ENABLE_LIBFDK)
+  message(STATUS "OBS:  DISABLED   obs-libfdk")
+  return()
 endif()
 
-include_directories(${LIBFDK_INCLUDE_DIRS})
-add_definitions(${LIBFDK_DEFINITIONS})
+find_package(Libfdk REQUIRED)
+
+add_library(obs-libfdk MODULE)
+add_library(OBS::libfdk ALIAS obs-libfdk)
+
+target_sources(obs-libfdk PRIVATE obs-libfdk.c)
 
-set(obs-libfdk_SOURCES
-	obs-libfdk.c)
+target_link_libraries(obs-libfdk PRIVATE OBS::libobs LibFDK::LibFDK)
 
-add_library(obs-libfdk MODULE
-	${obs-libfdk_SOURCES})
-target_link_libraries(obs-libfdk
-	libobs
-	${LIBFDK_LIBRARIES})
-set_target_properties(obs-libfdk PROPERTIES FOLDER "plugins")
+set_target_properties(obs-libfdk PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(obs-libfdk data)
+setup_plugin_target(obs-libfdk)

+ 165 - 179
plugins/obs-outputs/CMakeLists.txt

@@ -1,200 +1,186 @@
 project(obs-outputs)
 
-set(WITH_RTMPS AUTO CACHE STRING "Enable RTMPS support with mbedTLS")
-set_property(CACHE WITH_RTMPS PROPERTY STRINGS AUTO ON OFF)
-
-find_package(PkgConfig)
-
-option(STATIC_MBEDTLS "Statically link mbedTLS into binary" OFF)
-
-if (WITH_RTMPS STREQUAL "AUTO")
-	find_package(MbedTLS)
-	find_package(ZLIB)
-	if (NOT MBEDTLS_FOUND OR NOT ZLIB_FOUND)
-		set(WITH_RTMPS "OFF")
-		message(WARNING "mbedTLS or zlib was not found, RTMPS will be auto-disabled")
-	endif()
+if(NOT DEFINED ENABLE_RTMPS)
+  set(ENABLE_RTMPS
+      AUTO
+      CACHE STRING "Enable RTMPS support with mbedTLS" FORCE)
+  set_property(CACHE ENABLE_RTMPS PROPERTY STRINGS AUTO ON OFF)
 endif()
 
-if (WITH_RTMPS)
-	find_package(MbedTLS REQUIRED)
-	find_package(ZLIB REQUIRED)
-	add_definitions(-DCRYPTO -DUSE_MBEDTLS)
-	include_directories(${MBEDTLS_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIRS})
-else()
-	add_definitions(-DNO_CRYPTO)
-endif()
-
-set(COMPILE_FTL FALSE)
-
-if (PKG_CONFIG_FOUND)
-	pkg_check_modules(FTL libftl)
-endif()
+option(ENABLE_STATIC_MBEDTLS "Enable statically linking mbedTLS into binary"
+       OFF)
+mark_as_advanced(ENABLE_STATIC_MBEDTLS)
 
-if (FTL_FOUND)
-	find_package(Libcurl REQUIRED)
-	message(STATUS "Found ftl-sdk (system): ftl outputs enabled")
-
-	set(ftl_SOURCES ftl-stream.c)
-
-	include_directories(${LIBCURL_INCLUDE_DIRS} ${FTL_INCLUDE_DIRS})
-	set(COMPILE_FTL TRUE)
-elseif (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt")
-	find_package(Libcurl REQUIRED)
-	message(STATUS "Found ftl-sdk: ftl outputs enabled")
-
-	add_definitions(-DFTL_STATIC_COMPILE)
-
-	include_directories(${LIBCURL_INCLUDE_DIRS})
-
-	set(ftl_SOURCES
-		ftl-stream.c
-		ftl-sdk/libftl/hmac/hmac.c
-		ftl-sdk/libftl/hmac/sha2.c
-		ftl-sdk/libftl/ftl-sdk.c
-		ftl-sdk/libftl/handshake.c
-		ftl-sdk/libftl/ingest.c
-		ftl-sdk/libftl/ftl_helpers.c
-		ftl-sdk/libftl/media.c
-		ftl-sdk/libftl/gettimeofday/gettimeofday.c
-		ftl-sdk/libftl/logging.c)
-	set(ftl_HEADERS
-		ftl-sdk/libftl/hmac/hmac.h
-		ftl-sdk/libftl/hmac/sha2.h
-		ftl-sdk/libftl/ftl.h
-		ftl-sdk/libftl/ftl_private.h)
-	set(ftl_IMPORTS
-		${OBS_JANSSON_IMPORT}
-		${LIBCURL_LIBRARIES})
-
-	if (WIN32)
-		list(APPEND ftl_SOURCES
-			ftl-sdk/libftl/win32/socket.c
-			ftl-sdk/libftl/gettimeofday/gettimeofday.c
-			ftl-sdk/libftl/win32/threads.c)
-		list(APPEND ftl_HEADERS
-			ftl-sdk/libftl/gettimeofday/gettimeofday.h
-			ftl-sdk/libftl/win32/threads.h)
-
-		include_directories(ftl-sdk/libftl/win32)
-	else()
-		list(APPEND ftl_SOURCES
-			ftl-sdk/libftl/posix/socket.c
-			ftl-sdk/libftl/posix/threads.c)
-		list(APPEND ftl_HEADERS
-			ftl-sdk/libftl/posix/threads.h)
-
-		include_directories(ftl-sdk/libftl/posix)
-	endif()
-
-	include_directories(ftl-sdk/libftl)
-
-	set(COMPILE_FTL TRUE)
-endif()
+add_library(obs-outputs MODULE)
+add_library(OBS::outputs ALIAS obs-outputs)
 
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/obs-outputs-config.h.in"
-	"${CMAKE_BINARY_DIR}/plugins/obs-outputs/config/obs-outputs-config.h")
+target_sources(
+  obs-outputs
+  PRIVATE obs-outputs.c
+          obs-output-ver.h
+          flv-mux.c
+          flv-mux.h
+          flv-output.c
+          net-if.c
+          net-if.h
+          null-output.c
+          rtmp-helpers.h
+          rtmp-stream.c
+          rtmp-stream.h
+          rtmp-windows.c)
 
-include_directories("${CMAKE_BINARY_DIR}/plugins/obs-outputs/config")
+target_link_libraries(obs-outputs PRIVATE OBS::libobs)
 
-if(WIN32)
-	set(obs-outputs_PLATFORM_DEPS
-		ws2_32
-		winmm
-		Iphlpapi)
+set_target_properties(obs-outputs PROPERTIES FOLDER "plugins" PREFIX "")
 
-	if (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO"))
-		SET(obs-outputs_PLATFORM_DEPS
-			${obs-outputs_PLATFORM_DEPS}
-			crypt32)
-	endif()
-endif()
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS output module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-outputs.rc)
 
-if(MSVC)
-	set(obs-outputs_PLATFORM_DEPS
-		${obs-outputs_PLATFORM_DEPS}
-		w32-pthreads)
-endif()
+  target_sources(obs-outputs PRIVATE obs-outputs.rc)
 
-if(APPLE AND (WITH_RTMPS OR (WITH_RTMPS STREQUAL "AUTO")))
-	find_library(FOUNDATION_FRAMEWORK Foundation)
-	find_library(SECURITY_FRAMEWORK Security)
+  if(MSVC)
+    target_link_libraries(obs-outputs PRIVATE OBS::w32-pthreads)
+  endif()
 
-	set(obs-outputs_PLATFORM_DEPS
-		${obs-outputs_PLATFORM_DEPS}
-		${FOUNDATION_FRAMEWORK}
-		${SECURITY_FRAMEWORK})
+  target_link_libraries(obs-outputs PRIVATE ws2_32 winmm Iphlpapi)
 endif()
 
-set(obs-outputs_librtmp_HEADERS
-	librtmp/amf.h
-	librtmp/bytes.h
-	librtmp/cencode.h
-	librtmp/dh.h
-	librtmp/dhgroups.h
-	librtmp/handshake.h
-	librtmp/http.h
-	librtmp/log.h
-	librtmp/md5.h
-	librtmp/rtmp.h
-	librtmp/rtmp_sys.h)
-set(obs-outputs_librtmp_SOURCES
-	librtmp/amf.c
-	librtmp/cencode.c
-	librtmp/hashswf.c
-	librtmp/log.c
-	librtmp/md5.c
-	librtmp/parseurl.c
-	librtmp/rtmp.c)
-
-if(NOT WIN32)
-	set_source_files_properties(${obs-outputs_librtmp_SOURCES} PROPERTIES
-		COMPILE_FLAGS "-fvisibility=hidden")
+if(ENABLE_RTMPS STREQUAL "AUTO" OR ENABLE_RTMPS STREQUAL "ON")
+  find_package(MbedTLS)
+  find_package(ZLIB)
+  if(NOT MBEDTLS_FOUND OR NOT ZLIB_FOUND)
+    if(ENABLE_RTMPS STREQUAL "ON")
+      message(
+        FATAL_ERROR
+          "OBS:    -        mbedTLS or zlib not found, but required for RTMPS support."
+      )
+      return()
+    else()
+      message(
+        WARNING
+          "OBS:    -        mbedTLS or zlib was not found, RTMPS will be auto-disabled"
+      )
+      target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO)
+    endif()
+  else()
+    target_sources(
+      obs-outputs
+      PRIVATE librtmp/amf.c
+              librtmp/amf.h
+              librtmp/bytes.h
+              librtmp/cencode.c
+              librtmp/cencode.h
+              librtmp/dh.h
+              librtmp/dhgroups.h
+              librtmp/handshake.h
+              librtmp/hashswf.c
+              librtmp/http.h
+              librtmp/log.c
+              librtmp/log.h
+              librtmp/md5.c
+              librtmp/md5.h
+              librtmp/parseurl.c
+              librtmp/rtmp.c
+              librtmp/rtmp.h
+              librtmp/rtmp_sys.h)
+
+    target_compile_definitions(obs-outputs PRIVATE USE_MBEDTLS CRYPTO)
+
+    target_link_libraries(obs-outputs PRIVATE Mbedtls::Mbedtls ZLIB::ZLIB)
+
+    if(OS_WINDOWS)
+      target_link_libraries(obs-outputs PRIVATE crypt32)
+
+    elseif(OS_MACOS)
+      find_library(FOUNDATION_FRAMEWORK Foundation)
+      find_library(SECURITY_FRAMEWORK Security)
+      mark_as_advanced(FOUNDATION_FRAMEWORK SECURITY_FRAMEWORK)
+
+      target_link_libraries(obs-outputs PRIVATE ${FOUNDATION_FRAMEWORK}
+                                                ${SECURITY_FRAMEWORK})
+      set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden)
+
+    elseif(OS_POSIX)
+      set_target_properties(obs-outputs PROPERTIES CXX_VISIBILITY_PRESET hidden)
+    endif()
+  endif()
+else()
+  target_compile_definitions(obs-outputs PRIVATE NO_CRYPTO)
 endif()
 
-set(obs-outputs_HEADERS
-	"${CMAKE_BINARY_DIR}/plugins/obs-outputs/config/obs-outputs-config.h"
-	obs-output-ver.h
-	rtmp-helpers.h
-	rtmp-stream.h
-	net-if.h
-	flv-mux.h)
-set(obs-outputs_SOURCES
-	obs-outputs.c
-	null-output.c
-	rtmp-stream.c
-	rtmp-windows.c
-	flv-output.c
-	flv-mux.c
-	net-if.c)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS output module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-outputs.rc)
-	list(APPEND obs-outputs_SOURCES
-		obs-outputs.rc)
+find_package(PkgConfig QUIET)
+if(PKG_CONFIG_FOUND)
+  pkg_check_modules(FTL QUIET libftl)
 endif()
 
-add_library(obs-outputs MODULE
-	${ftl_SOURCES}
-	${ftl_HEADERS}
-	${obs-outputs_SOURCES}
-	${obs-outputs_HEADERS}
-	${obs-outputs_librtmp_SOURCES}
-	${obs-outputs_librtmp_HEADERS})
-
 if(FTL_FOUND)
-	target_link_libraries(obs-outputs ${FTL_LIBRARIES})
-	target_include_directories(obs-outputs PUBLIC ${FTL_INCLUDE_DIRS})
+  find_package(CURL REQUIRED)
+  message(STATUS "OBS:  ENABLED    ftl outputs (system ftl-sdk)")
+
+  target_sources(obs-outputs PRIVATE ftl-stream.c)
+
+  target_include_directories(obs-outputs PRIVATE ${FTL_INCLUDE_DIRS})
+
+  target_link_libraries(obs-outputs PRIVATE ${FTL_LIBRARIES} CURL::libcurl)
+
+  target_compile_features(obs-outputs PRIVATE c_std_11)
+
+  target_compile_definitions(obs-outputs PRIVATE FTL_FOUND)
+
+elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/CMakeLists.txt")
+  find_package(CURL REQUIRED)
+  message(STATUS "OBS:  ENABLED    ftl ouputs (bundled ftl-sdk)")
+
+  target_compile_definitions(obs-outputs PRIVATE FTL_STATIC_COMPILE)
+
+  target_compile_features(obs-outputs PRIVATE c_std_11)
+
+  target_link_libraries(obs-outputs PRIVATE Jansson::Jansson CURL::libcurl)
+
+  target_sources(
+    obs-outputs
+    PRIVATE ftl-stream.c
+            ftl-sdk/libftl/ftl.h
+            ftl-sdk/libftl/ftl_private.h
+            ftl-sdk/libftl/hmac/hmac.c
+            ftl-sdk/libftl/hmac/hmac.h
+            ftl-sdk/libftl/hmac/sha2.c
+            ftl-sdk/libftl/hmac/sha2.h
+            ftl-sdk/libftl/ftl-sdk.c
+            ftl-sdk/libftl/handshake.c
+            ftl-sdk/libftl/ingest.c
+            ftl-sdk/libftl/ftl_helpers.c
+            ftl-sdk/libftl/media.c
+            ftl-sdk/libftl/gettimeofday/gettimeofday.c
+            ftl-sdk/libftl/logging.c)
+
+  target_include_directories(obs-outputs
+                             PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl)
+
+  if(OS_WINDOWS)
+    target_sources(
+      obs-outputs
+      PRIVATE ftl-sdk/libftl/gettimeofday/gettimeofday.c
+              ftl-sdk/libftl/gettimeofday/gettimeofday.h
+              ftl-sdk/libftl/win32/socket.c
+              ftl-sdk/libftl/win32/threads.c
+              ftl-sdk/libftl/win32/threads.h)
+
+    target_include_directories(
+      obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/win32)
+  elseif(OS_POSIX)
+    target_sources(
+      obs-outputs
+      PRIVATE ftl-sdk/libftl/posix/socket.c ftl-sdk/libftl/posix/threads.c
+              ftl-sdk/libftl/posix/threads.h)
+
+    target_include_directories(
+      obs-outputs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ftl-sdk/libftl/posix)
+  endif()
+
+  target_compile_definitions(obs-outputs PRIVATE FTL_FOUND)
 endif()
 
-target_link_libraries(obs-outputs
-	libobs
-	${MBEDTLS_LIBRARIES}
-	${ZLIB_LIBRARIES}
-	${ftl_IMPORTS}
-	${obs-outputs_PLATFORM_DEPS})
-set_target_properties(obs-outputs PROPERTIES FOLDER "plugins")
-
-install_obs_plugin_with_data(obs-outputs data)
+setup_plugin_target(obs-outputs)

+ 1 - 1
plugins/obs-outputs/obs-outputs-config.h.in

@@ -12,4 +12,4 @@
 #define FALSE 0
 #endif
 
-#define COMPILE_FTL @COMPILE_FTL@
+#cmakedefine FTL_FOUND

+ 2 - 4
plugins/obs-outputs/obs-outputs.c

@@ -1,7 +1,5 @@
 #include <obs-module.h>
 
-#include "obs-outputs-config.h"
-
 #ifdef _WIN32
 #include <winsock2.h>
 #include <mbedtls/threading.h>
@@ -17,7 +15,7 @@ MODULE_EXPORT const char *obs_module_description(void)
 extern struct obs_output_info rtmp_output_info;
 extern struct obs_output_info null_output_info;
 extern struct obs_output_info flv_output_info;
-#if COMPILE_FTL
+#if defined(FTL_FOUND)
 extern struct obs_output_info ftl_output_info;
 #endif
 
@@ -67,7 +65,7 @@ bool obs_module_load(void)
 	obs_register_output(&rtmp_output_info);
 	obs_register_output(&null_output_info);
 	obs_register_output(&flv_output_info);
-#if COMPILE_FTL
+#if defined(FTL_FOUND)
 	obs_register_output(&ftl_output_info);
 #endif
 	return true;

+ 116 - 98
plugins/obs-qsv11/CMakeLists.txt

@@ -1,111 +1,129 @@
 option(ENABLE_QSV11 "Build Intel QSV11 Hardware Encoder." TRUE)
 
 if(NOT ENABLE_QSV11)
-	message(STATUS "NOT building Intel QSV11 Hardware Encoder.")
-	return()
+  message(STATUS "OBS:  DISABLED   obs-qsv11")
+  return()
 endif()
 
 project(obs-qsv11)
 
-include_directories(libmfx/include/msdk/include)
-include_directories(libmfx/include)
-
-set(obs-qsv11_libmfx_SOURCES
-	libmfx/src/main.cpp
-	libmfx/src/mfx_critical_section.cpp
-	libmfx/src/mfx_dispatcher.cpp
-	libmfx/src/mfx_dispatcher_log.cpp
-	libmfx/src/mfx_driver_store_loader.cpp
-	libmfx/src/mfx_dxva2_device.cpp
-	libmfx/src/mfx_function_table.cpp
-	libmfx/src/mfx_library_iterator.cpp
-	libmfx/src/mfx_load_dll.cpp
-	libmfx/src/mfx_load_plugin.cpp
-	libmfx/src/mfx_plugin_hive.cpp
-	libmfx/src/mfx_win_reg_key.cpp
-	)
-
-set(obs-qsv11_libmfx_HEADERS
-	libmfx/include/msdk/include/mfxadapter.h
-	libmfx/include/msdk/include/mfxastructures.h
-	libmfx/include/msdk/include/mfxaudio.h
-	libmfx/include/msdk/include/mfxaudio++.h
-	libmfx/include/msdk/include/mfxcommon.h
-	libmfx/include/msdk/include/mfxdefs.h
-	libmfx/include/msdk/include/mfxjpeg.h
-	libmfx/include/msdk/include/mfxmvc.h
-	libmfx/include/msdk/include/mfxplugin.h
-	libmfx/include/msdk/include/mfxplugin++.h
-	libmfx/include/msdk/include/mfxsession.h
-	libmfx/include/msdk/include/mfxstructures.h
-	libmfx/include/msdk/include/mfxvideo.h
-	libmfx/include/msdk/include/mfxvideo++.h
-	libmfx/include/msdk/include/mfxvstructures.h
-	libmfx/include/mfx_critical_section.h
-	libmfx/include/mfx_dispatcher.h
-	libmfx/include/mfx_dispatcher_defs.h
-	libmfx/include/mfx_dispatcher_log.h
-	libmfx/include/mfx_driver_store_loader.h
-	libmfx/include/mfx_dxva2_device.h
-	libmfx/include/mfx_exposed_functions_list.h
-	libmfx/include/mfx_library_iterator.h
-	libmfx/include/mfx_load_dll.h
-	libmfx/include/mfx_load_plugin.h
-	libmfx/include/mfx_plugin_hive.h
-	libmfx/include/mfx_vector.h
-	libmfx/include/mfx_win_reg_key.h
-	libmfx/include/mfxaudio_exposed_functions_list.h
-	)
-
-set(obs-qsv11_SOURCES
-	common_directx9.cpp
-	common_directx11.cpp
-	common_utils.cpp
-	common_utils_windows.cpp
-	device_directx9.cpp
-	QSV_Encoder.cpp
-	QSV_Encoder_Internal.cpp
-	obs-qsv11.c
-	obs-qsv11-plugin-main.c)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS QSV encoder")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-qsv11.rc)
-	list(APPEND obs-qsv11_SOURCES
-		obs-qsv11.rc)
-endif()
+add_library(obs-qsv11 MODULE)
+add_library(OBS::qsv11 ALIAS obs-qsv11)
+
+add_library(libmfx INTERFACE)
+add_library(OBS::libmfx ALIAS libmfx)
+
+target_sources(
+  libmfx
+  INTERFACE libmfx/src/main.cpp
+            libmfx/src/mfx_critical_section.cpp
+            libmfx/src/mfx_dispatcher.cpp
+            libmfx/src/mfx_dispatcher_log.cpp
+            libmfx/src/mfx_driver_store_loader.cpp
+            libmfx/src/mfx_dxva2_device.cpp
+            libmfx/src/mfx_function_table.cpp
+            libmfx/src/mfx_library_iterator.cpp
+            libmfx/src/mfx_load_dll.cpp
+            libmfx/src/mfx_load_plugin.cpp
+            libmfx/src/mfx_plugin_hive.cpp
+            libmfx/src/mfx_win_reg_key.cpp
+            libmfx/include/msdk/include/mfxadapter.h
+            libmfx/include/msdk/include/mfxastructures.h
+            libmfx/include/msdk/include/mfxaudio.h
+            libmfx/include/msdk/include/mfxaudio++.h
+            libmfx/include/msdk/include/mfxcommon.h
+            libmfx/include/msdk/include/mfxdefs.h
+            libmfx/include/msdk/include/mfxjpeg.h
+            libmfx/include/msdk/include/mfxmvc.h
+            libmfx/include/msdk/include/mfxplugin.h
+            libmfx/include/msdk/include/mfxplugin++.h
+            libmfx/include/msdk/include/mfxsession.h
+            libmfx/include/msdk/include/mfxstructures.h
+            libmfx/include/msdk/include/mfxvideo.h
+            libmfx/include/msdk/include/mfxvideo++.h
+            libmfx/include/msdk/include/mfxvstructures.h
+            libmfx/include/mfx_critical_section.h
+            libmfx/include/mfx_dispatcher.h
+            libmfx/include/mfx_dispatcher_defs.h
+            libmfx/include/mfx_dispatcher_log.h
+            libmfx/include/mfx_driver_store_loader.h
+            libmfx/include/mfx_dxva2_device.h
+            libmfx/include/mfx_exposed_functions_list.h
+            libmfx/include/mfx_library_iterator.h
+            libmfx/include/mfx_load_dll.h
+            libmfx/include/mfx_load_plugin.h
+            libmfx/include/mfx_plugin_hive.h
+            libmfx/include/mfx_vector.h
+            libmfx/include/mfx_win_reg_key.h
+            libmfx/include/mfxaudio_exposed_functions_list.h)
+
+target_include_directories(
+  libmfx INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libmfx/include/msdk/include
+                   ${CMAKE_CURRENT_SOURCE_DIR}/libmfx/include)
 
-set(obs-qsv11_HEADERS
-	bits/linux_defs.h
-	bits/windows_defs.h
-	common_directx9.h
-	common_directx11.h
-	device_directx9.h
-	common_utils.h
-	QSV_Encoder.h
-	QSV_Encoder_Internal.h)
-
-add_library(obs-qsv11 MODULE
-	${obs-qsv11_SOURCES}
-	${obs-qsv11_HEADERS}
-	${obs-qsv11_libmfx_SOURCES}
-	${obs-qsv11_libmfx_HEADERS}
-	)
-target_link_libraries(obs-qsv11
-	libobs
-	d3d9
-	d3d11
-	dxva2
-	dxgi
-	dxguid
-	)
+target_sources(
+  obs-qsv11
+  PRIVATE obs-qsv11.c
+          obs-qsv11-plugin-main.c
+          common_directx9.cpp
+          common_directx9.h
+          common_directx11.cpp
+          common_directx11.h
+          common_utils.cpp
+          common_utils.h
+          common_utils_windows.cpp
+          device_directx9.cpp
+          device_directx9.h
+          QSV_Encoder.cpp
+          QSV_Encoder.h
+          QSV_Encoder_Internal.cpp
+          QSV_Encoder_Internal.h
+          bits/linux_defs.h
+          bits/windows_defs.h)
+
+target_link_libraries(
+  obs-qsv11
+  PRIVATE OBS::libobs
+          OBS::libmfx
+          d3d9
+          d3d11
+          dxva2
+          dxgi
+          dxguid)
 
 target_compile_definitions(obs-qsv11 PRIVATE DX11_D3D)
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS QSV encoder")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-qsv11.rc)
+
+  target_sources(obs-qsv11 PRIVATE obs-qsv11.rc)
+
+  target_compile_definitions(
+    obs-qsv11 PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
+                      _CRT_NONSTDC_NO_WARNINGS)
+endif()
+
 set_target_properties(obs-qsv11 PROPERTIES FOLDER "plugins")
 
-source_group("obs-qsv11\\Source Files" FILES ${obs-qsv11_SOURCES})
-source_group("obs-qsv11\\Header Files" FILES ${obs-qsv11_HEADERS})
-source_group("libmfx\\Source Files" FILES ${obs-qsv11_libmfx_SOURCES})
-source_group("libmfx\\Header Files" FILES ${obs-qsv11_libmfx_HEADERS})
+file(GLOB _OBS_QSV11_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.c
+     ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
+file(GLOB _OBS_QSV11_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h
+     ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp)
+
+source_group("obs-qsv11\\Source Files" FILES ${_OBS_QSV11_SOURCE_FILES})
+source_group("obs-qsv11\\Header Files" FILES ${_OBS_QSV11_HEADER_FILES})
+
+get_target_property(_LIBMFX_SOURCES OBS::libmfx INTERFACE_SOURCES)
+
+foreach(_LIBMFX_SOURCE ${_LIBMFX_SOURCES})
+  get_filename_component(_EXT ${_LIBMFX_SOURCE} EXT)
+  if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h")
+    source_group("libmfx\\Header Files" FILES ${_LIBMFX_SOURCE})
+  elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c")
+    source_group("libmfx\\Source Files" FILES ${_LIBMFX_SOURCE})
+  endif()
+endforeach()
 
-install_obs_plugin_with_data(obs-qsv11 data)
+setup_plugin_target(obs-qsv11)

+ 18 - 21
plugins/obs-text/CMakeLists.txt

@@ -1,25 +1,22 @@
-if (NOT WIN32)
-	return()
-endif()
-
 project(obs-text)
 
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS GDI+ text module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-text.rc)
-	set(obs-text_PLATFORM_SOURCES
-		gdiplus/obs-text.cpp
-		obs-text.rc)
-	set(obs-text_PLATFORM_DEPS
-		gdiplus)
-endif()
-
-add_library(obs-text MODULE
-	${obs-text_PLATFORM_SOURCES}
-	${obs-text_PLATFORM_HEADERS})
-target_link_libraries(obs-text
-	libobs
-	${obs-text_PLATFORM_DEPS})
+add_library(obs-text MODULE)
+add_library(OBS::text ALIAS obs-text)
+
+target_link_libraries(obs-text PRIVATE OBS::libobs)
+
 set_target_properties(obs-text PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(obs-text data)
+set(MODULE_DESCRIPTION "OBS GDI+ text module")
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               obs-text.rc)
+
+target_sources(obs-text PRIVATE gdiplus/obs-text.cpp obs-text.rc)
+
+target_link_libraries(obs-text PRIVATE gdiplus)
+
+target_compile_definitions(
+  obs-text PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
+                   _CRT_NONSTDC_NO_WARNINGS)
+
+setup_plugin_target(obs-text)

+ 25 - 22
plugins/obs-transitions/CMakeLists.txt

@@ -1,27 +1,30 @@
 project(obs-transitions)
 
-set(obs-transitions_SOURCES
-	obs-transitions.c
-	transition-slide.c
-	transition-swipe.c
-	transition-fade.c
-	transition-cut.c
-	transition-fade-to-color.c
-	transition-luma-wipe.c
-	transition-stinger.c
-	)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS Transitions module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-transitions.rc)
-	list(APPEND obs-transitions_SOURCES
-		obs-transitions.rc)
+add_library(obs-transitions MODULE)
+add_library(OBS::transition ALIAS obs-transitions)
+
+target_sources(
+  obs-transitions
+  PRIVATE obs-transitions.c
+          transition-slide.c
+          transition-swipe.c
+          transition-fade.c
+          transition-cut.c
+          transition-fade-to-color.c
+          transition-luma-wipe.c
+          transition-stinger.c)
+
+target_link_libraries(obs-transitions PRIVATE OBS::libobs)
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS Transitions module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-transitions.rc)
+
+  target_sources(obs-transitions PRIVATE obs-transitions.rc)
+
 endif()
 
-add_library(obs-transitions MODULE
-	${obs-transitions_SOURCES})
-target_link_libraries(obs-transitions
-	libobs)
-set_target_properties(obs-transitions PROPERTIES FOLDER "plugins")
+set_target_properties(obs-transitions PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(obs-transitions data)
+setup_plugin_target(obs-transitions)

+ 23 - 24
plugins/obs-x264/CMakeLists.txt

@@ -1,32 +1,31 @@
 project(obs-x264)
 
 find_package(Libx264 REQUIRED)
-include_directories(${LIBX264_INCLUDE_DIRS})
-add_definitions(${LIBX264_DEFINITIONS})
-
-set(obs-x264_SOURCES
-	obs-x264.c
-	obs-x264-plugin-main.c)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS x264 encoder")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-x264.rc)
-	list(APPEND obs-x264_SOURCES
-		obs-x264.rc)
-endif()
 
-add_library(obs-x264 MODULE
-	${obs-x264_HEADERS}
-	${obs-x264_SOURCES})
-target_link_libraries(obs-x264
-	libobs
-	opts-parser
-	${LIBX264_LIBRARIES})
-set_target_properties(obs-x264 PROPERTIES FOLDER "plugins")
+add_library(obs-x264 MODULE)
+add_library(OBS::x264 ALIAS obs-x264)
+add_executable(obs-x264-test)
+
+target_sources(obs-x264-test PRIVATE obs-x264-test.c)
+
+target_link_libraries(obs-x264-test PRIVATE OBS::opts-parser)
+
+target_sources(obs-x264 PRIVATE obs-x264.c obs-x264-plugin-main.c)
+
+target_link_libraries(obs-x264 PRIVATE LIBX264::LIBX264 OBS::opts-parser)
 
-install_obs_plugin_with_data(obs-x264 data)
+set_target_properties(obs-x264 PROPERTIES FOLDER "plugins" PREFIX "")
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS x264 encoder")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 obs-x264.rc)
+
+  target_sources(obs-x264 PRIVATE obs-x264.rc)
+
+endif()
 
-add_executable(obs-x264-test obs-x264-test.c)
 set_target_properties(obs-x264-test PROPERTIES FOLDER "plugins")
-target_link_libraries(obs-x264-test PRIVATE libobs opts-parser)
 add_test(NAME obs-x264-test COMMAND obs-x264-test)
+
+setup_plugin_target(obs-x264)

+ 20 - 30
plugins/oss-audio/CMakeLists.txt

@@ -1,37 +1,27 @@
 project(oss-audio)
 
-if(DISABLE_OSS)
-	message(STATUS "OSS support disabled")
-	return()
-endif()
+option(ENABLE_OSS "Enable building with OSS audio support" ON)
 
-find_package(OSS)
-if(NOT OSS_FOUND AND ENABLE_OSS)
-	message(FATAL_ERROR "OSS not found but set as enabled")
-elseif(NOT OSS_FOUND)
-	message(STATUS "OSS not found, disabling OSS plugin")
-	return()
+if(NOT ENABLE_OSS)
+  message(STATUS "OBS:  DISABLED   oss-audio")
+  return()
 endif()
 
-configure_file(oss-platform.h.in oss-platform.h)
-
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs"
-	"${OSS_INCLUDE_DIR}"
-	"${CMAKE_CURRENT_BINARY_DIR}"
-)
-
-set(oss-audio_SOURCES
-	oss-audio.c
-	oss-input.c
-)
-
-add_library(oss-audio MODULE
-	${oss-audio_SOURCES}
-)
-target_link_libraries(oss-audio
-	libobs
-)
+find_package(OSS REQUIRED)
+
+add_library(oss-audio MODULE)
+add_library(OBS::oss-audio ALIAS oss-audio)
+
+target_sources(oss-audio PRIVATE oss-audio.c oss-input.c)
+
+target_link_libraries(oss-audio PRIVATE OBS::libobs OSS::OSS)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/oss-platform.h.in oss-platform.h)
+
+target_include_directories(oss-audio PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
+
+target_sources(oss-audio PRIVATE oss-platform.h)
+
 set_target_properties(oss-audio PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(oss-audio data)
+setup_plugin_target(oss-audio)

+ 44 - 57
plugins/rtmp-services/CMakeLists.txt

@@ -1,63 +1,50 @@
 project(rtmp-services)
 
-find_package(Libcurl REQUIRED)
-
-include_directories(${LIBCURL_INCLUDE_DIRS})
-
-include_directories(${OBS_JANSSON_INCLUDE_DIRS})
-
-set(rtmp-services_SOURCES
-	service-specific/twitch.c
-	service-specific/younow.c
-	service-specific/nimotv.c
-	service-specific/showroom.c
-	service-specific/dacast.c
-	rtmp-common.c
-	rtmp-custom.c
-	rtmp-services-main.c)
-
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS RTMP Services")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in rtmp-services.rc)
-	list(APPEND rtmp-services_SOURCES
-		rtmp-services.rc)
-endif()
-
-set(rtmp-services_HEADERS
-	service-specific/twitch.h
-	service-specific/younow.h
-	service-specific/nimotv.h
-	service-specific/showroom.h
-	service-specific/dacast.h
-	rtmp-format-ver.h)
+option(ENABLE_SERVICE_UPDATES "Checks for service updates" OFF)
 
 set(RTMP_SERVICES_URL
-	"https://obsproject.com/obs2_update/rtmp-services"
-	CACHE STRING "Default services package URL")
-option(CHECK_FOR_SERVICE_UPDATES "Checks for service updates" OFF)
-
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/lookup-config.h.in"
-	"${CMAKE_BINARY_DIR}/plugins/rtmp-services/lookup-config.h")
-
-set(rtmp-services_config_HEADERS
-	"${CMAKE_BINARY_DIR}/plugins/rtmp-services/lookup-config.h")
-
-add_library(rtmp-services MODULE
-	${rtmp-services_SOURCES}
-	${rtmp-services_HEADERS}
-	${rtmp-services_config_HEADERS})
-
-target_link_libraries(rtmp-services
-	libobs
-	file-updater
-	${OBS_JANSSON_IMPORT}
-	${LIBCURL_LIBRARIES})
-
-set_target_properties(rtmp-services PROPERTIES FOLDER "plugins")
+    "https://obsproject.com/obs2_update/rtmp-services"
+    CACHE STRING "Default services package URL" FORCE)
+
+mark_as_advanced(RTMP_SERVICES_URL)
+
+add_library(rtmp-services MODULE)
+add_library(OBS::rtmp-services ALIAS rtmp-services)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/lookup-config.h.in
+               ${CMAKE_BINARY_DIR}/config/lookup-config.h)
+
+target_sources(
+  rtmp-services
+  PRIVATE service-specific/twitch.c
+          service-specific/twitch.h
+          service-specific/younow.c
+          service-specific/younow.h
+          service-specific/nimotv.c
+          service-specific/nimotv.h
+          service-specific/showroom.c
+          service-specific/showroom.h
+          service-specific/dacast.c
+          service-specific/dacast.h
+          rtmp-common.c
+          rtmp-custom.c
+          rtmp-services-main.c
+          rtmp-format-ver.h
+          ${CMAKE_BINARY_DIR}/config/lookup-config.h)
+
+target_include_directories(rtmp-services PRIVATE ${CMAKE_BINARY_DIR}/config)
+
+target_link_libraries(rtmp-services PRIVATE OBS::libobs OBS::file-updater
+                                            Jansson::Jansson)
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS RTMP Services")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 rtmp-services.rc)
+
+  target_sources(rtmp-services PRIVATE rtmp-services.rc)
+endif()
 
-target_include_directories(rtmp-services
-	PUBLIC
-		"$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/plugins/rtmp-services>")
+set_target_properties(rtmp-services PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(rtmp-services data)
+setup_plugin_target(rtmp-services)

+ 1 - 1
plugins/rtmp-services/lookup-config.h.in

@@ -17,4 +17,4 @@
 #endif
 
 #define RTMP_SERVICES_URL "@RTMP_SERVICES_URL@"
-#define CHECK_FOR_SERVICE_UPDATES @CHECK_FOR_SERVICE_UPDATES@
+#cmakedefine ENABLE_SERVICE_UPDATES

+ 1 - 1
plugins/rtmp-services/rtmp-services-main.c

@@ -84,7 +84,7 @@ bool obs_module_load(void)
 	proc_handler_add(ph, "void twitch_ingests_refresh(int seconds)",
 			 refresh_callback, NULL);
 
-#if !defined(_WIN32) || CHECK_FOR_SERVICE_UPDATES
+#if !defined(_WIN32) || defined(ENABLE_SERVICE_UPDATES)
 	char *local_dir = obs_module_file("");
 	char *cache_dir = obs_module_config_path("");
 	char update_url[128];

+ 11 - 26
plugins/sndio/CMakeLists.txt

@@ -1,35 +1,20 @@
 project(sndio)
 
-if(DISABLE_SNDIO)
-	message(STATUS "Sndio support disabled")
-	return()
+option(ENABLE_SNDIO "Build OBS with sndio support" OFF)
+if(NOT ENABLE_SNDIO)
+  message(STATUS "OBS:  DISABLED   sndio")
+  return()
 endif()
 
-find_package(Sndio)
-if(NOT Sndio_FOUND AND ENABLE_SNDIO)
-	message(FATAL_ERROR "Sndio not found but set as enabled")
-elseif(NOT Sndio_FOUND)
-	message(STATUS "Sndio not found, disabling Sndio plugin")
-	return()
-endif()
+find_package(Sndio REQUIRED)
+
+add_library(sndio MODULE)
+add_library(OBS::sndio ALIAS sndio)
 
-include_directories(
-	SYSTEM "${CMAKE_SOURCE_DIR}/libobs" SYSTEM "${CMAKE_SOURCE_DIR}/../../libobs"
-	${Sndio_INCLUDE_DIRS}
-)
+target_sources(sndio PRIVATE sndio.c sndio-input.c)
 
-set(sndio_SOURCES
-	sndio.c
-	sndio-input.c
-)
+target_link_libraries(sndio PRIVATE OBS::libobs Sndio::Sndio)
 
-add_library(sndio MODULE
-	${sndio_SOURCES}
-)
-target_link_libraries(sndio
-	libobs
-	${Sndio_LIBRARIES}
-)
 set_target_properties(sndio PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(sndio data)
+setup_plugin_target(sndio)

+ 40 - 80
plugins/text-freetype2/CMakeLists.txt

@@ -1,89 +1,49 @@
 project(text-freetype2)
 
-if(DISABLE_FREETYPE)
-	message(STATUS "Freetype text plugin disabled")
-	return()
-endif()
+option(ENABLE_FREETYPE "Enable FreeType text plugin" ON)
 
-find_package(Freetype QUIET)
-if(NOT FREETYPE_FOUND AND ENABLE_FREETYPE)
-	message(FATAL_ERROR "Freetype library not found but set as enabled")
-elseif(NOT FREETYPE_FOUND)
-	message(STATUS "Freetype library not found, Freetype text plugin disabled")
-	return()
+if(NOT ENABLE_FREETYPE)
+  message(STATUS "OBS:  DISABLED   text-freetype2")
+  return()
 endif()
 
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS Freetype text module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in text-freetype2.rc)
-	set(text-freetype2_PLATFORM_SOURCES
-		find-font.c
-		find-font-windows.c
-		text-freetype2.rc)
-elseif(APPLE)
-	find_package(Iconv QUIET)
-	if(NOT ICONV_FOUND AND ENABLE_FREETYPE)
-		message(FATAL_ERROR "Iconv library not found but plugin set as enabled")
-	elseif(NOT ICONV_FOUND)
-		message(STATUS "Iconv library not found, Freetype text plugin disabled")
-		return()
-	endif()
-
-	find_library(COCOA Cocoa)
-
-	set(text-freetype2_PLATFORM_SOURCES
-		find-font.c
-		find-font-cocoa.m
-		find-font-iconv.c)
-
-	include_directories(${COCOA}
-		${ICONV_INCLUDE_DIRS})
-
-	set(text-freetype2_PLATFORM_DEPS
-		${COCOA}
-		${ICONV_LIBRARIES})
-else()
-	find_package(Fontconfig QUIET)
-	if(NOT FONTCONFIG_FOUND AND ENABLE_FREETYPE)
-		message(FATAL_ERROR "fontconfig not found but plugin set as enabled")
-	elseif(NOT FONTCONFIG_FOUND)
-		message(STATUS "fontconfig not found, Freetype text plugin disabled")
-		return()
-	endif()
-
-	set(text-freetype2_PLATFORM_SOURCES
-		find-font-unix.c)
-
-	include_directories(${FONTCONFIG_INCLUDE_DIRS})
-endif()
+find_package(Freetype REQUIRED)
 
-include_directories(${FREETYPE_INCLUDE_DIRS})
-
-set(text-freetype2_SOURCES
-	find-font.h
-	obs-convenience.c
-	text-functionality.c
-	text-freetype2.c
-	obs-convenience.h
-	text-freetype2.h)
-
-add_library(text-freetype2 MODULE
-	${text-freetype2_PLATFORM_SOURCES}
-	${text-freetype2_SOURCES})
-target_link_libraries(text-freetype2
-	libobs
-	${text-freetype2_PLATFORM_DEPS}
-	${FREETYPE_LIBRARIES})
-set_target_properties(text-freetype2 PROPERTIES FOLDER "plugins")
-
-if(NOT WIN32)
-	if(FONTCONFIG_FOUND)
-		target_link_libraries(text-freetype2 ${FONTCONFIG_LIBRARIES})
-	endif()
-endif()
+add_library(text-freetype2 MODULE)
+add_library(OBS::text-freetype2 ALIAS text-freetype2)
+
+target_sources(
+  text-freetype2 PRIVATE find-font.h obs-convenience.c text-functionality.c
+                         text-freetype2.c obs-convenience.h text-freetype2.h)
+
+target_link_libraries(text-freetype2 PRIVATE OBS::libobs Freetype::Freetype)
+
+set_target_properties(text-freetype2 PROPERTIES FOLDER "plugins" PREFIX "")
+
+if(OS_WINDOWS)
+  set(MODULE_DESCRIPTION "OBS FreeType text module")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 text-freetype2.rc)
+
+  target_sources(text-freetype2 PRIVATE find-font.c find-font-windows.c
+                                        text-freetype2.rc)
+
+elseif(OS_MACOS)
+  find_package(Iconv REQUIRED)
+  find_library(COCOA Cocoa)
+  mark_as_advanced(COCOA)
+
+  target_sources(text-freetype2 PRIVATE find-font.c find-font-cocoa.m
+                                        find-font-iconv.c)
+
+  target_link_libraries(text-freetype2 PRIVATE Iconv::Iconv ${COCOA})
+
+elseif(OS_POSIX)
+  find_package(Fontconfig REQUIRED)
+
+  target_sources(text-freetype2 PRIVATE find-font-unix.c)
 
-if(APPLE AND ICONV_FOUND)
-	target_link_libraries(text-freetype2 ${ICONV_LIBRARIES})
+  target_link_libraries(text-freetype2 PRIVATE Fontconfig::Fontconfig)
 endif()
 
-install_obs_plugin_with_data(text-freetype2 data)
+setup_plugin_target(text-freetype2)

+ 26 - 39
plugins/vlc-video/CMakeLists.txt

@@ -1,51 +1,38 @@
 project(vlc-video)
 
-if(DISABLE_VLC)
-	message(STATUS "VLC video plugin disabled")
-	return()
+option(ENABLE_VLC "Build OBS with VLC plugin support" ${OS_LINUX})
+if(NOT ENABLE_VLC)
+  message(STATUS "OBS:  DISABLED   vlc-video")
+  message(
+    WARNING
+      "VLC plugin supported is not enabled by default - please switch ENABLE_VLC to ON to enable this functionality."
+  )
+  return()
 endif()
 
-if(ENABLE_VLC)
-	find_package(LibVLC REQUIRED)
-else()
-	find_package(LibVLC)
-	if(NOT LibVLC_FOUND)
-		message(STATUS "VLC video plugin disabled")
-		return()
-	endif()
-endif()
+find_package(LibVLC REQUIRED)
 
-include_directories(${LIBVLC_INCLUDE_DIRS})
-add_definitions(${LIBVLC_DEFINITIONS})
+add_library(vlc-video MODULE)
+add_library(OBS::vlc-video ALIAS vlc-video)
 
-if(MSVC)
-	set(vlc-video_PLATFORM_DEPS
-		w32-pthreads)
-endif()
+target_sources(vlc-video PRIVATE vlc-video-plugin.c vlc-video-plugin.h
+                                 vlc-video-source.c)
+
+target_link_libraries(vlc-video PRIVATE OBS::libobs VLC::LibVLC)
+
+if(OS_WINDOWS)
+  if(MSVC)
+    target_link_libraries(vlc-video PRIVATE OBS::w32-pthreads)
+  endif()
 
-set(vlc-video_HEADERS
-	vlc-video-plugin.h
-	)
+  set(MODULE_DESCRIPTION "OBS VLC Plugin")
+  configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+                 vlc-video.rc)
 
-set(vlc-video_SOURCES
-	vlc-video-plugin.c
-	vlc-video-source.c
-	)
+  target_sources(vlc-video PRIVATE vlc-video.rc)
 
-if(WIN32)
-	set(MODULE_DESCRIPTION "OBS VLC module")
-	configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in vlc-video.rc)
-	list(APPEND vlc-video_SOURCES
-		vlc-video.rc)
 endif()
 
-add_library(vlc-video MODULE
-	${vlc-video_SOURCES}
-	${vlc-video_HEADERS})
-# instead of linking vlc we load at runtime.
-target_link_libraries(vlc-video
-	libobs
-	${vlc-video_PLATFORM_DEPS})
-set_target_properties(vlc-video PROPERTIES FOLDER "plugins")
+set_target_properties(vlc-video PROPERTIES FOLDER "plugins" PREFIX "")
 
-install_obs_plugin_with_data(vlc-video data)
+setup_plugin_target(vlc-video)

+ 41 - 40
plugins/win-capture/CMakeLists.txt

@@ -1,49 +1,50 @@
 project(win-capture)
 
+add_library(win-capture MODULE)
+add_library(OBS::capture ALIAS win-capture)
+
+target_sources(
+  win-capture
+  PRIVATE plugin-main.c
+          app-helpers.c
+          app-helpers.h
+          cursor-capture.c
+          cursor-capture.h
+          dc-capture.c
+          dc-capture.h
+          duplicator-monitor-capture.c
+          game-capture.c
+          game-capture-file-init.c
+          graphics-hook-info.h
+          graphics-hook-ver.h
+          hook-helpers.h
+          inject-library.c
+          inject-library.h
+          load-graphics-offsets.c
+          monitor-capture.c
+          nt-stuff.c
+          nt-stuff.h
+          obfuscate.c
+          obfuscate.h
+          window-capture.c
+          window-helpers.c
+          window-helpers.h)
+
+target_link_libraries(win-capture PRIVATE OBS::libobs OBS::ipc-util Dwmapi)
+
+set_target_properties(win-capture PROPERTIES FOLDER "plugins/win-capture")
+
 if(MSVC)
-	set(win-capture_PLATFORM_DEPS
-		w32-pthreads)
+  target_link_libraries(win-capture PRIVATE OBS::w32-pthreads)
 endif()
 
-set(win-capture_HEADERS
-	nt-stuff.h
-	obfuscate.h
-	app-helpers.h
-	hook-helpers.h
-	inject-library.h
-	cursor-capture.h
-	graphics-hook-info.h
-	graphics-hook-ver.h
-	window-helpers.h
-	dc-capture.h)
-
-set(win-capture_SOURCES
-	dc-capture.c
-	obfuscate.c
-	app-helpers.c
-	inject-library.c
-	cursor-capture.c
-	game-capture.c
-	window-helpers.c
-	monitor-capture.c
-	window-capture.c
-	load-graphics-offsets.c
-	game-capture-file-init.c
-	duplicator-monitor-capture.c
-	plugin-main.c
-	nt-stuff.c)
-
-add_library(win-capture MODULE
-	${win-capture_SOURCES}
-	${win-capture_HEADERS})
-target_link_libraries(win-capture
-	${win-capture_PLATFORM_DEPS}
-	libobs
-	Dwmapi
-	ipc-util)
-set_target_properties(win-capture PROPERTIES FOLDER "plugins/win-capture")
+target_compile_definitions(
+  win-capture PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
+                      _CRT_NONSTDC_NO_WARNINGS)
+
+set_property(GLOBAL APPEND PROPERTY OBS_MODULE_LIST "win-capture")
 
-install_obs_plugin_with_data(win-capture data)
+setup_plugin_target(win-capture)
 
 add_subdirectory(graphics-hook)
 add_subdirectory(get-graphics-offsets)

+ 28 - 30
plugins/win-capture/get-graphics-offsets/CMakeLists.txt

@@ -1,39 +1,37 @@
 project(get-graphics-offsets)
 
-set(get-graphics-offsets_HEADERS
-	../graphics-hook-info.h
-	../hook-helpers.h
-	get-graphics-offsets.h)
+add_executable(get-graphics-offsets)
 
-set(get-graphics-offsets_SOURCES
-	get-graphics-offsets.c
-	dxgi-offsets.cpp
-	d3d8-offsets.cpp
-	d3d9-offsets.cpp)
+target_sources(
+  get-graphics-offsets
+  PRIVATE get-graphics-offsets.c
+          get-graphics-offsets.h
+          dxgi-offsets.cpp
+          d3d8-offsets.cpp
+          d3d9-offsets.cpp
+          ../graphics-hook-info.h
+          ../hook-helpers.h)
 
-if(MSVC)
-	add_compile_options($<IF:$<CONFIG:Debug>,/MTd,/MT>)
-endif()
-
-add_executable(get-graphics-offsets
-	${get-graphics-offsets_SOURCES}
-	${get-graphics-offsets_HEADERS})
+target_include_directories(get-graphics-offsets
+                           PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
 
-target_link_libraries(get-graphics-offsets
-	d3d9.lib
-	dxgi.lib
-	d3d11.lib)
+target_link_libraries(get-graphics-offsets d3d9.lib dxgi.lib d3d11.lib)
 
-set_target_properties(get-graphics-offsets PROPERTIES FOLDER "plugins/win-capture")
-
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-	set(_output_suffix "64")
-else()
-	set(_output_suffix "32")
+if(MSVC)
+  target_compile_options(get-graphics-offsets
+                         PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  add_target_resource(
+    get-graphics-offsets "$<TARGET_PDB_FILE:get-graphics-offsets>"
+    "obs-plugins/win-capture/")
 endif()
 
-set_target_properties(get-graphics-offsets
-	PROPERTIES
-		OUTPUT_NAME "get-graphics-offsets${_output_suffix}")
+set_target_properties(get-graphics-offsets PROPERTIES FOLDER
+                                                      "plugins/win-capture")
+set_target_properties(
+  get-graphics-offsets
+  PROPERTIES OUTPUT_NAME
+             "get-graphics-offsets$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,64,32>"
+)
 
-install_obs_datatarget(get-graphics-offsets "obs-plugins/win-capture")
+add_target_resource(get-graphics-offsets "$<TARGET_FILE:get-graphics-offsets>"
+                    "obs-plugins/win-capture/")

+ 56 - 61
plugins/win-capture/graphics-hook/CMakeLists.txt

@@ -1,79 +1,74 @@
 project(graphics-hook)
 
-set(COMPILE_D3D12_HOOK FALSE CACHE BOOL "Compile D3D12 hook support (required windows 10 SDK)")
-
 find_package(Detours REQUIRED)
 find_package(Vulkan REQUIRED)
-include_directories(${VULKAN_INCLUDE_DIR})
 
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/graphics-hook-config.h.in"
-	"${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h")
+add_library(graphics-hook MODULE)
+add_library(OBS::graphics-hook ALIAS graphics-hook)
 
+target_sources(
+  graphics-hook
+  PRIVATE graphics-hook.c
+          graphics-hook.h
+          gl-capture.c
+          gl-decs.h
+          d3d8-capture.cpp
+          d3d9-capture.cpp
+          d3d9-patches.hpp
+          dxgi-capture.cpp
+          d3d10-capture.cpp
+          d3d11-capture.cpp
+          d3d12-capture.cpp
+          ../obfuscate.c
+          ../obfuscate.h
+          ../graphics-hook-ver.h
+          ../graphics-hook-info.h
+          ../hook-helpers.h
+          graphics-hook.rc)
 
-set(graphics-hook_HEADERS
-	"${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config/graphics-hook-config.h"
-	graphics-hook.h
-	../graphics-hook-ver.h
-	../graphics-hook-info.h
-	../hook-helpers.h
-	../obfuscate.h
-	gl-decs.h
-	d3d9-patches.hpp)
+target_include_directories(graphics-hook PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
 
-set(graphics-hook_SOURCES
-	graphics-hook.c
-	../obfuscate.c
-	gl-capture.c
-	d3d8-capture.cpp
-	d3d9-capture.cpp
-	dxgi-capture.cpp
-	d3d10-capture.cpp
-	d3d11-capture.cpp
-	d3d12-capture.cpp)
+target_link_libraries(graphics-hook PRIVATE OBS::ipc-util Detours::Detours
+                                            dxguid)
 
 if(MSVC)
-	add_compile_options("$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  target_compile_options(graphics-hook PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  add_target_resource(graphics-hook "$<TARGET_PDB_FILE:graphics-hook>"
+                      "obs-plugins/win-capture/")
 endif()
 
-if (VULKAN_FOUND)
-	list(APPEND graphics-hook_SOURCES
-		vulkan-capture.c)
-	list(APPEND graphics-hook_HEADERS
-		vulkan-capture.h)
-endif()
+set_target_properties(
+  graphics-hook
+  PROPERTIES FOLDER "plugins/win-capture"
+             OUTPUT_NAME
+             "graphics-hook$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,64,32>")
 
-add_library(graphics-hook MODULE
-	graphics-hook.rc
-	${graphics-hook_SOURCES}
-	${graphics-hook_HEADERS})
+target_compile_definitions(graphics-hook PRIVATE COMPILE_D3D12_HOOK)
 
-target_include_directories(graphics-hook PUBLIC
-	${DETOURS_INCLUDE_DIR}
-	"${CMAKE_BINARY_DIR}/plugins/win-capture/graphics-hook/config")
+if(TARGET Vulkan::Vulkan)
+  target_sources(graphics-hook PRIVATE vulkan-capture.c vulkan-capture.h)
 
-target_link_libraries(graphics-hook
-	dxguid
-	ipc-util
-	${DETOURS_LIBRARIES})
+  target_link_libraries(graphics-hook PRIVATE Vulkan::Vulkan)
 
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-	set(_output_suffix "64")
-else()
-	set(_output_suffix "32")
-endif()
+  target_compile_definitions(graphics-hook PRIVATE COMPILE_VULKAN_HOOK)
 
-set_target_properties(graphics-hook
-	PROPERTIES
-		FOLDER "plugins/win-capture"
-		OUTPUT_NAME "graphics-hook${_output_suffix}")
-
-if (VULKAN_FOUND)
-	add_custom_command(TARGET graphics-hook POST_BUILD
-		COMMAND "${CMAKE_COMMAND}" -E copy
-			"${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json" "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-plugins/win-capture/obs-vulkan64.json"
-		COMMAND "${CMAKE_COMMAND}" -E copy
-			"${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json" "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-plugins/win-capture/obs-vulkan32.json"
-		VERBATIM)
+  add_target_resource(
+    graphics-hook "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json"
+    "obs-plugins/win-capture/")
+  add_target_resource(
+    graphics-hook "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json"
+    "obs-plugins/win-capture/")
+  add_custom_command(
+    TARGET graphics-hook
+    POST_BUILD
+    COMMAND
+      "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan64.json"
+      "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-plugins/win-capture/obs-vulkan64.json"
+    COMMAND
+      "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/obs-vulkan32.json"
+      "${OBS_OUTPUT_DIR}/$<CONFIGURATION>/data/obs-plugins/win-capture/obs-vulkan32.json"
+    VERBATIM)
 endif()
-install_obs_datatarget(graphics-hook "obs-plugins/win-capture")
+
+add_target_resource(graphics-hook "$<TARGET_FILE:graphics-hook>"
+                    "obs-plugins/win-capture/")

+ 2 - 2
plugins/win-capture/graphics-hook/graphics-hook.c

@@ -319,7 +319,7 @@ static inline bool attempt_hook(void)
 	static bool d3d12_hooked = false;
 	static bool dxgi_hooked = false;
 	static bool gl_hooked = false;
-#if COMPILE_VULKAN_HOOK
+#ifdef COMPILE_VULKAN_HOOK
 	static bool vulkan_hooked = false;
 	if (!vulkan_hooked) {
 		vulkan_hooked = hook_vulkan();
@@ -329,7 +329,7 @@ static inline bool attempt_hook(void)
 	}
 #endif //COMPILE_VULKAN_HOOK
 
-#if COMPILE_D3D12_HOOK
+#ifdef COMPILE_D3D12_HOOK
 	if (!d3d12_hooked) {
 		d3d12_hooked = hook_d3d12();
 	}

+ 2 - 4
plugins/win-capture/graphics-hook/graphics-hook.h

@@ -1,7 +1,5 @@
 #pragma once
 
-#include "graphics-hook-config.h"
-
 #ifdef _MSC_VER
 /* conversion from data/function pointer */
 #pragma warning(disable : 4152)
@@ -53,7 +51,7 @@ extern bool hook_d3d9(void);
 extern bool hook_d3d12(void);
 extern bool hook_dxgi(void);
 extern bool hook_gl(void);
-#if COMPILE_VULKAN_HOOK
+#ifdef COMPILE_VULKAN_HOOK
 extern bool hook_vulkan(void);
 #endif
 
@@ -62,7 +60,7 @@ extern void d3d10_free(void);
 extern void d3d11_capture(void *swap, void *backbuffer);
 extern void d3d11_free(void);
 
-#if COMPILE_D3D12_HOOK
+#ifdef COMPILE_D3D12_HOOK
 extern void d3d12_capture(void *swap, void *backbuffer);
 extern void d3d12_free(void);
 #endif

+ 16 - 24
plugins/win-capture/inject-helper/CMakeLists.txt

@@ -1,32 +1,24 @@
 project(inject-helper)
 
-set(inject-helper_HEADERS
-	../inject-library.h
-	../obfuscate.h)
+add_executable(inject-helper)
 
-set(inject-helper_SOURCES
-	../inject-library.c
-	../obfuscate.c
-	inject-helper.c)
+target_sources(
+  inject-helper PRIVATE inject-helper.c ../inject-library.c ../inject-library.h
+                        ../obfuscate.c ../obfuscate.h)
 
-if(MSVC)
-	add_compile_options($<IF:$<CONFIG:Debug>,/MTd,/MT>)
-endif()
-
-add_executable(inject-helper
-	${inject-helper_SOURCES})
+target_include_directories(inject-helper PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
 
-target_link_libraries(inject-helper)
-
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-	set(_output_suffix "64")
-else()
-	set(_output_suffix "32")
+if(MSVC)
+  target_compile_options(inject-helper PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  add_target_resource(inject-helper "$<TARGET_PDB_FILE:inject-helper>"
+                      "obs-plugins/win-capture/")
 endif()
 
-set_target_properties(inject-helper
-	PROPERTIES
-		FOLDER "plugins/win-capture"
-		OUTPUT_NAME "inject-helper${_output_suffix}")
+set_target_properties(
+  inject-helper
+  PROPERTIES FOLDER "plugins/win-capture"
+             OUTPUT_NAME
+             "inject-helper$<IF:$<EQUAL:${CMAKE_SIZEOF_VOID_P},8>,64,32>")
 
-install_obs_datatarget(inject-helper "obs-plugins/win-capture")
+add_target_resource(inject-helper "$<TARGET_FILE:inject-helper>"
+                    "obs-plugins/win-capture/")

+ 164 - 128
plugins/win-dshow/CMakeLists.txt

@@ -1,152 +1,188 @@
 if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/dshowcapture.hpp")
-	message(STATUS "libdshowcapture submodule not found!  Please fetch submodules.  win-dshow plugin disabled.")
-	return()
+  message(
+    FATAL_ERROR
+      "OBS:             libdshowcapture submodule not found! Please fetch submodules. win-dshow plugin disabled."
+  )
+  return()
+endif()
+
+option(ENABLE_VIRTUALCAM "Enable building with Virtual Camera (Windows)" ON)
+
+if(NOT ENABLE_VIRTUALCAM)
+  message(STATUS "OBS:  DISABLED   Windows Virtual Camera")
+endif()
+
+if(ENABLE_VIRTUALCAM AND NOT VIRTUALCAM_GUID)
+  set(VIRTUALCAM_GUID
+      ""
+      CACHE STRING "Virtual Camera GUID" FORCE)
+  mark_as_advanced(VIRTUALCAM_GUID)
 endif()
 
 project(win-dshow)
 
 find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil)
-include_directories(${FFMPEG_INCLUDE_DIRS})
 
-set(win-dshow_HEADERS
-	encode-dstr.hpp
-	ffmpeg-decode.h)
+add_library(win-dshow MODULE)
+add_library(OBS::dshow ALIAS win-dshow)
+
+target_sources(
+  win-dshow PRIVATE encode-dstr.hpp win-dshow.cpp win-dshow-encoder.cpp
+                    dshow-plugin.cpp ffmpeg-decode.c ffmpeg-decode.h)
+
+add_library(libdshowcapture INTERFACE)
+add_library(OBS::libdshowcapture ALIAS libdshowcapture)
+
+target_sources(
+  libdshowcapture
+  INTERFACE libdshowcapture/dshowcapture.hpp
+            libdshowcapture/source/capture-filter.cpp
+            libdshowcapture/source/capture-filter.hpp
+            libdshowcapture/source/output-filter.cpp
+            libdshowcapture/source/output-filter.hpp
+            libdshowcapture/source/dshowcapture.cpp
+            libdshowcapture/source/dshowencode.cpp
+            libdshowcapture/source/device.cpp
+            libdshowcapture/source/device.hpp
+            libdshowcapture/source/encoder.cpp
+            libdshowcapture/source/encoder.hpp
+            libdshowcapture/source/dshow-base.cpp
+            libdshowcapture/source/dshow-base.hpp
+            libdshowcapture/source/dshow-demux.cpp
+            libdshowcapture/source/dshow-demux.hpp
+            libdshowcapture/source/dshow-device-defs.hpp
+            libdshowcapture/source/dshow-enum.cpp
+            libdshowcapture/source/dshow-enum.hpp
+            libdshowcapture/source/dshow-formats.cpp
+            libdshowcapture/source/dshow-formats.hpp
+            libdshowcapture/source/dshow-media-type.cpp
+            libdshowcapture/source/dshow-encoded-device.cpp
+            libdshowcapture/source/dshow-media-type.hpp
+            libdshowcapture/source/log.cpp
+            libdshowcapture/source/log.hpp
+            libdshowcapture/source/external/IVideoCaptureFilter.h)
+
+target_include_directories(
+  libdshowcapture INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture)
 
 set(MODULE_DESCRIPTION "OBS DirectShow module")
 
-set(VIRTUALCAM_GUID "" CACHE STRING "VirtualCam GUID")
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               win-dshow.rc)
 
-set(VIRTUALCAM_ENABLED FALSE)
+target_sources(win-dshow PRIVATE win-dshow.rc)
+
+target_compile_definitions(
+  win-dshow PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
+                    _CRT_NONSTDC_NO_WARNINGS)
+
+set(VIRTUALCAM_AVAILABLE OFF)
 if(VIRTUALCAM_GUID STREQUAL "")
-	message(STATUS "VirtualCam GUID not set! VirtualCam disabled.")
+  message(
+    WARNING
+      "OBS:  DISABLED   Windows Virtual Camera - GUID not set - specify as 'VIRTUALCAM_GUID' to enable."
+  )
 else()
-	set(INVALID_GUID TRUE)
-
-	string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
-
-	list(LENGTH GUID_VALS GUID_VAL_COUNT)
-	if(GUID_VAL_COUNT EQUAL 5)
-		string(REPLACE ";" "0" GUID_HEX ${GUID_VALS})
-		string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX})
-		if(GUID_ACTUAL_HEX STREQUAL GUID_HEX)
-			list(GET GUID_VALS 0 GUID_VALS_DATA1)
-			list(GET GUID_VALS 1 GUID_VALS_DATA2)
-			list(GET GUID_VALS 2 GUID_VALS_DATA3)
-			list(GET GUID_VALS 3 GUID_VALS_DATA4)
-			list(GET GUID_VALS 4 GUID_VALS_DATA5)
-			string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH)
-			string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH)
-			string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH)
-			string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH)
-			string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH)
-			if(GUID_VALS_DATA1_LENGTH EQUAL 8 AND
-			   GUID_VALS_DATA2_LENGTH EQUAL 4 AND
-			   GUID_VALS_DATA3_LENGTH EQUAL 4 AND
-			   GUID_VALS_DATA4_LENGTH EQUAL 4 AND
-			   GUID_VALS_DATA5_LENGTH EQUAL 12)
-				set(GUID_VAL01 ${GUID_VALS_DATA1})
-				set(GUID_VAL02 ${GUID_VALS_DATA2})
-				set(GUID_VAL03 ${GUID_VALS_DATA3})
-				string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04)
-				string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05)
-				string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06)
-				string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07)
-				string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08)
-				string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09)
-				string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10)
-				string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11)
-				set(VIRTUALCAM_ENABLED TRUE)
-				set(INVALID_GUID FALSE)
-			endif()
-		endif()
-	endif()
+  set(INVALID_GUID ON)
+
+  string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
+
+  list(LENGTH GUID_VALS GUID_VAL_COUNT)
+  if(GUID_VAL_COUNT EQUAL 5)
+    string(REPLACE ";" "0" GUID_HEX ${GUID_VALS})
+    string(REGEX MATCH "[0-9a-fA-F]+" GUID_ACTUAL_HEX ${GUID_HEX})
+    if(GUID_ACTUAL_HEX STREQUAL GUID_HEX)
+      list(GET GUID_VALS 0 GUID_VALS_DATA1)
+      list(GET GUID_VALS 1 GUID_VALS_DATA2)
+      list(GET GUID_VALS 2 GUID_VALS_DATA3)
+      list(GET GUID_VALS 3 GUID_VALS_DATA4)
+      list(GET GUID_VALS 4 GUID_VALS_DATA5)
+      string(LENGTH ${GUID_VALS_DATA1} GUID_VALS_DATA1_LENGTH)
+      string(LENGTH ${GUID_VALS_DATA2} GUID_VALS_DATA2_LENGTH)
+      string(LENGTH ${GUID_VALS_DATA3} GUID_VALS_DATA3_LENGTH)
+      string(LENGTH ${GUID_VALS_DATA4} GUID_VALS_DATA4_LENGTH)
+      string(LENGTH ${GUID_VALS_DATA5} GUID_VALS_DATA5_LENGTH)
+      if(GUID_VALS_DATA1_LENGTH EQUAL 8
+         AND GUID_VALS_DATA2_LENGTH EQUAL 4
+         AND GUID_VALS_DATA3_LENGTH EQUAL 4
+         AND GUID_VALS_DATA4_LENGTH EQUAL 4
+         AND GUID_VALS_DATA5_LENGTH EQUAL 12)
+        set(GUID_VAL01 ${GUID_VALS_DATA1})
+        set(GUID_VAL02 ${GUID_VALS_DATA2})
+        set(GUID_VAL03 ${GUID_VALS_DATA3})
+        string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04)
+        string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05)
+        string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06)
+        string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07)
+        string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08)
+        string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09)
+        string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10)
+        string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11)
+        set(VIRTUALCAM_AVAILABLE ON)
+        set(INVALID_GUID OFF)
+      endif()
+    endif()
+  endif()
 endif()
 
 if(INVALID_GUID)
-	message(WARNING "Invalid VirtualCam GUID! VirtualCam disabled.")
+  message(
+    WARNING "OBS:  DISABLED   Windows Virtual Camera - invalid GUID supplied")
 endif()
 
-if(VIRTUALCAM_ENABLED)
-	add_definitions(-DVIRTUALCAM_ENABLED)
-endif()
+target_link_libraries(
+  win-dshow
+  PRIVATE OBS::libobs
+          OBS::w32-pthreads
+          OBS::libdshowcapture
+          setupapi
+          strmiids
+          ksuser
+          winmm
+          wmcodecdspuuid
+          FFmpeg::avcodec
+          FFmpeg::avutil)
+
+file(GLOB _LIBOBS_SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.c
+     ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.cpp)
+file(GLOB _LIBOBS_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.h
+     ${CMAKE_CURRENT_SOURCE_DIR}/libdshowcapture/*.hpp)
+
+source_group("libdshowcapture\\Source Files" FILES ${_LIBOBS_SOURCE_FILES})
+source_group("libdshowcapture\\Header Files" FILES ${_LIBOBS_HEADER_FILES})
 
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-dshow.rc)
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-guid.h)
-include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
-set(win-dshow_SOURCES
-	win-dshow.cpp
-	win-dshow-encoder.cpp
-	dshow-plugin.cpp
-	ffmpeg-decode.c
-	win-dshow.rc)
-
-if(VIRTUALCAM_ENABLED)
-	set(virtualcam-output_SOURCES
-		tiny-nv12-scale.c
-		shared-memory-queue.c
-		virtualcam.c)
-	set(virtualcam-output_HEADERS
-		tiny-nv12-scale.h
-		shared-memory-queue.h)
-endif()
-
-set(libdshowcapture_SOURCES
-	libdshowcapture/source/capture-filter.cpp
-	libdshowcapture/source/output-filter.cpp
-	libdshowcapture/source/dshowcapture.cpp
-	libdshowcapture/source/dshowencode.cpp
-	libdshowcapture/source/device.cpp
-	libdshowcapture/source/encoder.cpp
-	libdshowcapture/source/dshow-base.cpp
-	libdshowcapture/source/dshow-demux.cpp
-	libdshowcapture/source/dshow-enum.cpp
-	libdshowcapture/source/dshow-formats.cpp
-	libdshowcapture/source/dshow-media-type.cpp
-	libdshowcapture/source/dshow-encoded-device.cpp
-	libdshowcapture/source/log.cpp)
-
-set(libdshowcapture_HEADERS
-	libdshowcapture/dshowcapture.hpp
-	libdshowcapture/source/external/IVideoCaptureFilter.h
-	libdshowcapture/source/capture-filter.hpp
-	libdshowcapture/source/output-filter.hpp
-	libdshowcapture/source/device.hpp
-	libdshowcapture/source/encoder.hpp
-	libdshowcapture/source/dshow-base.hpp
-	libdshowcapture/source/dshow-demux.hpp
-	libdshowcapture/source/dshow-device-defs.hpp
-	libdshowcapture/source/dshow-enum.hpp
-	libdshowcapture/source/dshow-formats.hpp
-	libdshowcapture/source/dshow-media-type.hpp
-	libdshowcapture/source/log.hpp)
-
-add_library(win-dshow MODULE
-	${win-dshow_SOURCES}
-	${win-dshow_HEADERS}
-	${virtualcam-output_SOURCES}
-	${virtualcam-output_HEADERS}
-	${libdshowcapture_SOURCES}
-	${libdshowcapture_HEADERS})
-target_link_libraries(win-dshow
-	libobs
-	setupapi
-	strmiids
-	ksuser
-	winmm
-	wmcodecdspuuid
-	w32-pthreads
-	${FFMPEG_LIBRARIES})
 set_target_properties(win-dshow PROPERTIES FOLDER "plugins/win-dshow")
 
-source_group("libdshowcapture\\Source Files" FILES ${libdshowcapture_SOURCES})
-source_group("libdshowcapture\\Header Files" FILES ${libdshowcapture_HEADERS})
+setup_plugin_target(win-dshow)
+
+if(ENABLE_VIRTUALCAM AND VIRTUALCAM_AVAILABLE)
+  target_sources(
+    win-dshow PRIVATE tiny-nv12-scale.c tiny-nv12-scale.h shared-memory-queue.c
+                      shared-memory-queue.h virtualcam.c)
+
+  target_compile_definitions(win-dshow PRIVATE VIRTUALCAM_AVAILABLE)
+
+  target_include_directories(win-dshow
+                             PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config)
+
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-guid.h.in
+                 ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
+
+  target_sources(win-dshow
+                 PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/config/virtualcam-guid.h)
+
+  configure_file(virtualcam-install.bat.in
+                 "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat")
+
+  configure_file(virtualcam-uninstall.bat.in
+                 "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat")
 
-install_obs_plugin_with_data(win-dshow data)
+  add_target_resource(
+    win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat"
+    "obs-plugins/win-dshow/")
+  add_target_resource(
+    win-dshow "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat"
+    "obs-plugins/win-dshow/")
 
-if(VIRTUALCAM_ENABLED)
-	configure_file(virtualcam-install.bat.in "${CMAKE_CURRENT_BINARY_DIR}/data/virtualcam-install.bat")
-	configure_file(virtualcam-uninstall.bat.in "${CMAKE_CURRENT_BINARY_DIR}/data/virtualcam-uninstall.bat")
-	install_obs_data_from_abs_path(win-dshow "${CMAKE_CURRENT_BINARY_DIR}/data" "obs-plugins/win-dshow")
-	add_subdirectory(virtualcam-module)
+  add_subdirectory(virtualcam-module)
 endif()

+ 4 - 2
plugins/win-dshow/dshow-plugin.cpp

@@ -1,7 +1,9 @@
 #include <obs-module.h>
 #include <strsafe.h>
 #include <strmif.h>
+#ifdef VIRTUALCAM_AVAILABLE
 #include "virtualcam-guid.h"
+#endif
 
 OBS_DECLARE_MODULE()
 OBS_MODULE_USE_DEFAULT_LOCALE("win-dshow", "en-US")
@@ -13,7 +15,7 @@ MODULE_EXPORT const char *obs_module_description(void)
 extern void RegisterDShowSource();
 extern void RegisterDShowEncoders();
 
-#ifdef VIRTUALCAM_ENABLED
+#ifdef VIRTUALCAM_AVAILABLE
 extern "C" struct obs_output_info virtualcam_info;
 
 static bool vcam_installed(bool b64)
@@ -42,7 +44,7 @@ bool obs_module_load(void)
 {
 	RegisterDShowSource();
 	RegisterDShowEncoders();
-#ifdef VIRTUALCAM_ENABLED
+#ifdef VIRTUALCAM_AVAILABLE
 	obs_register_output(&virtualcam_info);
 
 	bool installed = vcam_installed(false);

+ 1 - 1
plugins/win-dshow/virtualcam-guid.h.in

@@ -3,7 +3,7 @@
 #include <windows.h>
 #include <initguid.h>
 
-#ifdef VIRTUALCAM_ENABLED
+#ifdef VIRTUALCAM_AVAILABLE
 DEFINE_GUID(CLSID_OBS_VirtualVideo,
             0x@GUID_VAL01@,
             0x@GUID_VAL02@,

+ 75 - 72
plugins/win-dshow/virtualcam-module/CMakeLists.txt

@@ -2,84 +2,87 @@ cmake_minimum_required(VERSION 3.5)
 project(obs-virtualcam-module)
 
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-	set(_output_suffix "64")
+  set(_output_suffix "64")
 else()
-	set(_output_suffix "32")
+  set(_output_suffix "32")
 endif()
 
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in"
-	"${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def")
+add_library(obs-virtualcam-module MODULE)
+add_library(OBS::virtualcam-module ALIAS obs-virtualcam-module)
+
+target_sources(
+  obs-virtualcam-module
+  PRIVATE sleepto.c
+          sleepto.h
+          placeholder.cpp
+          virtualcam-module.cpp
+          virtualcam-filter.cpp
+          virtualcam-filter.hpp
+          virtualcam-module.rc
+          ../shared-memory-queue.c
+          ../shared-memory-queue.h
+          ../tiny-nv12-scale.c
+          ../tiny-nv12-scale.h)
+
+target_include_directories(obs-virtualcam-module
+                           PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/..)
 
 set(MODULE_DESCRIPTION "OBS Virtual Camera output module")
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in virtualcam-module.rc)
-
-include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
-
-set(libdshowcapture_SOURCES
-	../libdshowcapture/source/log.cpp
-	../libdshowcapture/source/dshow-base.cpp
-	../libdshowcapture/source/dshow-enum.cpp
-	../libdshowcapture/source/dshow-formats.cpp
-	../libdshowcapture/source/dshow-media-type.cpp
-	../libdshowcapture/source/output-filter.cpp
-	)
-
-set(libdshowcapture_HEADERS
-	../libdshowcapture/source/ComPtr.hpp
-	../libdshowcapture/source/CoTaskMemPtr.hpp
-	../libdshowcapture/source/log.hpp
-	../libdshowcapture/source/dshow-base.hpp
-	../libdshowcapture/source/dshow-enum.hpp
-	../libdshowcapture/source/dshow-formats.hpp
-	../libdshowcapture/source/dshow-media-type.hpp
-	../libdshowcapture/source/output-filter.hpp
-	../libdshowcapture/dshowcapture.hpp
-	)
-
-set(obs-virtualcam-module_SOURCES
-	"${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def"
-	sleepto.c
-	placeholder.cpp
-	virtualcam-module.cpp
-	virtualcam-filter.cpp
-	virtualcam-module.rc
-	../shared-memory-queue.c
-	../tiny-nv12-scale.c
-	)
-
-set(obs-virtualcam-module_HEADERS
-	sleepto.h
-	virtualcam-filter.hpp
-	../shared-memory-queue.h
-	../tiny-nv12-scale.h
-	)
+
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               virtualcam-module.rc)
+
+target_sources(obs-virtualcam-module PRIVATE virtualcam-module.rc)
+
+target_link_libraries(
+  obs-virtualcam-module PRIVATE OBS::libdshowcapture setupapi winmm strmiids
+                                gdiplus)
+
+target_link_options(obs-virtualcam-module PRIVATE "LINKER:/ignore:4104")
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/virtualcam-module.def.in
+               ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
+
+target_sources(obs-virtualcam-module
+               PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.def)
+
+target_include_directories(obs-virtualcam-module
+                           PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/../config)
+
+target_compile_definitions(
+  obs-virtualcam-module
+  PRIVATE VIRTUALCAM_AVAILABLE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
+          _CRT_NONSTDC_NO_WARNINGS)
 
 if(MSVC)
-	add_compile_options("$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  target_compile_options(obs-virtualcam-module
+                         PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+  add_target_resource(
+    obs-virtualcam-module "$<TARGET_PDB_FILE:obs-virtualcam-module>"
+    "obs-plugins/win-dshow/")
+
 endif()
 
-include_directories(${CMAKE_SOURCE_DIR}/libobs/util)
-
-source_group("libdshowcapture\\Source Files" FILES ${libdshowcapture_SOURCES})
-source_group("libdshowcapture\\Header Files" FILES ${libdshowcapture_HEADERS})
-
-set(CMAKE_MODULE_LINKER_FLAGS "${MAKE_MODULE_LINKER_FLAGS} /ignore:4104")
-
-add_library(obs-virtualcam-module MODULE
-	${libdshowcapture_SOURCES}
-	${libdshowcapture_HEADERS}
-	${obs-virtualcam-module_SOURCES}
-	${obs-virtualcam-module_HEADERS})
-target_link_libraries(obs-virtualcam-module
-	setupapi
-	winmm
-	strmiids
-	gdiplus
-	)
-set_target_properties(obs-virtualcam-module PROPERTIES FOLDER "plugins/win-dshow")
-
-set_target_properties(obs-virtualcam-module
-	PROPERTIES
-		OUTPUT_NAME "obs-virtualcam-module${_output_suffix}")
-install_obs_datatarget(obs-virtualcam-module "obs-plugins/win-dshow")
+get_target_property(_LIBDSHOW_SOURCES OBS::libdshowcapture INTERFACE_SOURCES)
+
+foreach(_LIBDSHOW_SOURCE ${_LIBDSHOW_SOURCES})
+  get_filename_component(_EXT ${_LIBDSHOW_SOURCE} EXT)
+  if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h")
+    source_group("libdshowcapture\\Header Files" FILES ${_LIBDSHOW_SOURCE})
+  elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c")
+    source_group("libdshowcapture\\Source Files" FILES ${_LIBDSHOW_SOURCE})
+  endif()
+endforeach()
+unset(_LIBDSHOW_SOURCE)
+unset(_LIBDSHOW_SOURCES)
+
+set_target_properties(obs-virtualcam-module PROPERTIES FOLDER
+                                                       "plugins/win-dshow")
+
+set_target_properties(
+  obs-virtualcam-module PROPERTIES OUTPUT_NAME
+                                   "obs-virtualcam-module${_output_suffix}")
+
+add_target_resource(
+  obs-virtualcam-module "$<TARGET_FILE:obs-virtualcam-module>"
+  "obs-plugins/win-dshow/")

+ 47 - 49
plugins/win-ivcam/CMakeLists.txt

@@ -1,64 +1,62 @@
-project(win-ivcam)
+option(ENABLE_IVCAM "Enable building with Realsense camera support" OFF)
 
-if(DISABLE_IVCAM)
-	message(STATUS "Realsense camera plugin disabled")
-	return()
+if(NOT ENABLE_IVCAM)
+  message(STATUS "OBS:  DISABLED   Realsense camera plugin support")
+  return()
 endif()
 
-find_package(RSSDK QUIET)
-if(NOT RSSDK_FOUND AND ENABLE_IVCAM)
-	message(FATAL_ERROR "RSSDK not found, but the realsense camera plugin is set as enabled")
-elseif(NOT RSSDK_FOUND)
-	message(STATUS "RSSDK not found, Realsense camera plugin disabled")
-	return()
+project(win-ivcam)
+
+find_package(RSSDK REQUIRED)
+
+if(NOT TARGET RSS::SDK)
+  message(FATAL_ERROR "OBS:    -        RSSDK not found")
 endif()
 
 include(IDLFileHelper)
 
-set(win-ivcam_seg_library_IDLS
-	seg_service/seg_service.idl
-	)
-
-add_idl_files(win-ivcam_seg_library_GENERATED_FILES
-	${win-ivcam_seg_library_IDLS})
-
-include_directories(
-	${CMAKE_CURRENT_BINARY_DIR}
-	)
-
-set(win-ivcam_seg_library_HEADERS
-	seg_library/Dependencies.h
-	seg_library/SegImage.h
-	seg_library/SegServer.h
-	seg_library/SegServerImpl.h
-	seg_library/SegService.h
-	)
-set(win-ivcam_seg_library_SOURCES
-	seg_library/SerServer.cpp
-	seg_library/SegServerImpl.cpp
-	seg_library/SegImage.cpp
-	${win-ivcam_seg_library_GENERATED_FILES}
-	)
+add_library(win-ivcam MODULE)
+add_library(OBS::ivcam ALIAS win-ivcam)
+
+add_library(seglibrary INTERFACE)
+add_library(Intel::seglibrary ALIAS seglibrary)
+
+add_idl_files(win-ivcam_seg_library_GENERATED_FILES seg_service/seg_service.idl)
+
+target_sources(
+  seglibrary
+  INTERFACE seg_library/Dependencies.h
+            seg_library/SerServer.cpp
+            seg_library/SegServer.h
+            seg_library/SegServerImpl.cpp
+            seg_library/SegServerImpl.h
+            seg_library/SegService.h
+            seg_library/SegImage.cpp
+            seg_library/SegImage.h
+            ${win-ivcam_seg_library_GENERATED_FILES})
 
 set(MODULE_DESCRIPTION "OBS Intel(R) RealSense(TM) module")
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-ivcam.rc)
-set(win-ivcam_SOURCES
-	realsense.cpp
-	win-ivcam.rc)
 
-source_group("seg_library\\Source Files" FILES ${win-ivcam_seg_library_SOURCES})
-source_group("seg_library\\Header Files" FILES ${win-ivcam_seg_library_HEADERS})
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               win-ivcam.rc)
+
+target_sources(win-ivcam PRIVATE realsense.cpp win-ivcam.rc)
 
-add_library(win-ivcam MODULE
-	${win-ivcam_seg_library_HEADERS}
-	${win-ivcam_seg_library_SOURCES}
-	${win-ivcam_SOURCES}
-	)
-target_link_libraries(win-ivcam
-	libobs)
+target_link_libraries(win-ivcam OBS::libobs Intel::seglibrary)
 
-install_obs_plugin(win-ivcam)
+get_target_property(_SEGLIBRARY_SOURCES INTEL::seglibrary INTERFACE_SOURCES)
+
+foreach(_SEGLIBRARY_SOURCE ${_SEGLIBRARY_SOURCES})
+  get_filename_component(_EXT ${_SEGLIBRARY_SOURCE} EXT)
+  if(${_EXT} STREQUAL "hpp" OR ${_EXT} STREQUAL "h")
+    source_group("seg_library\\Header Files" FILES ${_SEGLIBRARY_SOURCE})
+  elseif(${_EXT} STREQUAL "cpp" OR ${_EXT} STREQUAL "c")
+    source_group("seg_library\\Source Files" FILES ${_SEGLIBRARY_SOURCE})
+  endif()
+endforeach()
 
 if(CMAKE_SIZEOF_VOID_P EQUAL 4)
-	add_subdirectory(seg_service)
+  add_subdirectory(seg_service)
 endif()
+
+setup_plugin_target(win-ivcam)

+ 29 - 38
plugins/win-ivcam/seg_service/CMakeLists.txt

@@ -1,46 +1,37 @@
 project(seg_service)
 
+find_package(RSSDK REQUIRED)
+
+if(NOT TARGET RSS::SDK)
+  message(FATAL_ERROR "OBS:    -        RSSDK not found")
+endif()
+
 include(IDLFileHelper)
 
-set(seg_service_IDLS
-	seg_service.idl
-	)
-
-add_idl_files_with_tlb(seg_service_GENERATED_FILES
-	${seg_service_IDLS})
-
-include_directories(
-	${RSSDK_INCLUDE_DIRS}	
-	${CMAKE_CURRENT_BINARY_DIR}
-	)
-
-set(seg_service_HEADERS
-	resource.h
-	SegProc.h
-	stdafx.h
-	targetver.h
-	xdlldata.h
-	)
-
-set(seg_service_SOURCES
-	SegProc.rgs
-	seg_service.rgs
-	seg_service.cpp
-	SegProc.cpp
-	stdafx.cpp
-	seg_service.rc
-	${seg_service_GENERATED_FILES}
-	)
+add_executable(seg_service WIN32)
 
-if(MSVC)
-	add_compile_options($<IF:$<CONFIG:Debug>,/MTd,/MT>)
-endif()
+target_sources(
+  seg_service
+  PRIVATE SegProc.rgs
+          seg_service.rgs
+          seg_service.cpp
+          SegProc.cpp
+          stdafx.cpp
+          seg_service.rc
+          resource.h
+          SegProc.h
+          stdafx.h
+          targetver.h
+          xdlldata.h)
+
+add_idl_files_with_tlb(seg_service_GENERATED_FILES seg_service.idl)
 
-add_executable(seg_service WIN32
-	${seg_service_SOURCES}
-	${seg_service_HEADERS})
+get_target_property(_RSSSDK_INCLUDE_DIRECTORY RSS::SDK
+                    INTERFACE_INCLUDE_DIRECTORIES)
 
-target_link_libraries(seg_service
-	)
+target_include_directories(seg_service PRIVATE ${_RSSSDK_INCLUDE_DIRECTORY})
 
-install_obs_datatarget(seg_service "obs-plugins/win-ivcam")
+if(MSVC)
+  target_compile_definitions(seg_service
+                             PRIVATE "$<IF:$<CONFIG:Debug>,/MTd,/MT>")
+endif()

+ 37 - 52
plugins/win-mf/CMakeLists.txt

@@ -1,64 +1,49 @@
-project(win-mf)
-
-set(ENABLE_WINMF FALSE CACHE BOOL "Enables the now deprecated win-mf plugin")
+option(ENABLE_WINMF "Enable building with deprecated win-mf plugin" OFF)
+mark_as_advanced(ENABLE_WINMF)
 
-configure_file(
-	"${CMAKE_CURRENT_SOURCE_DIR}/mf-config.hpp.in"
-	"${CMAKE_CURRENT_BINARY_DIR}/mf-config.hpp")
+project(win-mf)
 
-set(win-mf_config_HEADERS
-	"${CMAKE_CURRENT_BINARY_DIR}/mf-config.hpp")
+add_library(win-mf MODULE)
+add_library(OBS::win-mf ALIAS win-mf)
 
 set(MODULE_DESCRIPTION "OBS Windows Media Foundations H.264/AAC encoder")
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-mf.rc)
-if(ENABLE_WINMF)
-	set(win-mf_SOURCES
-		mf-plugin.cpp
-		mf-aac.cpp
-		mf-aac-encoder.cpp
-		mf-common.cpp
-		mf-encoder-descriptor.cpp
-		mf-h264.cpp
-		mf-h264-encoder.cpp
-		win-mf.rc)
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               win-mf.rc)
 
-	set(win-mf_HEADERS
-		mf-common.hpp
-		mf-encoder-descriptor.hpp
-		mf-aac-encoder.hpp
-		mf-h264-encoder.hpp)
+target_sources(win-mf PRIVATE win-mf.rc)
 
-	set(win-mf_DEPS
-		d3d9
-		dxva2
-		uuid
-		mfplat
-		mfuuid
-		mf
-		wmcodecdspuuid)
+if(ENABLE_WINMF)
+  target_sources(
+    win-mf
+    PRIVATE mf-plugin.cpp
+            mf-aac.cpp
+            mf-aac-encoder.cpp
+            mf-aac-encoder.hpp
+            mf-common.cpp
+            mf-common.hpp
+            mf-encoder-descriptor.cpp
+            mf-encoder-descriptor.hpp
+            mf-h264.cpp
+            mf-h264-encoder.cpp
+            mf-h264-encoder.hpp)
+
+  target_link_libraries(
+    win-mf
+    PRIVATE d3d9
+            dxva2
+            uuid
+            mfplat
+            mfuuid
+            mf
+            wmcodecdspuuid)
+
+  target_compile_definitions(win-mf PRIVATE ENABLE_WINMF)
 else()
-	set(win-mf_SOURCES
-		mf-plugin.cpp
-		win-mf.rc)
+  target_sources(win-mf PRIVATE mf-plugin.cpp win-mf.rc)
 endif()
 
-add_library(win-mf MODULE
-	${win-mf_config_HEADERS}
-	${win-mf_SOURCES}
-	${win-mf_HEADERS})
-
-target_link_libraries(win-mf
-	${win-mf_DEPS}
-	libobs)
-
-target_include_directories(win-mf
-	PUBLIC
-	"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>")
+target_link_libraries(win-mf PRIVATE OBS::libobs)
 
 set_target_properties(win-mf PROPERTIES FOLDER "plugins")
 
-if(ENABLE_WINMF)
-	install_obs_plugin_with_data(win-mf data)
-else()
-	install_obs_plugin(win-mf)
-endif()
+setup_plugin_target(win-mf)

+ 4 - 5
plugins/win-mf/mf-plugin.cpp

@@ -1,7 +1,6 @@
 #include <obs-module.h>
-#include "mf-config.hpp"
 
-#if ENABLE_WINMF
+#ifdef ENABLE_WINMF
 #include <util/profiler.h>
 #include "mf-common.hpp"
 
@@ -12,7 +11,7 @@ extern void RegisterMFH264Encoders();
 
 extern "C" bool obs_module_load(void)
 {
-#if ENABLE_WINMF
+#ifdef ENABLE_WINMF
 	MFStartup(MF_VERSION, MFSTARTUP_FULL);
 
 	RegisterMFAACEncoder();
@@ -24,7 +23,7 @@ extern "C" bool obs_module_load(void)
 
 extern "C" void obs_module_unload(void)
 {
-#if ENABLE_WINMF
+#ifdef ENABLE_WINMF
 	MFShutdown();
 #endif
 }
@@ -35,6 +34,6 @@ MODULE_EXPORT const char *obs_module_description(void)
 	return "Windows Media Foundations H.264/AAC encoder";
 }
 
-#if ENABLE_WINMF
+#ifdef ENABLE_WINMF
 OBS_MODULE_USE_DEFAULT_LOCALE("win-mf", "en-US")
 #endif

+ 14 - 16
plugins/win-wasapi/CMakeLists.txt

@@ -1,22 +1,20 @@
 project(win-wasapi)
 
-set(win-wasapi_HEADERS
-	enum-wasapi.hpp)
+add_library(win-wasapi MODULE)
+add_library(OBS::wasapi ALIAS win-wasapi)
+
+target_sources(win-wasapi PRIVATE win-wasapi.cpp enum-wasapi.cpp
+                                  enum-wasapi.hpp plugin-main.cpp)
 
 set(MODULE_DESCRIPTION "OBS WASAPI module")
-configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in win-wasapi.rc)
-set(win-wasapi_SOURCES
-	win-wasapi.cpp
-	enum-wasapi.cpp
-	plugin-main.cpp
-	win-wasapi.rc)
-
-add_library(win-wasapi MODULE
-	${win-wasapi_SOURCES}
-	${win-wasapi_HEADERS})
-target_link_libraries(win-wasapi
-	Avrt
-	libobs)
+
+configure_file(${CMAKE_SOURCE_DIR}/cmake/bundle/windows/obs-module.rc.in
+               win-wasapi.rc)
+
+target_sources(win-wasapi PRIVATE win-wasapi.rc)
+
+target_link_libraries(win-wasapi PRIVATE OBS::libobs Avrt)
+
 set_target_properties(win-wasapi PROPERTIES FOLDER "plugins")
 
-install_obs_plugin_with_data(win-wasapi data)
+setup_plugin_target(win-wasapi)