# Installation path for executables LOCAL_DIR := $(PWD)/local # Local programs should have higher path priority than system-installed programs export PATH := $(LOCAL_DIR)/bin:$(PATH) # Allow specifying the number of jobs for toolchain build for systems that need it. # Due to different build systems used in the toolchain build, just `make -j` won't work here. # Note: Plugin build uses `$(MAKE)` to inherit `-j` argument from command line. ifdef JOBS export JOBS := $(JOBS) # Define number of jobs for crosstool-ng (uses different argument format) export JOBS_CT_NG := .$(JOBS) else # If `JOBS` is not specified, default to max number of jobs. export JOBS := export JOBS_CT_NG := endif WGET := wget -c UNTAR := tar -x -f UNZIP := unzip SHA256 := sha256check() { echo "$$2 $$1" | sha256sum -c; }; sha256check RACK_SDK_VERSION := 2.6.4 DOCKER_IMAGE_VERSION := 18 MACOS_SDK_VERSION := 12.3 DARWIN_VERSION := 21.4 all: toolchain-all rack-sdk-all # Toolchain build toolchain-all: toolchain-lin toolchain-win toolchain-mac cppcheck crosstool-ng := $(LOCAL_DIR)/bin/ct-ng $(crosstool-ng): git clone "https://github.com/crosstool-ng/crosstool-ng.git" crosstool-ng cd crosstool-ng && git checkout b49e4c689c4dc8e9c8da5b8f56d7ddf59e485d3b cd crosstool-ng && ./bootstrap cd crosstool-ng && ./configure --prefix="$(LOCAL_DIR)" cd crosstool-ng && make -j $(JOBS) cd crosstool-ng && make install rm -rf crosstool-ng toolchain-lin := $(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu toolchain-lin: $(toolchain-lin) $(toolchain-lin): $(crosstool-ng) $(WGET) "https://ftp.gnu.org/gnu/texinfo/texinfo-7.2.tar.gz" $(SHA256) texinfo-7.2.tar.gz e86de7dfef6b352aa1bf647de3a6213d1567c70129eccbf8977706d9c91919c8 $(UNTAR) texinfo-7.2.tar.gz rm texinfo-7.2.tar.gz cd texinfo-7.2 && ./configure --prefix="$(LOCAL_DIR)" cd texinfo-7.2 && make -j $(JOBS) cd texinfo-7.2 && make install -j $(JOBS) rm -rf texinfo-7.2 ct-ng x86_64-ubuntu16.04-linux-gnu CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG) rm -rf .build .config build.log # HACK Copy GL and related include dirs to toolchain sysroot chmod +w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include cp -r /usr/include/GL $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/ cp -r /usr/include/KHR $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/ cp -r /usr/include/X11 $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include/ chmod -w $(toolchain-lin)/x86_64-ubuntu16.04-linux-gnu/sysroot/usr/include toolchain-win := $(LOCAL_DIR)/x86_64-w64-mingw32 toolchain-win: $(toolchain-win) $(toolchain-win): $(crosstool-ng) ct-ng x86_64-w64-mingw32 # I don't know how to set crosstool-ng variables from the command line sed -i 's/CT_MINGW_W64_VERSION=.*/CT_MINGW_W64_VERSION="v10.0.0"/' .config CT_PREFIX="$(LOCAL_DIR)" ct-ng build$(JOBS_CT_NG) rm -rf .build .config build.log OSXCROSS_CLANG_VERSION := 20.1.1 OSXCROSS_BINUTILS_VERSION := 2.37 toolchain-mac := $(LOCAL_DIR)/osxcross toolchain-mac: $(toolchain-mac) $(toolchain-mac): export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH) $(toolchain-mac): # Obtain osxcross sources. git clone "https://github.com/tpoechtrager/osxcross.git" osxcross cd osxcross && git checkout 4372d5560307c649af5dbbfa20b39199c9ef48be # Build a custom clang compiler using the system's gcc compiler. # This enables us to have custom compiler environment needed for cross-compilation. 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 ## Build osxcross. cp MacOSX$(MACOS_SDK_VERSION).sdk.tar.* osxcross/tarballs/ cd osxcross && PATH="$(LOCAL_DIR)/bin:$(PATH)" UNATTENDED=1 TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build.sh ## Build compiler-rt. cd osxcross && ENABLE_COMPILER_RT_INSTALL=1 JOBS=$(JOBS) ./build_compiler_rt.sh ## Build MacOS binutils and build LLVM gold. cd osxcross && BINUTILS_VERSION=$(OSXCROSS_BINUTILS_VERSION) TARGET_DIR="$(LOCAL_DIR)/osxcross" JOBS=$(JOBS) ./build_binutils.sh 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) # Fix library paths (for Arch Linux and Ubuntu arm64). export PLATFORM_ID=$$($(LOCAL_DIR)/bin/clang -dumpmachine) ; \ echo "Platform ID: $$PLATFORM_ID" ; \ if [ ! -z "$$PLATFORM_ID" ] && [ -e "$(LOCAL_DIR)/lib/$$PLATFORM_ID/" ]; then \ echo "Copying lib files..." ; \ cp -Pv $(LOCAL_DIR)/lib/$$PLATFORM_ID/* $(LOCAL_DIR)/lib/ ; \ echo "done" ; \ fi ## Download rcodesign binary to ad-hoc sign arm64 plugin builds in a cross-compilation environment. $(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" $(UNTAR) apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz rm apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz cp ./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign $(LOCAL_DIR)/osxcross/bin/ rm -r apple-codesign-0.22.0-x86_64-unknown-linux-musl rm -rf osxcross CPPCHECK_VERSION := 2.16.0 cppcheck := $(LOCAL_DIR)/cppcheck/bin/cppcheck cppcheck: $(cppcheck) $(cppcheck): $(WGET) "https://github.com/danmar/cppcheck/archive/refs/tags/$(CPPCHECK_VERSION).tar.gz" $(UNTAR) $(CPPCHECK_VERSION).tar.gz cd cppcheck-$(CPPCHECK_VERSION) && mkdir build cd cppcheck-$(CPPCHECK_VERSION)/build \ && cmake .. \ -DUSE_MATCHCOMPILER=On \ -DUSE_THREADS=On \ -DCMAKE_INSTALL_PREFIX=$(LOCAL_DIR)/cppcheck \ && cmake --build . -j \ && cmake --install . rm $(CPPCHECK_VERSION).tar.gz rm -rf cppcheck-$(CPPCHECK_VERSION) toolchain-clean: rm -rf local osxcross .build build.log .config # Rack SDK rack-sdk-all: rack-sdk-mac-x64 rack-sdk-mac-arm64 rack-sdk-win-x64 rack-sdk-lin-x64 rack-sdk-mac-x64 := Rack-SDK-mac-x64 rack-sdk-mac-x64: $(rack-sdk-mac-x64) $(rack-sdk-mac-x64): $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip" $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip mv Rack-SDK Rack-SDK-mac-x64 rm Rack-SDK-$(RACK_SDK_VERSION)-mac-x64.zip RACK_DIR_MAC_X64 := $(PWD)/$(rack-sdk-mac-x64) rack-sdk-mac-arm64 := Rack-SDK-mac-arm64 rack-sdk-mac-arm64: $(rack-sdk-mac-arm64) $(rack-sdk-mac-arm64): $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip" $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip mv Rack-SDK Rack-SDK-mac-arm64 rm Rack-SDK-$(RACK_SDK_VERSION)-mac-arm64.zip RACK_DIR_MAC_ARM64 := $(PWD)/$(rack-sdk-mac-arm64) rack-sdk-win-x64 := Rack-SDK-win-x64 rack-sdk-win-x64: $(rack-sdk-win-x64) $(rack-sdk-win-x64): $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip" $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip mv Rack-SDK Rack-SDK-win-x64 rm Rack-SDK-$(RACK_SDK_VERSION)-win-x64.zip RACK_DIR_WIN_X64 := $(PWD)/$(rack-sdk-win-x64) rack-sdk-lin-x64 := Rack-SDK-lin-x64 rack-sdk-lin-x64: $(rack-sdk-lin-x64) $(rack-sdk-lin-x64): $(WGET) "https://vcvrack.com/downloads/Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip" $(UNZIP) Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip mv Rack-SDK Rack-SDK-lin-x64 rm Rack-SDK-$(RACK_SDK_VERSION)-lin-x64.zip RACK_DIR_LIN_X64 := $(PWD)/$(rack-sdk-lin-x64) rack-sdk-clean: rm -rf $(rack-sdk-mac-x64) $(rack-sdk-mac-arm64) $(rack-sdk-win-x64) $(rack-sdk-lin-x64) # Plugin build PLUGIN_BUILD_DIR := plugin-build PLUGIN_DIR ?= plugin-build: $(MAKE) plugin-build-mac-x64 $(MAKE) plugin-build-mac-arm64 $(MAKE) plugin-build-win-x64 $(MAKE) plugin-build-lin-x64 plugin-build-mac: $(MAKE) plugin-build-mac-x64 $(MAKE) plugin-build-mac-arm64 plugin-build-win: $(MAKE) plugin-build-win-x64 plugin-build-lin: $(MAKE) plugin-build-lin-x64 plugin-build-mac-x64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH) plugin-build-mac-x64: export CC := x86_64-apple-darwin$(DARWIN_VERSION)-clang plugin-build-mac-x64: export CXX := x86_64-apple-darwin$(DARWIN_VERSION)-clang++-libc++ plugin-build-mac-x64: export STRIP := x86_64-apple-darwin$(DARWIN_VERSION)-strip plugin-build-mac-x64: export INSTALL_NAME_TOOL := x86_64-apple-darwin$(DARWIN_VERSION)-install_name_tool plugin-build-mac-x64: export OTOOL := x86_64-apple-darwin$(DARWIN_VERSION)-otool plugin-build-mac-x64: export CODESIGN := rcodesign sign plugin-build-mac-arm64: export PATH := $(LOCAL_DIR)/osxcross/bin:$(PATH) plugin-build-mac-arm64: export CC := arm64-apple-darwin$(DARWIN_VERSION)-clang plugin-build-mac-arm64: export CXX := arm64-apple-darwin$(DARWIN_VERSION)-clang++-libc++ plugin-build-mac-arm64: export STRIP := arm64-apple-darwin$(DARWIN_VERSION)-strip plugin-build-mac-arm64: export INSTALL_NAME_TOOL := arm64-apple-darwin$(DARWIN_VERSION)-install_name_tool plugin-build-mac-arm64: export OTOOL := arm64-apple-darwin$(DARWIN_VERSION)-otool plugin-build-mac-arm64: export CODESIGN := rcodesign sign plugin-build-win-x64: export PATH := $(LOCAL_DIR)/x86_64-w64-mingw32/bin:$(PATH) plugin-build-win-x64: export CC := x86_64-w64-mingw32-gcc plugin-build-win-x64: export CXX := x86_64-w64-mingw32-g++ plugin-build-win-x64: export STRIP := x86_64-w64-mingw32-strip plugin-build-win-x64: export OBJCOPY := x86_64-w64-mingw32-objcopy plugin-build-lin-x64: export PATH:=$(LOCAL_DIR)/x86_64-ubuntu16.04-linux-gnu/bin:$(PATH) plugin-build-lin-x64: export CC := x86_64-ubuntu16.04-linux-gnu-gcc plugin-build-lin-x64: export CXX := x86_64-ubuntu16.04-linux-gnu-g++ plugin-build-lin-x64: export STRIP := x86_64-ubuntu16.04-linux-gnu-strip plugin-build-lin-x64: export OBJCOPY := x86_64-ubuntu16.04-linux-gnu-objcopy plugin-build-mac-x64: export RACK_DIR := $(RACK_DIR_MAC_X64) plugin-build-mac-arm64: export RACK_DIR := $(RACK_DIR_MAC_ARM64) plugin-build-win-x64: export RACK_DIR := $(RACK_DIR_WIN_X64) plugin-build-lin-x64: export RACK_DIR := $(RACK_DIR_LIN_X64) plugin-build-mac-x64 plugin-build-mac-arm64 plugin-build-win-x64 plugin-build-lin-x64: cd $(PLUGIN_DIR) && $(MAKE) clean cd $(PLUGIN_DIR) && $(MAKE) cleandep cd $(PLUGIN_DIR) && $(MAKE) dep cd $(PLUGIN_DIR) && $(MAKE) dist mkdir -p $(PLUGIN_BUILD_DIR) cp $(PLUGIN_DIR)/dist/*.vcvplugin $(PLUGIN_BUILD_DIR)/ cd $(PLUGIN_DIR) && $(MAKE) clean plugin-build-clean: rm -rf $(PLUGIN_BUILD_DIR) # Static Analysis static-analysis-cppcheck: export PATH := $(LOCAL_DIR)/cppcheck/bin:$(PATH) static-analysis-cppcheck: cppcheck cd $(PLUGIN_DIR) && cppcheck src/ -isrc/dep --std=c++11 -j $(shell nproc) --error-exitcode=1 plugin-analyze: static-analysis-cppcheck # Docker helpers dep-ubuntu: sudo apt-get install --no-install-recommends \ ca-certificates \ git \ build-essential \ autoconf \ automake \ bison \ flex \ gawk \ libtool-bin \ libncurses5-dev \ unzip \ zip \ jq \ libgl-dev \ libglu-dev \ git \ wget \ curl \ cmake \ nasm \ xz-utils \ file \ python3 \ libxml2-dev \ libssl-dev \ texinfo \ help2man \ libz-dev \ rsync \ xxd \ perl \ coreutils \ zstd \ markdown \ libarchive-tools \ gettext \ libgmp-dev \ libmpfr-dev dep-arch-linux: sudo pacman -S --needed \ gcc \ git \ cmake \ patch \ python3 \ automake \ help2man \ texinfo \ libtool \ jq \ rsync \ autoconf \ flex \ bison \ which \ unzip \ wget \ glu \ libx11 \ mesa docker-build: rack-sdk-all 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 DOCKER_RUN := docker run --rm --interactive --tty \ --volume=$(PLUGIN_DIR):/home/build/plugin-src \ --volume=$(PWD)/$(PLUGIN_BUILD_DIR):/home/build/rack-plugin-toolchain/$(PLUGIN_BUILD_DIR) \ --volume=$(PWD)/Rack-SDK-mac-x64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-x64 \ --volume=$(PWD)/Rack-SDK-mac-arm64:/home/build/rack-plugin-toolchain/Rack-SDK-mac-arm64 \ --volume=$(PWD)/Rack-SDK-win-x64:/home/build/rack-plugin-toolchain/Rack-SDK-win-x64 \ --volume=$(PWD)/Rack-SDK-lin-x64:/home/build/rack-plugin-toolchain/Rack-SDK-lin-x64 \ --env PLUGIN_DIR=/home/build/plugin-src \ rack-plugin-toolchain:$(DOCKER_IMAGE_VERSION) \ /bin/bash docker-run: $(DOCKER_RUN) docker-plugin-build: mkdir -p $(PLUGIN_BUILD_DIR) $(DOCKER_RUN) -c "$(MAKE) plugin-build $(MFLAGS)" docker-plugin-build-mac-x64: mkdir -p $(PLUGIN_BUILD_DIR) $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-x64 $(MFLAGS)" docker-plugin-build-mac-arm64: mkdir -p $(PLUGIN_BUILD_DIR) $(DOCKER_RUN) -c "$(MAKE) plugin-build-mac-arm64 $(MFLAGS)" docker-plugin-build-win-x64: mkdir -p $(PLUGIN_BUILD_DIR) $(DOCKER_RUN) -c "$(MAKE) plugin-build-win-x64 $(MFLAGS)" docker-plugin-build-lin-x64: mkdir -p $(PLUGIN_BUILD_DIR) $(DOCKER_RUN) -c "$(MAKE) plugin-build-lin-x64 $(MFLAGS)" docker-plugin-analyze: $(DOCKER_RUN) -c "$(MAKE) plugin-analyze $(MFLAGS)" .NOTPARALLEL: .PHONY: all plugin-build plugin-analyze