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.

474 lines
15KB

  1. #!/usr/bin/make -f
  2. # DISTRHO Cardinal Plugin
  3. # Copyright (C) 2021-2025 Filipe Coelho <falktx@falktx.com>
  4. # SPDX-License-Identifier: GPL-3.0-or-later
  5. ROOT = .
  6. include $(ROOT)/Makefile.base.mk
  7. # ---------------------------------------------------------------------------------------------------------------------
  8. # Set version
  9. # also set in:
  10. # .github/ISSUE_TEMPLATE/bug.yaml
  11. # src/CardinalCommon.cpp `CARDINAL_VERSION`
  12. # src/CardinalPlugin.cpp `getVersion`
  13. # utils/macOS/Info_{JACK,Native}.plist
  14. # .github/ISSUE_TEMPLATE/bug.yaml src/CardinalCommon.cpp src/CardinalPlugin.cpp utils/macOS/Info_{JACK,Native}.plist
  15. VERSION = 26.01
  16. # ---------------------------------------------------------------------------------------------------------------------
  17. # Build targets
  18. all: cardinal carla deps dgl plugins gen resources
  19. # ---------------------------------------------------------------------------------------------------------------------
  20. # Build config
  21. PREFIX ?= /usr/local
  22. DESTDIR ?=
  23. # ---------------------------------------------------------------------------------------------------------------------
  24. # Carla config
  25. CARLA_EXTRA_ARGS = \
  26. CARLA_BACKEND_NAMESPACE=Cardinal \
  27. DGL_NAMESPACE=CardinalDGL \
  28. HAVE_FFMPEG=false \
  29. HAVE_FLUIDSYNTH=false \
  30. HAVE_PROJECTM=false \
  31. HAVE_ZYN_DEPS=false \
  32. HAVE_ZYN_UI_DEPS=false
  33. ifneq ($(DEBUG),true)
  34. CARLA_EXTRA_ARGS += EXTERNAL_PLUGINS=true
  35. endif
  36. # ---------------------------------------------------------------------------------------------------------------------
  37. # DGL config
  38. ifeq ($(WASM),true)
  39. UI_TYPE = gles2
  40. else
  41. UI_TYPE = opengl
  42. endif
  43. # ---------------------------------------------------------------------------------------------------------------------
  44. # Check for required system-wide dependencies
  45. ifeq ($(SYSDEPS),true)
  46. ifneq ($(shell $(PKG_CONFIG) --exists jansson && echo true),true)
  47. $(error jansson dependency not installed/available)
  48. endif
  49. ifneq ($(shell $(PKG_CONFIG) --exists libarchive && echo true),true)
  50. $(error libarchive dependency not installed/available)
  51. endif
  52. ifneq ($(shell $(PKG_CONFIG) --exists samplerate && echo true),true)
  53. $(error samplerate dependency not installed/available)
  54. endif
  55. ifneq ($(shell $(PKG_CONFIG) --exists speexdsp && echo true),true)
  56. $(error speexdsp dependency not installed/available)
  57. endif
  58. endif
  59. ifeq ($(HEADLESS),true)
  60. ifneq ($(STATIC_BUILD),true)
  61. ifneq ($(shell $(PKG_CONFIG) --exists liblo && echo true),true)
  62. $(error liblo dependency not installed/available)
  63. endif
  64. endif
  65. endif
  66. # --------------------------------------------------------------
  67. # Check for X11+OpenGL dependencies (unless headless build)
  68. ifneq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true)
  69. ifneq ($(HEADLESS),true)
  70. ifneq ($(HAVE_OPENGL),true)
  71. $(error OpenGL dependency not installed/available)
  72. endif
  73. ifneq ($(HAVE_X11),true)
  74. $(error X11 dependency not installed/available)
  75. endif
  76. ifneq ($(HAVE_XCURSOR),true)
  77. $(warning Xcursor dependency not installed/available)
  78. endif
  79. ifneq ($(HAVE_XEXT),true)
  80. $(warning Xext dependency not installed/available)
  81. endif
  82. ifneq ($(HAVE_XRANDR),true)
  83. $(warning Xrandr dependency not installed/available)
  84. endif
  85. else
  86. CARLA_EXTRA_ARGS += HAVE_DBUS=false
  87. CARLA_EXTRA_ARGS += HAVE_DGL=false
  88. CARLA_EXTRA_ARGS += HAVE_OPENGL=false
  89. CARLA_EXTRA_ARGS += HAVE_X11=false
  90. CARLA_EXTRA_ARGS += HAVE_XCURSOR=false
  91. CARLA_EXTRA_ARGS += HAVE_XEXT=false
  92. CARLA_EXTRA_ARGS += HAVE_XRANDR=false
  93. endif
  94. endif
  95. # --------------------------------------------------------------
  96. # Check for optional system-wide dependencies
  97. ifeq ($(shell $(PKG_CONFIG) --exists fftw3f && echo true),true)
  98. HAVE_FFTW3F = true
  99. else
  100. $(warning fftw3f dependency not installed/available)
  101. endif
  102. # --------------------------------------------------------------
  103. # MOD builds
  104. EXTRA_MOD_FLAGS = -I../include/single-precision -fsingle-precision-constant -Wno-attributes
  105. ifeq ($(MODDUO),true)
  106. EXTRA_MOD_FLAGS += -mno-unaligned-access
  107. endif
  108. ifeq ($(WITH_LTO),true)
  109. EXTRA_MOD_FLAGS += -ffat-lto-objects
  110. endif
  111. MOD_ENVIRONMENT += HEADLESS=true
  112. MOD_ENVIRONMENT += STATIC_BUILD=true
  113. # --------------------------------------------------------------
  114. # Individual targets
  115. cardinal: carla deps dgl plugins resources
  116. $(MAKE) all -C src $(CARLA_EXTRA_ARGS)
  117. carla:
  118. ifneq ($(STATIC_BUILD),true)
  119. $(MAKE) static-plugin -C carla $(CARLA_EXTRA_ARGS) \
  120. CAN_GENERATE_LV2_TTL=false \
  121. CUSTOM_DPF_PATH=$(CURDIR)/dpf \
  122. STATIC_PLUGIN_TARGET=true \
  123. USING_CUSTOM_DPF=true
  124. endif
  125. carla-win32:
  126. ifneq ($(STATIC_BUILD),true)
  127. $(MAKE) all -C carla $(CARLA_EXTRA_ARGS) \
  128. CAN_GENERATE_LV2_TTL=false \
  129. CUSTOM_DPF_PATH=$(CURDIR)/dpf \
  130. DGL_NAMESPACE=CardinalDGL \
  131. HAVE_FRONTEND=true \
  132. HAVE_PYQT=true \
  133. HAVE_QT5=true \
  134. HAVE_QT5PKG=true \
  135. STATIC_PLUGIN_TARGET=true \
  136. USING_CUSTOM_DPF=true
  137. ifeq ($(CPU_X86_64),true)
  138. $(MAKE) win32r -C carla $(CARLA_EXTRA_ARGS) \
  139. CAN_GENERATE_LV2_TTL=false \
  140. CUSTOM_DPF_PATH=$(CURDIR)/dpf \
  141. DGL_NAMESPACE=CardinalDGL \
  142. HAVE_FRONTEND=true \
  143. HAVE_PYQT=true \
  144. HAVE_QT5=true \
  145. HAVE_QT5PKG=true \
  146. STATIC_PLUGIN_TARGET=true \
  147. USING_CUSTOM_DPF=true
  148. endif
  149. endif
  150. deps:
  151. ifeq ($(SYSDEPS),true)
  152. $(MAKE) quickjs surge -C deps
  153. else
  154. $(MAKE) all -C deps
  155. endif
  156. ifeq ($(HAVE_FFTW3F),true)
  157. $(MAKE) all -C deps/aubio
  158. endif
  159. dgl:
  160. ifneq ($(HEADLESS),true)
  161. $(MAKE) $(UI_TYPE) -C dpf/dgl $(DGL_EXTRA_ARGS)
  162. endif
  163. plugins: deps
  164. $(MAKE) all -C plugins
  165. resources:
  166. $(MAKE) resources -C plugins
  167. loader-resources:
  168. $(MAKE) loader-resources -C plugins
  169. mini-plugins: deps
  170. $(MAKE) mini -C plugins
  171. mini-resources:
  172. $(MAKE) mini-resources -C plugins
  173. ifneq ($(CROSS_COMPILING),true)
  174. gen: cardinal resources dpf/utils/lv2_ttl_generator
  175. @$(CURDIR)/dpf/utils/generate-ttl.sh
  176. loader-gen: loader loader-resources dpf/utils/lv2_ttl_generator
  177. @$(CURDIR)/dpf/utils/generate-ttl.sh
  178. dpf/utils/lv2_ttl_generator:
  179. $(MAKE) -C dpf/utils/lv2-ttl-generator
  180. else
  181. gen:
  182. loader-gen:
  183. endif
  184. # --------------------------------------------------------------
  185. # extra rules, for quick testing
  186. jack: carla deps dgl plugins resources
  187. $(MAKE) jack -C src $(CARLA_EXTRA_ARGS)
  188. native: carla deps dgl plugins resources
  189. $(MAKE) native -C src $(CARLA_EXTRA_ARGS)
  190. mini: carla deps dgl mini-plugins mini-resources
  191. $(MAKE) mini -C src $(CARLA_EXTRA_ARGS)
  192. au: carla deps dgl plugins resources
  193. $(MAKE) au -C src $(CARLA_EXTRA_ARGS)
  194. clap: carla deps dgl plugins resources
  195. $(MAKE) clap -C src $(CARLA_EXTRA_ARGS)
  196. lv2: carla deps dgl plugins resources
  197. $(MAKE) lv2 -C src $(CARLA_EXTRA_ARGS)
  198. mapi: carla deps dgl plugins resources
  199. $(MAKE) mapi -C src $(CARLA_EXTRA_ARGS)
  200. vst2: carla deps dgl plugins resources
  201. $(MAKE) vst2 -C src $(CARLA_EXTRA_ARGS)
  202. vst2fx: carla deps dgl plugins resources
  203. $(MAKE) vst2fx -C src $(CARLA_EXTRA_ARGS)
  204. vst3: carla deps dgl plugins resources
  205. $(MAKE) vst3 -C src $(CARLA_EXTRA_ARGS)
  206. modgui:
  207. $(MAKE) modgui -C src/CardinalMiniSep
  208. ifeq ($(HEADLESS)$(STATIC_BUILD),truetrue)
  209. loader: deps dgl plugins loader-gen
  210. $(MAKE) loader -C src $(CARLA_EXTRA_ARGS)
  211. @$(CURDIR)/dpf/utils/generate-ttl.sh
  212. else
  213. loader:
  214. $(MAKE) loader HEADLESS=true STATIC_BUILD=true
  215. endif
  216. # --------------------------------------------------------------
  217. # Packaging standalone for CI
  218. unzipfx: deps/unzipfx/unzipfx2cat$(APP_EXT) CardinalJACK.zip CardinalNative.zip
  219. cat deps/unzipfx/unzipfx2cat$(APP_EXT) CardinalJACK.zip > CardinalJACK$(APP_EXT)
  220. cat deps/unzipfx/unzipfx2cat$(APP_EXT) CardinalNative.zip > CardinalNative$(APP_EXT)
  221. chmod +x CardinalJACK$(APP_EXT) CardinalNative$(APP_EXT)
  222. CardinalJACK.zip: bin/Cardinal$(APP_EXT) bin/CardinalFX.lv2/resources
  223. mkdir -p build/unzipfx-jack
  224. ln -sf ../../bin/Cardinal$(APP_EXT) build/unzipfx-jack/Cardinal$(APP_EXT)
  225. ln -sf ../../bin/CardinalFX.lv2/resources build/unzipfx-jack/resources
  226. cd build/unzipfx-jack && \
  227. zip -r -9 ../../$@ Cardinal$(APP_EXT) resources
  228. CardinalNative.zip: bin/CardinalNative$(APP_EXT) bin/CardinalFX.lv2/resources
  229. mkdir -p build/unzipfx-native
  230. ln -sf ../../bin/CardinalNative$(APP_EXT) build/unzipfx-native/Cardinal$(APP_EXT)
  231. ln -sf ../../bin/CardinalFX.lv2/resources build/unzipfx-native/resources
  232. cd build/unzipfx-native && \
  233. zip -r -9 ../../$@ Cardinal$(APP_EXT) resources
  234. deps/unzipfx/unzipfx2cat:
  235. make -C deps/unzipfx -f Makefile.linux
  236. deps/unzipfx/unzipfx2cat.exe:
  237. make -C deps/unzipfx -f Makefile.win32
  238. # --------------------------------------------------------------
  239. # Clean step
  240. clean:
  241. $(MAKE) distclean -C carla $(CARLA_EXTRA_ARGS) CAN_GENERATE_LV2_TTL=false STATIC_PLUGIN_TARGET=true
  242. $(MAKE) clean -C deps
  243. $(MAKE) clean -C deps/aubio
  244. $(MAKE) clean -C dpf/dgl
  245. $(MAKE) clean -C dpf/utils/lv2-ttl-generator
  246. $(MAKE) clean -C plugins
  247. $(MAKE) clean -C src
  248. rm -rf bin build build-headless dpf/utils/lv2_ttl_generator.d
  249. # --------------------------------------------------------------
  250. # Install step
  251. install:
  252. install -d $(DESTDIR)$(PREFIX)/bin
  253. install -d $(DESTDIR)$(PREFIX)/lib/lv2/Cardinal.lv2
  254. install -d $(DESTDIR)$(PREFIX)/lib/lv2/CardinalFX.lv2
  255. install -d $(DESTDIR)$(PREFIX)/lib/lv2/CardinalMini.lv2
  256. install -d $(DESTDIR)$(PREFIX)/lib/lv2/CardinalSynth.lv2
  257. install -d $(DESTDIR)$(PREFIX)/lib/clap/Cardinal.clap
  258. install -d $(DESTDIR)$(PREFIX)/lib/vst/Cardinal.vst
  259. ifneq ($(VST3_BINARY_DIR),)
  260. install -d $(DESTDIR)$(PREFIX)/lib/vst3/Cardinal.vst3/$(VST3_BINARY_DIR)
  261. install -d $(DESTDIR)$(PREFIX)/lib/vst3/CardinalFX.vst3/$(VST3_BINARY_DIR)
  262. install -d $(DESTDIR)$(PREFIX)/lib/vst3/CardinalSynth.vst3/$(VST3_BINARY_DIR)
  263. endif
  264. install -d $(DESTDIR)$(PREFIX)/share/cardinal
  265. install -d $(DESTDIR)$(PREFIX)/share/doc/cardinal/docs
  266. install -m 644 bin/Cardinal.lv2/*.* $(DESTDIR)$(PREFIX)/lib/lv2/Cardinal.lv2/
  267. install -m 644 bin/CardinalFX.lv2/*.* $(DESTDIR)$(PREFIX)/lib/lv2/CardinalFX.lv2/
  268. install -m 644 bin/CardinalMini.lv2/*.* $(DESTDIR)$(PREFIX)/lib/lv2/CardinalMini.lv2/
  269. install -m 644 bin/CardinalSynth.lv2/*.* $(DESTDIR)$(PREFIX)/lib/lv2/CardinalSynth.lv2/
  270. install -m 644 bin/Cardinal.clap/*.* $(DESTDIR)$(PREFIX)/lib/clap/Cardinal.clap/
  271. install -m 644 bin/Cardinal.vst/*.* $(DESTDIR)$(PREFIX)/lib/vst/Cardinal.vst/
  272. ifneq ($(VST3_BINARY_DIR),)
  273. install -m 644 bin/Cardinal.vst3/$(VST3_BINARY_DIR)/* $(DESTDIR)$(PREFIX)/lib/vst3/Cardinal.vst3/$(VST3_BINARY_DIR)/
  274. install -m 644 bin/CardinalFX.vst3/$(VST3_BINARY_DIR)/* $(DESTDIR)$(PREFIX)/lib/vst3/CardinalFX.vst3/$(VST3_BINARY_DIR)/
  275. install -m 644 bin/CardinalSynth.vst3/$(VST3_BINARY_DIR)/* $(DESTDIR)$(PREFIX)/lib/vst3/CardinalSynth.vst3/$(VST3_BINARY_DIR)/
  276. endif
  277. install -m 755 bin/Cardinal$(APP_EXT) $(DESTDIR)$(PREFIX)/bin/
  278. install -m 755 bin/CardinalMini$(APP_EXT) $(DESTDIR)$(PREFIX)/bin/
  279. install -m 755 bin/CardinalNative$(APP_EXT) $(DESTDIR)$(PREFIX)/bin/
  280. cp -rL bin/Cardinal.lv2/resources/* $(DESTDIR)$(PREFIX)/share/cardinal/
  281. install -m 644 README.md $(DESTDIR)$(PREFIX)/share/doc/cardinal/
  282. install -m 644 docs/*.md docs/*.png $(DESTDIR)$(PREFIX)/share/doc/cardinal/docs/
  283. # --------------------------------------------------------------
  284. # Tarball step, for releases
  285. TAR_ARGS = \
  286. --exclude=".appveyor*" \
  287. --exclude=".ci*" \
  288. --exclude=".clang*" \
  289. --exclude=".drone*" \
  290. --exclude=".editor*" \
  291. --exclude=".git*" \
  292. --exclude="*.kdev*" \
  293. --exclude=".travis*" \
  294. --exclude=".vscode*" \
  295. --exclude="carla/source/native-plugins/external/zynaddsubfx*" \
  296. --exclude="src/Rack/dep/osdialog/osdialog_*" \
  297. --exclude="src/Rack/icon.*" \
  298. --exclude=bin \
  299. --exclude=build \
  300. --exclude=jucewrapper \
  301. --exclude=lv2export \
  302. --exclude=carla/data \
  303. --exclude=carla/source/frontend \
  304. --exclude=carla/source/interposer \
  305. --exclude=carla/source/libjack \
  306. --exclude=carla/source/native-plugins/resources \
  307. --exclude=carla/source/rest \
  308. --exclude=carla/source/tests.old \
  309. --exclude=carla/source/theme \
  310. --exclude=carla/resources \
  311. --exclude=deps/PawPaw \
  312. --exclude=deps/sysroot \
  313. --exclude=deps/unzipfx \
  314. --exclude=docs/.generate-plugin-licenses.sh \
  315. --exclude=docs/MODDEVICES.md \
  316. --exclude=dpf/cmake \
  317. --exclude=dpf/examples \
  318. --exclude=dpf/lac \
  319. --exclude=dpf/tests \
  320. --exclude=plugins/.kdev_include_paths \
  321. --exclude=plugins/todo.txt \
  322. --exclude=plugins/AriaModules/res/Arcane \
  323. --exclude=plugins/AudibleInstruments/design \
  324. --exclude=plugins/BaconPlugs/res/midi/beeth \
  325. --exclude=plugins/BogaudioModules/res-pp \
  326. --exclude=plugins/BogaudioModules/res-src \
  327. --exclude=plugins/Cardinal/orig \
  328. --exclude=plugins/GrandeModular/res-src \
  329. --exclude=plugins/surgext/surge/libs/JUCE \
  330. --exclude=plugins/surgext/surge/resources/data/patches_3rdparty \
  331. --exclude=plugins/surgext/surge/resources/data/patches_factory \
  332. --exclude=plugins/surgext/surge/resources/data/wavetables_3rdparty \
  333. --exclude=src/Rack/adapters \
  334. --exclude=src/Rack/dep/filesystem/cmake \
  335. --exclude=src/Rack/dep/filesystem/examples \
  336. --exclude=src/Rack/dep/filesystem/test \
  337. --exclude=src/Rack/dep/glfw/CMake \
  338. --exclude=src/Rack/dep/glfw/deps \
  339. --exclude=src/Rack/dep/glfw/docs \
  340. --exclude=src/Rack/dep/glfw/examples \
  341. --exclude=src/Rack/dep/glfw/src \
  342. --exclude=src/Rack/dep/glfw/tests \
  343. --exclude=src/Rack/dep/nanosvg/example \
  344. --exclude=src/Rack/dep/nanovg \
  345. --exclude=src/Rack/dep/rtaudio \
  346. --exclude=src/Rack/include/audio.hpp \
  347. --exclude=src/Rack/include/midi.hpp \
  348. --exclude=src/Rack/include/engine/Port.hpp \
  349. --exclude=src/Rack/src/core \
  350. --exclude=src/Rack/src/asset.cpp \
  351. --exclude=src/Rack/src/audio.cpp \
  352. --exclude=src/Rack/src/common.cpp \
  353. --exclude=src/Rack/src/context.cpp \
  354. --exclude=src/Rack/src/dep.cpp \
  355. --exclude=src/Rack/src/discord.cpp \
  356. --exclude=src/Rack/src/gamepad.cpp \
  357. --exclude=src/Rack/src/keyboard.cpp \
  358. --exclude=src/Rack/src/library.cpp \
  359. --exclude=src/Rack/src/midi.cpp \
  360. --exclude=src/Rack/src/network.cpp \
  361. --exclude=src/Rack/src/plugin.cpp \
  362. --exclude=src/Rack/src/rtaudio.cpp \
  363. --exclude=src/Rack/src/rtmidi.cpp \
  364. --exclude=src/Rack/src/app/AudioDisplay.cpp \
  365. --exclude=src/Rack/src/app/MenuBar.cpp \
  366. --exclude=src/Rack/src/app/MidiDisplay.cpp \
  367. --exclude=src/Rack/src/app/ModuleWidget.cpp \
  368. --exclude=src/Rack/src/app/Scene.cpp \
  369. --exclude=src/Rack/src/app/TipWindow.cpp \
  370. --exclude=src/Rack/src/dsp/minblep.cpp \
  371. --exclude=src/Rack/src/engine/Engine.cpp \
  372. --exclude=src/Rack/src/plugin/Model.cpp \
  373. --exclude=src/Rack/src/widget/OpenGlWidget.cpp \
  374. --exclude=src/Rack/src/window/Window.cpp \
  375. --exclude=src/Rack/res/Core \
  376. --exclude=src/Rack/res/icon.png \
  377. --transform='s,^\.\.,-.-.,' \
  378. --transform='s,^\.,cardinal-$(VERSION),' \
  379. --transform='s,^-\.-\.,..,' \
  380. download:
  381. $(MAKE) download -C deps
  382. tarball:
  383. $(MAKE) clean -C deps
  384. rm -f ../cardinal-$(VERSION).tar.xz
  385. tar -c --lzma $(TAR_ARGS) -f ../cardinal-$(VERSION).tar.xz .
  386. tarball+deps: download
  387. rm -f ../cardinal+deps-$(VERSION).tar.xz
  388. tar -c --lzma $(TAR_ARGS) -f ../cardinal+deps-$(VERSION).tar.xz .
  389. version:
  390. @echo $(VERSION)
  391. # --------------------------------------------------------------
  392. .PHONY: carla deps plugins