277 lines
11 KiB
Makefile
277 lines
11 KiB
Makefile
# zipprine Makefile
|
|
# Build for all major architectures
|
|
|
|
.PHONY: all build clean install test help deps build-all release
|
|
|
|
# Application name
|
|
BINARY_NAME=zipprine
|
|
VERSION?=1.0.3
|
|
BUILD_DIR=build
|
|
RELEASE_DIR=releases
|
|
|
|
# Go parameters
|
|
GOCMD=go
|
|
GOBUILD=$(GOCMD) build
|
|
GOCLEAN=$(GOCMD) clean
|
|
GOTEST=$(GOCMD) test
|
|
GOGET=$(GOCMD) get
|
|
GOMOD=$(GOCMD) mod
|
|
GOINSTALL=$(GOCMD) install
|
|
|
|
# Build flags
|
|
LDFLAGS=-ldflags "-s -w -X main.Version=$(VERSION)"
|
|
BUILD_FLAGS=-trimpath
|
|
|
|
# Source
|
|
MAIN_PATH=./cmd/zipprine
|
|
|
|
# Color output
|
|
RED=\033[0;31m
|
|
GREEN=\033[0;32m
|
|
YELLOW=\033[0;33m
|
|
BLUE=\033[0;34m
|
|
MAGENTA=\033[0;35m
|
|
CYAN=\033[0;36m
|
|
NC=\033[0m # No Color
|
|
|
|
##@ General
|
|
|
|
help: ## Display this help screen
|
|
@echo "$(CYAN)╔═══════════════════════════════════════════════════╗$(NC)"
|
|
@echo "$(CYAN)║ 🗜️ zipprine Build System 🚀 ║$(NC)"
|
|
@echo "$(CYAN)╚═══════════════════════════════════════════════════╝$(NC)"
|
|
@echo ""
|
|
@awk 'BEGIN {FS = ":.*##"; printf "Usage:\n make $(CYAN)<target>$(NC)\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " $(CYAN)%-15s$(NC) %s\n", $$1, $$2 } /^##@/ { printf "\n$(MAGENTA)%s$(NC)\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
|
|
|
|
##@ Development
|
|
|
|
deps: ## Download dependencies
|
|
@echo "$(BLUE)📦 Downloading dependencies...$(NC)"
|
|
@$(GOMOD) download
|
|
@$(GOMOD) tidy
|
|
@echo "$(GREEN)✅ Dependencies installed$(NC)"
|
|
|
|
test: ## Run tests
|
|
@echo "$(BLUE)🧪 Running tests...$(NC)"
|
|
@$(GOTEST) -race -timeout 30s ./...
|
|
@echo "$(GREEN)✅ Tests passed$(NC)"
|
|
|
|
test-verbose: ## Run tests with verbose output
|
|
@echo "$(BLUE)🧪 Running tests (verbose)...$(NC)"
|
|
@$(GOTEST) -v -race -timeout 30s ./...
|
|
@echo "$(GREEN)✅ Tests passed$(NC)"
|
|
|
|
test-coverage: ## Run tests with coverage report
|
|
@echo "$(BLUE)📊 Running tests with coverage...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@$(GOTEST) -race -coverprofile=$(BUILD_DIR)/coverage.out -covermode=atomic ./...
|
|
@$(GOCMD) tool cover -html=$(BUILD_DIR)/coverage.out -o $(BUILD_DIR)/coverage.html
|
|
@echo "$(GREEN)✅ Coverage report generated: $(BUILD_DIR)/coverage.html$(NC)"
|
|
@$(GOCMD) tool cover -func=$(BUILD_DIR)/coverage.out | tail -n 1
|
|
|
|
bench: ## Run benchmarks
|
|
@echo "$(BLUE)📊 Running benchmarks...$(NC)"
|
|
@$(GOTEST) -bench=. -benchmem -run=^$$ ./...
|
|
@echo "$(GREEN)✅ Benchmarks complete$(NC)"
|
|
|
|
test-all: test-coverage bench ## Run all tests with coverage and benchmarks
|
|
@echo "$(GREEN)✨ All tests and benchmarks complete$(NC)"
|
|
|
|
clean: ## Clean build artifacts
|
|
@echo "$(YELLOW)🧹 Cleaning build artifacts...$(NC)"
|
|
@$(GOCLEAN)
|
|
@rm -rf $(BUILD_DIR)
|
|
@rm -rf $(RELEASE_DIR)
|
|
@echo "$(GREEN)✅ Clean complete$(NC)"
|
|
|
|
fmt: ## Format code
|
|
@echo "$(BLUE)📝 Formatting code...$(NC)"
|
|
@$(GOCMD) fmt ./...
|
|
@echo "$(GREEN)✅ Code formatted$(NC)"
|
|
|
|
vet: ## Run go vet
|
|
@echo "$(BLUE)🔍 Running go vet...$(NC)"
|
|
@$(GOCMD) vet ./...
|
|
@echo "$(GREEN)✅ Vet complete$(NC)"
|
|
|
|
lint: fmt vet ## Run linters
|
|
@echo "$(GREEN)✅ Linting complete$(NC)"
|
|
|
|
##@ Building
|
|
|
|
build: deps ## Build for current platform
|
|
@echo "$(BLUE)🔨 Building $(BINARY_NAME) for current platform...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@$(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME) $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Build complete: $(BUILD_DIR)/$(BINARY_NAME)$(NC)"
|
|
|
|
install: deps ## Install to $GOPATH/bin
|
|
@echo "$(BLUE)📥 Installing $(BINARY_NAME)...$(NC)"
|
|
@$(GOINSTALL) $(LDFLAGS) $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Installed to $(shell go env GOPATH)/bin/$(BINARY_NAME)$(NC)"
|
|
|
|
run: build ## Build and run
|
|
@echo "$(CYAN)▶️ Running $(BINARY_NAME)...$(NC)"
|
|
@./$(BUILD_DIR)/$(BINARY_NAME)
|
|
|
|
##@ Cross-Platform Builds
|
|
|
|
build-linux-amd64: ## Build for Linux AMD64
|
|
@echo "$(BLUE)🐧 Building for Linux AMD64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=linux GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64$(NC)"
|
|
|
|
build-linux-arm64: ## Build for Linux ARM64
|
|
@echo "$(BLUE)🐧 Building for Linux ARM64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=linux GOARCH=arm64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64$(NC)"
|
|
|
|
build-linux-arm: ## Build for Linux ARM
|
|
@echo "$(BLUE)🐧 Building for Linux ARM...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=linux GOARCH=arm $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-linux-arm$(NC)"
|
|
|
|
build-darwin-amd64: ## Build for macOS AMD64 (Intel)
|
|
@echo "$(BLUE)🍎 Building for macOS AMD64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=darwin GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64$(NC)"
|
|
|
|
build-darwin-arm64: ## Build for macOS ARM64 (Apple Silicon)
|
|
@echo "$(BLUE)🍎 Building for macOS ARM64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=darwin GOARCH=arm64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64$(NC)"
|
|
|
|
build-windows-amd64: ## Build for Windows AMD64
|
|
@echo "$(BLUE)🪟 Building for Windows AMD64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=windows GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe$(NC)"
|
|
|
|
build-windows-arm64: ## Build for Windows ARM64
|
|
@echo "$(BLUE)🪟 Building for Windows ARM64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=windows GOARCH=arm64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-arm64.exe $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-windows-arm64.exe$(NC)"
|
|
|
|
build-freebsd-amd64: ## Build for FreeBSD AMD64
|
|
@echo "$(BLUE)👹 Building for FreeBSD AMD64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=freebsd GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-freebsd-amd64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-freebsd-amd64$(NC)"
|
|
|
|
build-openbsd-amd64: ## Build for OpenBSD AMD64
|
|
@echo "$(BLUE)🐡 Building for OpenBSD AMD64...$(NC)"
|
|
@mkdir -p $(BUILD_DIR)
|
|
@GOOS=openbsd GOARCH=amd64 $(GOBUILD) $(BUILD_FLAGS) $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-openbsd-amd64 $(MAIN_PATH)
|
|
@echo "$(GREEN)✅ Built: $(BUILD_DIR)/$(BINARY_NAME)-openbsd-amd64$(NC)"
|
|
|
|
build-all: deps ## Build for all platforms
|
|
@echo "$(MAGENTA)╔═══════════════════════════════════════════════════╗$(NC)"
|
|
@echo "$(MAGENTA)║ 🌍 Building for ALL architectures 🚀 ║$(NC)"
|
|
@echo "$(MAGENTA)╚═══════════════════════════════════════════════════╝$(NC)"
|
|
@echo ""
|
|
@$(MAKE) build-linux-amd64
|
|
@$(MAKE) build-linux-arm64
|
|
@$(MAKE) build-linux-arm
|
|
@$(MAKE) build-darwin-amd64
|
|
@$(MAKE) build-darwin-arm64
|
|
@$(MAKE) build-windows-amd64
|
|
@$(MAKE) build-windows-arm64
|
|
@$(MAKE) build-freebsd-amd64
|
|
@$(MAKE) build-openbsd-amd64
|
|
@echo ""
|
|
@echo "$(GREEN)╔═══════════════════════════════════════════════════╗$(NC)"
|
|
@echo "$(GREEN)║ ✨ All builds complete! ✨ ║$(NC)"
|
|
@echo "$(GREEN)╚═══════════════════════════════════════════════════╝$(NC)"
|
|
@ls -lh $(BUILD_DIR)/
|
|
|
|
##@ Release
|
|
|
|
release: clean build-all ## Create release packages
|
|
@echo "$(MAGENTA)📦 Creating release packages...$(NC)"
|
|
@mkdir -p $(RELEASE_DIR)
|
|
|
|
@echo "$(BLUE) → Packaging Linux AMD64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-linux-amd64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-linux-amd64
|
|
|
|
@echo "$(BLUE) → Packaging Linux ARM64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-linux-arm64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-linux-arm64
|
|
|
|
@echo "$(BLUE) → Packaging Linux ARM...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-linux-arm.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-linux-arm
|
|
|
|
@echo "$(BLUE) → Packaging macOS AMD64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-darwin-amd64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-darwin-amd64
|
|
|
|
@echo "$(BLUE) → Packaging macOS ARM64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-darwin-arm64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-darwin-arm64
|
|
|
|
@echo "$(BLUE) → Packaging Windows AMD64...$(NC)"
|
|
@cd $(BUILD_DIR) && zip -q ../$(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-windows-amd64.zip $(BINARY_NAME)-windows-amd64.exe
|
|
|
|
@echo "$(BLUE) → Packaging Windows ARM64...$(NC)"
|
|
@cd $(BUILD_DIR) && zip -q ../$(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-windows-arm64.zip $(BINARY_NAME)-windows-arm64.exe
|
|
|
|
@echo "$(BLUE) → Packaging FreeBSD AMD64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-freebsd-amd64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-freebsd-amd64
|
|
|
|
@echo "$(BLUE) → Packaging OpenBSD AMD64...$(NC)"
|
|
@tar -czf $(RELEASE_DIR)/$(BINARY_NAME)-$(VERSION)-openbsd-amd64.tar.gz -C $(BUILD_DIR) $(BINARY_NAME)-openbsd-amd64
|
|
|
|
@echo ""
|
|
@echo "$(GREEN)✅ Release packages created:$(NC)"
|
|
@ls -lh $(RELEASE_DIR)/
|
|
@echo ""
|
|
@echo "$(CYAN)📊 Package sizes:$(NC)"
|
|
@du -sh $(RELEASE_DIR)/*
|
|
|
|
checksums: ## Generate SHA256 checksums for releases
|
|
@echo "$(BLUE)🔐 Generating checksums...$(NC)"
|
|
@mkdir -p $(RELEASE_DIR)
|
|
@rm -f $(RELEASE_DIR)/SHA256SUMS
|
|
@if [ -n "$$(ls -A $(RELEASE_DIR) 2>/dev/null)" ]; then \
|
|
cd $(RELEASE_DIR) && shasum -a 256 * > SHA256SUMS && \
|
|
echo "$(GREEN)✅ Checksums generated: $(RELEASE_DIR)/SHA256SUMS$(NC)" && \
|
|
cat SHA256SUMS; \
|
|
else \
|
|
echo "$(YELLOW)⚠️ No files found in $(RELEASE_DIR). Run 'make release' first.$(NC)"; \
|
|
fi
|
|
|
|
##@ Docker (Bonus)
|
|
|
|
docker-build: ## Build Docker image
|
|
@echo "$(BLUE)🐳 Building Docker image...$(NC)"
|
|
@docker build -t $(BINARY_NAME):$(VERSION) -t $(BINARY_NAME):latest .
|
|
@echo "$(GREEN)✅ Docker image built$(NC)"
|
|
|
|
docker-run: ## Run in Docker
|
|
@echo "$(CYAN)🐳 Running in Docker...$(NC)"
|
|
@docker run -it --rm $(BINARY_NAME):latest
|
|
|
|
##@ Info
|
|
|
|
version: ## Show version
|
|
@echo "$(CYAN)zipprine version: $(VERSION)$(NC)"
|
|
|
|
platforms: ## Show supported platforms
|
|
@echo "$(CYAN)Supported platforms:$(NC)"
|
|
@echo " 🐧 Linux: AMD64, ARM64, ARM"
|
|
@echo " 🍎 macOS: AMD64 (Intel), ARM64 (Apple Silicon)"
|
|
@echo " 🪟 Windows: AMD64, ARM64"
|
|
@echo " 👹 FreeBSD: AMD64"
|
|
@echo " 🐡 OpenBSD: AMD64"
|
|
|
|
size: ## Show binary sizes
|
|
@echo "$(CYAN)Binary sizes:$(NC)"
|
|
@if [ -d "$(BUILD_DIR)" ]; then \
|
|
du -sh $(BUILD_DIR)/* | sort -h; \
|
|
else \
|
|
echo "$(RED)No builds found. Run 'make build-all' first.$(NC)"; \
|
|
fi
|
|
|
|
.DEFAULT_GOAL := help
|