CMakeLists.txt 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. add_subdirectory(obs-frontend-api)
  2. option(ENABLE_UI "Enable building with UI (requires Qt)" ON)
  3. if(NOT ENABLE_UI)
  4. obs_status(DISABLED "OBS UI")
  5. return()
  6. endif()
  7. project(obs)
  8. # Legacy support
  9. if(TARGET obs-browser
  10. AND NOT TARGET OBS::browser-panels
  11. AND BROWSER_PANEL_SUPPORT_ENABLED)
  12. add_library(obs-browser-panels INTERFACE)
  13. add_library(OBS::browser-panels ALIAS obs-browser-panels)
  14. target_include_directories(
  15. obs-browser-panels INTERFACE ${CMAKE_SOURCE_DIR}/plugins/obs-browser/panel)
  16. endif()
  17. set(OAUTH_BASE_URL
  18. "https://auth.obsproject.com/"
  19. CACHE STRING "Default OAuth base URL")
  20. mark_as_advanced(OAUTH_BASE_URL)
  21. if(NOT DEFINED TWITCH_CLIENTID
  22. OR "${TWITCH_CLIENTID}" STREQUAL ""
  23. OR NOT DEFINED TWITCH_HASH
  24. OR "${TWITCH_HASH}" STREQUAL ""
  25. OR NOT TARGET OBS::browser-panels)
  26. set(TWITCH_ENABLED OFF)
  27. set(TWITCH_CLIENTID "")
  28. set(TWITCH_HASH "0")
  29. else()
  30. set(TWITCH_ENABLED ON)
  31. endif()
  32. if(NOT DEFINED RESTREAM_CLIENTID
  33. OR "${RESTREAM_CLIENTID}" STREQUAL ""
  34. OR NOT DEFINED RESTREAM_HASH
  35. OR "${RESTREAM_HASH}" STREQUAL ""
  36. OR NOT TARGET OBS::browser-panels)
  37. set(RESTREAM_ENABLED OFF)
  38. set(RESTREAM_CLIENTID "")
  39. set(RESTREAM_HASH "0")
  40. else()
  41. set(RESTREAM_ENABLED ON)
  42. endif()
  43. if(NOT DEFINED YOUTUBE_CLIENTID
  44. OR "${YOUTUBE_CLIENTID}" STREQUAL ""
  45. OR NOT DEFINED YOUTUBE_SECRET
  46. OR "${YOUTUBE_SECRET}" STREQUAL ""
  47. OR NOT DEFINED YOUTUBE_CLIENTID_HASH
  48. OR "${YOUTUBE_CLIENTID_HASH}" STREQUAL ""
  49. OR NOT DEFINED YOUTUBE_SECRET_HASH
  50. OR "${YOUTUBE_SECRET_HASH}" STREQUAL "")
  51. set(YOUTUBE_ENABLED OFF)
  52. else()
  53. set(YOUTUBE_ENABLED ON)
  54. endif()
  55. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ui-config.h.in
  56. ${CMAKE_CURRENT_BINARY_DIR}/ui-config.h)
  57. find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
  58. find_package(CURL REQUIRED)
  59. add_subdirectory(frontend-plugins)
  60. add_executable(obs)
  61. find_qt(COMPONENTS Widgets Network Svg Xml COMPONENTS_LINUX Gui)
  62. target_link_libraries(obs PRIVATE Qt::Widgets Qt::Svg Qt::Xml Qt::Network)
  63. set_target_properties(
  64. obs
  65. PROPERTIES AUTOMOC ON
  66. AUTOUIC ON
  67. AUTORCC ON
  68. AUTOUIC_SEARCH_PATHS "forms;forms/source-toolbar")
  69. target_include_directories(obs PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
  70. ${CMAKE_CURRENT_BINARY_DIR})
  71. target_sources(obs PRIVATE forms/obs.qrc)
  72. target_sources(
  73. obs
  74. PRIVATE forms/AutoConfigFinishPage.ui
  75. forms/AutoConfigStartPage.ui
  76. forms/AutoConfigStartPage.ui
  77. forms/AutoConfigStreamPage.ui
  78. forms/AutoConfigTestPage.ui
  79. forms/AutoConfigVideoPage.ui
  80. forms/ColorSelect.ui
  81. forms/OBSAbout.ui
  82. forms/OBSAdvAudio.ui
  83. forms/OBSBasic.ui
  84. forms/OBSBasicFilters.ui
  85. forms/OBSBasicInteraction.ui
  86. forms/OBSBasicSettings.ui
  87. forms/OBSBasicSourceSelect.ui
  88. forms/OBSBasicTransform.ui
  89. forms/OBSExtraBrowsers.ui
  90. forms/OBSImporter.ui
  91. forms/OBSLogReply.ui
  92. forms/OBSMissingFiles.ui
  93. forms/OBSRemux.ui
  94. forms/OBSUpdate.ui
  95. forms/OBSYoutubeActions.ui
  96. forms/source-toolbar/browser-source-toolbar.ui
  97. forms/source-toolbar/color-source-toolbar.ui
  98. forms/source-toolbar/device-select-toolbar.ui
  99. forms/source-toolbar/game-capture-toolbar.ui
  100. forms/source-toolbar/image-source-toolbar.ui
  101. forms/source-toolbar/media-controls.ui
  102. forms/source-toolbar/text-source-toolbar.ui)
  103. target_sources(
  104. obs
  105. PRIVATE auth-oauth.cpp
  106. auth-oauth.hpp
  107. auth-listener.cpp
  108. auth-listener.hpp
  109. obf.c
  110. obf.h
  111. obs-app.cpp
  112. obs-app.hpp
  113. obs-proxy-style.cpp
  114. obs-proxy-style.hpp
  115. api-interface.cpp
  116. auth-base.cpp
  117. auth-base.hpp
  118. crash-report.cpp
  119. crash-report.hpp
  120. display-helpers.hpp
  121. platform.hpp
  122. qt-display.cpp
  123. qt-display.hpp
  124. qt-wrappers.cpp
  125. qt-wrappers.hpp
  126. ui-validation.cpp
  127. ui-validation.hpp
  128. multiview.cpp
  129. multiview.hpp
  130. ${CMAKE_SOURCE_DIR}/deps/json11/json11.cpp
  131. ${CMAKE_SOURCE_DIR}/deps/json11/json11.hpp
  132. ${CMAKE_SOURCE_DIR}/deps/libff/libff/ff-util.c
  133. ${CMAKE_SOURCE_DIR}/deps/libff/libff/ff-util.h
  134. ${CMAKE_CURRENT_BINARY_DIR}/ui-config.h)
  135. target_sources(
  136. obs
  137. PRIVATE adv-audio-control.cpp
  138. adv-audio-control.hpp
  139. audio-encoders.cpp
  140. audio-encoders.hpp
  141. balance-slider.hpp
  142. clickable-label.hpp
  143. double-slider.cpp
  144. double-slider.hpp
  145. horizontal-scroll-area.cpp
  146. horizontal-scroll-area.hpp
  147. item-widget-helpers.cpp
  148. item-widget-helpers.hpp
  149. context-bar-controls.cpp
  150. context-bar-controls.hpp
  151. expand-checkbox.hpp
  152. focus-list.cpp
  153. focus-list.hpp
  154. hotkey-edit.cpp
  155. hotkey-edit.hpp
  156. lineedit-autoresize.cpp
  157. lineedit-autoresize.hpp
  158. locked-checkbox.cpp
  159. locked-checkbox.hpp
  160. log-viewer.cpp
  161. log-viewer.hpp
  162. media-controls.cpp
  163. media-controls.hpp
  164. media-slider.cpp
  165. media-slider.hpp
  166. menu-button.cpp
  167. menu-button.hpp
  168. mute-checkbox.hpp
  169. properties-view.cpp
  170. properties-view.hpp
  171. properties-view.moc.hpp
  172. record-button.cpp
  173. record-button.hpp
  174. remote-text.cpp
  175. remote-text.hpp
  176. scene-tree.cpp
  177. scene-tree.hpp
  178. screenshot-obj.hpp
  179. slider-absoluteset-style.cpp
  180. slider-absoluteset-style.hpp
  181. slider-ignorewheel.cpp
  182. slider-ignorewheel.hpp
  183. source-label.cpp
  184. source-label.hpp
  185. spinbox-ignorewheel.cpp
  186. spinbox-ignorewheel.hpp
  187. source-tree.cpp
  188. source-tree.hpp
  189. url-push-button.cpp
  190. url-push-button.hpp
  191. undo-stack-obs.cpp
  192. undo-stack-obs.hpp
  193. volume-control.cpp
  194. volume-control.hpp
  195. vertical-scroll-area.cpp
  196. vertical-scroll-area.hpp
  197. visibility-checkbox.cpp
  198. visibility-checkbox.hpp
  199. visibility-item-widget.cpp
  200. visibility-item-widget.hpp)
  201. target_sources(
  202. obs
  203. PRIVATE window-basic-about.cpp
  204. window-basic-about.hpp
  205. window-basic-auto-config.cpp
  206. window-basic-auto-config.hpp
  207. window-basic-auto-config-test.cpp
  208. window-basic-adv-audio.cpp
  209. window-basic-adv-audio.hpp
  210. window-basic-filters.cpp
  211. window-basic-filters.hpp
  212. window-basic-interaction.cpp
  213. window-basic-interaction.hpp
  214. window-basic-main.cpp
  215. window-basic-main.hpp
  216. window-basic-main-browser.cpp
  217. window-basic-main-dropfiles.cpp
  218. window-basic-main-icons.cpp
  219. window-basic-main-outputs.cpp
  220. window-basic-main-outputs.hpp
  221. window-basic-main-profiles.cpp
  222. window-basic-main-scene-collections.cpp
  223. window-basic-main-screenshot.cpp
  224. window-basic-main-transitions.cpp
  225. window-basic-preview.cpp
  226. window-basic-properties.cpp
  227. window-basic-properties.hpp
  228. window-basic-settings.cpp
  229. window-basic-settings.hpp
  230. window-basic-settings-a11y.cpp
  231. window-basic-settings-stream.cpp
  232. window-basic-source-select.cpp
  233. window-basic-source-select.hpp
  234. window-basic-stats.cpp
  235. window-basic-stats.hpp
  236. window-basic-status-bar.cpp
  237. window-basic-status-bar.hpp
  238. window-basic-transform.cpp
  239. window-basic-transform.hpp
  240. window-basic-preview.hpp
  241. window-dock.cpp
  242. window-dock.hpp
  243. window-importer.cpp
  244. window-importer.hpp
  245. window-log-reply.hpp
  246. window-main.hpp
  247. window-missing-files.cpp
  248. window-missing-files.hpp
  249. window-namedialog.cpp
  250. window-namedialog.hpp
  251. window-log-reply.cpp
  252. window-projector.cpp
  253. window-projector.hpp
  254. window-remux.cpp
  255. window-remux.hpp)
  256. target_sources(
  257. obs
  258. PRIVATE importers/importers.cpp importers/importers.hpp importers/classic.cpp
  259. importers/sl.cpp importers/studio.cpp importers/xsplit.cpp)
  260. target_compile_features(obs PRIVATE cxx_std_17)
  261. target_include_directories(obs PRIVATE ${CMAKE_SOURCE_DIR}/deps/json11
  262. ${CMAKE_SOURCE_DIR}/deps/libff)
  263. target_link_libraries(
  264. obs PRIVATE CURL::libcurl FFmpeg::avcodec FFmpeg::avutil FFmpeg::avformat
  265. OBS::libobs OBS::frontend-api)
  266. set_target_properties(obs PROPERTIES FOLDER "frontend")
  267. if(TARGET OBS::browser-panels)
  268. get_target_property(_PANEL_INCLUDE_DIRECTORY OBS::browser-panels
  269. INTERFACE_INCLUDE_DIRECTORIES)
  270. target_include_directories(obs PRIVATE ${_PANEL_INCLUDE_DIRECTORY})
  271. target_compile_definitions(obs PRIVATE BROWSER_AVAILABLE)
  272. target_sources(
  273. obs PRIVATE window-dock-browser.cpp window-dock-browser.hpp
  274. window-extra-browsers.cpp window-extra-browsers.hpp)
  275. if(TWITCH_ENABLED)
  276. target_sources(obs PRIVATE auth-twitch.cpp auth-twitch.hpp)
  277. endif()
  278. if(RESTREAM_ENABLED)
  279. target_sources(obs PRIVATE auth-restream.cpp auth-restream.hpp)
  280. endif()
  281. endif()
  282. if(YOUTUBE_ENABLED)
  283. target_sources(
  284. obs
  285. PRIVATE auth-youtube.cpp auth-youtube.hpp youtube-api-wrappers.cpp
  286. youtube-api-wrappers.hpp window-youtube-actions.cpp
  287. window-youtube-actions.hpp)
  288. endif()
  289. if(OS_WINDOWS)
  290. set_target_properties(obs PROPERTIES WIN32_EXECUTABLE ON OUTPUT_NAME
  291. "obs${_ARCH_SUFFIX}")
  292. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/obs.rc.in
  293. ${CMAKE_BINARY_DIR}/obs.rc)
  294. target_sources(
  295. obs
  296. PRIVATE obs.manifest
  297. platform-windows.cpp
  298. win-update/update-window.cpp
  299. win-update/update-window.hpp
  300. win-update/win-update.cpp
  301. win-update/win-update.hpp
  302. win-update/win-update-helpers.cpp
  303. win-update/win-update-helpers.hpp
  304. ${CMAKE_BINARY_DIR}/obs.rc)
  305. if(_QT_VERSION EQUAL 5)
  306. find_qt(COMPONENTS WinExtras)
  307. target_link_libraries(obs PRIVATE Qt::WinExtras)
  308. endif()
  309. target_link_libraries(obs PRIVATE crypt32 OBS::blake2)
  310. target_compile_features(obs PRIVATE cxx_std_17)
  311. target_compile_definitions(
  312. obs PRIVATE UNICODE _UNICODE _CRT_SECURE_NO_WARNINGS
  313. _CRT_NONSTDC_NO_WARNINGS)
  314. if(MSVC)
  315. target_link_options(obs PRIVATE "LINKER:/IGNORE:4098" "LINKER:/IGNORE:4099")
  316. target_link_libraries(obs PRIVATE OBS::w32-pthreads)
  317. set_source_files_properties(
  318. ${CMAKE_CURRENT_SOURCE_DIR}../deps/libff/libff/ff-util.c
  319. PROPERTIES COMPILE_FLAGS -Dinline=__inline)
  320. endif()
  321. if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  322. target_link_options(obs PRIVATE /LARGEADDRESSAWARE)
  323. endif()
  324. add_subdirectory(win-update/updater)
  325. elseif(OS_MACOS)
  326. set_target_properties(
  327. obs
  328. PROPERTIES OUTPUT_NAME ${OBS_BUNDLE_NAME}
  329. MACOSX_BUNDLE ON
  330. MACOSX_BUNDLE_INFO_PLIST
  331. ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Info.plist.in)
  332. if(XCODE)
  333. set_target_properties(
  334. obs
  335. PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER
  336. "${MACOSX_BUNDLE_GUI_IDENTIFIER}"
  337. XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon
  338. XCODE_ATTRIBUTE_PRODUCT_NAME "OBS")
  339. set(APP_ICON_TARGET ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/Assets.xcassets)
  340. target_sources(obs PRIVATE ${APP_ICON_TARGET})
  341. set_source_files_properties(${APP_ICON_TARGET}
  342. PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  343. else()
  344. set(APP_ICON_TARGET ${CMAKE_SOURCE_DIR}/cmake/bundle/macOS/AppIcon.iconset)
  345. set(APP_ICON_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/AppIcon.icns)
  346. add_custom_command(
  347. OUTPUT ${APP_ICON_OUTPUT} COMMAND iconutil -c icns "${APP_ICON_TARGET}"
  348. -o "${APP_ICON_OUTPUT}")
  349. set(MACOSX_BUNDLE_ICON_FILE AppIcon.icns)
  350. target_sources(obs PRIVATE ${APP_ICON_OUTPUT}
  351. ${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS)
  352. set_source_files_properties(${APP_ICON_OUTPUT}
  353. PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  354. endif()
  355. find_library(APPKIT Appkit)
  356. find_library(AVFOUNDATION AVFoundation)
  357. find_library(APPLICATIONSERVICES ApplicationServices)
  358. mark_as_advanced(APPKIT AVFOUNDATION APPLICATIONSERVICES)
  359. target_link_libraries(obs PRIVATE ${APPKIT} ${AVFOUNDATION}
  360. ${APPLICATIONSERVICES})
  361. if(ENABLE_SPARKLE_UPDATER)
  362. find_library(SPARKLE Sparkle)
  363. mark_as_advanced(SPARKLE)
  364. target_sources(obs PRIVATE sparkle-updater.mm)
  365. target_compile_definitions(obs PRIVATE ENABLE_SPARKLE_UPDATER)
  366. target_link_libraries(obs PRIVATE ${SPARKLE})
  367. endif()
  368. target_sources(obs PRIVATE platform-osx.mm)
  369. set_source_files_properties(platform-osx.mm PROPERTIES COMPILE_FLAGS
  370. -fobjc-arc)
  371. elseif(OS_POSIX)
  372. target_sources(obs PRIVATE platform-x11.cpp)
  373. target_link_libraries(obs PRIVATE Qt::GuiPrivate)
  374. if(TARGET obspython)
  375. find_package(Python REQUIRED COMPONENTS Interpreter Development)
  376. target_link_libraries(obs PRIVATE Python::Python)
  377. target_link_options(obs PRIVATE "LINKER:-no-as-needed")
  378. endif()
  379. if(NOT LINUX_PORTABLE)
  380. add_subdirectory(xdg-data)
  381. endif()
  382. if(OS_FREEBSD)
  383. target_link_libraries(obs PRIVATE procstat)
  384. endif()
  385. endif()
  386. get_target_property(_SOURCES obs SOURCES)
  387. set(_UI ${_SOURCES})
  388. list(FILTER _UI INCLUDE REGEX ".*\\.ui?")
  389. source_group(
  390. TREE "${CMAKE_CURRENT_SOURCE_DIR}/forms"
  391. PREFIX "UI Files"
  392. FILES ${_UI})
  393. unset(_SOURCES)
  394. unset(_UI)
  395. define_graphic_modules(obs)
  396. setup_obs_app(obs)
  397. setup_target_resources(obs obs-studio)
  398. add_target_resource(obs ${CMAKE_CURRENT_SOURCE_DIR}/../AUTHORS
  399. obs-studio/authors)