DiffSeeker/Makefile

147 lines
3.9 KiB
Makefile

# DiffSeeker Makefile
# Usage: make help
SHELL := /bin/sh
PYTHON ?= python3
PIP ?= pip3
VENV_DIR ?= .venv
VENV_PY := $(VENV_DIR)/bin/python
VENV_PIP := $(VENV_DIR)/bin/pip
# Default DB/CSV outputs for convenience targets
OUTCSV ?= cfa-output.csv
DB ?= diffseeker.db
WALKDIR ?= .
VOLUME ?= UNKNOWN
HASH ?= sha256
RESERVE ?= 0
# Excludes can be overridden: make scan EXCLUDES=".git .svn"
EXCLUDES ?= .git .svn
# Docker image tags (local)
PY_IMG ?= diffseeker-python:dev
RS_IMG ?= diffseeker-rust:dev
.DEFAULT_GOAL := help
.PHONY: help
help:
@printf "%s\n" "DiffSeeker targets:"
@printf "%s\n" ""
@printf "%s\n" "Python:"
@printf "%s\n" " make venv Create venv and install Python package (editable)"
@printf "%s\n" " make py-install Install Python package into existing venv"
@printf "%s\n" " make py-test Run Python tests"
@printf "%s\n" " make py-clean Remove Python build artifacts"
@printf "%s\n" " make scan Run mpchunkcfa scan -> CSV"
@printf "%s\n" " make scan-db Run mpchunkcfa scan -> CSV + SQLite"
@printf "%s\n" ""
@printf "%s\n" "Rust:"
@printf "%s\n" " make rs-build Build Rust CLI (release)"
@printf "%s\n" " make rs-test Run Rust tests"
@printf "%s\n" " make rs-clean Clean Rust build artifacts"
@printf "%s\n" ""
@printf "%s\n" "Docker:"
@printf "%s\n" " make docker-python Build Python Docker image"
@printf "%s\n" " make docker-rust Build Rust Docker image"
@printf "%s\n" " make docker-scan Run Python scan in container (bind-mount current dir)"
@printf "%s\n" ""
@printf "%s\n" "Variables (override as needed):"
@printf "%s\n" " WALKDIR=., VOLUME=NAME, OUTCSV=FILE.csv, DB=FILE.db, HASH=sha256, RESERVE=0"
@printf "%s\n" " EXCLUDES='.git .svn'"
# -------------------------
# Python environment
# -------------------------
.PHONY: venv
venv: $(VENV_PY) py-install
$(VENV_PY):
$(PYTHON) -m venv $(VENV_DIR)
$(VENV_PIP) install --upgrade pip setuptools wheel
.PHONY: py-install
py-install: $(VENV_PY)
$(VENV_PIP) install -e .
.PHONY: py-test
py-test: $(VENV_PY)
$(VENV_PIP) install -e .
$(VENV_PY) -m pytest -q python/tests
.PHONY: py-clean
py-clean:
rm -rf build dist *.egg-info .pytest_cache
find python -name "__pycache__" -type d -prune -exec rm -rf {} \; || true
.PHONY: venv-clean
venv-clean:
rm -rf $(VENV_DIR)
# -------------------------
# Convenience scan targets
# -------------------------
# Build --exclude args from space-separated EXCLUDES
EXCLUDE_ARGS = $(foreach e,$(EXCLUDES),--exclude $(e))
.PHONY: scan
scan: $(VENV_PY)
$(VENV_PIP) install -e .
$(VENV_DIR)/bin/mpchunkcfa --walk "$(WALKDIR)" -V "$(VOLUME)" -c "$(OUTCSV)" --hash "$(HASH)" $(EXCLUDE_ARGS) --reserve-cores "$(RESERVE)"
.PHONY: scan-db
scan-db: $(VENV_PY)
$(VENV_PIP) install -e .
$(VENV_DIR)/bin/mpchunkcfa --walk "$(WALKDIR)" -V "$(VOLUME)" -c "$(OUTCSV)" --hash "$(HASH)" $(EXCLUDE_ARGS) --db "$(DB)" --reserve-cores "$(RESERVE)"
# -------------------------
# Rust
# -------------------------
.PHONY: rs-build
rs-build:
cargo build --release -p diffseeker_cli
.PHONY: rs-test
rs-test:
cargo test
.PHONY: rs-clean
rs-clean:
cargo clean
# -------------------------
# Docker
# -------------------------
.PHONY: docker-python
docker-python:
docker build -t $(PY_IMG) -f docker/Dockerfile.python .
.PHONY: docker-rust
docker-rust:
docker build -t $(RS_IMG) -f docker/Dockerfile.rust .
# Run the Python mpchunkcfa in a container, bind-mount current directory to /work
# Example:
# make docker-scan WALKDIR=/work VOLUME=VOL_A OUTCSV=/work/vol_a.csv
.PHONY: docker-scan
docker-scan: docker-python
docker run --rm -it \
-v "$(PWD)":/work \
-w /work \
$(PY_IMG) \
--walk "$(WALKDIR)" -V "$(VOLUME)" -c "$(OUTCSV)" --hash "$(HASH)" $(EXCLUDE_ARGS) --reserve-cores "$(RESERVE)"
# -------------------------
# Meta
# -------------------------
.PHONY: all
all: py-test rs-test