mirror of
https://github.com/yarlson/lnk.git
synced 2025-09-08 18:50:39 +02:00
187 lines
6.1 KiB
Makefile
187 lines
6.1 KiB
Makefile
# Variables
|
|
BINARY_NAME=lnk
|
|
VERSION=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
|
BUILD_TIME=$(shell date +%FT%T%z)
|
|
LDFLAGS=-ldflags "-X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)"
|
|
|
|
# Go related variables
|
|
GOBASE=$(shell pwd)
|
|
GOBIN=$(GOBASE)/bin
|
|
GOFILES=$(wildcard *.go)
|
|
|
|
# Colors for pretty output
|
|
RED=\033[0;31m
|
|
GREEN=\033[0;32m
|
|
YELLOW=\033[0;33m
|
|
BLUE=\033[0;34m
|
|
NC=\033[0m # No Color
|
|
|
|
.PHONY: help build test clean install uninstall fmt lint vet tidy run dev cross-compile release goreleaser-check goreleaser-snapshot
|
|
|
|
## help: Show this help message
|
|
help:
|
|
@echo "$(BLUE)Lnk CLI - Available targets:$(NC)"
|
|
@echo ""
|
|
@echo "$(GREEN)Development:$(NC)"
|
|
@echo " build Build the binary"
|
|
@echo " test Run tests"
|
|
@echo " test-v Run tests with verbose output"
|
|
@echo " test-cover Run tests with coverage"
|
|
@echo " run Run the application"
|
|
@echo " dev Development mode with file watching"
|
|
@echo ""
|
|
@echo "$(GREEN)Code Quality:$(NC)"
|
|
@echo " fmt Format Go code"
|
|
@echo " lint Run golangci-lint"
|
|
@echo " vet Run go vet"
|
|
@echo " tidy Tidy Go modules"
|
|
@echo " check Run all quality checks (fmt, vet, lint, test)"
|
|
@echo ""
|
|
@echo "$(GREEN)Installation:$(NC)"
|
|
@echo " install Install binary to /usr/local/bin"
|
|
@echo " uninstall Remove binary from /usr/local/bin"
|
|
@echo ""
|
|
@echo "$(GREEN)Release:$(NC)"
|
|
@echo " cross-compile Build for multiple platforms (legacy)"
|
|
@echo " release Create release builds (legacy)"
|
|
@echo " goreleaser-check Validate .goreleaser.yml config"
|
|
@echo " goreleaser-snapshot Build snapshot release with GoReleaser"
|
|
@echo ""
|
|
@echo "$(GREEN)Utilities:$(NC)"
|
|
@echo " clean Clean build artifacts"
|
|
@echo " deps Install development dependencies"
|
|
|
|
## build: Build the binary
|
|
build:
|
|
@echo "$(BLUE)Building $(BINARY_NAME)...$(NC)"
|
|
@go build $(LDFLAGS) -o $(BINARY_NAME) .
|
|
@echo "$(GREEN)✓ Build complete: $(BINARY_NAME)$(NC)"
|
|
|
|
## test: Run tests
|
|
test:
|
|
@echo "$(BLUE)Running tests...$(NC)"
|
|
@go test ./...
|
|
@echo "$(GREEN)✓ Tests passed$(NC)"
|
|
|
|
## test-v: Run tests with verbose output
|
|
test-v:
|
|
@echo "$(BLUE)Running tests (verbose)...$(NC)"
|
|
@go test -v ./...
|
|
|
|
## test-cover: Run tests with coverage
|
|
test-cover:
|
|
@echo "$(BLUE)Running tests with coverage...$(NC)"
|
|
@go test -v -cover ./...
|
|
@go test -coverprofile=coverage.out ./
|
|
@go tool cover -html=coverage.out -o coverage.html
|
|
@echo "$(GREEN)✓ Coverage report generated: coverage.html$(NC)"
|
|
|
|
## run: Run the application
|
|
run: build
|
|
@echo "$(BLUE)Running $(BINARY_NAME)...$(NC)"
|
|
@./$(BINARY_NAME)
|
|
|
|
## dev: Development mode with file watching (requires entr)
|
|
dev:
|
|
@echo "$(YELLOW)Development mode - watching for changes...$(NC)"
|
|
@echo "$(YELLOW)Install 'entr' if not available: brew install entr$(NC)"
|
|
@find . -name "*.go" | entr -r make run
|
|
|
|
## fmt: Format Go code
|
|
fmt:
|
|
@echo "$(BLUE)Formatting code...$(NC)"
|
|
@go fmt ./...
|
|
@echo "$(GREEN)✓ Code formatted$(NC)"
|
|
|
|
## lint: Run golangci-lint
|
|
lint:
|
|
@echo "$(BLUE)Running linter...$(NC)"
|
|
@if command -v golangci-lint >/dev/null 2>&1; then \
|
|
golangci-lint run; \
|
|
echo "$(GREEN)✓ Linting complete$(NC)"; \
|
|
else \
|
|
echo "$(YELLOW)⚠ golangci-lint not found. Install with: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest$(NC)"; \
|
|
fi
|
|
|
|
## vet: Run go vet
|
|
vet:
|
|
@echo "$(BLUE)Running go vet...$(NC)"
|
|
@go vet ./...
|
|
@echo "$(GREEN)✓ Vet check passed$(NC)"
|
|
|
|
## tidy: Tidy Go modules
|
|
tidy:
|
|
@echo "$(BLUE)Tidying modules...$(NC)"
|
|
@go mod tidy
|
|
@echo "$(GREEN)✓ Modules tidied$(NC)"
|
|
|
|
## check: Run all quality checks
|
|
check: fmt vet lint test
|
|
@echo "$(GREEN)✓ All quality checks passed$(NC)"
|
|
|
|
## install: Install binary to /usr/local/bin
|
|
install: build
|
|
@echo "$(BLUE)Installing $(BINARY_NAME) to /usr/local/bin...$(NC)"
|
|
@sudo cp $(BINARY_NAME) /usr/local/bin/
|
|
@echo "$(GREEN)✓ $(BINARY_NAME) installed$(NC)"
|
|
|
|
## uninstall: Remove binary from /usr/local/bin
|
|
uninstall:
|
|
@echo "$(BLUE)Uninstalling $(BINARY_NAME)...$(NC)"
|
|
@sudo rm -f /usr/local/bin/$(BINARY_NAME)
|
|
@echo "$(GREEN)✓ $(BINARY_NAME) uninstalled$(NC)"
|
|
|
|
## cross-compile: Build for multiple platforms
|
|
cross-compile: clean
|
|
@echo "$(BLUE)Cross-compiling for multiple platforms...$(NC)"
|
|
@mkdir -p dist
|
|
@GOOS=linux GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-amd64 .
|
|
@GOOS=linux GOARCH=arm64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-arm64 .
|
|
@GOOS=darwin GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-darwin-amd64 .
|
|
@GOOS=darwin GOARCH=arm64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-darwin-arm64 .
|
|
@GOOS=windows GOARCH=amd64 go build $(LDFLAGS) -o dist/$(BINARY_NAME)-windows-amd64.exe .
|
|
@echo "$(GREEN)✓ Cross-compilation complete. Binaries in dist/$(NC)"
|
|
|
|
## release: Create release builds with checksums
|
|
release: cross-compile
|
|
@echo "$(BLUE)Creating release artifacts...$(NC)"
|
|
@cd dist && sha256sum * > checksums.txt
|
|
@echo "$(GREEN)✓ Release artifacts created in dist/$(NC)"
|
|
|
|
## clean: Clean build artifacts
|
|
clean:
|
|
@echo "$(BLUE)Cleaning...$(NC)"
|
|
@rm -f $(BINARY_NAME)
|
|
@rm -rf dist/
|
|
@rm -f coverage.out coverage.html
|
|
@echo "$(GREEN)✓ Clean complete$(NC)"
|
|
|
|
## deps: Install development dependencies
|
|
deps:
|
|
@echo "$(BLUE)Installing development dependencies...$(NC)"
|
|
@go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
|
|
@if ! command -v goreleaser >/dev/null 2>&1; then \
|
|
echo "$(BLUE)Installing GoReleaser...$(NC)"; \
|
|
go install github.com/goreleaser/goreleaser@latest; \
|
|
fi
|
|
@echo "$(GREEN)✓ Dependencies installed$(NC)"
|
|
|
|
## goreleaser-check: Validate GoReleaser configuration
|
|
goreleaser-check:
|
|
@echo "$(BLUE)Validating GoReleaser configuration...$(NC)"
|
|
@if command -v goreleaser >/dev/null 2>&1; then \
|
|
goreleaser check; \
|
|
echo "$(GREEN)✓ GoReleaser configuration is valid$(NC)"; \
|
|
else \
|
|
echo "$(YELLOW)⚠ GoReleaser not found. Install with: make deps$(NC)"; \
|
|
fi
|
|
|
|
## goreleaser-snapshot: Build snapshot release with GoReleaser
|
|
goreleaser-snapshot: goreleaser-check
|
|
@echo "$(BLUE)Building snapshot release with GoReleaser...$(NC)"
|
|
@goreleaser build --snapshot --clean
|
|
@echo "$(GREEN)✓ Snapshot release built in dist/$(NC)"
|
|
|
|
# Default target
|
|
all: check build
|