# Makefile for Prole Database Deployment and Installer ifneq ($(wildcard bin/python3),) PYTHON ?= bin/python3 else PYTHON ?= python3 endif PYINSTALLER = $(PYTHON) -m PyInstaller DIST_DIR = dist BUILD_DIR = build PROLE_CONF ?= conf PROLE_MODE ?= k3d PIPELINE_DIR ?= deploy/opentofu/k3s DEPLOYMENT_GIT_DIR ?= prole/deployment GITEA_SCRIPT ?= prole/etc/gitea.sh KUBECONFIG_PATH ?= $(CURDIR)/prole-k3s.kubeconfig DEPLOYMENT_REPO_URL ?= http://gitea.local/prole/deployment.git .PHONY: all prole install deploy init clean help requirements test pyconv all: prole help: @echo "Prole Build & Deployment System" @echo "" @echo "Targets:" @echo " prole - Build the 'prole' CLI binary (ncurses/silent only)" @echo " requirements - Install Python dependencies" @echo " install - Run silent install via prole.sh" @echo " init - Sync OpenTofu pipeline, tofu init, stage deployment git dir" @echo " deploy - Run infrastructure deployment via OpenTofu" @echo " test - Run full install.py test suite with pyconv and coverage summary" @echo " pyconv - Check Python code style conventions (black)" @echo " clean - Remove build artifacts" @echo "" @echo "Environment:" @echo " PROLE_CONF - Directory containing prole.cfg (default: conf)" requirements: @echo "Installing dependencies..." $(PYTHON) -m pip install -r prole_requirements.txt prole: @$(PYTHON) -c "import PyInstaller" 2>/dev/null || (echo "Error: PyInstaller not found. Please run 'make requirements' or install it with: $(PYTHON) -m pip install -r prole_requirements.txt" && exit 1) @echo "Building 'prole' CLI binary (excluding Tk UI)..." $(PYINSTALLER) --clean --noconfirm --onefile \ --name prole \ --exclude-module tkinter \ --exclude-module _tkinter \ --exclude-module Tkinter \ --add-data "etc:etc" \ --add-data "prole-net:prole-net" \ --add-data "k8s:k8s" \ --add-data "conf:conf" \ prole/cli.py @echo "✓ Build complete: $(DIST_DIR)/prole" install: @echo "Running silent install..." PROLE_CONF=$(PROLE_CONF) ./prole.sh install -s -c $(PROLE_CONF)/prole.cfg init: @command -v tofu >/dev/null 2>&1 || (echo "Error: OpenTofu (tofu) not found in PATH." && exit 1) @echo "Syncing OpenTofu pipeline from $(PROLE_MODE) runtime into $(PIPELINE_DIR)..." @PROLE_MODE=$(PROLE_MODE) PROLE_CONF=$(PROLE_CONF) PROLE_GIT_REPO=$(DEPLOYMENT_REPO_URL) PYTHONPATH=$(CURDIR) $(PYTHON) - <<'PY' from installer.core.controller import ProleController from installer.core.env import PROJECT_ROOT from prole.deployment import ProleDeployment import sys deployment = ProleDeployment(ProleController(PROJECT_ROOT, verbose=False), PROJECT_ROOT) ok = deployment.duplicate_k3d_to_k3s() sys.exit(0 if ok else 1) PY @echo "Initializing OpenTofu backend in $(PIPELINE_DIR)..." @cd $(PIPELINE_DIR) && tofu init @echo "Staging pipeline sources into $(DEPLOYMENT_GIT_DIR) for Gitea" @mkdir -p $(DEPLOYMENT_GIT_DIR) @if command -v rsync >/dev/null 2>&1; then rsync -a $(PIPELINE_DIR)/ $(DEPLOYMENT_GIT_DIR)/; else cp -a $(PIPELINE_DIR)/. $(DEPLOYMENT_GIT_DIR)/; fi @cd $(DEPLOYMENT_GIT_DIR) && if [ ! -d .git ]; then git init -q; fi @echo "✓ init complete" deploy: init @echo "Deploying internal Gitea to k3s..." @KUBECONFIG=$(KUBECONFIG_PATH) PROLE_MODE=k3s PROLE_CONF=$(PROLE_CONF) $(GITEA_SCRIPT) deploy -c $(PROLE_CONF)/prole.cfg @echo "Running Prole deployment (OpenTofu)..." KUBECONFIG=$(KUBECONFIG_PATH) PYTHONPATH=$(CURDIR) PROLE_CONF=$(PROLE_CONF) PROLE_MODE=$(PROLE_MODE) PROLE_GIT_REPO=$(DEPLOYMENT_REPO_URL) $(PYTHON) prole/cli.py deploy test: pyconv @echo "Running full install.py test suite..." @./tests/run_tests.sh @echo "" @echo "Test Summary:" @$(PYTHON) -m coverage report | grep TOTAL | awk '{print "Total Coverage: " $$4 " (Statements: " $$2 ", Missed: " $$3 ")"}' pyconv: @echo "Checking Python code style conventions..." @$(PYTHON) -m black --check . || (echo "Warning: pyconv (black) found style issues. Run 'black .' to fix." && exit 1) clean: @echo "Cleaning build artifacts..." rm -rf $(BUILD_DIR) $(DIST_DIR) *.spec rm -rf __pycache__ prole/__pycache__ installer/__pycache__ @echo "✓ Clean complete"