CMakeLists.txt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. cmake_minimum_required(VERSION 3.28...3.30)
  2. option(ENABLE_VIRTUALCAM "Enable Windows Virtual Camera" ON)
  3. if(NOT ENABLE_VIRTUALCAM)
  4. target_disable_feature(obs-virtualcam-module "Virtual Camera Support")
  5. target_disable(obs-virtualcam-module)
  6. return()
  7. endif()
  8. if(NOT VIRTUALCAM_GUID)
  9. set(VIRTUALCAM_GUID "" CACHE STRING "Virtual Camera GUID" FORCE)
  10. mark_as_advanced(VIRTUALCAM_GUID)
  11. message(WARNING "Empty Virtual Camera GUID set.")
  12. target_disable_feature(obs-virtualcam-module "Virtual Camera Support (empty GUID)")
  13. return()
  14. else()
  15. set(VALID_GUID FALSE)
  16. check_uuid(${VIRTUALCAM_GUID} VALID_GUID)
  17. if(NOT VALID_GUID)
  18. message(WARNING "Invalid Virtual Camera GUID set.")
  19. target_disable_feature(obs-virtualcam-module "Virtual Camera Support (invalid GUID)")
  20. return()
  21. endif()
  22. # DirectShow API requires separate GUID tokens
  23. string(REPLACE "-" ";" GUID_VALS ${VIRTUALCAM_GUID})
  24. list(GET GUID_VALS 0 GUID_VALS_DATA1)
  25. list(GET GUID_VALS 1 GUID_VALS_DATA2)
  26. list(GET GUID_VALS 2 GUID_VALS_DATA3)
  27. list(GET GUID_VALS 3 GUID_VALS_DATA4)
  28. list(GET GUID_VALS 4 GUID_VALS_DATA5)
  29. set(GUID_VAL01 ${GUID_VALS_DATA1})
  30. set(GUID_VAL02 ${GUID_VALS_DATA2})
  31. set(GUID_VAL03 ${GUID_VALS_DATA3})
  32. string(SUBSTRING ${GUID_VALS_DATA4} 0 2 GUID_VAL04)
  33. string(SUBSTRING ${GUID_VALS_DATA4} 2 2 GUID_VAL05)
  34. string(SUBSTRING ${GUID_VALS_DATA5} 0 2 GUID_VAL06)
  35. string(SUBSTRING ${GUID_VALS_DATA5} 2 2 GUID_VAL07)
  36. string(SUBSTRING ${GUID_VALS_DATA5} 4 2 GUID_VAL08)
  37. string(SUBSTRING ${GUID_VALS_DATA5} 6 2 GUID_VAL09)
  38. string(SUBSTRING ${GUID_VALS_DATA5} 8 2 GUID_VAL10)
  39. string(SUBSTRING ${GUID_VALS_DATA5} 10 2 GUID_VAL11)
  40. endif()
  41. if(NOT TARGET OBS::winhandle)
  42. add_subdirectory("${CMAKE_SOURCE_DIR}/libobs" "${CMAKE_BINARY_DIR}/libobs")
  43. endif()
  44. if(NOT TARGET OBS::threading-windows)
  45. add_subdirectory("${CMAKE_SOURCE_DIR}/libobs" "${CMAKE_BINARY_DIR}/libobs")
  46. endif()
  47. if(NOT TARGET OBS::tiny-nv12-scale)
  48. add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-tiny-nv12-scale" obs-tiny-nv12-scale)
  49. endif()
  50. if(NOT TARGET OBS::shared-memory-queue)
  51. add_subdirectory("${CMAKE_SOURCE_DIR}/shared/obs-shared-memory-queue" obs-shared-memory-queue)
  52. endif()
  53. if(NOT TARGET OBS::libdshowcapture)
  54. add_subdirectory("${CMAKE_SOURCE_DIR}/deps/libdshowcapture" libdshowcapture)
  55. endif()
  56. add_library(obs-virtualcam-guid INTERFACE)
  57. add_library(OBS::virtualcam-guid ALIAS obs-virtualcam-guid)
  58. configure_file(virtualcam-guid.h.in virtualcam-guid.h)
  59. target_sources(obs-virtualcam-guid INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-guid.h")
  60. target_include_directories(obs-virtualcam-guid INTERFACE "${CMAKE_CURRENT_BINARY_DIR}")
  61. add_library(obs-virtualcam-module MODULE)
  62. add_library(OBS::virtualcam ALIAS obs-virtualcam-module)
  63. configure_file(cmake/windows/obs-module.rc.in virtualcam-module.rc)
  64. target_sources(
  65. obs-virtualcam-module
  66. PRIVATE
  67. ${CMAKE_CURRENT_BINARY_DIR}/virtualcam-module.rc
  68. placeholder.cpp
  69. sleepto.c
  70. sleepto.h
  71. virtualcam-filter.cpp
  72. virtualcam-filter.hpp
  73. virtualcam-module.cpp
  74. )
  75. target_include_directories(obs-virtualcam-module PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
  76. target_compile_definitions(obs-virtualcam-module PRIVATE VIRTUALCAM_AVAILABLE)
  77. target_link_libraries(
  78. obs-virtualcam-module
  79. PRIVATE
  80. OBS::tiny-nv12-scale
  81. OBS::shared-memory-queue
  82. OBS::virtualcam-guid
  83. OBS::libdshowcapture
  84. OBS::winhandle
  85. OBS::threading-windows
  86. gdiplus
  87. strmiids
  88. winmm
  89. )
  90. if(OBS_PARENT_ARCHITECTURE STREQUAL CMAKE_VS_PLATFORM_NAME)
  91. if(CMAKE_VS_PLATFORM_NAME STREQUAL ARM64)
  92. add_custom_command(
  93. TARGET obs-virtualcam-module
  94. POST_BUILD
  95. COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_SOURCE_DIR}/build_x64 --config $<CONFIG> -t obs-virtualcam-module
  96. COMMENT "Build x64 obs-virtualcam-module"
  97. )
  98. endif()
  99. if(CMAKE_VS_PLATFORM_NAME MATCHES "(ARM64|x64)")
  100. add_custom_command(
  101. TARGET obs-virtualcam-module
  102. POST_BUILD
  103. COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_SOURCE_DIR}/build_x86 --config $<CONFIG> -t obs-virtualcam-module
  104. COMMENT "Build x86 obs-virtualcam-module"
  105. )
  106. endif()
  107. add_dependencies(win-dshow obs-virtualcam-module)
  108. endif()
  109. if(CMAKE_VS_PLATFORM_NAME STREQUAL ARM64)
  110. set(_OUTPUT_NAME virtualcam-module-arm64)
  111. elseif(CMAKE_VS_PLATFORM_NAME STREQUAL x64)
  112. set(_OUTPUT_NAME virtualcam-module64)
  113. else()
  114. set(_OUTPUT_NAME virtualcam-module32)
  115. endif()
  116. target_sources(obs-virtualcam-module PRIVATE cmake/windows/${_OUTPUT_NAME}.def)
  117. configure_file(virtualcam-install.bat.in virtualcam-install.bat)
  118. target_add_resource(obs-virtualcam-module "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-install.bat"
  119. "${OBS_DATA_DESTINATION}/obs-plugins/win-dshow"
  120. )
  121. configure_file(virtualcam-uninstall.bat.in virtualcam-uninstall.bat)
  122. target_add_resource(obs-virtualcam-module "${CMAKE_CURRENT_BINARY_DIR}/virtualcam-uninstall.bat"
  123. "${OBS_DATA_DESTINATION}/obs-plugins/win-dshow"
  124. )
  125. set_target_properties_obs(
  126. obs-virtualcam-module PROPERTIES
  127. FOLDER plugins/win-dshow
  128. OUTPUT_NAME obs-${_OUTPUT_NAME}
  129. MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
  130. )