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.

388 lines
12KB

  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 --continue
  18. UNTAR := tar -x -f
  19. UNZIP := unzip
  20. RACK_SDK_VERSION := 2.5.2
  21. DOCKER_IMAGE_VERSION := 14
  22. all: toolchain-all rack-sdk-all
  23. # Toolchain build
  24. toolchain-all: toolchain-lin toolchain-win toolchain-mac cppcheck
  25. crosstool-ng := $(LOCAL_DIR)/bin/ct-ng
  26. $(crosstool-ng):
  27. git clone https://github.com/crosstool-ng/crosstool-ng.git
  28. cd crosstool-ng && git checkout e63c40854c977f488bee159a8f8ebf5fc06c8666
  29. cd crosstool-ng && ./bootstrap
  30. cd crosstool-ng && ./configure --prefix="$(LOCAL_DIR)"
  31. cd crosstool-ng && make -j $(JOBS)
  32. cd crosstool-ng && make install -j $(JOBS)
  33. rm -rf crosstool-ng
  34. toolchain-lin := $(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu
  35. toolchain-lin: $(toolchain-lin)
  36. $(toolchain-lin): $(crosstool-ng)
  37. # Build a newer version of texinfo because version 7.1 in Ubuntu 24.04 has issues.
  38. # This is needed to build glibc for the GNU/Linux based toolchain.
  39. git clone https://git.savannah.gnu.org/git/texinfo.git
  40. cd texinfo && git checkout 60d3edc4b74b4e1e5ef55e53de394d3b65506c47
  41. cd texinfo && ./autogen.sh
  42. cd texinfo && ./configure --prefix="$(LOCAL_DIR)"
  43. cd texinfo && make -j $(JOBS)
  44. cd texinfo && make install -j $(JOBS)
  45. rm -rf texinfo
  46. ct-ng x86_64-ubuntu16.04-linux-gnu
  47. CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG)
  48. rm -rf .build .config build.log
  49. # HACK Copy GL and related include dirs to toolchain sysroot
  50. chmod +w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include
  51. cp -r /usr/include/GL $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  52. cp -r /usr/include/KHR $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  53. cp -r /usr/include/X11 $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/
  54. chmod -w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include
  55. toolchain-win := $(LOCAL_DIR)/x86_64-w64-mingw32
  56. toolchain-win: $(toolchain-win)
  57. $(toolchain-win): $(crosstool-ng)
  58. ct-ng x86_64-w64-mingw32
  59. CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG)
  60. rm -rf .build .config build.log /home/build/src
  61. OSXCROSS_CLANG_VERSION := 15.0.7
  62. OSXCROSS_BINUTILS_VERSION := 2.37
  63. toolchain-mac := $(LOCAL_DIR)/osxcross
  64. toolchain-mac: $(toolchain-mac)
  65. $(toolchain-mac): export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  66. $(toolchain-mac):
  67. # Obtain osxcross sources.
  68. # FIXME Use official osxcross version when workaround from our fork are not required anymore.
  69. git clone "https://github.com/tpoechtrager/osxcross.git" osxcross
  70. cd osxcross && git checkout ff8d100f3f026b4ffbe4ce96d8aac4ce06f1278b
  71. # Build a custom clang compiler using the system's gcc compiler.
  72. # This enables us to have custom compiler environment needed for cross-compilation.
  73. 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
  74. ## Build osxcross.
  75. cp MacOSX11.1.sdk.tar.* osxcross/tarballs/
  76. cd osxcross && PATH="$(LOCAL_DIR)/bin:$(PATH)" UNATTENDED=1 TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build.sh
  77. ## Build compiler-rt.
  78. cd osxcross && ENABLE_COMPILER_RT_INSTALL=1 JOBS=$(JOBS) ./build_compiler_rt.sh
  79. ## Build MacOS binutils and build LLVM gold.
  80. cd osxcross && BINUTILS_VERSION=$(OSXCROSS_BINUTILS_VERSION) TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build_binutils.sh
  81. # This doesn't seem to work anymore
  82. #cd osxcross/build/build_stage && cmake . -DLLVM_BINUTILS_INCDIR=$(PWD)/osxcross/build/binutils-$(OSXCROSS_BINUTILS_VERSION)/include && make install -j $(JOBS)
  83. # Fix library paths (for Arch Linux and Ubuntu arm64).
  84. export PLATFORM_ID=$$($(LOCAL_DIR)/bin/clang -dumpmachine) ; \
  85. echo "Platform ID: $$PLATFORM_ID" ; \
  86. if [ ! -z "$$PLATFORM_ID" ] && [ -e "$(LOCAL_DIR)/lib/$$PLATFORM_ID/" ]; then \
  87. echo "Copying lib files..." ; \
  88. cp -Pv $(LOCAL_DIR)/lib/$$PLATFORM_ID/* $(LOCAL_DIR)/lib/ ; \
  89. echo "done" ; \
  90. fi
  91. ## Download rcodesign binary to ad-hoc sign arm64 plugin builds in a cross-compilation environment.
  92. $(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"
  93. $(UNTAR) apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
  94. rm apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
  95. cp ./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign $(LOCAL_DIR)/osxcross/bin/
  96. rm -r apple-codesign-0.22.0-x86_64-unknown-linux-musl
  97. rm -rf osxcross
  98. CPPCHECK_VERSION := 2.14.0
  99. cppcheck := $(LOCAL_DIR)/cppcheck/bin/cppcheck
  100. cppcheck: $(cppcheck)
  101. $(cppcheck):
  102. $(WGET) "https://github.com/danmar/cppcheck/archive/refs/tags/$(CPPCHECK_VERSION).tar.gz"
  103. $(UNTAR) $(CPPCHECK_VERSION).tar.gz
  104. cd cppcheck-$(CPPCHECK_VERSION) && mkdir build
  105. cd cppcheck-$(CPPCHECK_VERSION)/build \
  106. && cmake .. \
  107. -DUSE_MATCHCOMPILER=ON \
  108. -DUSE_THREADS=ON \
  109. -DCMAKE_INSTALL_PREFIX=$(LOCAL_DIR)/cppcheck \
  110. && cmake --build . -j \
  111. && cmake --install .
  112. rm $(CPPCHECK_VERSION).tar.gz
  113. rm -rf cppcheck-$(CPPCHECK_VERSION)
  114. toolchain-clean:
  115. rm -rf local osxcross .build build.log .config
  116. # Rack SDK
  117. rack-sdk-all: rack-sdk-mac-x64 rack-sdk-mac-arm64 rack-sdk-win-x64 rack-sdk-lin-x64
  118. rack-sdk-mac-x64 := Rack-SDK-mac-x64
  119. rack-sdk-mac-x64: $(rack-sdk-mac-x64)
  120. $(rack-sdk-mac-x64):
  121. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip"
  122. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip
  123. mv Rack-SDK Rack-SDK-mac-x64
  124. rm Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip
  125. RACK_DIR_MAC_X64 := $(PWD)/$(rack-sdk-mac-x64)
  126. rack-sdk-mac-arm64 := Rack-SDK-mac-arm64
  127. rack-sdk-mac-arm64: $(rack-sdk-mac-arm64)
  128. $(rack-sdk-mac-arm64):
  129. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip"
  130. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip
  131. mv Rack-SDK Rack-SDK-mac-arm64
  132. rm Rack-SDK-$(RACK_SDK_VERSION)-mac-x64+arm64.zip
  133. RACK_DIR_MAC_ARM64 := $(PWD)/$(rack-sdk-mac-arm64)
  134. rack-sdk-win-x64 := Rack-SDK-win-x64
  135. rack-sdk-win-x64: $(rack-sdk-win-x64)
  136. $(rack-sdk-win-x64):
  137. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip"
  138. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip
  139. mv Rack-SDK Rack-SDK-win-x64
  140. rm Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip
  141. RACK_DIR_WIN_X64 := $(PWD)/$(rack-sdk-win-x64)
  142. rack-sdk-lin-x64 := Rack-SDK-lin-x64
  143. rack-sdk-lin-x64: $(rack-sdk-lin-x64)
  144. $(rack-sdk-lin-x64):
  145. $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip"
  146. $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip
  147. mv Rack-SDK Rack-SDK-lin-x64
  148. rm Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip
  149. RACK_DIR_LIN_X64 := $(PWD)/$(rack-sdk-lin-x64)
  150. rack-sdk-clean:
  151. rm -rf $(rack-sdk-mac-x64) $(rack-sdk-mac-arm64) $(rack-sdk-win-x64) $(rack-sdk-lin-x64)
  152. # Plugin build
  153. PLUGIN_BUILD_DIR := plugin-build
  154. PLUGIN_DIR ?=
  155. plugin-build:
  156. $(MAKE) plugin-build-mac-x64
  157. $(MAKE) plugin-build-mac-arm64
  158. $(MAKE) plugin-build-win-x64
  159. $(MAKE) plugin-build-lin-x64
  160. plugin-build-mac-x64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  161. plugin-build-mac-x64: export CC := x86_64-apple-darwin20.2-clang
  162. plugin-build-mac-x64: export CXX := x86_64-apple-darwin20.2-clang++-libc++
  163. plugin-build-mac-x64: export STRIP := x86_64-apple-darwin20.2-strip
  164. plugin-build-mac-x64: export INSTALL_NAME_TOOL := x86_64-apple-darwin20.2-install_name_tool
  165. plugin-build-mac-x64: export OTOOL := x86_64-apple-darwin20.2-otool
  166. plugin-build-mac-x64: export CODESIGN := rcodesign sign
  167. plugin-build-mac-arm64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH)
  168. plugin-build-mac-arm64: export CC := arm64-apple-darwin20.2-clang
  169. plugin-build-mac-arm64: export CXX := arm64-apple-darwin20.2-clang++-libc++
  170. plugin-build-mac-arm64: export STRIP := arm64-apple-darwin20.2-strip
  171. plugin-build-mac-arm64: export INSTALL_NAME_TOOL := arm64-apple-darwin20.2-install_name_tool
  172. plugin-build-mac-arm64: export OTOOL := arm64-apple-darwin20.2-otool
  173. plugin-build-mac-arm64: export CODESIGN := rcodesign sign
  174. plugin-build-win-x64: export PATH := $(LOCAL_DIR)/x86_64-w64-mingw32/bin:$(PATH)
  175. plugin-build-win-x64: export CC := x86_64-w64-mingw32-gcc
  176. plugin-build-win-x64: export CXX := x86_64-w64-mingw32-g++
  177. plugin-build-win-x64: export STRIP := x86_64-w64-mingw32-strip
  178. plugin-build-win-x64: export OBJCOPY := x86_64-w64-mingw32-objcopy
  179. plugin-build-lin-x64: export PATH:=$(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu/bin:$(PATH)
  180. plugin-build-lin-x64: export CC := x86_64-ubuntu16.04-linux-gnu-gcc
  181. plugin-build-lin-x64: export CXX := x86_64-ubuntu16.04-linux-gnu-g++
  182. plugin-build-lin-x64: export STRIP := x86_64-ubuntu16.04-linux-gnu-strip
  183. plugin-build-lin-x64: export OBJCOPY := x86_64-ubuntu16.04-linux-gnu-objcopy
  184. plugin-build-mac-x64: export RACK_DIR := $(RACK_DIR_MAC_X64)
  185. plugin-build-mac-arm64: export RACK_DIR := $(RACK_DIR_MAC_ARM64)
  186. plugin-build-win-x64: export RACK_DIR := $(RACK_DIR_WIN_X64)
  187. plugin-build-lin-x64: export RACK_DIR := $(RACK_DIR_LIN_X64)
  188. plugin-build-mac-x64 plugin-build-mac-arm64 plugin-build-win-x64 plugin-build-lin-x64:
  189. cd $(PLUGIN_DIR) && $(MAKE) clean
  190. cd $(PLUGIN_DIR) && $(MAKE) cleandep
  191. cd $(PLUGIN_DIR) && $(MAKE) dep
  192. cd $(PLUGIN_DIR) && $(MAKE) dist
  193. mkdir -p $(PLUGIN_BUILD_DIR)
  194. cp $(PLUGIN_DIR)/dist/*.vcvplugin $(PLUGIN_BUILD_DIR)/
  195. cd $(PLUGIN_DIR) && $(MAKE) clean
  196. plugin-build-clean:
  197. rm -rf $(PLUGIN_BUILD_DIR)
  198. # Static Analysis
  199. static-analysis-cppcheck: export PATH := $(LOCAL_DIR)/cppcheck/bin:$(PATH)
  200. static-analysis-cppcheck: cppcheck
  201. cd $(PLUGIN_DIR) && cppcheck src/ -isrc/dep --std=c++11 -j $(shell nproc) --error-exitcode=1
  202. plugin-analyze: static-analysis-cppcheck
  203. # Docker helpers
  204. dep-ubuntu:
  205. apt-get update
  206. apt-get install -y --no-install-recommends \
  207. ca-certificates \
  208. git \
  209. build-essential \
  210. autoconf \
  211. automake \
  212. bison \
  213. flex \
  214. gawk \
  215. libtool-bin \
  216. libncurses5-dev \
  217. unzip \
  218. zip \
  219. jq \
  220. libgl-dev \
  221. libglu-dev \
  222. git \
  223. wget \
  224. curl \
  225. cmake \
  226. nasm \
  227. xz-utils \
  228. file \
  229. python3 \
  230. libxml2-dev \
  231. libssl-dev \
  232. texinfo \
  233. help2man \
  234. libz-dev \
  235. rsync \
  236. xxd \
  237. perl \
  238. coreutils \
  239. zstd \
  240. markdown \
  241. libarchive-tools \
  242. gettext
  243. dep-arch-linux:
  244. pacman -Suyy --noconfirm && pacman -S --noconfirm --needed \
  245. gcc \
  246. git \
  247. cmake \
  248. patch \
  249. python3 \
  250. automake \
  251. help2man \
  252. texinfo \
  253. libtool \
  254. jq \
  255. rsync \
  256. autoconf \
  257. flex \
  258. bison \
  259. which \
  260. unzip \
  261. wget \
  262. glu \
  263. libx11 \
  264. mesa
  265. docker-build: rack-sdk-all
  266. docker build --build-arg JOBS=$(JOBS) --no-cache --tag rack-plugin-toolchain:$(DOCKER_IMAGE_VERSION) . --progress=plain 2>&1 | tee docker-build.log
  267. DOCKER_RUN := docker run --rm --interactive --tty \
  268. --volume=$(PLUGIN_DIR):/home/build/plugin-src \
  269. --volume=$(PWD)/$(PLUGIN_BUILD_DIR):/home/build/rack-plugin-toolchain/$(PLUGIN_BUILD_DIR) \
  270. --volume=$(PWD)/Rack-SDK-mac-x64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-x64 \
  271. --volume=$(PWD)/Rack-SDK-mac-arm64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64 \
  272. --volume=$(PWD)/Rack-SDK-win-x64:/home/build/rack-plugin-toolchain/Rack-SDK-win-x64 \
  273. --volume=$(PWD)/Rack-SDK-lin-x64:/home/build/rack-plugin-toolchain/Rack-SDK-lin-x64 \
  274. --env PLUGIN_DIR=/home/build/plugin-src \
  275. rack-plugin-toolchain:$(DOCKER_IMAGE_VERSION) \
  276. /bin/bash
  277. docker-run:
  278. $(DOCKER_RUN)
  279. docker-plugin-build:
  280. mkdir -p $(PLUGIN_BUILD_DIR)
  281. $(DOCKER_RUN) -c "$(MAKE) plugin-build $(MFLAGS)"
  282. docker-plugin-build-mac-x64:
  283. mkdir -p $(PLUGIN_BUILD_DIR)
  284. $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-x64 $(MFLAGS)"
  285. docker-plugin-build-mac-arm64:
  286. mkdir -p $(PLUGIN_BUILD_DIR)
  287. $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-arm64 $(MFLAGS)"
  288. docker-plugin-build-win-x64:
  289. mkdir -p $(PLUGIN_BUILD_DIR)
  290. $(DOCKER_RUN) -c "$(MAKE) plugin-build-win-x64 $(MFLAGS)"
  291. docker-plugin-build-lin-x64:
  292. mkdir -p $(PLUGIN_BUILD_DIR)
  293. $(DOCKER_RUN) -c "$(MAKE) plugin-build-lin-x64 $(MFLAGS)"
  294. docker-plugin-analyze:
  295. $(DOCKER_RUN) -c "$(MAKE) plugin-analyze $(MFLAGS)"
  296. .NOTPARALLEL:
  297. .PHONY: all plugin-build plugin-analyze