.PHONY: build build-release release install clean test test-native test-local-fast test-local-ramdisk test-image test-container-image test-docker test-container ramdisk-up ramdisk-down test-unit test-integration check fmt lint all
RAMDISK_NAME ?= STAXRAM
RAMDISK_SIZE_MB ?= 2048
RAMDISK_MOUNT ?= /Volumes/$(RAMDISK_NAME)
MAC_LOCAL_TEST_THREADS ?= 8
LEVEL ?= minor
STAX_TEST_IMAGE ?= stax-test
CONTAINER ?= $(shell if [ -x /opt/homebrew/opt/container/bin/container ]; then printf '%s\n' /opt/homebrew/opt/container/bin/container; else printf '%s\n' container; fi)
CONTAINER_MEMORY ?= 8G
CONTAINER_CARGO_BUILD_JOBS ?= 4
CONTAINER_CARGO_PROFILE ?= test-container
all: check build test
build:
cargo build
build-release:
cargo build --release
release:
cargo release $(LEVEL) --execute --no-confirm
install:
CARGO_INCREMENTAL=0 cargo install --path . --locked --bins --debug
STAX_DISABLE_UPDATE_CHECK=1 "$${CARGO_HOME:-$$HOME/.cargo}/bin/stax" shell-setup --refresh
clean:
cargo clean
test:
@if [ "$$(uname)" = "Darwin" ] && command -v docker >/dev/null 2>&1; then \
$(MAKE) test-docker; \
else \
cargo nextest run; \
fi
test-native:
@if [ "$$(uname)" = "Darwin" ]; then \
$(MAKE) test-local-fast; \
else \
cargo nextest run; \
fi
test-local-fast:
mkdir -p .test-tmp
@threads="$${NEXTEST_TEST_THREADS:-}"; \
if [ -z "$$threads" ] && [ "$$(uname)" = "Darwin" ]; then \
threads="$(MAC_LOCAL_TEST_THREADS)"; \
fi; \
if [ -z "$$threads" ]; then \
threads="num-cpus"; \
fi; \
env -u GITHUB_TOKEN -u STAX_GITHUB_TOKEN -u GH_TOKEN STAX_DISABLE_UPDATE_CHECK=1 STAX_TEST_TMPDIR="$$(pwd)/.test-tmp" TMPDIR="$$(pwd)/.test-tmp" NEXTEST_TEST_THREADS="$$threads" cargo nextest run
ramdisk-up:
@if [ "$$(uname)" != "Darwin" ]; then \
echo "ramdisk-up is only supported on macOS"; \
exit 1; \
fi
@if [ ! -d "$(RAMDISK_MOUNT)" ]; then \
echo "Creating RAM disk $(RAMDISK_NAME) ($(RAMDISK_SIZE_MB)MB)"; \
disk=$$(hdiutil attach -nomount ram://$$(( $(RAMDISK_SIZE_MB) * 2048 )) | awk 'NR==1{print $$1}'); \
diskutil erasevolume HFS+ "$(RAMDISK_NAME)" "$$disk" >/dev/null; \
else \
echo "RAM disk already mounted at $(RAMDISK_MOUNT)"; \
fi
@mkdir -p "$(RAMDISK_MOUNT)/tmp"
ramdisk-down:
@if [ "$$(uname)" != "Darwin" ]; then \
echo "ramdisk-down is only supported on macOS"; \
exit 1; \
fi
@if [ -d "$(RAMDISK_MOUNT)" ]; then \
disk=$$(diskutil info "$(RAMDISK_MOUNT)" | awk -F': *' '/Device Node/{print $$2; exit}'); \
if [ -n "$$disk" ]; then \
echo "Detaching $(RAMDISK_MOUNT) ($$disk)"; \
hdiutil detach "$$disk" >/dev/null; \
fi; \
else \
echo "RAM disk not mounted: $(RAMDISK_MOUNT)"; \
fi
test-local-ramdisk: ramdisk-up
@threads="$${NEXTEST_TEST_THREADS:-}"; \
if [ -z "$$threads" ] && [ "$$(uname)" = "Darwin" ]; then \
threads="$(MAC_LOCAL_TEST_THREADS)"; \
fi; \
if [ -z "$$threads" ]; then \
threads="num-cpus"; \
fi; \
env -u GITHUB_TOKEN -u STAX_GITHUB_TOKEN -u GH_TOKEN STAX_DISABLE_UPDATE_CHECK=1 STAX_TEST_TMPDIR="$(RAMDISK_MOUNT)/tmp" TMPDIR="$(RAMDISK_MOUNT)/tmp" NEXTEST_TEST_THREADS="$$threads" cargo nextest run
test-image:
docker build -t $(STAX_TEST_IMAGE) -f Dockerfile .
test-container-image:
$(CONTAINER) build -t $(STAX_TEST_IMAGE) -f Dockerfile .
define CONTAINER_TEST_RUN
@threads="$${NEXTEST_TEST_THREADS:-$(MAC_LOCAL_TEST_THREADS)}"; \
$(1) run --rm -t \
-u "$$(id -u):$$(id -g)" \
$(2) \
-v "$$(pwd):/work" \
-w /work \
-e CARGO_HOME=/work/$(3)/cargo \
-e CARGO_INCREMENTAL=0 \
-e CARGO_BUILD_JOBS="$(CONTAINER_CARGO_BUILD_JOBS)" \
-e STAX_CONTAINER_CARGO_PROFILE="$(CONTAINER_CARGO_PROFILE)" \
-e NEXTEST_TEST_THREADS="$$threads" \
-e RUST_MIN_STACK=4194304 \
-v "$$(pwd)/$(3)/target:/work/target" \
$(STAX_TEST_IMAGE) \
bash /work/scripts/container-nextest.sh $(4)
endef
test-docker: test-image
mkdir -p .docker-cache/cargo .docker-cache/target
$(call CONTAINER_TEST_RUN,docker,,.docker-cache,)
test-container: test-container-image
mkdir -p .container-cache/cargo .container-cache/target
$(call CONTAINER_TEST_RUN,$(CONTAINER),-m "$(CONTAINER_MEMORY)",.container-cache,)
test-unit:
cargo nextest run --lib --bins
test-integration:
cargo nextest run --tests
check:
cargo check
cargo clippy -- -D warnings
fmt:
cargo fmt
lint:
cargo fmt -- --check
cargo clippy -- -D warnings
run:
cargo run -- $(ARGS)
demo: install
@echo "=== stax demo ==="
stax --help