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.

407 lines
13KB

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