2026-03-06 17:33:30 +08:00

169 lines
6.7 KiB
Makefile

# Edge AI Platform - Makefile
.PHONY: help dev dev-mock build clean test lint mock install fmt build-embed release release-snapshot \
build-server-tray installer-payload installer installer-dev installer-clean deploy-frontend deploy-frontend-setup deploy-ec2 build-relay
VERSION ?= v0.1.0
BUILD_TIME := $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
help: ## Show available targets
@echo "Edge AI Platform - Available targets:"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-18s\033[0m %s\n", $$1, $$2}'
# ── Development ──────────────────────────────────────────
dev: ## Start frontend + backend with REAL hardware (no mock)
@echo "Starting development servers (real hardware)..."
@$(MAKE) -j2 dev-server dev-frontend
dev-server:
cd server && go run main.go --dev
dev-frontend:
cd frontend && pnpm dev
dev-mock: ## Start frontend + backend with mock devices
@echo "Starting development servers (mock mode)..."
@$(MAKE) -j2 dev-mock-server dev-frontend
dev-mock-server:
cd server && go run main.go --dev --mock --mock-devices=3
mock: ## Start server in mock mode only (no frontend)
cd server && go run main.go --dev --mock --mock-devices=3 --mock-camera
# ── Build ────────────────────────────────────────────────
build: build-frontend build-embed build-server ## Build single binary with embedded frontend
@echo "Build complete! Binary: dist/edge-ai-server"
build-frontend: ## Build Next.js frontend static export
cd frontend && pnpm build
@echo "Frontend built: frontend/out/"
build-embed: ## Copy frontend static export into server for go:embed
@rm -rf server/web/out
@mkdir -p server/web/out
cp -r frontend/out/. server/web/out/
@echo "Frontend static files copied to server/web/out/"
build-server: ## Build Go server binary (embeds frontend)
@mkdir -p dist
cd server && go build \
-ldflags="-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o ../dist/edge-ai-server main.go
@echo "Server binary: dist/edge-ai-server"
build-relay: ## Build relay server binary
@mkdir -p dist
cd server && go build -o ../dist/relay-server ./cmd/relay-server
@echo "Relay binary: dist/relay-server"
build-server-tray: build-frontend build-embed ## Build server with tray support (CGO required)
@mkdir -p dist
cd server && CGO_ENABLED=1 go build \
-ldflags="-X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o ../dist/edge-ai-server main.go
@echo "Server binary (tray-enabled): dist/edge-ai-server"
# ── Release ──────────────────────────────────────────────
release-snapshot: ## Build release archives locally (no publish)
goreleaser release --snapshot --clean
release: ## Build and publish release to Gitea
goreleaser release --clean
# ── Testing ──────────────────────────────────────────────
test: test-server test-frontend ## Run all tests
@echo "All tests passed!"
test-server: ## Run Go tests
cd server && go test -v ./...
test-frontend: ## Run Vitest tests
cd frontend && pnpm test
test-coverage: ## Run tests with coverage reports
cd server && go test -coverprofile=coverage.out ./... && \
go tool cover -html=coverage.out -o coverage.html
cd frontend && pnpm test -- --coverage
# ── Linting ──────────────────────────────────────────────
lint: lint-server lint-frontend ## Lint all code
lint-server: ## Lint Go code
cd server && go vet ./...
lint-frontend: ## Lint frontend code
cd frontend && pnpm lint
fmt: ## Format all code
cd server && go fmt ./...
# ── Dependencies ─────────────────────────────────────────
install: ## Install all dependencies
cd server && go mod download
cd frontend && pnpm install
# ── GUI Installer ────────────────────────────────────────
installer-payload: build-server-tray ## Stage payload files for GUI installer
@echo "Staging installer payload..."
@rm -rf installer/payload
@mkdir -p installer/payload/data/nef/kl520
@mkdir -p installer/payload/data/nef/kl720
@mkdir -p installer/payload/scripts/firmware/KL520
@mkdir -p installer/payload/scripts/firmware/KL720
cp dist/edge-ai-server installer/payload/
cp server/data/models.json installer/payload/data/
cp server/data/nef/kl520/*.nef installer/payload/data/nef/kl520/
cp server/data/nef/kl720/*.nef installer/payload/data/nef/kl720/
cp server/scripts/kneron_bridge.py installer/payload/scripts/
cp server/scripts/requirements.txt installer/payload/scripts/
cp server/scripts/update_kl720_firmware.py installer/payload/scripts/
cp scripts/kneron_detect.py installer/payload/scripts/
cp server/scripts/firmware/KL520/*.bin installer/payload/scripts/firmware/KL520/
cp server/scripts/firmware/KL720/*.bin installer/payload/scripts/firmware/KL720/
@echo "Payload staged in installer/payload/"
installer: installer-payload ## Build GUI installer app
cd installer && wails build -clean
@echo "Installer built! Check installer/build/"
installer-dev: installer-payload ## Run GUI installer in dev mode
cd installer && wails dev
installer-clean: ## Remove installer build artifacts
rm -rf installer/payload
@mkdir -p installer/payload && touch installer/payload/.gitkeep
rm -rf installer/build
@echo "Installer artifacts cleaned!"
# ── Deploy ───────────────────────────────────────────────
deploy-frontend: build-frontend ## Deploy frontend to AWS (CloudFront + S3)
bash scripts/deploy-aws.sh
deploy-frontend-setup: build-frontend ## First-time AWS S3+CloudFront setup + deploy
bash scripts/deploy-aws.sh --setup
deploy-ec2: build-frontend ## Deploy frontend to EC2 (nginx). Usage: make deploy-ec2 HOST=user@ip KEY=~/.ssh/key.pem
bash scripts/deploy-ec2.sh $(HOST) --key $(KEY)
# ── Cleanup ──────────────────────────────────────────────
clean: installer-clean ## Remove build artifacts
rm -rf dist/
rm -rf frontend/.next
rm -rf frontend/out
rm -rf server/web/out
@mkdir -p server/web/out && touch server/web/out/.gitkeep
rm -f server/coverage.out server/coverage.html
@echo "Clean complete!"