170 lines
5.3 KiB
Makefile
170 lines
5.3 KiB
Makefile
# 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
|