JUCE_REPO := https://github.com/juce-framework/JUCE.git JUCE_DIR := lib/JUCE JUCE_TAG := 8.0.9 BUILD_DIR := build TEST_BUILD_DIR := build-tests BUILD_TYPE := Release CMAKE_ARGS := -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) UNAME_S := $(shell uname -s) # Platform-aware CPU count ifeq ($(UNAME_S),Darwin) JOBS := $(shell sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4) else JOBS := $(shell nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 4) endif ARTEFACTS := $(BUILD_DIR)/Monoslicer_artefacts/$(BUILD_TYPE) VST3 := $(ARTEFACTS)/VST3/Monoslicer.vst3 # AU only exists on macOS; Standalone is a .app on macOS, a plain binary elsewhere ifeq ($(UNAME_S),Darwin) AU := $(ARTEFACTS)/AU/Monoslicer.component AU_DIR := ~/Library/Audio/Plug-Ins/Components VST3_DIR := ~/Library/Audio/Plug-Ins/VST3 FORMATS := AU and VST3 else AU := VST3_DIR := ~/.vst3 FORMATS := VST3 endif C_RESET := \033[0m C_BOLD := \033[1m C_DIM := \033[93m C_CYAN := \033[36m C_GREEN := \033[32m C_YELLOW := \033[33m STEP = @printf '$(C_BOLD)$(C_CYAN)▸$(C_RESET) $(C_BOLD)$(1)$(C_RESET)\n' INFO = @printf '$(C_DIM) $(1)$(C_RESET)\n' COLORIZE = sed -E "$$(printf ' \ s/([0-9]+)%%/\033[92m\\1%%\033[0m/g; \ s/(Building [A-Z]+ object [^ ]+)/\033[34m\\1\033[0m/g; \ s/(Linking [A-Z]+ [^ ]+)/\033[35m\\1\033[0m/g; \ s/(Configuring done)/\033[92m\\1\033[0m/g; \ s/(Generating done)/\033[92m\\1\033[0m/g; \ s/(Build files have been written to: .+)/\033[92m\\1\033[0m/g; \ s/(-- [A-Z].+)/\033[96m\\1\033[0m/g; \ s/(-- .+ - (done|yes|no))$$/\033[92m\\1\033[0m/g; \ s/(.*error:.*)$$/\033[1m\\1\033[0m/i \ ')" .PHONY: all clean fetch configure build install test all: build $(JUCE_DIR)/CMakeLists.txt: $(call STEP,Fetching JUCE $(JUCE_TAG)) $(call INFO,cloning $(C_CYAN)juce-framework/JUCE$(C_RESET)$(C_DIM)@$(JUCE_TAG)$(C_RESET)) git clone --depth 1 --branch $(JUCE_TAG) $(JUCE_REPO) $(JUCE_DIR) | $(COLORIZE) fetch: $(JUCE_DIR)/CMakeLists.txt configure: fetch $(call STEP,Configuring CMake) $(call INFO,$(C_DIM)cmake -B $(BUILD_DIR) -S . $(CMAKE_ARGS)$(C_RESET)) cmake -B $(BUILD_DIR) -S . $(CMAKE_ARGS) | $(COLORIZE) build: configure $(call STEP,Building Monoslicer) $(call INFO,$(C_DIM)$(C_YELLOW)$(JOBS)$(C_RESET)$(C_DIM) parallel jobs$(C_RESET)) cmake --build $(BUILD_DIR) -j$(JOBS) | $(COLORIZE) install: build $(call STEP,Installing plugins) ifeq ($(UNAME_S),Darwin) $(call INFO,AU → $(AU_DIR)) mkdir -p $(AU_DIR) cp -R $(AU) $(AU_DIR)/ $(call INFO,VST3 → $(VST3_DIR)) mkdir -p $(VST3_DIR) cp -R $(VST3) $(VST3_DIR)/ $(call STEP,Rescanning Audio Units) killall -9 AudioComponentRegistrar 2>/dev/null; true else $(call INFO,VST3 → $(VST3_DIR)) mkdir -p $(VST3_DIR) cp -R $(VST3) $(VST3_DIR)/ endif @printf '\n $(C_GREEN)$(C_BOLD)✓ Done.$(C_RESET) $(C_GREEN)Monoslicer$(C_RESET)$(C_DIM) installed as $(FORMATS)$(C_RESET)\n\n' clean: $(call STEP,Cleaning) rm -rf $(BUILD_DIR) $(TEST_BUILD_DIR) $(call INFO,$(C_DIM)removed $(BUILD_DIR)/ and $(TEST_BUILD_DIR)/$(C_RESET)) @printf ' $(C_GREEN)$(C_BOLD)✓ Clean.$(C_RESET)\n' # Tests live in their own build dir so `make` stays fast. test: $(call STEP,Building and running tests) $(call INFO,$(C_DIM)separate build dir → $(TEST_BUILD_DIR)$(C_RESET)) cmake -B $(TEST_BUILD_DIR) -S . $(CMAKE_ARGS) -DMONOSLICER_BUILD_TESTS=ON > /dev/null cmake --build $(TEST_BUILD_DIR) -j$(JOBS) --target MonoslicerDnDTest > /dev/null $(TEST_BUILD_DIR)/MonoslicerDnDTest_artefacts/$(BUILD_TYPE)/MonoslicerDnDTest