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.

429 lines
13KB

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