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.

403 lines
13KB

  1. # Installation path for executables
  2. LOCAL_DIR := $(PWD)/local
  3. # Local programs should have higher path priority than system-installed programs
  4. export PATH := $(LOCAL_DIR)/bin:$(PATH)
  5. # Allow specifying the number of jobs for toolchain build for systems that need it.
  6. # Due to different build systems used in the toolchain build, just `make -j` won't work here.
  7. # Note: Plugin build uses `$(MAKE)` to inherit `-j` argument from command line.
  8. ifdef JOBS
  9. export JOBS := $(JOBS)
  10. # Define number of jobs for crosstool-ng (uses different argument format)
  11. export JOBS_CT_NG := .$(JOBS)
  12. else
  13. # If `JOBS` is not specified, default to max number of jobs.
  14. export JOBS :=
  15. export JOBS_CT_NG :=
  16. endif
  17. WGET := wget -c
  18. UNTAR := tar -x -f
  19. UNZIP := unzip
  20. SHA256 := sha256check() { echo "$$2 $$1" | sha256sum -c; }; sha256check
  21. CROSSTOOL_NG_VERSION := 1.27.0
  22. RACK_SDK_VERSION := 2.6.4
  23. DOCKER_IMAGE_VERSION := 17
  24. MACOS_SDK_VERSION := 12.3
  25. DARWIN_VERSION := 21.4
  26. all: toolchain-all rack-sdk-all
  27. # Toolchain build
  28. toolchain-all: toolchain-lin toolchain-win toolchain-mac cppcheck
  29. crosstool-ng := $(LOCAL_DIR)/bin/ct-ng
  30. $(crosstool-ng):
  31. $(WGET) "http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-$(CROSSTOOL_NG_VERSION).tar.bz2"
  32. $(SHA256) crosstool-ng-$(CROSSTOOL_NG_VERSION).tar.bz2 6307b93a0abdd1b20b85305210094195825ff00a2ed8b650eeab21235088da4b
  33. $(UNTAR) crosstool-ng-$(CROSSTOOL_NG_VERSION).tar.bz2
  34. rm crosstool-ng-$(CROSSTOOL_NG_VERSION).tar.bz2
  35. cd crosstool-ng-$(CROSSTOOL_NG_VERSION) && ./configure --prefix="$(LOCAL_DIR)"
  36. cd crosstool-ng-$(CROSSTOOL_NG_VERSION) && make -j $(JOBS)
  37. cd crosstool-ng-$(CROSSTOOL_NG_VERSION) && make install
  38. rm -rf crosstool-ng-$(CROSSTOOL_NG_VERSION)
  39. toolchain-lin := $(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu
  40. toolchain-lin: $(toolchain-lin)
  41. $(toolchain-lin): $(crosstool-ng)
  42. $(WGET) "https://ftp.gnu.org/gnu/texinfo/texinfo-7.2.tar.gz"
  43. $(SHA256) texinfo-7.2.tar.gz e86de7dfef6b352aa1bf647de3a6213d1567c70129eccbf8977706d9c91919c8
  44. $(UNTAR) texinfo-7.2.tar.gz
  45. rm texinfo-7.2.tar.gz
  46. cd texinfo-7.2 && ./configure --prefix="$(LOCAL_DIR)"
  47. cd texinfo-7.2 && make -j $(JOBS)
  48. cd texinfo-7.2 && make install -j $(JOBS)
  49. rm -rf texinfo-7.2
  50. ct-ng x86_64-ubuntu16.04-linux-gnu
  51. CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG)
  52. rm -rf .build .config build.log
  53. # HACK Copy GL and related include dirs to toolchain sysroot
  54. chmod +w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include
  55. cp -r /usr/include/GL $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  56. cp -r /usr/include/KHR $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  57. cp -r /usr/include/X11 $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  58. chmod -w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include
  59. toolchain-win := $(LOCAL_DIR)/x86_64-w64-mingw32
  60. toolchain-win: $(toolchain-win)
  61. $(toolchain-win): $(crosstool-ng)
  62. ct-ng x86_64-w64-mingw32
  63. # I don't know how to set crosstool-ng variables from the command line
  64. sed -i 's/CT_MINGW_W64_VERSION=.*/CT_MINGW_W64_VERSION="v10.0.0"/' .config
  65. CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG)
  66. rm -rf .build .config build.log
  67. OSXCROSS_CLANG_VERSION := 15.0.7
  68. OSXCROSS_BINUTILS_VERSION := 2.37
  69. toolchain-mac := $(LOCAL_DIR)/osxcross
  70. toolchain-mac: $(toolchain-mac)
  71. $(toolchain-mac): export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  72. $(toolchain-mac):
  73. # Obtain osxcross sources.
  74. git clone "https://github.com/tpoechtrager/osxcross.git" osxcross
  75. cd osxcross && git checkout 611675b5179c4a9a5e33eac6c376ed8f986bab21
  76. # Build a custom clang compiler using the system's gcc compiler.
  77. # This enables us to have custom compiler environment needed for cross-compilation.
  78. cd osxcross && UNATTENDED=1 INSTALLPREFIX="$(LOCAL_DIR)" GITPROJECT=llvm CLANG_VERSION=$(OSXCROSS_CLANG_VERSION) OCDEBUG=1 ENABLE_CLANG_INSTALL=1 JOBS=$(JOBS) ./build_clang.sh
  79. ## Build osxcross.
  80. cp MacOSX$(MACOS_SDK_VERSION).sdk.tar.* osxcross/tarballs/
  81. cd osxcross && PATH="$(LOCAL_DIR)/bin:$(PATH)" UNATTENDED=1 TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build.sh
  82. ## Build compiler-rt.
  83. cd osxcross && ENABLE_COMPILER_RT_INSTALL=1 JOBS=$(JOBS) ./build_compiler_rt.sh
  84. ## Build MacOS binutils and build LLVM gold.
  85. cd osxcross && BINUTILS_VERSION=$(OSXCROSS_BINUTILS_VERSION) TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build_binutils.sh
  86. cd osxcross/build/clang-$(OSXCROSS_CLANG_VERSION)/build_stage2 && cmake . -DLLVM_BINUTILS_INCDIR=$(PWD)/osxcross/build/binutils-$(OSXCROSS_BINUTILS_VERSION)/include && make install -j $(JOBS)
  87. # Fix library paths (for Arch Linux and Ubuntu arm64).
  88. export PLATFORM_ID=$$($(LOCAL_DIR)/bin/clang -dumpmachine) ; \
  89. echo "Platform ID: $$PLATFORM_ID" ; \
  90. if [ ! -z "$$PLATFORM_ID" ] && [ -e "$(LOCAL_DIR)/lib/$$PLATFORM_ID/" ]; then \
  91. echo "Copying lib files..." ; \
  92. cp -Pv $(LOCAL_DIR)/lib/$$PLATFORM_ID/* $(LOCAL_DIR)/lib/ ; \
  93. echo "done" ; \
  94. fi
  95. ## Download rcodesign binary to ad-hoc sign arm64 plugin builds in a cross-compilation environment.
  96. $(WGET) "https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz"
  97. $(UNTAR) apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
  98. rm apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
  99. cp ./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign $(LOCAL_DIR)/osxcross/bin/
  100. rm -r apple-codesign-0.22.0-x86_64-unknown-linux-musl
  101. rm -rf osxcross
  102. CPPCHECK_VERSION := 2.16.0
  103. cppcheck := $(LOCAL_DIR)/cppcheck/bin/cppcheck
  104. cppcheck: $(cppcheck)
  105. $(cppcheck):
  106. $(WGET) "https://github.com/danmar/cppcheck/archive/refs/tags/$(CPPCHECK_VERSION).tar.gz"
  107. $(UNTAR) $(CPPCHECK_VERSION).tar.gz
  108. cd cppcheck-$(CPPCHECK_VERSION) && mkdir build
  109. cd cppcheck-$(CPPCHECK_VERSION)/build \
  110. && cmake .. \
  111. -DUSE_MATCHCOMPILER=On \
  112. -DUSE_THREADS=On \
  113. -DCMAKE_INSTALL_PREFIX=$(LOCAL_DIR)/cppcheck \
  114. && cmake --build . -j \
  115. && cmake --install .
  116. rm $(CPPCHECK_VERSION).tar.gz
  117. rm -rf cppcheck-$(CPPCHECK_VERSION)
  118. toolchain-clean:
  119. rm -rf local osxcross .build build.log .config
  120. # Rack SDK
  121. rack-sdk-all: rack-sdk-mac-x64 rack-sdk-mac-arm64 rack-sdk-win-x64 rack-sdk-lin-x64
  122. rack-sdk-mac-x64 := Rack-SDK-mac-x64
  123. rack-sdk-mac-x64: $(rack-sdk-mac-x64)
  124. $(rack-sdk-mac-x64):
  125. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip"
  126. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip
  127. mv Rack-SDK Rack-SDK-mac-x64
  128. rm Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip
  129. RACK_DIR_MAC_X64 := $(PWD)/$(rack-sdk-mac-x64)
  130. rack-sdk-mac-arm64 := Rack-SDK-mac-arm64
  131. rack-sdk-mac-arm64: $(rack-sdk-mac-arm64)
  132. $(rack-sdk-mac-arm64):
  133. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip"
  134. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip
  135. mv Rack-SDK Rack-SDK-mac-arm64
  136. rm Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip
  137. RACK_DIR_MAC_ARM64 := $(PWD)/$(rack-sdk-mac-arm64)
  138. rack-sdk-win-x64 := Rack-SDK-win-x64
  139. rack-sdk-win-x64: $(rack-sdk-win-x64)
  140. $(rack-sdk-win-x64):
  141. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip"
  142. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip
  143. mv Rack-SDK Rack-SDK-win-x64
  144. rm Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip
  145. RACK_DIR_WIN_X64 := $(PWD)/$(rack-sdk-win-x64)
  146. rack-sdk-lin-x64 := Rack-SDK-lin-x64
  147. rack-sdk-lin-x64: $(rack-sdk-lin-x64)
  148. $(rack-sdk-lin-x64):
  149. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip"
  150. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip
  151. mv Rack-SDK Rack-SDK-lin-x64
  152. rm Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip
  153. RACK_DIR_LIN_X64 := $(PWD)/$(rack-sdk-lin-x64)
  154. rack-sdk-clean:
  155. rm -rf $(rack-sdk-mac-x64) $(rack-sdk-mac-arm64) $(rack-sdk-win-x64) $(rack-sdk-lin-x64)
  156. # Plugin build
  157. PLUGIN_BUILD_DIR := plugin-build
  158. PLUGIN_DIR ?=
  159. plugin-build:
  160. $(MAKE) plugin-build-mac-x64
  161. $(MAKE) plugin-build-mac-arm64
  162. $(MAKE) plugin-build-win-x64
  163. $(MAKE) plugin-build-lin-x64
  164. plugin-build-mac:
  165. $(MAKE) plugin-build-mac-x64
  166. $(MAKE) plugin-build-mac-arm64
  167. plugin-build-win:
  168. $(MAKE) plugin-build-win-x64
  169. plugin-build-lin:
  170. $(MAKE) plugin-build-lin-x64
  171. plugin-build-mac-x64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  172. plugin-build-mac-x64: export CC := x86_64-apple-darwin$(DARWIN_VERSION)-clang
  173. plugin-build-mac-x64: export CXX := x86_64-apple-darwin$(DARWIN_VERSION)-clang++-libc++
  174. plugin-build-mac-x64: export STRIP := x86_64-apple-darwin$(DARWIN_VERSION)-strip
  175. plugin-build-mac-x64: export INSTALL_NAME_TOOL := x86_64-apple-darwin$(DARWIN_VERSION)-install_name_tool
  176. plugin-build-mac-x64: export OTOOL := x86_64-apple-darwin$(DARWIN_VERSION)-otool
  177. plugin-build-mac-x64: export CODESIGN := rcodesign sign
  178. plugin-build-mac-arm64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  179. plugin-build-mac-arm64: export CC := arm64-apple-darwin$(DARWIN_VERSION)-clang
  180. plugin-build-mac-arm64: export CXX := arm64-apple-darwin$(DARWIN_VERSION)-clang++-libc++
  181. plugin-build-mac-arm64: export STRIP := arm64-apple-darwin$(DARWIN_VERSION)-strip
  182. plugin-build-mac-arm64: export INSTALL_NAME_TOOL := arm64-apple-darwin$(DARWIN_VERSION)-install_name_tool
  183. plugin-build-mac-arm64: export OTOOL := arm64-apple-darwin$(DARWIN_VERSION)-otool
  184. plugin-build-mac-arm64: export CODESIGN := rcodesign sign
  185. plugin-build-win-x64: export PATH := $(LOCAL_DIR)/x86_64-w64-mingw32/bin:$(PATH)
  186. plugin-build-win-x64: export CC := x86_64-w64-mingw32-gcc
  187. plugin-build-win-x64: export CXX := x86_64-w64-mingw32-g++
  188. plugin-build-win-x64: export STRIP := x86_64-w64-mingw32-strip
  189. plugin-build-win-x64: export OBJCOPY := x86_64-w64-mingw32-objcopy
  190. plugin-build-lin-x64: export PATH:=$(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu/bin:$(PATH)
  191. plugin-build-lin-x64: export CC := x86_64-ubuntu16.04-linux-gnu-gcc
  192. plugin-build-lin-x64: export CXX := x86_64-ubuntu16.04-linux-gnu-g++
  193. plugin-build-lin-x64: export STRIP := x86_64-ubuntu16.04-linux-gnu-strip
  194. plugin-build-lin-x64: export OBJCOPY := x86_64-ubuntu16.04-linux-gnu-objcopy
  195. plugin-build-mac-x64: export RACK_DIR := $(RACK_DIR_MAC_X64)
  196. plugin-build-mac-arm64: export RACK_DIR := $(RACK_DIR_MAC_ARM64)
  197. plugin-build-win-x64: export RACK_DIR := $(RACK_DIR_WIN_X64)
  198. plugin-build-lin-x64: export RACK_DIR := $(RACK_DIR_LIN_X64)
  199. plugin-build-mac-x64 plugin-build-mac-arm64 plugin-build-win-x64 plugin-build-lin-x64:
  200. cd $(PLUGIN_DIR) && $(MAKE) clean
  201. cd $(PLUGIN_DIR) && $(MAKE) cleandep
  202. cd $(PLUGIN_DIR) && $(MAKE) dep
  203. cd $(PLUGIN_DIR) && $(MAKE) dist
  204. mkdir -p $(PLUGIN_BUILD_DIR)
  205. cp $(PLUGIN_DIR)/dist/*.vcvplugin $(PLUGIN_BUILD_DIR)/
  206. cd $(PLUGIN_DIR) && $(MAKE) clean
  207. plugin-build-clean:
  208. rm -rf $(PLUGIN_BUILD_DIR)
  209. # Static Analysis
  210. static-analysis-cppcheck: export PATH := $(LOCAL_DIR)/cppcheck/bin:$(PATH)
  211. static-analysis-cppcheck: cppcheck
  212. cd $(PLUGIN_DIR) && cppcheck src/ -isrc/dep --std=c++11 -j $(shell nproc) --error-exitcode=1
  213. plugin-analyze: static-analysis-cppcheck
  214. # Docker helpers
  215. dep-ubuntu:
  216. sudo apt-get install --no-install-recommends \
  217. ca-certificates \
  218. git \
  219. build-essential \
  220. autoconf \
  221. automake \
  222. bison \
  223. flex \
  224. gawk \
  225. libtool-bin \
  226. libncurses5-dev \
  227. unzip \
  228. zip \
  229. jq \
  230. libgl-dev \
  231. libglu-dev \
  232. git \
  233. wget \
  234. curl \
  235. cmake \
  236. nasm \
  237. xz-utils \
  238. file \
  239. python3 \
  240. libxml2-dev \
  241. libssl-dev \
  242. texinfo \
  243. help2man \
  244. libz-dev \
  245. rsync \
  246. xxd \
  247. perl \
  248. coreutils \
  249. zstd \
  250. markdown \
  251. libarchive-tools \
  252. gettext
  253. dep-arch-linux:
  254. sudo pacman -S --needed \
  255. gcc \
  256. git \
  257. cmake \
  258. patch \
  259. python3 \
  260. automake \
  261. help2man \
  262. texinfo \
  263. libtool \
  264. jq \
  265. rsync \
  266. autoconf \
  267. flex \
  268. bison \
  269. which \
  270. unzip \
  271. wget \
  272. glu \
  273. libx11 \
  274. mesa
  275. docker-build: rack-sdk-all
  276. docker build --build-arg JOBS=$(JOBS) --build-arg MACOS_SDK_VERSION=$(MACOS_SDK_VERSION) --no-cache --tag rack-plugin-toolchain:$(DOCKER_IMAGE_VERSION) . --progress=plain 2>&1 | tee docker-build.log
  277. DOCKER_RUN := docker run --rm --interactive --tty \
  278. --volume=$(PLUGIN_DIR):/home/build/plugin-src \
  279. --volume=$(PWD)/$(PLUGIN_BUILD_DIR):/home/build/rack-plugin-toolchain/$(PLUGIN_BUILD_DIR) \
  280. --volume=$(PWD)/Rack-SDK-mac-x64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-x64 \
  281. --volume=$(PWD)/Rack-SDK-mac-arm64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64 \
  282. --volume=$(PWD)/Rack-SDK-win-x64:/home/build/rack-plugin-toolchain/Rack-SDK-win-x64 \
  283. --volume=$(PWD)/Rack-SDK-lin-x64:/home/build/rack-plugin-toolchain/Rack-SDK-lin-x64 \
  284. --env PLUGIN_DIR=/home/build/plugin-src \
  285. rack-plugin-toolchain:$(DOCKER_IMAGE_VERSION) \
  286. /bin/bash
  287. docker-run:
  288. $(DOCKER_RUN)
  289. docker-plugin-build:
  290. mkdir -p $(PLUGIN_BUILD_DIR)
  291. $(DOCKER_RUN) -c "$(MAKE) plugin-build $(MFLAGS)"
  292. docker-plugin-build-mac-x64:
  293. mkdir -p $(PLUGIN_BUILD_DIR)
  294. $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-x64 $(MFLAGS)"
  295. docker-plugin-build-mac-arm64:
  296. mkdir -p $(PLUGIN_BUILD_DIR)
  297. $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-arm64 $(MFLAGS)"
  298. docker-plugin-build-win-x64:
  299. mkdir -p $(PLUGIN_BUILD_DIR)
  300. $(DOCKER_RUN) -c "$(MAKE) plugin-build-win-x64 $(MFLAGS)"
  301. docker-plugin-build-lin-x64:
  302. mkdir -p $(PLUGIN_BUILD_DIR)
  303. $(DOCKER_RUN) -c "$(MAKE) plugin-build-lin-x64 $(MFLAGS)"
  304. docker-plugin-analyze:
  305. $(DOCKER_RUN) -c "$(MAKE) plugin-analyze $(MFLAGS)"
  306. .NOTPARALLEL:
  307. .PHONY: all plugin-build plugin-analyze