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.

362 lines
11KB

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