# Makefile for hdwalletpy workflow # - Build reusable Docker image (Python 3.12) # - Vendor multi-platform wheels for offline air-gapped use # - Compile wheels in container (wheelhouse) # - Create host venv and install from wheelhouse or vendor/ # - Optionally run inside a warm container # ---------- Config ---------- IMAGE := hdwallet-build:3.12 CONTAINER := hdwallet-dev WORKDIR := /app VENV_HOST := .venv VENV_CONTAINER := /opt/venv WHEELHOUSE := wheelhouse # Vendor directories for air-gapped deployment VENDOR_MACOS := vendor/macos-arm64 VENDOR_LINUX := vendor/linux-x86_64 # ---------- Help ---------- .PHONY: help help: @echo "Vendoring (for offline/air-gapped use):" @echo " make vendor-macos - Build macOS ARM64 wheels (native)" @echo " make vendor-linux - Build Linux x86_64 wheels (Docker)" @echo " make vendor-all - Build wheels for both platforms" @echo " make verify-vendor - Test offline installation from vendor/" @echo "" @echo "Development workflow:" @echo " make build-image - Build Docker image (Python 3.12)" @echo " make wheels - Build wheels into ./$(WHEELHOUSE)" @echo " make install - Create venv and install dependencies" @echo " make test - Run test suite" @echo " make up - Start warm dev container" @echo " make shell - Open shell in warm container" @echo " make down - Stop and remove dev container" @echo "" @echo "Cleanup:" @echo " make clean - Remove venv, wheelhouse, vendor/" @echo " make clean-vendor - Remove vendor/ only" # ---------- Build reusable image ---------- .PHONY: build-image build-image: docker build -t $(IMAGE) . # ---------- Vendoring for Air-Gapped Use ---------- .PHONY: vendor-macos vendor-macos: requirements.txt @echo "Building macOS ARM64 wheels (native)..." @if [ ! -f ".venv312/bin/pip" ]; then \ echo "ERROR: .venv312 not found. Create it first:"; \ echo " python3.12 -m venv .venv312 && source .venv312/bin/activate"; \ exit 1; \ fi mkdir -p $(VENDOR_MACOS) .venv312/bin/pip download --dest $(VENDOR_MACOS) -r requirements.txt cd $(VENDOR_MACOS) && shasum -a 256 *.whl > SHA256SUMS @echo "✓ macOS ARM64 wheels: $(VENDOR_MACOS)/" .PHONY: vendor-linux vendor-linux: requirements.txt build-image @echo "Building Linux x86_64 wheels (Docker)..." mkdir -p $(VENDOR_LINUX) docker run --rm \ -v "$$PWD":$(WORKDIR) \ -w $(WORKDIR) \ $(IMAGE) \ bash -c " \ pip install --upgrade pip && \ pip download --dest $(VENDOR_LINUX) -r requirements.txt && \ pip wheel --wheel-dir $(VENDOR_LINUX) --no-deps $(VENDOR_LINUX)/*.tar.gz 2>/dev/null || true && \ rm -f $(VENDOR_LINUX)/*.tar.gz && \ cd $(VENDOR_LINUX) && sha256sum *.whl > SHA256SUMS \ " @echo "✓ Linux x86_64 wheels: $(VENDOR_LINUX)/" .PHONY: vendor-all vendor-all: vendor-macos vendor-linux @echo "" @echo "✓ All platforms vendored:" @echo " macOS ARM64: $(VENDOR_MACOS)/ ($$(ls $(VENDOR_MACOS)/*.whl 2>/dev/null | wc -l | xargs) wheels)" @echo " Linux x86_64: $(VENDOR_LINUX)/ ($$(ls $(VENDOR_LINUX)/*.whl 2>/dev/null | wc -l | xargs) wheels)" @echo "" @echo "Commit with: git add vendor/ && git commit -m 'vendor: update wheels'" .PHONY: verify-vendor verify-vendor: @echo "Testing offline installation from vendor/..." @bash -c ' \ if [[ "$$OSTYPE" == "darwin"* ]]; then \ PLATFORM="macos-arm64"; \ else \ PLATFORM="linux-x86_64"; \ fi; \ echo "Platform: $$PLATFORM"; \ python3.12 -m venv .venv-verify && \ source .venv-verify/bin/activate && \ pip install --no-index --find-links=vendor/$$PLATFORM -r requirements.txt && \ pytest -v tests/test_vectors.py && \ python src/pyhdwallet.py test && \ echo "" && \ echo "✅ Vendor installation verified!" && \ deactivate && \ rm -rf .venv-verify \ ' # ---------- Development Workflow ---------- .PHONY: wheels wheels: requirements.txt build-image docker run --rm \ -v "$$PWD":$(WORKDIR) \ -w $(WORKDIR) \ $(IMAGE) \ bash -c " \ pip install --upgrade pip setuptools wheel && \ mkdir -p $(WHEELHOUSE) && \ pip wheel -r requirements.txt -w $(WHEELHOUSE) \ " .PHONY: install install: requirements.txt @if [ ! -d "$(VENV_HOST)" ]; then \ echo "Creating venv: $(VENV_HOST)"; \ python3.12 -m venv $(VENV_HOST); \ fi . $(VENV_HOST)/bin/activate && \ pip install --upgrade pip && \ pip install -r requirements.txt && \ echo "✓ Virtual environment ready: $(VENV_HOST)" .PHONY: test test: @if [ ! -d "$(VENV_HOST)" ]; then \ echo "ERROR: Run 'make install' first"; \ exit 1; \ fi . $(VENV_HOST)/bin/activate && \ pytest -v tests/test_vectors.py && \ python src/pyhdwallet.py test # ---------- Warm container lifecycle ---------- .PHONY: up up: build-image docker run -dit \ -v "$$PWD":$(WORKDIR) \ -w $(WORKDIR) \ --name $(CONTAINER) \ $(IMAGE) \ bash .PHONY: shell shell: docker exec -it $(CONTAINER) bash .PHONY: down down: - docker rm -f $(CONTAINER) # ---------- Cleanup ---------- .PHONY: clean-vendor clean-vendor: rm -rf vendor/ .PHONY: clean clean: down rm -rf $(VENV_HOST) $(WHEELHOUSE) vendor/ .venv-verify .venv-offline-test find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true find . -type d -name "*.egg-info" -exec rm -rf {} + 2>/dev/null || true