CMakeLists.txt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. if(DISABLE_UI)
  2. message(STATUS "UI disabled")
  3. return()
  4. elseif(ENABLE_UI)
  5. set(FIND_MODE REQUIRED)
  6. else()
  7. set(FIND_MODE QUIET)
  8. endif()
  9. if(BROWSER_AVAILABLE_INTERNAL)
  10. add_definitions(-DBROWSER_AVAILABLE)
  11. endif()
  12. add_subdirectory(obs-frontend-api)
  13. # ----------------------------------------------------------------------------
  14. project(obs)
  15. set(DISABLE_UPDATE_MODULE TRUE CACHE BOOL "Disables building the update module")
  16. if(NOT DEFINED TWITCH_CLIENTID OR "${TWITCH_CLIENTID}" STREQUAL "" OR
  17. NOT DEFINED TWITCH_HASH OR "${TWITCH_HASH}" STREQUAL "" OR
  18. NOT BROWSER_AVAILABLE_INTERNAL)
  19. set(TWITCH_ENABLED FALSE)
  20. set(TWITCH_CLIENTID "")
  21. set(TWITCH_HASH "0")
  22. else()
  23. set(TWITCH_ENABLED TRUE)
  24. endif()
  25. if(NOT DEFINED RESTREAM_CLIENTID OR "${RESTREAM_CLIENTID}" STREQUAL "" OR
  26. NOT DEFINED RESTREAM_HASH OR "${RESTREAM_HASH}" STREQUAL "" OR
  27. NOT BROWSER_AVAILABLE_INTERNAL)
  28. set(RESTREAM_ENABLED FALSE)
  29. set(RESTREAM_CLIENTID "")
  30. set(RESTREAM_HASH "0")
  31. else()
  32. set(RESTREAM_ENABLED TRUE)
  33. endif()
  34. if(DEFINED ENV{YOUTUBE_CLIENTID} AND NOT DEFINED YOUTUBE_CLIENTID)
  35. set(YOUTUBE_CLIENTID "$ENV{YOUTUBE_CLIENTID}")
  36. endif()
  37. if(DEFINED ENV{YOUTUBE_CLIENTID_HASH} AND NOT DEFINED YOUTUBE_CLIENTID_HASH)
  38. set(YOUTUBE_CLIENTID_HASH "$ENV{YOUTUBE_CLIENTID_HASH}")
  39. endif()
  40. if(DEFINED ENV{YOUTUBE_SECRET} AND NOT DEFINED YOUTUBE_SECRET)
  41. set(YOUTUBE_SECRET "$ENV{YOUTUBE_SECRET}")
  42. endif()
  43. if(DEFINED ENV{YOUTUBE_SECRET_HASH} AND NOT DEFINED YOUTUBE_SECRET_HASH)
  44. set(YOUTUBE_SECRET_HASH "$ENV{YOUTUBE_SECRET_HASH}")
  45. endif()
  46. if(NOT DEFINED YOUTUBE_CLIENTID OR "${YOUTUBE_CLIENTID}" STREQUAL "" OR
  47. NOT DEFINED YOUTUBE_SECRET OR "${YOUTUBE_SECRET}" STREQUAL "" OR
  48. NOT DEFINED YOUTUBE_CLIENTID_HASH OR "${YOUTUBE_CLIENTID_HASH}" STREQUAL "" OR
  49. NOT DEFINED YOUTUBE_SECRET_HASH OR "${YOUTUBE_SECRET_HASH}" STREQUAL "")
  50. set(YOUTUBE_ENABLED FALSE)
  51. else()
  52. set(YOUTUBE_ENABLED TRUE)
  53. endif()
  54. configure_file(
  55. "${CMAKE_CURRENT_SOURCE_DIR}/ui-config.h.in"
  56. "${CMAKE_CURRENT_BINARY_DIR}/ui-config.h")
  57. set(CMAKE_INCLUDE_CURRENT_DIR TRUE)
  58. set(CMAKE_AUTOMOC TRUE)
  59. find_package(Threads REQUIRED)
  60. find_package(Qt5Network ${FIND_MODE})
  61. find_package(Qt5Widgets ${FIND_MODE})
  62. find_package(Qt5Svg ${FIND_MODE})
  63. if(WIN32 AND (Qt5Widgets_VERSION VERSION_LESS 6.0.0))
  64. find_package(Qt5WinExtras ${FIND_MODE})
  65. endif()
  66. find_package(Qt5Xml ${FIND_MODE})
  67. find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
  68. if(NOT Qt5Widgets_FOUND)
  69. if (ENABLE_UI)
  70. message(FATAL_ERROR "Failed to find Qt5")
  71. else()
  72. message(STATUS "Qt5 not found - UI disabled")
  73. return()
  74. endif()
  75. endif()
  76. include_directories(${FFMPEG_INCLUDE_DIRS})
  77. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  78. include_directories(SYSTEM "obs-frontend-api")
  79. include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
  80. include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/libff")
  81. include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/json11")
  82. if(BROWSER_AVAILABLE_INTERNAL)
  83. include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/plugins/obs-browser/panel")
  84. endif()
  85. find_package(Libcurl REQUIRED)
  86. include_directories(${LIBCURL_INCLUDE_DIRS})
  87. add_definitions(${LIBCURL_DEFINITIONS})
  88. if(WIN32)
  89. include_directories(${BLAKE2_INCLUDE_DIR})
  90. set(obs_PLATFORM_SOURCES
  91. platform-windows.cpp
  92. win-update/update-window.cpp
  93. win-update/win-update.cpp
  94. win-update/win-update-helpers.cpp
  95. ${obs-studio_BINARY_DIR}/obs.rc)
  96. set(obs_PLATFORM_HEADERS
  97. win-update/update-window.hpp
  98. win-update/win-update.hpp
  99. win-update/win-update-helpers.hpp)
  100. set(obs_PLATFORM_LIBRARIES
  101. crypt32
  102. blake2)
  103. if(CMAKE_SIZEOF_VOID_P EQUAL 4)
  104. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE")
  105. endif()
  106. elseif(APPLE)
  107. set(obs_PLATFORM_SOURCES
  108. platform-osx.mm)
  109. find_package(AppKit REQUIRED)
  110. set(obs_PLATFORM_LIBRARIES ${APPKIT_LIBRARIES})
  111. add_definitions(-fobjc-arc)
  112. option(ENABLE_SPARKLE_UPDATER "Enables updates via the Sparkle framework (don't forget to update the Info.plist for your .app)" OFF)
  113. if(ENABLE_SPARKLE_UPDATER)
  114. find_library(SPARKLE Sparkle)
  115. include_directories(${SPARKLE})
  116. set(obs_PLATFORM_SOURCES
  117. ${obs_PLATFORM_SOURCES}
  118. sparkle-updater.mm)
  119. set(obs_PLATFORM_LIBRARIES
  120. ${obs_PLATFORM_LIBRARIES}
  121. ${SPARKLE})
  122. add_definitions(-DUPDATE_SPARKLE=1)
  123. endif()
  124. elseif(UNIX)
  125. find_package(Qt5Gui REQUIRED)
  126. find_package(PythonDeps QUIET)
  127. include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS})
  128. set(obs_PLATFORM_SOURCES
  129. platform-x11.cpp)
  130. set(obs_PLATFORM_LIBRARIES
  131. ${obs_PLATFORM_LIBRARIES}
  132. Qt5::Gui
  133. Qt5::GuiPrivate)
  134. if("${CMAKE_SYSTEM_NAME}" MATCHES "FreeBSD")
  135. list(APPEND obs_PLATFORM_LIBRARIES
  136. procstat)
  137. endif()
  138. endif()
  139. if(BROWSER_AVAILABLE_INTERNAL)
  140. list(APPEND obs_PLATFORM_SOURCES
  141. window-dock-browser.cpp
  142. window-extra-browsers.cpp
  143. )
  144. list(APPEND obs_PLATFORM_HEADERS
  145. window-dock-browser.hpp
  146. window-extra-browsers.hpp
  147. )
  148. if(TWITCH_ENABLED)
  149. list(APPEND obs_PLATFORM_SOURCES
  150. auth-twitch.cpp
  151. )
  152. list(APPEND obs_PLATFORM_HEADERS
  153. auth-twitch.hpp
  154. )
  155. endif()
  156. if(RESTREAM_ENABLED)
  157. list(APPEND obs_PLATFORM_SOURCES
  158. auth-restream.cpp
  159. )
  160. list(APPEND obs_PLATFORM_HEADERS
  161. auth-restream.hpp
  162. )
  163. endif()
  164. endif()
  165. if(YOUTUBE_ENABLED)
  166. list(APPEND obs_PLATFORM_SOURCES
  167. auth-youtube.cpp
  168. youtube-api-wrappers.cpp
  169. )
  170. list(APPEND obs_PLATFORM_HEADERS
  171. auth-youtube.hpp
  172. youtube-api-wrappers.hpp
  173. )
  174. endif()
  175. set(obs_libffutil_SOURCES
  176. ../deps/libff/libff/ff-util.c
  177. )
  178. set(obs_libffutil_HEADERS
  179. ../deps/libff/libff/ff-util.h
  180. )
  181. if(MSVC)
  182. set_source_files_properties(
  183. ../deps/libff/libff/ff-util.c
  184. PROPERTIES COMPILE_FLAGS -Dinline=__inline
  185. )
  186. set(obs_PLATFORM_LIBRARIES
  187. ${obs_PLATFORM_LIBRARIES}
  188. w32-pthreads)
  189. endif()
  190. set(obs_SOURCES
  191. ${obs_PLATFORM_SOURCES}
  192. ${obs_libffutil_SOURCES}
  193. ../deps/json11/json11.cpp
  194. obs-app.cpp
  195. window-dock.cpp
  196. api-interface.cpp
  197. window-basic-main.cpp
  198. window-basic-stats.cpp
  199. window-basic-filters.cpp
  200. window-basic-settings.cpp
  201. window-basic-interaction.cpp
  202. window-basic-properties.cpp
  203. window-basic-auto-config.cpp
  204. window-basic-main-outputs.cpp
  205. window-basic-source-select.cpp
  206. window-basic-settings-stream.cpp
  207. window-basic-main-screenshot.cpp
  208. window-basic-auto-config-test.cpp
  209. window-basic-main-scene-collections.cpp
  210. window-basic-main-transitions.cpp
  211. window-basic-main-dropfiles.cpp
  212. window-basic-main-profiles.cpp
  213. window-basic-main-browser.cpp
  214. window-basic-main-icons.cpp
  215. window-basic-status-bar.cpp
  216. window-basic-adv-audio.cpp
  217. window-basic-transform.cpp
  218. window-basic-preview.cpp
  219. window-basic-about.cpp
  220. window-importer.cpp
  221. media-controls.cpp
  222. window-namedialog.cpp
  223. window-log-reply.cpp
  224. window-projector.cpp
  225. window-remux.cpp
  226. window-missing-files.cpp
  227. auth-base.cpp
  228. auth-oauth.cpp
  229. auth-listener.cpp
  230. obf.c
  231. source-tree.cpp
  232. scene-tree.cpp
  233. properties-view.cpp
  234. focus-list.cpp
  235. menu-button.cpp
  236. double-slider.cpp
  237. slider-ignorewheel.cpp
  238. combobox-ignorewheel.cpp
  239. spinbox-ignorewheel.cpp
  240. record-button.cpp
  241. ui-validation.cpp
  242. url-push-button.cpp
  243. volume-control.cpp
  244. adv-audio-control.cpp
  245. item-widget-helpers.cpp
  246. context-bar-controls.cpp
  247. horizontal-scroll-area.cpp
  248. vertical-scroll-area.cpp
  249. visibility-item-widget.cpp
  250. slider-absoluteset-style.cpp
  251. qt-display.cpp
  252. crash-report.cpp
  253. hotkey-edit.cpp
  254. source-label.cpp
  255. remote-text.cpp
  256. audio-encoders.cpp
  257. qt-wrappers.cpp
  258. log-viewer.cpp
  259. obs-proxy-style.cpp
  260. locked-checkbox.cpp
  261. visibility-checkbox.cpp
  262. media-slider.cpp
  263. undo-stack-obs.cpp)
  264. set(obs_HEADERS
  265. ${obs_PLATFORM_HEADERS}
  266. ${obs_libffutil_HEADERS}
  267. ../deps/json11/json11.hpp
  268. obs-app.hpp
  269. platform.hpp
  270. window-dock.hpp
  271. window-main.hpp
  272. window-basic-main.hpp
  273. window-basic-stats.hpp
  274. window-basic-filters.hpp
  275. window-basic-settings.hpp
  276. window-basic-interaction.hpp
  277. window-basic-properties.hpp
  278. window-basic-auto-config.hpp
  279. window-basic-main-outputs.hpp
  280. window-basic-source-select.hpp
  281. window-basic-about.hpp
  282. window-basic-status-bar.hpp
  283. window-basic-adv-audio.hpp
  284. window-basic-transform.hpp
  285. window-basic-preview.hpp
  286. window-importer.hpp
  287. media-controls.hpp
  288. window-namedialog.hpp
  289. window-log-reply.hpp
  290. window-projector.hpp
  291. window-remux.hpp
  292. window-missing-files.hpp
  293. auth-base.hpp
  294. auth-oauth.hpp
  295. auth-listener.hpp
  296. obf.h
  297. source-tree.hpp
  298. scene-tree.hpp
  299. properties-view.hpp
  300. properties-view.moc.hpp
  301. display-helpers.hpp
  302. balance-slider.hpp
  303. double-slider.hpp
  304. slider-ignorewheel.hpp
  305. combobox-ignorewheel.hpp
  306. spinbox-ignorewheel.hpp
  307. focus-list.hpp
  308. menu-button.hpp
  309. mute-checkbox.hpp
  310. record-button.hpp
  311. ui-validation.hpp
  312. screenshot-obj.hpp
  313. url-push-button.hpp
  314. volume-control.hpp
  315. adv-audio-control.hpp
  316. item-widget-helpers.hpp
  317. visibility-checkbox.hpp
  318. context-bar-controls.hpp
  319. locked-checkbox.hpp
  320. horizontal-scroll-area.hpp
  321. expand-checkbox.hpp
  322. vertical-scroll-area.hpp
  323. visibility-item-widget.hpp
  324. slider-absoluteset-style.hpp
  325. qt-display.hpp
  326. crash-report.hpp
  327. hotkey-edit.hpp
  328. source-label.hpp
  329. remote-text.hpp
  330. audio-encoders.hpp
  331. qt-wrappers.hpp
  332. clickable-label.hpp
  333. log-viewer.hpp
  334. obs-proxy-style.hpp
  335. obs-proxy-style.hpp
  336. media-slider.hpp
  337. undo-stack-obs.hpp)
  338. set(obs_importers_HEADERS
  339. importers/importers.hpp)
  340. set(obs_importers_SOURCES
  341. importers/importers.cpp
  342. importers/classic.cpp
  343. importers/sl.cpp
  344. importers/studio.cpp
  345. importers/xsplit.cpp)
  346. source_group("importers\\Source Files" FILES ${obs_importers_SOURCES})
  347. source_group("importers\\Header Files" FILES ${obs_importers_HEADERS})
  348. set(obs_UI
  349. forms/source-toolbar/browser-source-toolbar.ui
  350. forms/source-toolbar/device-select-toolbar.ui
  351. forms/source-toolbar/game-capture-toolbar.ui
  352. forms/source-toolbar/image-source-toolbar.ui
  353. forms/source-toolbar/color-source-toolbar.ui
  354. forms/source-toolbar/text-source-toolbar.ui
  355. forms/source-toolbar/media-controls.ui
  356. forms/AutoConfigStartPage.ui
  357. forms/AutoConfigVideoPage.ui
  358. forms/AutoConfigStreamPage.ui
  359. forms/AutoConfigTestPage.ui
  360. forms/ColorSelect.ui
  361. forms/OBSLogReply.ui
  362. forms/OBSBasic.ui
  363. forms/OBSBasicTransform.ui
  364. forms/OBSBasicFilters.ui
  365. forms/OBSBasicSettings.ui
  366. forms/OBSBasicSourceSelect.ui
  367. forms/OBSBasicInteraction.ui
  368. forms/OBSExtraBrowsers.ui
  369. forms/OBSUpdate.ui
  370. forms/OBSRemux.ui
  371. forms/OBSImporter.ui
  372. forms/OBSMissingFiles.ui
  373. forms/OBSAbout.ui)
  374. set(obs_QRC
  375. forms/obs.qrc)
  376. if(YOUTUBE_ENABLED)
  377. list(APPEND obs_SOURCES
  378. window-youtube-actions.cpp
  379. )
  380. list(APPEND obs_HEADERS
  381. window-youtube-actions.hpp
  382. )
  383. list(APPEND obs_UI
  384. forms/OBSYoutubeActions.ui
  385. )
  386. endif()
  387. qt5_wrap_ui(obs_UI_HEADERS ${obs_UI})
  388. qt5_add_resources(obs_QRC_SOURCES ${obs_QRC})
  389. add_executable(obs WIN32
  390. obs.manifest
  391. ${obs_SOURCES}
  392. ${obs_HEADERS}
  393. ${obs_importers_SOURCES}
  394. ${obs_importers_HEADERS}
  395. ${obs_UI_HEADERS}
  396. ${obs_QRC_SOURCES})
  397. if(WIN32)
  398. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  399. set(_output_suffix "64")
  400. else()
  401. set(_output_suffix "32")
  402. endif()
  403. set_target_properties(obs
  404. PROPERTIES
  405. OUTPUT_NAME "obs${_output_suffix}")
  406. if(Qt5Widgets_VERSION VERSION_LESS 6.0.0)
  407. target_link_libraries(obs
  408. Qt5::WinExtras)
  409. endif()
  410. endif()
  411. target_link_libraries(obs
  412. libobs
  413. Threads::Threads
  414. Qt5::Network
  415. Qt5::Widgets
  416. Qt5::Svg
  417. Qt5::Xml
  418. obs-frontend-api
  419. ${FFMPEG_LIBRARIES}
  420. ${LIBCURL_LIBRARIES}
  421. ${obs_PLATFORM_LIBRARIES})
  422. set_target_properties(obs PROPERTIES FOLDER "frontend")
  423. define_graphic_modules(obs)
  424. install_obs_core(obs)
  425. install_obs_data(obs data obs-studio)
  426. install_obs_data_file(obs ../AUTHORS obs-studio/authors)
  427. if (UNIX AND UNIX_STRUCTURE AND NOT APPLE)
  428. add_subdirectory(xdg-data)
  429. endif()
  430. if (UNIX AND NOT APPLE)
  431. # python symbols must be in the global symbol table
  432. # so we link the main executable to python if we expect
  433. # obs-scripting python support to be enabled.
  434. # see: https://github.com/obsproject/obs-studio/issues/2222 and https://bugs.python.org/issue36721
  435. if(NOT DISABLE_PYTHON AND PYTHONLIBS_FOUND)
  436. target_link_libraries(obs ${PYTHON_LIBRARIES})
  437. set_target_properties(obs PROPERTIES LINK_FLAGS "-Wl,--no-as-needed")
  438. # Use this after cmake 3.13 aka we drop ubuntu 18.04.
  439. # target_link_options(obs PRIVATE "LINKER:-no-as-needed")
  440. endif()
  441. endif()
  442. add_subdirectory(frontend-plugins)
  443. if(WIN32)
  444. add_subdirectory(win-update/updater)
  445. endif()