.PHONY: all build clean clean-all install test test-race lint fmt deps help fresh .PHONY: build-linux build-windows build-macos .PHONY: build-linux-amd64 build-linux-arm64 build-win-x86_64 build-win-arm64 build-macos-intel build-macos-arm .PHONY: build-all run release checksums .PHONY: build-generator build-generator-linux build-generator-windows build-generator-macos .PHONY: tailwind tailwind-watch .PHONY: release-build release-package release-checksums .PHONY: _ensure-dist _generate-windows-resources .PHONY: build-aur # Detect number of CPU cores for parallel builds NPROC := $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) # Default to half the cores for parallel make (leave rest for system) JOBS ?= $(shell echo $$(($(NPROC) > 8 ? 8 : $(NPROC)))) GOOS?=$(shell go env GOOS) GOARCH?=$(shell go env GOARCH) BINARY_NAME=mpv-manager GENERATOR_NAME=generate-info CHECKSUMS_NAME=gen-checksums VERSION?=1.2.0 BUILD_TIME=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ") GIT_COMMIT=$(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown") # Self-update disable flag for package manager builds (Arch AUR, etc.) # Set to disable self-update: make build SELF_UPDATE_FLAG="-X 'gitgud.io/mike/mpv-manager/pkg/version.SelfUpdateDisabled=true'" SELF_UPDATE_FLAG?= LDFLAGS=-ldflags "-X gitgud.io/mike/mpv-manager/pkg/version.CurrentVersion=$(VERSION) -X gitgud.io/mike/mpv-manager/pkg/version.BuildTime=$(BUILD_TIME) -X gitgud.io/mike/mpv-manager/pkg/version.GitCommit=$(GIT_COMMIT) $(SELF_UPDATE_FLAG) -s -w" # -buildvcs=false: Skip VCS stamping (faster, we embed version via ldflags) # -p 4: Build up to 4 packages in parallel within each build BUILD_FLAGS=-buildvcs=false -p 4 # ============================================================================= # UTILITY TARGETS # ============================================================================= _ensure-dist: @mkdir -p dist # Windows resources only need to be generated once, even with parallel builds _generate-windows-resources: _ensure-dist @echo "Generating Windows resources..." @cd cmd/mpv-manager && go generate 2>/dev/null || true # ============================================================================= # MAIN BUILD TARGETS # ============================================================================= build: _ensure-dist @echo "Building for $(GOOS)/$(GOARCH)..." @echo "Version: $(VERSION), Commit: $(GIT_COMMIT)" go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME) ./cmd/mpv-manager build-linux: build-linux-amd64 build-linux-arm64 build-windows: build-win-x86_64 build-win-arm64 build-macos: build-macos-arm build-macos-intel # ============================================================================= # PLATFORM-SPECIFIC BUILDS # ============================================================================= build-linux-amd64: _ensure-dist @echo "Building for linux/amd64..." GOOS=linux GOARCH=amd64 GOAMD64=v2 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-amd64 ./cmd/mpv-manager build-linux-arm64: _ensure-dist @echo "Building for linux/arm64..." GOOS=linux GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-linux-arm64 ./cmd/mpv-manager build-win-x86_64: _ensure-dist _generate-windows-resources @echo "Building for windows/amd64 (x86-64-v2)..." GOOS=windows GOARCH=amd64 GOAMD64=v2 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-win-x86_64.exe ./cmd/mpv-manager build-win-arm64: _ensure-dist _generate-windows-resources @echo "Building for windows/arm64..." GOOS=windows GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-win-arm64.exe ./cmd/mpv-manager build-macos-arm: _ensure-dist @echo "Building for darwin/arm64..." GOOS=darwin GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-macos-arm ./cmd/mpv-manager build-macos-intel: _ensure-dist @echo "Building for darwin/amd64..." GOOS=darwin GOARCH=amd64 GOAMD64=v2 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(BINARY_NAME)-macos-intel ./cmd/mpv-manager # ============================================================================= # PACKAGE MANAGER BUILDS (self-update disabled) # ============================================================================= # Arch Linux AUR build (self-update disabled, package manager handles updates) build-aur: _ensure-dist @echo "Building for Arch Linux AUR (self-update disabled)..." $(MAKE) build SELF_UPDATE_FLAG="-X 'gitgud.io/mike/mpv-manager/pkg/version.SelfUpdateDisabled=true'" # ============================================================================= # GENERATOR TOOL BUILDS # ============================================================================= build-generator: _ensure-dist @echo "Building generator for $(GOOS)/$(GOARCH)..." @echo "Version: $(VERSION), Commit: $(GIT_COMMIT)" go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME) ./cmd/generate-info build-generator-linux: build-generator-linux-amd64 build-generator-linux-arm64 build-generator-windows: build-generator-windows-amd64 build-generator-windows-arm64 build-generator-macos: build-generator-macos-amd64 build-generator-macos-arm64 build-generator-linux-amd64: _ensure-dist @echo "Building generator for linux/amd64..." GOOS=linux GOARCH=amd64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-linux-amd64 ./cmd/generate-info build-generator-linux-arm64: _ensure-dist @echo "Building generator for linux/arm64..." GOOS=linux GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-linux-arm64 ./cmd/generate-info build-generator-windows-amd64: _ensure-dist _generate-windows-resources @echo "Building generator for windows/amd64..." GOOS=windows GOARCH=amd64 GOAMD64=v2 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-windows-amd64.exe ./cmd/generate-info build-generator-windows-arm64: _ensure-dist _generate-windows-resources @echo "Building generator for windows/arm64..." GOOS=windows GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-windows-arm64.exe ./cmd/generate-info build-generator-macos-amd64: _ensure-dist @echo "Building generator for darwin/amd64..." GOOS=darwin GOARCH=amd64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-macos-amd64 ./cmd/generate-info build-generator-macos-arm64: _ensure-dist @echo "Building generator for darwin/arm64..." GOOS=darwin GOARCH=arm64 go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(GENERATOR_NAME)-macos-arm64 ./cmd/generate-info build-gen-checksums: _ensure-dist @echo "Building gen-checksums..." go build $(BUILD_FLAGS) $(LDFLAGS) -o dist/$(CHECKSUMS_NAME) ./cmd/gen-checksums # ============================================================================= # PARALLEL BUILD TARGETS # ============================================================================= # Build all platforms in parallel (use: make -j8 build-all-parallel) build-all-parallel: _ensure-dist _generate-windows-resources @echo "Building all platforms in parallel with $(JOBS) jobs..." $(MAKE) -j$(JOBS) \ build-linux-amd64 build-linux-arm64 \ build-win-x86_64 build-win-arm64 \ build-macos-intel build-macos-arm \ build-gen-checksums build-generator @echo "All builds complete:" @ls -lh dist/$(BINARY_NAME)-* dist/$(CHECKSUMS_NAME) 2>/dev/null || echo " (none)" # All platforms (sequential for safety, use build-all-parallel for speed) all: clean @echo "Building all installers..." $(MAKE) -j$(JOBS) \ build-linux-amd64 build-linux-arm64 \ build-win-x86_64 build-win-arm64 \ build-macos-intel build-macos-arm \ build-gen-checksums build-generator @echo "Created binaries:" @ls -lh dist/$(BINARY_NAME)-* dist/$(CHECKSUMS_NAME) 2>/dev/null || echo " (none)" build-all: all # ============================================================================= # RELEASE TARGETS (PARALLEL BUILDS + SEQUENTIAL PACKAGING) # ============================================================================= # Stage 1: Build all binaries in parallel release-build: _ensure-dist _generate-windows-resources @echo "=== Stage 1/3: Building all binaries ($(JOBS) parallel jobs) ===" $(MAKE) -j$(JOBS) \ build-linux-amd64 build-linux-arm64 \ build-win-x86_64 build-win-arm64 \ build-macos-intel build-macos-arm \ build-gen-checksums # Stage 2: Package binaries (sequential to avoid race conditions) release-package: @echo "=== Stage 2/3: Creating release packages for version $(VERSION) ===" @cd dist && tar -czf $(BINARY_NAME)-$(VERSION)-linux-amd64.tar.gz $(BINARY_NAME)-linux-amd64 @cd dist && tar -czf $(BINARY_NAME)-$(VERSION)-linux-arm64.tar.gz $(BINARY_NAME)-linux-arm64 @cd dist && zip -q $(BINARY_NAME)-$(VERSION)-win-x86_64.zip $(BINARY_NAME)-win-x86_64.exe @cd dist && zip -q $(BINARY_NAME)-$(VERSION)-win-arm64.zip $(BINARY_NAME)-win-arm64.exe @cd dist && zip -q $(BINARY_NAME)-$(VERSION)-macos-intel.zip $(BINARY_NAME)-macos-intel @cd dist && zip -q $(BINARY_NAME)-$(VERSION)-macos-arm.zip $(BINARY_NAME)-macos-arm # Stage 3: Generate checksums release-checksums: @echo "=== Stage 3/3: Generating BLAKE3 checksums ===" ./dist/$(CHECKSUMS_NAME) @echo "Release packages created:" @ls -lh dist/*$(VERSION)* dist/BLAKE3SUMS.txt # Full release: clean + parallel build + package + checksum release: clean release-build release-package release-checksums checksums: build-gen-checksums @echo "Creating BLAKE3 checksums..." ./dist/$(CHECKSUMS_NAME) # ============================================================================= # DEVELOPMENT TARGETS # ============================================================================= clean: @echo "Cleaning build artifacts..." @rm -rf dist/* @echo "Clean complete" clean-all: @echo "Deep cleaning (includes Go build cache)..." @rm -rf dist/* @go clean -cache @echo "Deep clean complete" install: build @echo "Installing $(BINARY_NAME) to GOPATH/bin..." @go install ./cmd/mpv-manager @echo "Installation complete" test: @echo "Running tests with $(JOBS) parallel packages..." go test -v -p $(JOBS) ./... test-coverage: @echo "Running tests with coverage..." go test -v -p $(JOBS) -coverprofile=coverage.out ./... go tool cover -html=coverage.out -o coverage.html @echo "Coverage report: coverage.html" test-race: @echo "Running tests with race detector..." go test -v -race -p $(JOBS) ./... lint: @echo "Running linters..." @if command -v golangci-lint >/dev/null 2>&1; then \ golangci-lint run ./...; \ else \ echo "golangci-lint not found. Installing..."; \ go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest; \ golangci-lint run ./...; \ fi fmt: @echo "Formatting code..." @go fmt ./... @if command -v goimports >/dev/null 2>&1; then \ goimports -w .; \ fi deps: @echo "Downloading dependencies..." go mod download go mod tidy @echo "Dependencies ready" deps-update: @echo "Updating dependencies..." go get -u ./... go mod tidy @echo "Dependencies updated" vendor: @echo "Vendoring dependencies..." go mod vendor first-time: @echo "Setting up for first time use..." @$(MAKE) deps @$(MAKE) build @echo "" @echo "Setup complete! Binary: dist/$(BINARY_NAME)" @echo "Run with: ./dist/$(BINARY_NAME)" fresh: @echo "Fresh build (clean + deps + build)..." @$(MAKE) clean @$(MAKE) deps @$(MAKE) build @echo "" @echo "Fresh build complete! Binary: dist/$(BINARY_NAME)" run: build ./dist/$(BINARY_NAME) # ============================================================================= # TAILWIND CSS # ============================================================================= tailwind: @echo "Building TailwindCSS..." @if command -v npx >/dev/null 2>&1; then \ npx tailwindcss -i ./internal/webassets/css/input.css -o ./internal/webassets/static/css/tailwind.min.css --minify; \ echo "TailwindCSS build complete"; \ else \ echo "npx not found. Please install Node.js/npm first."; \ exit 1; \ fi tailwind-watch: @echo "Watching TailwindCSS for changes..." @npx tailwindcss -i ./internal/webassets/css/input.css -o ./internal/webassets/static/css/tailwind.min.css --watch tailwind-dev: @echo "Building TailwindCSS (development - unminified)..." @npx tailwindcss -i ./internal/webassets/css/input.css -o ./internal/webassets/static/css/tailwind.min.css # ============================================================================= # HELP # ============================================================================= help: @echo "MPV.Rocks Manager Makefile" @echo "" @echo "Detected: $(NPROC) CPU cores, using $(JOBS) parallel jobs" @echo "" @echo "Quick Start:" @echo " make first-time - Install deps and build (for new clones)" @echo " make build - Build for current platform" @echo " make run - Build and run" @echo "" @echo "Parallel Builds (FAST):" @echo " make build-all-parallel - Build ALL platforms in parallel" @echo " make release - Full release (parallel builds)" @echo " make -j8 release - Override parallelism (8 jobs)" @echo "" @echo "Sequential Builds (SAFE):" @echo " make all - Build all platforms" @echo " make build-linux - Linux (amd64 + arm64)" @echo " make build-windows - Windows (x86_64 + arm64)" @echo " make build-macos - macOS (intel + arm)" @echo "" @echo "Single Platform:" @echo " make build-linux-amd64 - Linux x86_64" @echo " make build-linux-arm64 - Linux ARM64" @echo " make build-win-x86_64 - Windows x86_64" @echo " make build-win-arm64 - Windows ARM64" @echo " make build-macos-intel - macOS Intel" @echo " make build-macos-arm - macOS Apple Silicon" @echo "" @echo "Package Manager Builds:" @echo " make build-aur - Arch Linux AUR (self-update disabled)" @echo "" @echo "Development:" @echo " make test - Run tests" @echo " make test-race - Run tests with race detector" @echo " make test-coverage - Tests with coverage report" @echo " make lint - Run linters" @echo " make fmt - Format code" @echo " make clean - Clean dist/ (keep cache)" @echo " make clean-all - Deep clean (includes Go cache)" @echo "" @echo "Customization:" @echo " JOBS=4 make release - Use 4 parallel jobs" @echo " VERSION=1.0.0 make - Set version" @echo " make build SELF_UPDATE_FLAG=\"-X 'gitgud.io/mike/mpv-manager/pkg/version.SelfUpdateDisabled=true'\" - Disable self-update" .DEFAULT_GOAL := help