Files

94 lines
2.7 KiB
Makefile

SHELL := /usr/bin/env bash
PYTHON ?= python3
VENV_DIR ?= .venv
PIP := $(VENV_DIR)/bin/pip
UVICORN := $(VENV_DIR)/bin/uvicorn
.PHONY: help venv install env run start stop restart run-mock run-serial reset clean
help:
@echo "Targets:"
@echo " venv - create virtual environment in $(VENV_DIR)"
@echo " install - install Python dependencies"
@echo " env - create .env from .env.example if missing"
@echo " run - run API (uses .env)"
@echo " start - start API in background (PID file: .uvicorn.pid)"
@echo " stop - stop API using PID file"
@echo " restart - stop then start API"
@echo " run-mock - run API with APP_MODE=mock"
@echo " run-serial - run API with APP_MODE=serial"
@echo " reset - remove virtual environment and .env"
venv:
$(PYTHON) -m venv $(VENV_DIR)
install: venv env
$(PIP) install --upgrade pip
$(PIP) install -r requirements.txt
env:
@bash -c 'set -euo pipefail; \
if [ ! -f .env ]; then \
cp .env.example .env; \
echo ".env created from .env.example"; \
else \
changed=0; \
while IFS= read -r line; do \
case "$$line" in \
""|\#*) continue ;; \
esac; \
key="$${line%%=*}"; \
if ! grep -qE "^$${key}=" .env; then \
echo "$$line" >> .env; \
changed=1; \
fi; \
done < .env.example; \
if [ "$$changed" -eq 1 ]; then \
echo ".env updated with missing variables"; \
else \
echo ".env up to date"; \
fi; \
fi'
run:
bash -c 'set -a; [ -f .env ] && . ./.env; set +a; $(UVICORN) app.main:app --host "$${APP_HOST:-0.0.0.0}" --port "$${APP_PORT:-8000}"'
start:
@bash -c 'set -a; [ -f .env ] && . ./.env; set +a; \
if [ -f .uvicorn.pid ] && kill -0 "$$(cat .uvicorn.pid)" 2>/dev/null; then \
echo "API already running (PID $$(cat .uvicorn.pid))"; \
exit 0; \
fi; \
nohup $(UVICORN) app.main:app --host "$${APP_HOST:-0.0.0.0}" --port "$${APP_PORT:-8000}" >/dev/null 2>&1 & \
echo $$! > .uvicorn.pid; \
echo "API started (PID $$(cat .uvicorn.pid))"'
stop:
@bash -c 'set -euo pipefail; \
if [ ! -f .uvicorn.pid ]; then \
echo "No PID file (.uvicorn.pid)."; \
exit 0; \
fi; \
pid="$$(cat .uvicorn.pid)"; \
if kill -0 "$$pid" 2>/dev/null; then \
kill "$$pid"; \
echo "API stopped (PID $$pid)"; \
else \
echo "Process not running (PID $$pid)"; \
fi; \
rm -f .uvicorn.pid'
restart: stop start
run-mock:
bash -c 'set -a; [ -f .env ] && . ./.env; set +a; APP_MODE=mock $(UVICORN) app.main:app --host "$${APP_HOST:-0.0.0.0}" --port "$${APP_PORT:-8000}"'
run-serial:
bash -c 'set -a; [ -f .env ] && . ./.env; set +a; APP_MODE=serial $(UVICORN) app.main:app --host "$${APP_HOST:-0.0.0.0}" --port "$${APP_PORT:-8000}"'
reset:
rm -rf $(VENV_DIR)
rm -f .env .uvicorn.pid
clean: reset