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.

408 lines
12KB

  1. #!/usr/bin/make -f
  2. # Makefile for Cardinal #
  3. # --------------------- #
  4. # Created by falkTX
  5. #
  6. # --------------------------------------------------------------
  7. # Import base definitions
  8. DISTRHO_NAMESPACE = CardinalDISTRHO
  9. DGL_NAMESPACE = CardinalDGL
  10. USE_NANOVG_FBO = true
  11. WASM_EXCEPTIONS = true
  12. include ../dpf/Makefile.base.mk
  13. # --------------------------------------------------------------
  14. # Build config
  15. ifeq ($(BSD),true)
  16. SYSDEPS ?= true
  17. else
  18. SYSDEPS ?= false
  19. endif
  20. ifeq ($(SYSDEPS),true)
  21. DEP_PATH = $(abspath sysroot)
  22. else
  23. DEP_PATH = $(abspath ../src/Rack/dep)
  24. endif
  25. # --------------------------------------------------------------
  26. # custom build flags
  27. BASE_FLAGS += -I$(abspath ../include)
  28. BASE_FLAGS += -I$(abspath ../include/simd-compat)
  29. ifeq ($(HAIKU)$(WASM),true)
  30. BASE_FLAGS += -I$(abspath ../include/linux-compat)
  31. endif
  32. ifeq ($(HEADLESS),true)
  33. ifeq ($(WITH_LTO),true)
  34. BASE_FLAGS += -ffat-lto-objects
  35. endif
  36. endif
  37. ifneq ($(SYSDEPS),true)
  38. BASE_FLAGS += -DZSTDLIB_VISIBILITY=
  39. endif
  40. ifneq ($(HAIKU),true)
  41. ifneq ($(WASM),true)
  42. BASE_FLAGS += -pthread
  43. endif
  44. endif
  45. ifeq ($(WINDOWS),true)
  46. BASE_FLAGS += -D_USE_MATH_DEFINES
  47. BASE_FLAGS += -DWIN32_LEAN_AND_MEAN
  48. BASE_FLAGS += -D_WIN32_WINNT=0x0600
  49. BASE_FLAGS += -I$(abspath ../include/mingw-compat)
  50. BASE_FLAGS += -I$(abspath ../include/mingw-std-threads)
  51. endif
  52. BUILD_C_FLAGS += -fno-finite-math-only -fno-strict-aliasing
  53. BUILD_CXX_FLAGS += -fno-finite-math-only -fno-strict-aliasing
  54. # Rack code is not tested for this flag, unset it
  55. BUILD_CXX_FLAGS += -U_GLIBCXX_ASSERTIONS -Wp,-U_GLIBCXX_ASSERTIONS
  56. # --------------------------------------------------------------
  57. # override VCV arch.mk stuff so we can build more architectures
  58. ifeq ($(CPU_ARM32),true)
  59. ARCH_NAME = arm
  60. MACHINE = i686-the-rack
  61. else ifeq ($(CPU_ARM64),true)
  62. ARCH_NAME = arm64
  63. MACHINE = x86_64-the-rack
  64. else ifeq ($(CPU_RISCV64),true)
  65. ARCH_NAME = riscv64
  66. MACHINE = x86_64-the-rack
  67. else ifeq ($(WASM),true)
  68. MACHINE = i686-wasm
  69. else
  70. MACHINE = $(TARGET_MACHINE)
  71. endif
  72. ifeq ($(MACOS),true)
  73. MACHINE_SUFFIX = -darwin
  74. else ifeq ($(WINDOWS),true)
  75. MACHINE_SUFFIX = -mingw32
  76. else
  77. MACHINE_SUFFIX = -linux
  78. endif
  79. # --------------------------------------------------------------
  80. # Set up env to pass to cmake and configure
  81. ENV = env
  82. ENV += AR=$(AR)
  83. ENV += CC=$(CC)
  84. ENV += CXX=$(CXX)
  85. ENV += CFLAGS='$(BUILD_C_FLAGS)'
  86. ENV += CXXFLAGS='$(BUILD_CXX_FLAGS)'
  87. ENV += LDFLAGS='$(LINK_FLAGS)'
  88. # --------------------------------------------------------------
  89. # Fix up cmake
  90. SPACE =
  91. SPACE +=
  92. CMAKE = cmake
  93. CMAKE += -DCMAKE_INSTALL_LIBDIR=lib
  94. CMAKE += -DCMAKE_INSTALL_PREFIX='$(DEP_PATH)'
  95. CMAKE += -DBUILD_SHARED_LIBS=OFF
  96. # make sure debug/release matches
  97. ifeq ($(DEBUG),true)
  98. CMAKE += -DCMAKE_BUILD_TYPE=Debug
  99. else
  100. CMAKE += -DCMAKE_BUILD_TYPE=Release
  101. endif
  102. # make sure macOS target matches ours
  103. ifeq ($(MACOS),true)
  104. ifneq (,$(findstring -arch$(SPACE),$(CXXFLAGS)))
  105. CMAKE += -DCMAKE_OSX_ARCHITECTURES='$(subst $(SPACE),;,$(subst -arch=,,$(filter -arch=%,$(subst -arch$(SPACE),-arch=,$(CXXFLAGS)))))'
  106. else ifeq ($(CIBUILD),true)
  107. $(error CI build requires -arch flag on macOS)
  108. endif
  109. ifneq (,$(findstring -mmacosx-version-min=,$(CXXFLAGS)))
  110. export MACOSX_DEPLOYMENT_TARGET = $(subst -mmacosx-version-min=,,$(filter -mmacosx-version-min=%,$(CXXFLAGS)))
  111. CMAKE += -DCMAKE_OSX_DEPLOYMENT_TARGET=$(MACOSX_DEPLOYMENT_TARGET)
  112. else ifeq ($(CIBUILD),true)
  113. $(error CI build requires -mmacosx-version-min flag on macOS)
  114. endif
  115. CMAKE += -DCMAKE_OSX_SYSROOT="macosx"
  116. endif
  117. # fix emar and emranlib usage
  118. ifeq ($(WASM),true)
  119. CMAKE_AR = $(shell which $(AR))
  120. CMAKE_RANLIB = $(shell which $(RANLIB))
  121. CMAKE += -DCMAKE_AR=$(CMAKE_AR)
  122. CMAKE += -DCMAKE_C_COMPILER_AR=$(CMAKE_AR)
  123. CMAKE += -DCMAKE_CXX_COMPILER_AR=$(CMAKE_AR)
  124. CMAKE += -DCMAKE_RANLIB=$(CMAKE_RANLIB)
  125. CMAKE += -DCMAKE_C_COMPILER_RANLIB=$(CMAKE_RANLIB)
  126. CMAKE += -DCMAKE_CXX_COMPILER_RANLIB=$(CMAKE_RANLIB)
  127. ifeq ($(shell uname -s),Darwin)
  128. CMAKE += -DCMAKE_CROSSCOMPILING=ON
  129. CMAKE += -DCMAKE_SYSTEM_NAME=Generic
  130. endif
  131. CMAKE += -DCMAKE_SKIP_COMPATIBILITY_TESTS=1
  132. CMAKE += -DCMAKE_SIZEOF_CHAR=1
  133. CMAKE += -DCMAKE_SIZEOF_UNSIGNED_SHORT=2
  134. CMAKE += -DCMAKE_SIZEOF_SHORT=2
  135. CMAKE += -DCMAKE_SIZEOF_INT=4
  136. CMAKE += -DCMAKE_SIZEOF_UNSIGNED_LONG=4
  137. CMAKE += -DCMAKE_SIZEOF_UNSIGNED_INT=4
  138. CMAKE += -DCMAKE_SIZEOF_LONG=4
  139. CMAKE += -DCMAKE_SIZEOF_VOID_P=4
  140. CMAKE += -DCMAKE_SIZEOF_FLOAT=4
  141. CMAKE += -DCMAKE_SIZEOF_DOUBLE=8
  142. CMAKE += -DCMAKE_C_SIZEOF_DATA_PTR=4
  143. CMAKE += -DCMAKE_CXX_SIZEOF_DATA_PTR=4
  144. CMAKE += -DCMAKE_HAVE_LIMITS_H=1
  145. CMAKE += -DCMAKE_HAVE_UNISTD_H=1
  146. CMAKE += -DCMAKE_HAVE_PTHREAD_H=1
  147. CMAKE += -DCMAKE_HAVE_SYS_PRCTL_H=1
  148. CMAKE += -DCMAKE_WORDS_BIGENDIAN=0
  149. CMAKE += -DCMAKE_DL_LIBS=''
  150. CMAKE += -DCMAKE_C_BYTE_ORDER=LITTLE_ENDIAN
  151. CMAKE += -DCMAKE_CXX_BYTE_ORDER=LITTLE_ENDIAN
  152. endif
  153. # fix cross-compilation for windows
  154. ifeq ($(WINDOWS),true)
  155. CMAKE += -G 'Unix Makefiles'
  156. CMAKE += -DCMAKE_RC_COMPILER=$(subst gcc,windres,$(CC))
  157. CMAKE += -DCMAKE_SYSTEM_NAME=Windows
  158. endif
  159. # --------------------------------------------------------------
  160. # Fix up configure
  161. CONFIGURE = ./configure
  162. CONFIGURE += --prefix="$(DEP_PATH)"
  163. CONFIGURE += --host=$(TARGET_MACHINE)
  164. CONFIGURE += --enable-static
  165. CONFIGURE += --disable-shared
  166. # NOTE libsamplerate wants to link against alsa, so we disable that
  167. CONFIGURE += --disable-alsa
  168. # NOTE speex fails to build when neon is enabled, so we disable that
  169. CONFIGURE += --disable-neon
  170. # NOTE libsamplerate fails with invalid host, so we force ac_cv_host
  171. CONFIGURE += ac_cv_host=$(TARGET_MACHINE)
  172. # --------------------------------------------------------------
  173. # Fix up make
  174. DEP_MAKE = $(MAKE)
  175. DEP_MAKE += ARCH_NAME=$(ARCH_NAME)
  176. DEP_MAKE += AR=$(AR)
  177. DEP_MAKE += CC=$(CC)
  178. DEP_MAKE += CXX=$(CXX)
  179. DEP_MAKE += CFLAGS="$(BUILD_C_FLAGS)"
  180. DEP_MAKE += CXXFLAGS="$(BUILD_CXX_FLAGS)"
  181. DEP_MAKE += LDFLAGS="$(LINK_FLAGS)"
  182. DEP_MAKE += DEP_FLAGS="$(BASE_FLAGS)"
  183. DEP_MAKE += DEP_MAC_SDK_FLAGS=
  184. DEP_MAKE += MACHINE=$(MACHINE)$(MACHINE_SUFFIX)
  185. DEP_MAKE += VERBOSE=1
  186. ifeq ($(shell uname -s),Darwin)
  187. ifeq ($(CIBUILD),true)
  188. DEP_MAKE += SHA256SUM="shasum5.30 -a 256"
  189. else
  190. DEP_MAKE += SHA256SUM="shasum5.30 -a 256"
  191. endif
  192. endif
  193. DEP_MAKE2 = $(DEP_MAKE)
  194. DEP_MAKE2 += CMAKE="$(ENV) $(CMAKE)"
  195. DEP_MAKE2 += CONFIGURE="$(ENV) $(CONFIGURE)"
  196. # --------------------------------------------------------------
  197. # Rack internal dependencies target
  198. $(DEP_PATH)/lib/%.a:
  199. $(DEP_MAKE2) -C $(DEP_PATH) lib/$*.a
  200. $(DEP_PATH)/jansson-2.12:
  201. $(DEP_MAKE2) -C $(DEP_PATH) jansson-2.12
  202. # libarchive: skip shared lib and ensure libzstd is enabled
  203. $(DEP_PATH)/lib/libarchive.a: $(DEP_PATH)/lib/libzstd.a $(DEP_PATH)/libarchive-3.4.3/.stamp-patched
  204. $(DEP_PATH)/lib/libarchive_static.a: $(DEP_PATH)/lib/libzstd.a $(DEP_PATH)/libarchive-3.4.3/.stamp-patched
  205. $(DEP_PATH)/libarchive-3.4.3/.stamp-patched:
  206. $(DEP_MAKE2) -C $(DEP_PATH) libarchive-3.4.3
  207. sed -i -e "618,625d" $(DEP_PATH)/libarchive-3.4.3/CMakeLists.txt
  208. awk 'NR==616{print " SET(HAVE_LIBZSTD 1)"}1' $(DEP_PATH)/libarchive-3.4.3/CMakeLists.txt > $(DEP_PATH)/libarchive-3.4.3/CMakeLists.txt2
  209. mv $(DEP_PATH)/libarchive-3.4.3/CMakeLists.txt2 $(DEP_PATH)/libarchive-3.4.3/CMakeLists.txt
  210. sed -i -e "238,243d" $(DEP_PATH)/libarchive-3.4.3/libarchive/CMakeLists.txt
  211. sed -i -e "s/TARGETS archive archive_static/TARGETS archive_static/" $(DEP_PATH)/libarchive-3.4.3/libarchive/CMakeLists.txt
  212. touch $@
  213. # libsamplerate: skip tests, fails to build in some systems and are not needed or wanted anyway
  214. $(DEP_PATH)/lib/libsamplerate.a: $(DEP_PATH)/libsamplerate-0.1.9/.stamp-patched
  215. $(DEP_PATH)/libsamplerate-0.1.9/.stamp-patched:
  216. $(DEP_MAKE2) -C $(DEP_PATH) libsamplerate-0.1.9
  217. sed -i -e "s/src doc examples tests/src/" $(DEP_PATH)/libsamplerate-0.1.9/Makefile.in
  218. touch $@
  219. # libspeexdsp: hide symbols
  220. $(DEP_PATH)/lib/libspeexdsp.a: $(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3/.stamp-patched
  221. $(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3/.stamp-patched:
  222. $(DEP_MAKE2) -C $(DEP_PATH) speexdsp-SpeexDSP-1.2rc3 \
  223. WGET="wget -c http://downloads.xiph.org/releases/speex/speexdsp-1.2rc3.tar.gz && mv speexdsp-1.2rc3.tar.gz speexdsp-SpeexDSP-1.2rc3.tgz #" \
  224. SHA256SUM="true" \
  225. UNTAR="mkdir -p speexdsp-SpeexDSP-1.2rc3 && tar -x --strip-components=1 --directory=$(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3 -f"
  226. sed -i -e "s/#pragma GCC visibility push/#error we dont want this/" $(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3/configure
  227. touch $@
  228. # custom zstd build for only building static libs
  229. $(DEP_PATH)/lib/libzstd.a: $(DEP_PATH)/zstd-1.4.5/.stamp-patched
  230. cd $(DEP_PATH)/zstd-1.4.5/build/cmake && $(CMAKE) -DZSTD_BUILD_STATIC=ON -DZSTD_BUILD_PROGRAMS=OFF -DZSTD_BUILD_SHARED=OFF -DZSTD_MULTITHREAD_SUPPORT=OFF .
  231. $(DEP_MAKE2) -C $(DEP_PATH)/zstd-1.4.5/build/cmake
  232. $(DEP_MAKE2) -C $(DEP_PATH)/zstd-1.4.5/build/cmake install
  233. # zstd cmake is borked, see https://github.com/facebook/zstd/issues/1401
  234. # zstd also fails to build on old systems, patch that too
  235. $(DEP_PATH)/zstd-1.4.5/.stamp-patched:
  236. $(DEP_MAKE2) -C $(DEP_PATH) zstd-1.4.5
  237. sed -i -e "56,66d" $(DEP_PATH)/zstd-1.4.5/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake
  238. sed -i -e "146,175d" $(DEP_PATH)/zstd-1.4.5/programs/util.c
  239. sed -i -e "142,144d" $(DEP_PATH)/zstd-1.4.5/programs/util.c
  240. touch $@
  241. # --------------------------------------------------------------
  242. # QuickJS target, needed for AriaModules
  243. QUICKJS_MAKE_FLAGS = CFLAGS="$(BUILD_C_FLAGS) -D_GNU_SOURCE -DCONFIG_VERSION='\"Cardinal\"' -w"
  244. QUICKJS_MAKE_FLAGS += PROGS=libquickjs.a
  245. ifeq ($(WITH_LTO),true)
  246. QUICKJS_MAKE_FLAGS += CONFIG_LTO=y
  247. else
  248. QUICKJS_MAKE_FLAGS += CONFIG_LTO=
  249. endif
  250. ifeq ($(WINDOWS),true)
  251. QUICKJS_MAKE_FLAGS += CONFIG_WIN32=y
  252. else ifeq ($(MACOS),true)
  253. QUICKJS_MAKE_FLAGS += CONFIG_DARWIN=y
  254. endif
  255. $(DEP_PATH)/lib/libquickjs.a:
  256. $(DEP_MAKE) $(QUICKJS_MAKE_FLAGS) -C $(CURDIR)/QuickJS
  257. install -d $(DEP_PATH)/include
  258. install -d $(DEP_PATH)/lib
  259. install -m644 $(CURDIR)/QuickJS/libquickjs.a $@
  260. install -m644 $(CURDIR)/QuickJS/quickjs.h $(DEP_PATH)/include/quickjs.h
  261. # --------------------------------------------------------------
  262. # SurgeXT target
  263. SURGE_DEP_PATH = $(abspath surge-build)
  264. SURGE_SRC_PATH = $(abspath ../plugins/surgext/surge)
  265. SURGE_NAMES = HysteresisProcessing Patch SolverType Tunings Wavetable clouds ghc plaits stmlib
  266. SURGE_CXX_FLAGS = $(filter-out -fsingle-precision-constant,$(filter-out -std=gnu++11,$(BUILD_CXX_FLAGS)))
  267. SURGE_CXX_FLAGS += $(foreach n,$(SURGE_NAMES),-D$(n)=surgext$(n))
  268. # fix JUCE build https://github.com/juce-framework/JUCE/issues/374
  269. ifeq ($(CPU_I386),true)
  270. SURGE_CXX_FLAGS += -D__sigemptyset=sigemptyset
  271. endif
  272. # unwanted in this build
  273. SURGE_CXX_FLAGS += -DJUCE_DSP_ENABLE_SNAP_TO_ZERO=0
  274. # possibly use fftw?
  275. # ifeq ($(shell $(PKG_CONFIG) --exists fftw3 fftw3f && echo true),true)
  276. # SURGE_CXX_FLAGS += -DJUCE_DSP_USE_STATIC_FFTW=1
  277. # endif
  278. # JUCE_USE_CURL
  279. SURGE_ENV = env \
  280. AR=$(AR) \
  281. CC=$(CC) \
  282. CXX=$(CXX) \
  283. CFLAGS='$(BUILD_C_FLAGS) -w' \
  284. CXXFLAGS='$(SURGE_CXX_FLAGS) -w' \
  285. LDFLAGS='$(LINK_FLAGS)'
  286. SURGE_LIB = $(SURGE_DEP_PATH)/src/common/libsurge-common.a
  287. $(SURGE_LIB): $(SURGE_DEP_PATH)/Makefile
  288. $(DEP_MAKE) -C $(SURGE_DEP_PATH) surge-common
  289. $(SURGE_DEP_PATH)/Makefile: $(SURGE_SRC_PATH)/CMakeLists.txt
  290. mkdir -p $(SURGE_DEP_PATH)
  291. cd $(SURGE_DEP_PATH) && \
  292. $(SURGE_ENV) $(CMAKE) \
  293. -DSURGE_COMPILE_BLOCK_SIZE=8 \
  294. -DSURGE_SKIP_AIRWINDOWS=TRUE \
  295. -DSURGE_SKIP_JUCE_FOR_RACK=TRUE \
  296. -DSURGE_SKIP_LUA=TRUE \
  297. -DSURGE_SKIP_ODDSOUND_MTS=TRUE \
  298. $(SURGE_SRC_PATH)
  299. # --------------------------------------------------------------
  300. # Build targets
  301. ifneq ($(NOPLUGINS),true)
  302. TARGETS += $(SURGE_LIB)
  303. endif
  304. TARGETS += $(DEP_PATH)/lib/libjansson.a
  305. TARGETS += $(DEP_PATH)/lib/libquickjs.a
  306. TARGETS += $(DEP_PATH)/lib/libsamplerate.a
  307. TARGETS += $(DEP_PATH)/lib/libspeexdsp.a
  308. ifeq ($(WINDOWS),true)
  309. TARGETS += $(DEP_PATH)/lib/libarchive_static.a
  310. else
  311. TARGETS += $(DEP_PATH)/lib/libarchive.a
  312. endif
  313. TARGETS += $(DEP_PATH)/lib/libzstd.a
  314. all: $(TARGETS)
  315. clean:
  316. $(DEP_MAKE) $(QUICKJS_MAKE_FLAGS) -C $(CURDIR)/QuickJS clean
  317. rm -f $(TARGETS)
  318. rm -f $(DEP_PATH)/*.tgz
  319. rm -f $(DEP_PATH)/*.tar.gz
  320. rm -rf $(DEP_PATH)/bin
  321. rm -rf $(DEP_PATH)/include
  322. rm -rf $(DEP_PATH)/lib
  323. rm -rf $(DEP_PATH)/share
  324. rm -rf $(DEP_PATH)/jansson-2.12
  325. rm -rf $(DEP_PATH)/libarchive-3.4.3
  326. rm -rf $(DEP_PATH)/libsamplerate-0.1.9
  327. rm -rf $(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3
  328. rm -rf $(DEP_PATH)/zstd-1.4.5
  329. rm -rf $(SURGE_DEP_PATH)
  330. download: \
  331. $(DEP_PATH)/jansson-2.12 \
  332. $(DEP_PATH)/libarchive-3.4.3/.stamp-patched \
  333. $(DEP_PATH)/libsamplerate-0.1.9/.stamp-patched \
  334. $(DEP_PATH)/speexdsp-SpeexDSP-1.2rc3/.stamp-patched \
  335. $(DEP_PATH)/zstd-1.4.5/.stamp-patched
  336. quickjs: $(DEP_PATH)/lib/libquickjs.a
  337. surge: $(SURGE_LIB)
  338. # --------------------------------------------------------------