DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1465 lines
53KB

  1. # DISTRHO Plugin Framework (DPF)
  2. # Copyright (C) 2021 Jean Pierre Cimalando <jp-dev@inbox.ru>
  3. # Copyright (C) 2022-2024 Filipe Coelho <falktx@falktx.com>
  4. #
  5. # SPDX-License-Identifier: ISC
  6. # ------------------------------------------------------------------------------
  7. # CMake support module for the DISTRHO Plugin Framework
  8. #
  9. # The purpose of this module is to help building music plugins easily, when the
  10. # project uses CMake as its build system.
  11. #
  12. # In order to use the helpers provided by this module, a plugin author should
  13. # add DPF as a subproject, making the function `dpf_add_plugin` available.
  14. # The usage of this function is documented below in greater detail.
  15. #
  16. # Example project `CMakeLists.txt`:
  17. #
  18. # ```
  19. # cmake_minimum_required(VERSION 3.7)
  20. # project(MyPlugin)
  21. #
  22. # add_subdirectory(DPF)
  23. #
  24. # dpf_add_plugin(MyPlugin
  25. # TARGETS clap lv2 vst2 vst3
  26. # UI_TYPE opengl
  27. # FILES_DSP
  28. # src/MyPlugin.cpp
  29. # FILES_UI
  30. # src/MyUI.cpp)
  31. #
  32. # target_include_directories(MyPlugin
  33. # PUBLIC src)
  34. # ```
  35. #
  36. # Important: note that properties, such as include directories, definitions,
  37. # and linked libraries *must* be marked with `PUBLIC` so they take effect and
  38. # propagate into all the plugin targets.
  39. include(CMakeParseArguments)
  40. # ------------------------------------------------------------------------------
  41. # DPF public functions
  42. # ------------------------------------------------------------------------------
  43. # dpf_add_plugin(name <args...>)
  44. # ------------------------------------------------------------------------------
  45. #
  46. # Add a plugin built using the DISTRHO Plugin Framework.
  47. #
  48. # ------------------------------------------------------------------------------
  49. # Created targets:
  50. #
  51. # `<name>`
  52. # static library: the common part of the plugin
  53. # The public properties set on this target apply to both DSP and UI.
  54. #
  55. # `<name>-dsp`
  56. # static library: the DSP part of the plugin
  57. # The public properties set on this target apply to the DSP only.
  58. #
  59. # `<name>-ui`
  60. # static library: the UI part of the plugin
  61. # The public properties set on this target apply to the UI only.
  62. #
  63. # `<name>-<target>` for each target specified with the `TARGETS` argument.
  64. # This is target-dependent and not intended for public use.
  65. #
  66. # ------------------------------------------------------------------------------
  67. # Arguments:
  68. #
  69. # `TARGETS` <tgt1>...<tgtN>
  70. # a list of one of more of the following target types:
  71. # `jack`, `ladspa`, `dssi`, `lv2`, `vst2`, `vst3`, `clap`
  72. #
  73. # `UI_TYPE` <type>
  74. # the user interface type, can be one of the following:
  75. # - cairo
  76. # - external
  77. # - opengl (default)
  78. # - opengl3
  79. # - vulkan
  80. # - webview
  81. #
  82. # `FILES_COMMON` <file1>...<fileN>
  83. # list of sources which are part of both DSP and UI
  84. #
  85. # `FILES_DSP` <file1>...<fileN>
  86. # list of sources which are part of the DSP
  87. #
  88. # `FILES_UI` <file1>...<fileN>
  89. # list of sources which are part of the UI
  90. # empty indicates the plugin does not have UI
  91. #
  92. # `MODGUI_CLASS_NAME`
  93. # class name to use for modgui builds
  94. #
  95. # `MONOLITHIC`
  96. # build LV2 as a single binary for UI and DSP
  97. #
  98. # `NO_SHARED_RESOURCES`
  99. # do not build DPF shared resources (fonts, etc)
  100. #
  101. # `USE_FILE_BROWSER`
  102. # enable file browser dialog APIs
  103. #
  104. # `USE_WEB_VIEW`
  105. # enable web browser view APIs
  106. #
  107. function(dpf_add_plugin NAME)
  108. set(options MONOLITHIC NO_SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  109. set(oneValueArgs MODGUI_CLASS_NAME UI_TYPE)
  110. set(multiValueArgs FILES_COMMON FILES_DSP FILES_UI TARGETS)
  111. cmake_parse_arguments(_dpf_plugin "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  112. if("${_dpf_plugin_UI_TYPE}" STREQUAL "")
  113. set(_dpf_plugin_UI_TYPE "opengl")
  114. endif()
  115. set(_dgl_library)
  116. if(_dpf_plugin_FILES_UI)
  117. if(_dpf_plugin_UI_TYPE STREQUAL "cairo")
  118. dpf__add_dgl_cairo($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  119. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  120. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  121. set(_dgl_library dgl-cairo)
  122. elseif(_dpf_plugin_UI_TYPE STREQUAL "external")
  123. dpf__add_dgl_external($<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  124. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  125. set(_dgl_library dgl-external)
  126. elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl")
  127. dpf__add_dgl_opengl($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  128. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  129. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  130. set(_dgl_library dgl-opengl)
  131. elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl3")
  132. dpf__add_dgl_opengl3($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  133. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  134. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  135. set(_dgl_library dgl-opengl3)
  136. elseif(_dpf_plugin_UI_TYPE STREQUAL "vulkan")
  137. dpf__add_dgl_vulkan($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  138. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  139. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  140. set(_dgl_library dgl-vulkan)
  141. elseif(_dpf_plugin_UI_TYPE STREQUAL "webview")
  142. set(_dpf_plugin_USE_WEB_VIEW TRUE)
  143. dpf__add_dgl_external($<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  144. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  145. set(_dgl_library dgl-external)
  146. else()
  147. message(FATAL_ERROR "Unrecognized UI type for plugin: ${_dpf_plugin_UI_TYPE}")
  148. endif()
  149. else()
  150. set(_dpf_plugin_UI_TYPE "")
  151. endif()
  152. set(_dgl_has_ui OFF)
  153. if(_dgl_library)
  154. set(_dgl_has_ui ON)
  155. endif()
  156. ###
  157. dpf__ensure_sources_non_empty(_dpf_plugin_FILES_COMMON)
  158. dpf__ensure_sources_non_empty(_dpf_plugin_FILES_DSP)
  159. dpf__ensure_sources_non_empty(_dpf_plugin_FILES_UI)
  160. ###
  161. dpf__add_static_library("${NAME}" ${_dpf_plugin_FILES_COMMON})
  162. target_include_directories("${NAME}" PUBLIC
  163. "${DPF_ROOT_DIR}/distrho")
  164. if(_dpf_plugin_USE_FILE_BROWSER)
  165. target_compile_definitions("${NAME}" PUBLIC "DGL_USE_FILE_BROWSER")
  166. endif()
  167. if(_dpf_plugin_USE_WEB_VIEW)
  168. target_compile_definitions("${NAME}" PUBLIC "DGL_USE_WEB_VIEW")
  169. endif()
  170. if(_dpf_plugin_MODGUI_CLASS_NAME)
  171. target_compile_definitions("${NAME}" PUBLIC "DISTRHO_PLUGIN_MODGUI_CLASS_NAME=\"${_dpf_plugin_MODGUI_CLASS_NAME}\"")
  172. endif()
  173. if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU))
  174. target_link_libraries("${NAME}" PRIVATE "dl")
  175. endif()
  176. if(_dgl_library)
  177. # make sure that all code will see DGL_* definitions
  178. target_link_libraries("${NAME}" PUBLIC
  179. "${_dgl_library}-definitions"
  180. dgl-system-libs-definitions
  181. dgl-system-libs)
  182. endif()
  183. dpf__add_static_library("${NAME}-dsp" ${_dpf_plugin_FILES_DSP})
  184. target_link_libraries("${NAME}-dsp" PUBLIC "${NAME}")
  185. if(_dgl_library)
  186. dpf__add_static_library("${NAME}-ui" ${_dpf_plugin_FILES_UI})
  187. target_link_libraries("${NAME}-ui" PUBLIC "${NAME}" ${_dgl_library})
  188. if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU))
  189. target_link_libraries("${NAME}-ui" PRIVATE "dl")
  190. if(LINUX AND _dpf_plugin_USE_WEB_VIEW)
  191. execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=Scrt1.o
  192. OUTPUT_STRIP_TRAILING_WHITESPACE
  193. OUTPUT_VARIABLE _dpf_plugin_shared_crt)
  194. target_link_libraries("${NAME}-ui" PRIVATE "rt")
  195. endif()
  196. endif()
  197. # add the files containing C++17 or Objective-C classes
  198. dpf__add_plugin_specific_ui_sources("${NAME}-ui" "${_dpf_plugin_USE_WEB_VIEW}")
  199. else()
  200. add_library("${NAME}-ui" INTERFACE)
  201. endif()
  202. ###
  203. foreach(_target ${_dpf_plugin_TARGETS})
  204. if(_target STREQUAL "jack")
  205. dpf__build_jack("${NAME}" "${_dgl_has_ui}")
  206. elseif(_target STREQUAL "ladspa")
  207. dpf__build_ladspa("${NAME}")
  208. elseif(_target STREQUAL "dssi")
  209. dpf__build_dssi("${NAME}" "${_dgl_has_ui}")
  210. elseif(_target STREQUAL "lv2")
  211. dpf__build_lv2("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_MONOLITHIC}" "${_dpf_plugin_shared_crt}")
  212. elseif(_target STREQUAL "vst2")
  213. dpf__build_vst2("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}")
  214. elseif(_target STREQUAL "vst3")
  215. dpf__build_vst3("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}")
  216. elseif(_target STREQUAL "clap")
  217. dpf__build_clap("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}")
  218. elseif(_target STREQUAL "au")
  219. if (APPLE)
  220. dpf__build_au("${NAME}" "${_dgl_has_ui}")
  221. endif()
  222. elseif(_target STREQUAL "static")
  223. dpf__build_static("${NAME}" "${_dgl_has_ui}")
  224. else()
  225. message(FATAL_ERROR "Unrecognized target type for plugin: ${_target}")
  226. endif()
  227. endforeach()
  228. endfunction()
  229. # dpf_add_executable(target <args...>)
  230. # ------------------------------------------------------------------------------
  231. #
  232. # Add a simple executable built using the DISTRHO Plugin Framework.
  233. #
  234. # ------------------------------------------------------------------------------
  235. # Arguments:
  236. #
  237. # `UI_TYPE` <type>
  238. # the user interface type, can be one of the following:
  239. # - cairo
  240. # - external
  241. # - opengl (default)
  242. # - opengl3
  243. # - vulkan
  244. # - webview
  245. #
  246. # `NO_SHARED_RESOURCES`
  247. # do not build DPF shared resources (fonts, etc)
  248. #
  249. # `USE_FILE_BROWSER`
  250. # enable file browser dialog APIs
  251. #
  252. # `USE_WEB_VIEW`
  253. # enable web browser view APIs
  254. #
  255. function(dpf_add_executable NAME)
  256. set(options NO_SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  257. set(oneValueArgs UI_TYPE)
  258. cmake_parse_arguments(_dpf_plugin "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  259. if("${_dpf_plugin_UI_TYPE}" STREQUAL "")
  260. set(_dpf_plugin_UI_TYPE "opengl")
  261. endif()
  262. set(_dgl_library)
  263. if(_dpf_plugin_UI_TYPE STREQUAL "cairo")
  264. dpf__add_dgl_cairo($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  265. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  266. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  267. set(_dgl_library dgl-cairo)
  268. elseif(_dpf_plugin_UI_TYPE STREQUAL "external")
  269. dpf__add_dgl_external($<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  270. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  271. set(_dgl_library dgl-external)
  272. elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl")
  273. dpf__add_dgl_opengl($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  274. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  275. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  276. set(_dgl_library dgl-opengl)
  277. elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl3")
  278. dpf__add_dgl_opengl3($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  279. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  280. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  281. set(_dgl_library dgl-opengl3)
  282. elseif(_dpf_plugin_UI_TYPE STREQUAL "vulkan")
  283. dpf__add_dgl_vulkan($<NOT:$<BOOL:${_dpf_plugin_NO_SHARED_RESOURCES}>>
  284. $<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  285. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  286. set(_dgl_library dgl-vulkan)
  287. elseif(_dpf_plugin_UI_TYPE STREQUAL "webview")
  288. set(_dpf_plugin_USE_WEB_VIEW TRUE)
  289. dpf__add_dgl_external($<BOOL:${_dpf_plugin_USE_FILE_BROWSER}>
  290. $<BOOL:${_dpf_plugin_USE_WEB_VIEW}>)
  291. set(_dgl_library dgl-external)
  292. else()
  293. message(FATAL_ERROR "Unrecognized UI type for executable: ${_dpf_plugin_UI_TYPE}")
  294. endif()
  295. set(_dgl_has_ui OFF)
  296. if(_dgl_library)
  297. set(_dgl_has_ui ON)
  298. endif()
  299. dpf__create_dummy_source_list(_no_srcs)
  300. dpf__add_executable("${NAME}" ${_no_srcs})
  301. target_include_directories("${NAME}" PUBLIC "${DPF_ROOT_DIR}/distrho")
  302. if(_dpf_plugin_USE_FILE_BROWSER)
  303. target_compile_definitions("${NAME}" PUBLIC "DGL_USE_FILE_BROWSER")
  304. endif()
  305. if(_dpf_plugin_USE_WEB_VIEW)
  306. target_compile_definitions("${NAME}" PUBLIC "DGL_USE_WEB_VIEW")
  307. endif()
  308. if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU))
  309. target_link_libraries("${NAME}" PRIVATE "dl")
  310. endif()
  311. if(_dgl_library)
  312. # make sure that all code will see DGL_* definitions
  313. target_link_libraries("${NAME}" PUBLIC
  314. "${_dgl_library}"
  315. "${_dgl_library}-definitions"
  316. dgl-system-libs-definitions
  317. dgl-system-libs)
  318. # extra linkage for linux web view
  319. if(LINUX AND _dpf_plugin_USE_WEB_VIEW)
  320. target_link_libraries("${NAME}" PRIVATE "rt")
  321. endif()
  322. # add the files containing C++17 or Objective-C classes
  323. dpf__add_plugin_specific_ui_sources("${NAME}" "${_dpf_plugin_USE_WEB_VIEW}")
  324. endif()
  325. endfunction()
  326. # ------------------------------------------------------------------------------
  327. # DPF private functions (prefixed with `dpf__`)
  328. # ------------------------------------------------------------------------------
  329. # Note: The $<0:> trick is to prevent MSVC from appending the build type
  330. # to the output directory.
  331. #
  332. # dpf__build_jack
  333. # ------------------------------------------------------------------------------
  334. #
  335. # Add build rules for a JACK/Standalone program.
  336. #
  337. function(dpf__build_jack NAME HAS_UI)
  338. dpf__create_dummy_source_list(_no_srcs)
  339. dpf__add_executable("${NAME}-jack" ${_no_srcs})
  340. dpf__add_plugin_main("${NAME}-jack" "jack")
  341. dpf__add_ui_main("${NAME}-jack" "jack" "${HAS_UI}")
  342. target_link_libraries("${NAME}-jack" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  343. set_target_properties("${NAME}-jack" PROPERTIES
  344. RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  345. OUTPUT_NAME "${NAME}")
  346. target_compile_definitions("${NAME}" PUBLIC "HAVE_JACK")
  347. target_compile_definitions("${NAME}-jack" PRIVATE "HAVE_GETTIMEOFDAY")
  348. find_package(PkgConfig)
  349. pkg_check_modules(SDL2 "sdl2")
  350. if(SDL2_FOUND)
  351. target_compile_definitions("${NAME}" PUBLIC "HAVE_SDL2")
  352. target_include_directories("${NAME}-jack" PRIVATE ${SDL2_STATIC_INCLUDE_DIRS})
  353. target_link_libraries("${NAME}-jack" PRIVATE ${SDL2_STATIC_LIBRARIES})
  354. dpf__target_link_directories("${NAME}-jack" "${SDL2_STATIC_LIBRARY_DIRS}")
  355. endif()
  356. if(APPLE OR WIN32)
  357. target_compile_definitions("${NAME}" PUBLIC "HAVE_RTAUDIO")
  358. else()
  359. find_package(Threads)
  360. pkg_check_modules(ALSA "alsa")
  361. pkg_check_modules(PULSEAUDIO "libpulse-simple")
  362. if(ALSA_FOUND)
  363. target_compile_definitions("${NAME}" PUBLIC "HAVE_ALSA")
  364. target_include_directories("${NAME}-jack" PRIVATE ${ALSA_INCLUDE_DIRS})
  365. target_link_libraries("${NAME}-jack" PRIVATE ${ALSA_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
  366. dpf__target_link_directories("${NAME}-jack" "${ALSA_LIBRARY_DIRS}")
  367. endif()
  368. if(PULSEAUDIO_FOUND)
  369. target_compile_definitions("${NAME}" PUBLIC "HAVE_PULSEAUDIO")
  370. target_include_directories("${NAME}-jack" PRIVATE ${PULSEAUDIO_INCLUDE_DIRS})
  371. target_link_libraries("${NAME}-jack" PRIVATE ${PULSEAUDIO_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
  372. dpf__target_link_directories("${NAME}-jack" "${PULSEAUDIO_LIBRARY_DIRS}")
  373. endif()
  374. if(ALSA_FOUND OR PULSEAUDIO_FOUND)
  375. target_compile_definitions("${NAME}" PUBLIC "HAVE_RTAUDIO")
  376. endif()
  377. endif()
  378. # for RtAudio native fallback
  379. if(APPLE)
  380. find_library(APPLE_COREAUDIO_FRAMEWORK "CoreAudio")
  381. find_library(APPLE_COREFOUNDATION_FRAMEWORK "CoreFoundation")
  382. find_library(APPLE_COREMIDI_FRAMEWORK "CoreMIDI")
  383. target_link_libraries("${NAME}-jack" PRIVATE
  384. "${APPLE_COREAUDIO_FRAMEWORK}"
  385. "${APPLE_COREFOUNDATION_FRAMEWORK}"
  386. "${APPLE_COREMIDI_FRAMEWORK}")
  387. elseif(WIN32)
  388. target_link_libraries("${NAME}-jack" PRIVATE "ksuser" "mfplat" "mfuuid" "ole32" "winmm" "wmcodecdspuuid")
  389. if(HAS_UI AND MINGW)
  390. set_target_properties("${NAME}-jack" PROPERTIES WIN32_EXECUTABLE TRUE)
  391. endif()
  392. endif()
  393. endfunction()
  394. # dpf__build_ladspa
  395. # ------------------------------------------------------------------------------
  396. #
  397. # Add build rules for a LADSPA plugin.
  398. #
  399. function(dpf__build_ladspa NAME)
  400. dpf__create_dummy_source_list(_no_srcs)
  401. dpf__add_module("${NAME}-ladspa" ${_no_srcs})
  402. dpf__add_plugin_main("${NAME}-ladspa" "ladspa")
  403. dpf__set_module_export_list("${NAME}-ladspa" "ladspa")
  404. target_link_libraries("${NAME}-ladspa" PRIVATE "${NAME}-dsp")
  405. set_target_properties("${NAME}-ladspa" PROPERTIES
  406. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  407. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/ladspa/$<0:>"
  408. OUTPUT_NAME "${NAME}-ladspa"
  409. PREFIX "")
  410. endfunction()
  411. # dpf__build_dssi
  412. # ------------------------------------------------------------------------------
  413. #
  414. # Add build rules for a DSSI plugin.
  415. #
  416. function(dpf__build_dssi NAME HAS_UI)
  417. find_package(PkgConfig)
  418. pkg_check_modules(LIBLO "liblo")
  419. if(NOT LIBLO_FOUND)
  420. dpf__warn_once_only(missing_liblo
  421. "liblo is not found, skipping the `dssi` plugin targets")
  422. return()
  423. endif()
  424. dpf__create_dummy_source_list(_no_srcs)
  425. dpf__add_module("${NAME}-dssi" ${_no_srcs})
  426. dpf__add_plugin_main("${NAME}-dssi" "dssi")
  427. dpf__set_module_export_list("${NAME}-dssi" "dssi")
  428. target_link_libraries("${NAME}-dssi" PRIVATE "${NAME}-dsp")
  429. set_target_properties("${NAME}-dssi" PROPERTIES
  430. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  431. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/dssi/$<0:>"
  432. OUTPUT_NAME "${NAME}-dssi"
  433. PREFIX "")
  434. if(HAS_UI)
  435. dpf__add_executable("${NAME}-dssi-ui" ${_no_srcs})
  436. dpf__add_ui_main("${NAME}-dssi-ui" "dssi" "${HAS_UI}")
  437. target_link_libraries("${NAME}-dssi-ui" PRIVATE "${NAME}-ui")
  438. set_target_properties("${NAME}-dssi-ui" PROPERTIES
  439. RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}-dssi/$<0:>"
  440. OUTPUT_NAME "${NAME}_ui")
  441. target_compile_definitions("${NAME}" PUBLIC "HAVE_LIBLO")
  442. target_include_directories("${NAME}-dssi-ui" PRIVATE ${LIBLO_INCLUDE_DIRS})
  443. target_link_libraries("${NAME}-dssi-ui" PRIVATE ${LIBLO_LIBRARIES})
  444. dpf__target_link_directories("${NAME}-dssi-ui" "${LIBLO_LIBRARY_DIRS}")
  445. endif()
  446. endfunction()
  447. # dpf__build_lv2
  448. # ------------------------------------------------------------------------------
  449. #
  450. # Add build rules for an LV2 plugin.
  451. #
  452. function(dpf__build_lv2 NAME HAS_UI MONOLITHIC EXTRA_UI_LINK_OPTS)
  453. dpf__create_dummy_source_list(_no_srcs)
  454. dpf__add_module("${NAME}-lv2" ${_no_srcs})
  455. dpf__add_plugin_main("${NAME}-lv2" "lv2")
  456. if(HAS_UI AND MONOLITHIC)
  457. dpf__set_module_export_list("${NAME}-lv2" "lv2")
  458. else()
  459. dpf__set_module_export_list("${NAME}-lv2" "lv2-dsp")
  460. endif()
  461. target_link_libraries("${NAME}-lv2" PRIVATE "${NAME}-dsp")
  462. set_target_properties("${NAME}-lv2" PROPERTIES
  463. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.lv2/$<0:>"
  464. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/lv2/$<0:>"
  465. OUTPUT_NAME "${NAME}_dsp"
  466. PREFIX "")
  467. if(HAS_UI)
  468. if(MONOLITHIC)
  469. dpf__add_ui_main("${NAME}-lv2" "lv2" "${HAS_UI}")
  470. target_link_libraries("${NAME}-lv2" PRIVATE "${NAME}-ui")
  471. target_link_options("${NAME}-lv2" PRIVATE "${EXTRA_UI_LINK_OPTS}")
  472. set_target_properties("${NAME}-lv2" PROPERTIES
  473. OUTPUT_NAME "${NAME}")
  474. else()
  475. dpf__add_module("${NAME}-lv2-ui" ${_no_srcs})
  476. dpf__add_ui_main("${NAME}-lv2-ui" "lv2" "${HAS_UI}")
  477. dpf__set_module_export_list("${NAME}-lv2-ui" "lv2-ui")
  478. target_link_options("${NAME}-lv2-ui" PRIVATE "${EXTRA_UI_LINK_OPTS}")
  479. target_link_libraries("${NAME}-lv2-ui" PRIVATE "${NAME}-ui")
  480. set_target_properties("${NAME}-lv2-ui" PROPERTIES
  481. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.lv2/$<0:>"
  482. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/lv2/$<0:>"
  483. OUTPUT_NAME "${NAME}_ui"
  484. PREFIX "")
  485. endif()
  486. endif()
  487. dpf__add_lv2_ttl_generator()
  488. add_dependencies("${NAME}-lv2" lv2_ttl_generator)
  489. separate_arguments(CMAKE_CROSSCOMPILING_EMULATOR)
  490. add_custom_command(TARGET "${NAME}-lv2" POST_BUILD
  491. COMMAND
  492. ${CMAKE_CROSSCOMPILING_EMULATOR}
  493. "$<TARGET_FILE:lv2_ttl_generator>"
  494. "$<TARGET_FILE:${NAME}-lv2>"
  495. WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.lv2"
  496. DEPENDS lv2_ttl_generator)
  497. endfunction()
  498. # dpf__build_vst2
  499. # ------------------------------------------------------------------------------
  500. #
  501. # Add build rules for a VST2 plugin.
  502. #
  503. function(dpf__build_vst2 NAME HAS_UI EXTRA_UI_LINK_OPTS)
  504. dpf__create_dummy_source_list(_no_srcs)
  505. dpf__add_module("${NAME}-vst2" ${_no_srcs})
  506. dpf__add_plugin_main("${NAME}-vst2" "vst2")
  507. dpf__add_ui_main("${NAME}-vst2" "vst2" "${HAS_UI}")
  508. dpf__set_module_export_list("${NAME}-vst2" "vst2")
  509. target_link_libraries("${NAME}-vst2" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  510. target_link_options("${NAME}-vst2" PRIVATE "${EXTRA_UI_LINK_OPTS}")
  511. set_target_properties("${NAME}-vst2" PROPERTIES
  512. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  513. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/vst2/$<0:>"
  514. OUTPUT_NAME "${NAME}-vst2"
  515. PREFIX "")
  516. if(APPLE)
  517. set_target_properties("${NAME}-vst2" PROPERTIES
  518. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.vst/Contents/MacOS/$<0:>"
  519. OUTPUT_NAME "${NAME}"
  520. SUFFIX "")
  521. set(INFO_PLIST_PROJECT_NAME "${NAME}")
  522. configure_file("${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/Info.plist"
  523. "${PROJECT_BINARY_DIR}/bin/${NAME}.vst/Contents/Info.plist" @ONLY)
  524. file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo"
  525. DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.vst/Contents")
  526. endif()
  527. endfunction()
  528. # dpf__determine_vst3_package_architecture
  529. # ------------------------------------------------------------------------------
  530. #
  531. # Determines the package architecture for a VST3 plugin target.
  532. #
  533. function(dpf__determine_vst3_package_architecture OUTPUT_VARIABLE)
  534. # if set by variable, override the detection
  535. if(DPF_VST3_ARCHITECTURE)
  536. set("${OUTPUT_VARIABLE}" "${DPF_VST3_ARCHITECTURE}" PARENT_SCOPE)
  537. return()
  538. endif()
  539. # not used on Apple, which supports universal binary
  540. if(APPLE)
  541. set("${OUTPUT_VARIABLE}" "universal" PARENT_SCOPE)
  542. return()
  543. endif()
  544. # identify the target processor (special case of MSVC, problematic sometimes)
  545. if(MSVC)
  546. set(vst3_system_arch "${MSVC_CXX_ARCHITECTURE_ID}")
  547. else()
  548. set(vst3_system_arch "${CMAKE_SYSTEM_PROCESSOR}")
  549. endif()
  550. # transform the processor name to a format that VST3 recognizes
  551. if(vst3_system_arch MATCHES "^(x86_64|amd64|AMD64|x64|X64)$")
  552. set(vst3_package_arch "x86_64")
  553. elseif(vst3_system_arch MATCHES "^(i.86|x86|X86)$")
  554. if(WIN32)
  555. set(vst3_package_arch "x86")
  556. else()
  557. set(vst3_package_arch "i386")
  558. endif()
  559. elseif(vst3_system_arch MATCHES "^(armv[3-9][a-z]*|aarch64|loongarch64|ppc(64)?(le)?)$")
  560. set(vst3_package_arch "${vst3_system_arch}")
  561. else()
  562. message(FATAL_ERROR "We don't know this architecture for VST3: ${vst3_system_arch}.")
  563. endif()
  564. # TODO: the detections for Windows arm/arm64 when supported
  565. set("${OUTPUT_VARIABLE}" "${vst3_package_arch}" PARENT_SCOPE)
  566. endfunction()
  567. # dpf__build_vst3
  568. # ------------------------------------------------------------------------------
  569. #
  570. # Add build rules for a VST3 plugin.
  571. #
  572. function(dpf__build_vst3 NAME HAS_UI EXTRA_UI_LINK_OPTS)
  573. dpf__determine_vst3_package_architecture(vst3_arch)
  574. dpf__create_dummy_source_list(_no_srcs)
  575. dpf__add_module("${NAME}-vst3" ${_no_srcs})
  576. dpf__add_plugin_main("${NAME}-vst3" "vst3")
  577. dpf__add_ui_main("${NAME}-vst3" "vst3" "${HAS_UI}")
  578. dpf__set_module_export_list("${NAME}-vst3" "vst3")
  579. target_link_libraries("${NAME}-vst3" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  580. target_link_options("${NAME}-vst3" PRIVATE "${EXTRA_UI_LINK_OPTS}")
  581. set_target_properties("${NAME}-vst3" PROPERTIES
  582. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/vst3/$<0:>"
  583. OUTPUT_NAME "${NAME}"
  584. PREFIX "")
  585. if(APPLE)
  586. set_target_properties("${NAME}-vst3" PROPERTIES
  587. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.vst3/Contents/MacOS/$<0:>"
  588. SUFFIX "")
  589. elseif(WIN32)
  590. set_target_properties("${NAME}-vst3" PROPERTIES
  591. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.vst3/Contents/${vst3_arch}-win/$<0:>" SUFFIX ".vst3")
  592. else()
  593. set_target_properties("${NAME}-vst3" PROPERTIES
  594. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.vst3/Contents/${vst3_arch}-linux/$<0:>")
  595. endif()
  596. if(APPLE)
  597. # Uses the same macOS bundle template as VST2
  598. set(INFO_PLIST_PROJECT_NAME "${NAME}")
  599. configure_file("${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/Info.plist"
  600. "${PROJECT_BINARY_DIR}/bin/${NAME}.vst3/Contents/Info.plist" @ONLY)
  601. file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo"
  602. DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.vst3/Contents")
  603. endif()
  604. endfunction()
  605. # dpf__build_clap
  606. # ------------------------------------------------------------------------------
  607. #
  608. # Add build rules for a CLAP plugin.
  609. #
  610. function(dpf__build_clap NAME HAS_UI EXTRA_UI_LINK_OPTS)
  611. dpf__create_dummy_source_list(_no_srcs)
  612. dpf__add_module("${NAME}-clap" ${_no_srcs})
  613. dpf__add_plugin_main("${NAME}-clap" "clap")
  614. dpf__add_ui_main("${NAME}-clap" "clap" "${HAS_UI}")
  615. dpf__set_module_export_list("${NAME}-clap" "clap")
  616. target_link_libraries("${NAME}-clap" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  617. target_link_options("${NAME}-clap" PRIVATE "${EXTRA_UI_LINK_OPTS}")
  618. set_target_properties("${NAME}-clap" PROPERTIES
  619. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  620. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/clap/$<0:>"
  621. OUTPUT_NAME "${NAME}"
  622. PREFIX ""
  623. SUFFIX ".clap")
  624. if(APPLE)
  625. set_target_properties("${NAME}-clap" PROPERTIES
  626. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents/MacOS/$<0:>"
  627. OUTPUT_NAME "${NAME}"
  628. SUFFIX "")
  629. set(INFO_PLIST_PROJECT_NAME "${NAME}")
  630. configure_file("${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/Info.plist"
  631. "${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents/Info.plist" @ONLY)
  632. file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo"
  633. DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.clap/Contents")
  634. endif()
  635. endfunction()
  636. # dpf__build_au
  637. # ------------------------------------------------------------------------------
  638. #
  639. # Add build rules for an AUv2 plugin.
  640. #
  641. function(dpf__build_au NAME HAS_UI)
  642. dpf__create_dummy_source_list(_no_srcs)
  643. dpf__add_module("${NAME}-au" ${_no_srcs})
  644. dpf__add_plugin_main("${NAME}-au" "au")
  645. dpf__add_ui_main("${NAME}-au" "au" "${HAS_UI}")
  646. dpf__set_module_export_list("${NAME}-au" "au")
  647. find_library(APPLE_AUDIOTOOLBOX_FRAMEWORK "AudioToolbox")
  648. find_library(APPLE_AUDIOUNIT_FRAMEWORK "AudioUnit")
  649. find_library(APPLE_COREFOUNDATION_FRAMEWORK "CoreFoundation")
  650. target_compile_options("${NAME}-au" PRIVATE "-ObjC++")
  651. target_link_libraries("${NAME}-au" PRIVATE
  652. "${NAME}-dsp"
  653. "${NAME}-ui"
  654. "${APPLE_AUDIOTOOLBOX_FRAMEWORK}"
  655. "${APPLE_AUDIOUNIT_FRAMEWORK}"
  656. "${APPLE_COREFOUNDATION_FRAMEWORK}")
  657. set_target_properties("${NAME}-au" PROPERTIES
  658. LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents/MacOS/$<0:>"
  659. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/au/$<0:>"
  660. OUTPUT_NAME "${NAME}"
  661. PREFIX ""
  662. SUFFIX "")
  663. dpf__add_executable("${NAME}-export" ${_no_srcs})
  664. dpf__add_plugin_main("${NAME}-export" "export")
  665. dpf__add_ui_main("${NAME}-export" "export" "${HAS_UI}")
  666. target_link_libraries("${NAME}-export" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  667. separate_arguments(CMAKE_CROSSCOMPILING_EMULATOR)
  668. add_custom_command(TARGET "${NAME}-au" POST_BUILD
  669. COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} "$<TARGET_FILE:${NAME}-export>" "${NAME}"
  670. WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents"
  671. DEPENDS "${NAME}-export")
  672. add_dependencies("${NAME}-au" "${NAME}-export")
  673. file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo"
  674. DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents")
  675. endfunction()
  676. # dpf__build_static
  677. # ------------------------------------------------------------------------------
  678. #
  679. # Add build rules for a static library.
  680. #
  681. function(dpf__build_static NAME HAS_UI)
  682. dpf__create_dummy_source_list(_no_srcs)
  683. dpf__add_module("${NAME}-static" ${_no_srcs} STATIC)
  684. dpf__add_plugin_main("${NAME}-static" "static")
  685. dpf__add_ui_main("${NAME}-static" "static" "${HAS_UI}")
  686. target_link_libraries("${NAME}-static" PRIVATE "${NAME}-dsp" "${NAME}-ui")
  687. get_target_property(dsp_srcs "${NAME}-dsp" SOURCES)
  688. get_target_property(ui_srcs "${NAME}-ui" SOURCES)
  689. foreach(src ${dsp_srcs})
  690. target_sources("${NAME}-static" PRIVATE ${src})
  691. endforeach()
  692. foreach(src ${ui_srcs})
  693. target_sources("${NAME}-static" PRIVATE ${src})
  694. endforeach()
  695. set_target_properties("${NAME}-static" PROPERTIES
  696. ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>"
  697. OUTPUT_NAME "${NAME}"
  698. PREFIX "")
  699. endfunction()
  700. # dpf__add_dgl_cairo
  701. # ------------------------------------------------------------------------------
  702. #
  703. # Add the Cairo variant of DGL, if not already available.
  704. #
  705. function(dpf__add_dgl_cairo SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  706. if(TARGET dgl-cairo)
  707. return()
  708. endif()
  709. find_package(PkgConfig)
  710. pkg_check_modules(CAIRO "cairo" REQUIRED)
  711. link_directories(${CAIRO_LIBRARY_DIRS})
  712. dpf__add_static_library(dgl-cairo STATIC
  713. "${DPF_ROOT_DIR}/dgl/src/Application.cpp"
  714. "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp"
  715. "${DPF_ROOT_DIR}/dgl/src/Color.cpp"
  716. "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp"
  717. "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp"
  718. "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp"
  719. "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp"
  720. "${DPF_ROOT_DIR}/dgl/src/Layout.cpp"
  721. "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp"
  722. "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp"
  723. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp"
  724. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp"
  725. "${DPF_ROOT_DIR}/dgl/src/Widget.cpp"
  726. "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp"
  727. "${DPF_ROOT_DIR}/dgl/src/Window.cpp"
  728. "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp"
  729. "${DPF_ROOT_DIR}/dgl/src/Cairo.cpp")
  730. if(SHARED_RESOURCES)
  731. target_sources(dgl-cairo PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp")
  732. else()
  733. target_compile_definitions(dgl-cairo PUBLIC "DGL_NO_SHARED_RESOURCES")
  734. endif()
  735. if(APPLE)
  736. target_sources(dgl-cairo PRIVATE
  737. "${DPF_ROOT_DIR}/dgl/src/pugl.mm")
  738. else()
  739. target_sources(dgl-cairo PRIVATE
  740. "${DPF_ROOT_DIR}/dgl/src/pugl.cpp")
  741. endif()
  742. target_include_directories(dgl-cairo PUBLIC
  743. "${DPF_ROOT_DIR}/dgl")
  744. target_include_directories(dgl-cairo PUBLIC
  745. "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include")
  746. if(USE_FILE_BROWSER)
  747. target_compile_definitions(dgl-cairo PUBLIC "DGL_USE_FILE_BROWSER")
  748. endif()
  749. if(USE_WEB_VIEW)
  750. target_compile_definitions(dgl-cairo PUBLIC "DGL_USE_FILE_BROWSER")
  751. if(APPLE)
  752. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  753. target_link_libraries(dgl-cairo PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  754. elseif(WIN32)
  755. target_sources(dgl-cairo PRIVATE
  756. "${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp")
  757. set_source_files_properties("${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp"
  758. PROPERTIES
  759. COMPILE_FLAGS
  760. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  761. endif()
  762. endif()
  763. dpf__add_dgl_system_libs()
  764. target_link_libraries(dgl-cairo PRIVATE dgl-system-libs)
  765. add_library(dgl-cairo-definitions INTERFACE)
  766. target_compile_definitions(dgl-cairo-definitions INTERFACE "DGL_CAIRO" "HAVE_CAIRO" "HAVE_DGL")
  767. target_include_directories(dgl-cairo PUBLIC ${CAIRO_INCLUDE_DIRS})
  768. if(MINGW)
  769. target_link_libraries(dgl-cairo PRIVATE ${CAIRO_STATIC_LIBRARIES})
  770. else()
  771. target_link_libraries(dgl-cairo PRIVATE ${CAIRO_LIBRARIES})
  772. endif()
  773. target_link_libraries(dgl-cairo PRIVATE dgl-cairo-definitions)
  774. endfunction()
  775. # dpf__add_dgl_external
  776. # ------------------------------------------------------------------------------
  777. #
  778. # Add the external variant of DGL, if not already available.
  779. #
  780. function(dpf__add_dgl_external USE_FILE_BROWSER USE_WEB_VIEW)
  781. if(TARGET dgl-external)
  782. return()
  783. endif()
  784. dpf__add_static_library(dgl-external STATIC
  785. "${DPF_ROOT_DIR}/dgl/src/Application.cpp"
  786. "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp"
  787. "${DPF_ROOT_DIR}/dgl/src/Color.cpp"
  788. "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp"
  789. "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp"
  790. "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp"
  791. "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp"
  792. "${DPF_ROOT_DIR}/dgl/src/Layout.cpp"
  793. "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp"
  794. "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp"
  795. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp"
  796. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp"
  797. "${DPF_ROOT_DIR}/dgl/src/Widget.cpp"
  798. "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp"
  799. "${DPF_ROOT_DIR}/dgl/src/Window.cpp"
  800. "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp"
  801. "${DPF_ROOT_DIR}/dgl/src/Stub.cpp")
  802. if(APPLE)
  803. target_sources(dgl-external PRIVATE
  804. "${DPF_ROOT_DIR}/dgl/src/pugl.mm")
  805. else()
  806. target_sources(dgl-external PRIVATE
  807. "${DPF_ROOT_DIR}/dgl/src/pugl.cpp")
  808. endif()
  809. target_include_directories(dgl-external PUBLIC
  810. "${DPF_ROOT_DIR}/dgl")
  811. target_include_directories(dgl-external PUBLIC
  812. "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include")
  813. if(USE_FILE_BROWSER)
  814. target_compile_definitions(dgl-external PUBLIC "DGL_USE_FILE_BROWSER")
  815. endif()
  816. if(USE_WEB_VIEW)
  817. target_compile_definitions(dgl-external PUBLIC "DGL_USE_WEB_VIEW")
  818. if(APPLE)
  819. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  820. target_link_libraries(dgl-external PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  821. elseif(WIN32)
  822. target_sources(dgl-external PRIVATE
  823. "${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp")
  824. set_source_files_properties("${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp"
  825. PROPERTIES
  826. COMPILE_FLAGS
  827. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  828. endif()
  829. endif()
  830. dpf__add_dgl_system_libs()
  831. target_compile_definitions(dgl-external PUBLIC "DGL_NO_SHARED_RESOURCES")
  832. target_link_libraries(dgl-external PRIVATE dgl-system-libs)
  833. add_library(dgl-external-definitions INTERFACE)
  834. target_compile_definitions(dgl-external-definitions INTERFACE "DGL_EXTERNAL" "HAVE_DGL")
  835. target_include_directories(dgl-external PUBLIC "${OPENGL_INCLUDE_DIR}")
  836. target_link_libraries(dgl-external PRIVATE dgl-external-definitions "${OPENGL_gl_LIBRARY}")
  837. endfunction()
  838. # dpf__add_dgl_opengl
  839. # ------------------------------------------------------------------------------
  840. #
  841. # Add the OpenGL variant of DGL, if not already available.
  842. #
  843. function(dpf__add_dgl_opengl SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  844. if(TARGET dgl-opengl)
  845. return()
  846. endif()
  847. if(NOT OpenGL_GL_PREFERENCE)
  848. set(OpenGL_GL_PREFERENCE "LEGACY")
  849. endif()
  850. find_package(OpenGL REQUIRED)
  851. dpf__add_static_library(dgl-opengl STATIC
  852. "${DPF_ROOT_DIR}/dgl/src/Application.cpp"
  853. "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp"
  854. "${DPF_ROOT_DIR}/dgl/src/Color.cpp"
  855. "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp"
  856. "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp"
  857. "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp"
  858. "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp"
  859. "${DPF_ROOT_DIR}/dgl/src/Layout.cpp"
  860. "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp"
  861. "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp"
  862. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp"
  863. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp"
  864. "${DPF_ROOT_DIR}/dgl/src/Widget.cpp"
  865. "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp"
  866. "${DPF_ROOT_DIR}/dgl/src/Window.cpp"
  867. "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp"
  868. "${DPF_ROOT_DIR}/dgl/src/OpenGL.cpp"
  869. "${DPF_ROOT_DIR}/dgl/src/NanoVG.cpp")
  870. if(SHARED_RESOURCES)
  871. target_sources(dgl-opengl PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp")
  872. else()
  873. target_compile_definitions(dgl-opengl PUBLIC "DGL_NO_SHARED_RESOURCES")
  874. endif()
  875. if(APPLE)
  876. target_sources(dgl-opengl PRIVATE
  877. "${DPF_ROOT_DIR}/dgl/src/pugl.mm")
  878. else()
  879. target_sources(dgl-opengl PRIVATE
  880. "${DPF_ROOT_DIR}/dgl/src/pugl.cpp")
  881. endif()
  882. target_include_directories(dgl-opengl PUBLIC
  883. "${DPF_ROOT_DIR}/dgl")
  884. target_include_directories(dgl-opengl PUBLIC
  885. "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include")
  886. if(APPLE)
  887. target_compile_definitions(dgl-opengl PUBLIC "GL_SILENCE_DEPRECATION")
  888. endif()
  889. if(USE_FILE_BROWSER)
  890. target_compile_definitions(dgl-opengl PUBLIC "DGL_USE_FILE_BROWSER")
  891. endif()
  892. if(USE_WEB_VIEW)
  893. target_compile_definitions(dgl-opengl PUBLIC "DGL_USE_WEB_VIEW")
  894. if(APPLE)
  895. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  896. target_link_libraries(dgl-opengl PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  897. elseif(WIN32)
  898. target_sources(dgl-opengl PRIVATE
  899. "${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp")
  900. set_source_files_properties("${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp"
  901. PROPERTIES
  902. COMPILE_FLAGS
  903. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  904. endif()
  905. endif()
  906. dpf__add_dgl_system_libs()
  907. target_link_libraries(dgl-opengl PRIVATE dgl-system-libs)
  908. add_library(dgl-opengl-definitions INTERFACE)
  909. target_compile_definitions(dgl-opengl-definitions INTERFACE "DGL_OPENGL" "HAVE_OPENGL" "HAVE_DGL")
  910. target_include_directories(dgl-opengl PUBLIC "${OPENGL_INCLUDE_DIR}")
  911. target_link_libraries(dgl-opengl PRIVATE dgl-opengl-definitions "${OPENGL_gl_LIBRARY}")
  912. endfunction()
  913. # dpf__add_dgl_opengl3
  914. # ------------------------------------------------------------------------------
  915. #
  916. # Add the OpenGL3 variant of DGL, if not already available.
  917. #
  918. function(dpf__add_dgl_opengl3 SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  919. if(TARGET dgl-opengl3)
  920. return()
  921. endif()
  922. if(NOT OpenGL_GL_PREFERENCE)
  923. set(OpenGL_GL_PREFERENCE "LEGACY")
  924. endif()
  925. find_package(OpenGL REQUIRED)
  926. dpf__add_static_library(dgl-opengl3 STATIC
  927. "${DPF_ROOT_DIR}/dgl/src/Application.cpp"
  928. "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp"
  929. "${DPF_ROOT_DIR}/dgl/src/Color.cpp"
  930. "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp"
  931. "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp"
  932. "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp"
  933. "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp"
  934. "${DPF_ROOT_DIR}/dgl/src/Layout.cpp"
  935. "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp"
  936. "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp"
  937. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp"
  938. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp"
  939. "${DPF_ROOT_DIR}/dgl/src/Widget.cpp"
  940. "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp"
  941. "${DPF_ROOT_DIR}/dgl/src/Window.cpp"
  942. "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp"
  943. "${DPF_ROOT_DIR}/dgl/src/OpenGL.cpp"
  944. "${DPF_ROOT_DIR}/dgl/src/NanoVG.cpp")
  945. if(SHARED_RESOURCES)
  946. target_sources(dgl-opengl3 PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp")
  947. else()
  948. target_compile_definitions(dgl-opengl3 PUBLIC "DGL_NO_SHARED_RESOURCES")
  949. endif()
  950. if(APPLE)
  951. target_sources(dgl-opengl3 PRIVATE
  952. "${DPF_ROOT_DIR}/dgl/src/pugl.mm")
  953. else()
  954. target_sources(dgl-opengl3 PRIVATE
  955. "${DPF_ROOT_DIR}/dgl/src/pugl.cpp")
  956. endif()
  957. target_include_directories(dgl-opengl3 PUBLIC
  958. "${DPF_ROOT_DIR}/dgl")
  959. target_include_directories(dgl-opengl3 PUBLIC
  960. "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include")
  961. if(APPLE)
  962. target_compile_definitions(dgl-opengl3 PUBLIC "GL_SILENCE_DEPRECATION")
  963. endif()
  964. if(USE_FILE_BROWSER)
  965. target_compile_definitions(dgl-opengl3 PUBLIC "DGL_USE_FILE_BROWSER")
  966. endif()
  967. if(USE_WEB_VIEW)
  968. target_compile_definitions(dgl-opengl3 PUBLIC "DGL_USE_WEB_VIEW")
  969. if(APPLE)
  970. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  971. target_link_libraries(dgl-opengl3 PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  972. elseif(WIN32)
  973. target_sources(dgl-opengl3 PRIVATE
  974. "${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp")
  975. set_source_files_properties("${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp"
  976. PROPERTIES
  977. COMPILE_FLAGS
  978. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  979. endif()
  980. endif()
  981. dpf__add_dgl_system_libs()
  982. target_link_libraries(dgl-opengl3 PRIVATE dgl-system-libs)
  983. add_library(dgl-opengl3-definitions INTERFACE)
  984. target_compile_definitions(dgl-opengl3-definitions INTERFACE "DGL_USE_OPENGL3" "DGL_OPENGL" "HAVE_OPENGL" "HAVE_DGL")
  985. target_include_directories(dgl-opengl3 PUBLIC "${OPENGL_INCLUDE_DIR}")
  986. target_link_libraries(dgl-opengl3 PRIVATE dgl-opengl3-definitions "${OPENGL_gl_LIBRARY}")
  987. endfunction()
  988. # dpf__add_dgl_vulkan
  989. # ------------------------------------------------------------------------------
  990. #
  991. # Add the Vulkan variant of DGL, if not already available.
  992. #
  993. function(dpf__add_dgl_vulkan SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW)
  994. if(TARGET dgl-vulkan)
  995. return()
  996. endif()
  997. find_package(Vulkan REQUIRED)
  998. dpf__add_static_library(dgl-vulkan STATIC
  999. "${DPF_ROOT_DIR}/dgl/src/Application.cpp"
  1000. "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp"
  1001. "${DPF_ROOT_DIR}/dgl/src/Color.cpp"
  1002. "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp"
  1003. "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp"
  1004. "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp"
  1005. "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp"
  1006. "${DPF_ROOT_DIR}/dgl/src/Layout.cpp"
  1007. "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp"
  1008. "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp"
  1009. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp"
  1010. "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp"
  1011. "${DPF_ROOT_DIR}/dgl/src/Widget.cpp"
  1012. "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp"
  1013. "${DPF_ROOT_DIR}/dgl/src/Window.cpp"
  1014. "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp"
  1015. "${DPF_ROOT_DIR}/dgl/src/Vulkan.cpp")
  1016. if(NO_SHARED_RESOURCES)
  1017. target_sources(dgl-vulkan PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp")
  1018. else()
  1019. target_compile_definitions(dgl-vulkan PUBLIC "DGL_NO_SHARED_RESOURCES")
  1020. endif()
  1021. if(APPLE)
  1022. target_sources(dgl-vulkan PRIVATE
  1023. "${DPF_ROOT_DIR}/dgl/src/pugl.mm")
  1024. else()
  1025. target_sources(dgl-vulkan PRIVATE
  1026. "${DPF_ROOT_DIR}/dgl/src/pugl.cpp")
  1027. endif()
  1028. target_include_directories(dgl-vulkan PUBLIC
  1029. "${DPF_ROOT_DIR}/dgl")
  1030. target_include_directories(dgl-vulkan PUBLIC
  1031. "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include")
  1032. if(APPLE)
  1033. target_compile_definitions(dgl-vulkan PUBLIC "GL_SILENCE_DEPRECATION")
  1034. endif()
  1035. if(USE_FILE_BROWSER)
  1036. target_compile_definitions(dgl-vulkan PUBLIC "DGL_USE_FILE_BROWSER")
  1037. endif()
  1038. if(USE_WEB_VIEW)
  1039. target_compile_definitions(dgl-vulkan PUBLIC "DGL_USE_WEB_VIEW")
  1040. if(APPLE)
  1041. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  1042. target_link_libraries(dgl-vulkan PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  1043. elseif(WIN32)
  1044. target_sources(dgl-vulkan PRIVATE
  1045. "${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp")
  1046. set_source_files_properties("${DPF_ROOT_DIR}/dgl/src/WebViewWin32.cpp"
  1047. PROPERTIES
  1048. COMPILE_FLAGS
  1049. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  1050. endif()
  1051. endif()
  1052. dpf__add_dgl_system_libs()
  1053. target_link_libraries(dgl-vulkan PRIVATE dgl-system-libs)
  1054. add_library(dgl-vulkan-definitions INTERFACE)
  1055. target_compile_definitions(dgl-vulkan-definitions INTERFACE "DGL_VULKAN" "HAVE_VULKAN" "HAVE_DGL")
  1056. target_include_directories(dgl-vulkan PUBLIC "${OPENGL_INCLUDE_DIR}")
  1057. target_link_libraries(dgl-vulkan PRIVATE dgl-vulkan-definitions "${OPENGL_gl_LIBRARY}")
  1058. endfunction()
  1059. # dpf__add_plugin_specific_ui_sources
  1060. # ------------------------------------------------------------------------------
  1061. #
  1062. # Compile system specific files
  1063. #
  1064. function(dpf__add_plugin_specific_ui_sources NAME USE_WEB_VIEW)
  1065. if(APPLE)
  1066. target_sources("${NAME}" PRIVATE
  1067. "${DPF_ROOT_DIR}/distrho/DistrhoUI_macOS.mm")
  1068. if(USE_WEB_VIEW)
  1069. find_library(APPLE_WEBKIT_FRAMEWORK "WebKit")
  1070. target_link_libraries("${NAME}" PRIVATE "${APPLE_WEBKIT_FRAMEWORK}")
  1071. endif()
  1072. elseif(WIN32 AND USE_WEB_VIEW)
  1073. target_sources("${NAME}" PRIVATE
  1074. "${DPF_ROOT_DIR}/distrho/DistrhoUI_win32.cpp")
  1075. set_source_files_properties("${DPF_ROOT_DIR}/distrho/DistrhoUI_win32.cpp"
  1076. PROPERTIES
  1077. COMPILE_FLAGS
  1078. $<IF:$<BOOL:${MSVC}>,/std:c++17,-std=gnu++17>)
  1079. target_link_libraries("${NAME}" PRIVATE "ole32" "uuid")
  1080. endif()
  1081. endfunction()
  1082. # dpf__add_dgl_system_libs
  1083. # ------------------------------------------------------------------------------
  1084. #
  1085. # Find system libraries required by DGL and add them as an interface target.
  1086. #
  1087. function(dpf__add_dgl_system_libs)
  1088. if(TARGET dgl-system-libs)
  1089. return()
  1090. endif()
  1091. add_library(dgl-system-libs INTERFACE)
  1092. add_library(dgl-system-libs-definitions INTERFACE)
  1093. if(APPLE)
  1094. find_library(APPLE_COCOA_FRAMEWORK "Cocoa")
  1095. find_library(APPLE_COREVIDEO_FRAMEWORK "CoreVideo")
  1096. target_link_libraries(dgl-system-libs INTERFACE "${APPLE_COCOA_FRAMEWORK}" "${APPLE_COREVIDEO_FRAMEWORK}")
  1097. elseif(EMSCRIPTEN)
  1098. elseif(HAIKU)
  1099. target_link_libraries(dgl-system-libs INTERFACE "be")
  1100. elseif(WIN32)
  1101. target_link_libraries(dgl-system-libs INTERFACE "comdlg32" "dwmapi" "gdi32")
  1102. else()
  1103. find_package(PkgConfig)
  1104. pkg_check_modules(DBUS "dbus-1")
  1105. if(DBUS_FOUND)
  1106. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_DBUS")
  1107. target_include_directories(dgl-system-libs INTERFACE "${DBUS_INCLUDE_DIRS}")
  1108. target_link_libraries(dgl-system-libs INTERFACE "${DBUS_LIBRARIES}")
  1109. endif()
  1110. find_package(X11 REQUIRED)
  1111. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_X11")
  1112. target_include_directories(dgl-system-libs INTERFACE "${X11_INCLUDE_DIR}")
  1113. target_link_libraries(dgl-system-libs INTERFACE "${X11_X11_LIB}")
  1114. if(X11_Xcursor_FOUND)
  1115. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_XCURSOR")
  1116. target_link_libraries(dgl-system-libs INTERFACE "${X11_Xcursor_LIB}")
  1117. endif()
  1118. if(X11_Xext_FOUND)
  1119. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_XEXT")
  1120. target_link_libraries(dgl-system-libs INTERFACE "${X11_Xext_LIB}")
  1121. endif()
  1122. if(X11_Xrandr_FOUND)
  1123. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_XRANDR")
  1124. target_link_libraries(dgl-system-libs INTERFACE "${X11_Xrandr_LIB}")
  1125. endif()
  1126. if(X11_XSync_FOUND)
  1127. target_compile_definitions(dgl-system-libs-definitions INTERFACE "HAVE_XSYNC")
  1128. target_link_libraries(dgl-system-libs INTERFACE "${X11_XSync_LIB}")
  1129. endif()
  1130. endif()
  1131. if(MSVC)
  1132. file(MAKE_DIRECTORY "${DPF_ROOT_DIR}/khronos/GL")
  1133. foreach(_gl_header "glext.h")
  1134. if(NOT EXISTS "${DPF_ROOT_DIR}/khronos/GL/${_gl_header}")
  1135. file(DOWNLOAD "https://www.khronos.org/registry/OpenGL/api/GL/${_gl_header}" "${DPF_ROOT_DIR}/khronos/GL/${_gl_header}" SHOW_PROGRESS)
  1136. endif()
  1137. endforeach()
  1138. foreach(_khr_header "khrplatform.h")
  1139. if(NOT EXISTS "${DPF_ROOT_DIR}/khronos/KHR/${_khr_header}")
  1140. file(DOWNLOAD "https://www.khronos.org/registry/EGL/api/KHR/${_khr_header}" "${DPF_ROOT_DIR}/khronos/KHR/${_khr_header}" SHOW_PROGRESS)
  1141. endif()
  1142. endforeach()
  1143. target_include_directories(dgl-system-libs-definitions INTERFACE "${DPF_ROOT_DIR}/khronos")
  1144. endif()
  1145. target_link_libraries(dgl-system-libs INTERFACE dgl-system-libs-definitions)
  1146. endfunction()
  1147. # dpf__add_executable
  1148. # ------------------------------------------------------------------------------
  1149. #
  1150. # Adds an executable target, and set some default properties on the target.
  1151. #
  1152. function(dpf__add_executable NAME)
  1153. add_executable("${NAME}" ${ARGN})
  1154. dpf__set_target_defaults("${NAME}")
  1155. if(MINGW)
  1156. target_link_libraries("${NAME}" PRIVATE "-static")
  1157. endif()
  1158. endfunction()
  1159. # dpf__add_module
  1160. # ------------------------------------------------------------------------------
  1161. #
  1162. # Adds a module target, and set some default properties on the target.
  1163. #
  1164. function(dpf__add_module NAME)
  1165. add_library("${NAME}" MODULE ${ARGN})
  1166. dpf__set_target_defaults("${NAME}")
  1167. if(APPLE)
  1168. set_target_properties("${NAME}" PROPERTIES SUFFIX ".dylib")
  1169. elseif(MINGW)
  1170. target_link_libraries("${NAME}" PRIVATE "-static")
  1171. endif()
  1172. endfunction()
  1173. # dpf__add_static_library
  1174. # ------------------------------------------------------------------------------
  1175. #
  1176. # Adds a static library target, and set some default properties on the target.
  1177. #
  1178. function(dpf__add_static_library NAME)
  1179. add_library("${NAME}" STATIC ${ARGN})
  1180. dpf__set_target_defaults("${NAME}")
  1181. endfunction()
  1182. # dpf__set_module_export_list
  1183. # ------------------------------------------------------------------------------
  1184. #
  1185. # Applies a list of exported symbols to the module target.
  1186. #
  1187. function(dpf__set_module_export_list NAME EXPORTS)
  1188. if(WIN32)
  1189. target_sources("${NAME}" PRIVATE "${DPF_ROOT_DIR}/utils/symbols/${EXPORTS}.def")
  1190. elseif(APPLE)
  1191. set_property(TARGET "${NAME}" APPEND PROPERTY LINK_OPTIONS
  1192. "-Xlinker" "-exported_symbols_list"
  1193. "-Xlinker" "${DPF_ROOT_DIR}/utils/symbols/${EXPORTS}.exp")
  1194. else()
  1195. set_property(TARGET "${NAME}" APPEND PROPERTY LINK_OPTIONS
  1196. "-Xlinker" "--version-script=${DPF_ROOT_DIR}/utils/symbols/${EXPORTS}.version")
  1197. endif()
  1198. endfunction()
  1199. # dpf__set_target_defaults
  1200. # ------------------------------------------------------------------------------
  1201. #
  1202. # Set default properties which must apply to all DPF-defined targets.
  1203. #
  1204. function(dpf__set_target_defaults NAME)
  1205. set_target_properties("${NAME}" PROPERTIES
  1206. POSITION_INDEPENDENT_CODE TRUE
  1207. C_VISIBILITY_PRESET "hidden"
  1208. CXX_VISIBILITY_PRESET "hidden"
  1209. VISIBILITY_INLINES_HIDDEN TRUE)
  1210. if(WIN32)
  1211. target_compile_definitions("${NAME}" PUBLIC "NOMINMAX")
  1212. endif()
  1213. if (MINGW)
  1214. target_compile_options("${NAME}" PUBLIC "-mstackrealign")
  1215. endif()
  1216. if (MSVC)
  1217. target_compile_options("${NAME}" PUBLIC "/UTF-8")
  1218. target_compile_definitions("${NAME}" PUBLIC "_CRT_SECURE_NO_WARNINGS")
  1219. endif()
  1220. if (CMAKE_COMPILER_IS_GNUCXX)
  1221. target_compile_options("${NAME}" PUBLIC "-fno-gnu-unique")
  1222. endif()
  1223. if ((NOT APPLE) AND (NOT MSVC))
  1224. target_link_options("${NAME}" PUBLIC "-Wl,--no-undefined")
  1225. endif()
  1226. endfunction()
  1227. # dpf__add_plugin_main
  1228. # ------------------------------------------------------------------------------
  1229. #
  1230. # Adds plugin code to the given target.
  1231. #
  1232. function(dpf__add_plugin_main NAME TARGET)
  1233. target_sources("${NAME}" PRIVATE
  1234. "${DPF_ROOT_DIR}/distrho/DistrhoPluginMain.cpp")
  1235. dpf__add_plugin_target_definition("${NAME}" "${TARGET}")
  1236. endfunction()
  1237. # dpf__add_ui_main
  1238. # ------------------------------------------------------------------------------
  1239. #
  1240. # Adds UI code to the given target (only if the target has UI).
  1241. #
  1242. function(dpf__add_ui_main NAME TARGET HAS_UI)
  1243. if(HAS_UI)
  1244. target_sources("${NAME}" PRIVATE
  1245. "${DPF_ROOT_DIR}/distrho/DistrhoUIMain.cpp")
  1246. dpf__add_plugin_target_definition("${NAME}" "${TARGET}")
  1247. endif()
  1248. endfunction()
  1249. # dpf__add_plugin_target_definition
  1250. # ------------------------------------------------------------------------------
  1251. #
  1252. # Adds the plugins target macro definition.
  1253. # This selects which entry file is compiled according to the target type.
  1254. #
  1255. function(dpf__add_plugin_target_definition NAME TARGET)
  1256. string(TOUPPER "${TARGET}" _upperTarget)
  1257. target_compile_definitions("${NAME}" PRIVATE "DISTRHO_PLUGIN_TARGET_${_upperTarget}")
  1258. endfunction()
  1259. # dpf__add_lv2_ttl_generator
  1260. # ------------------------------------------------------------------------------
  1261. #
  1262. # Build the LV2 TTL generator.
  1263. #
  1264. function(dpf__add_lv2_ttl_generator)
  1265. if(TARGET lv2_ttl_generator)
  1266. return()
  1267. endif()
  1268. add_executable(lv2_ttl_generator "${DPF_ROOT_DIR}/utils/lv2-ttl-generator/lv2_ttl_generator.c")
  1269. if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU))
  1270. target_link_libraries(lv2_ttl_generator PRIVATE "dl")
  1271. endif()
  1272. endfunction()
  1273. # dpf__ensure_sources_non_empty
  1274. # ------------------------------------------------------------------------------
  1275. #
  1276. # Ensure the given source list contains at least one file.
  1277. # The function appends an empty source file to the list if necessary.
  1278. # This is useful when CMake does not permit to add targets without sources.
  1279. #
  1280. function(dpf__ensure_sources_non_empty VAR)
  1281. if(NOT "" STREQUAL "${${VAR}}")
  1282. return()
  1283. endif()
  1284. set(_file "${CMAKE_CURRENT_BINARY_DIR}/_dpf_empty.c")
  1285. if(NOT EXISTS "${_file}")
  1286. file(WRITE "${_file}" "")
  1287. endif()
  1288. set("${VAR}" "${_file}" PARENT_SCOPE)
  1289. endfunction()
  1290. # dpf__create_dummy_source_list
  1291. # ------------------------------------------------------------------------------
  1292. #
  1293. # Create a dummy source list which is equivalent to compiling nothing.
  1294. # This is only for compatibility with older CMake versions, which refuse to add
  1295. # targets without any sources.
  1296. #
  1297. macro(dpf__create_dummy_source_list VAR)
  1298. set("${VAR}")
  1299. if(CMAKE_VERSION VERSION_LESS "3.11")
  1300. dpf__ensure_sources_non_empty("${VAR}")
  1301. endif()
  1302. endmacro()
  1303. # dpf__target_link_directories
  1304. # ------------------------------------------------------------------------------
  1305. #
  1306. # Call `target_link_directories` if cmake >= 3.13,
  1307. # otherwise fallback to global `link_directories`.
  1308. #
  1309. macro(dpf__target_link_directories NAME DIRS)
  1310. if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.13")
  1311. target_link_directories("${NAME}" PUBLIC ${DIRS})
  1312. else()
  1313. link_directories(${DIRS})
  1314. endif()
  1315. endmacro()
  1316. # dpf__warn_once
  1317. # ------------------------------------------------------------------------------
  1318. #
  1319. # Prints a warning message once only.
  1320. #
  1321. function(dpf__warn_once_only TOKEN MESSAGE)
  1322. get_property(_warned GLOBAL PROPERTY "dpf__have_warned_${TOKEN}")
  1323. if(NOT _warned)
  1324. set_property(GLOBAL PROPERTY "dpf__have_warned_${TOKEN}" TRUE)
  1325. message(WARNING "${MESSAGE}")
  1326. endif()
  1327. endfunction()