513 lines
16 KiB
Makefile
Raw Permalink Normal View History

2025-10-07 11:12:02 +01:00
# Provisioning System Build System
# Comprehensive Makefile for building, testing, and distributing the provisioning system
# ============================================================================
# Configuration
# ============================================================================
# Project metadata
PROJECT_NAME := provisioning
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev-$(shell date +%Y%m%d)")
BUILD_TIME := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
GIT_COMMIT := $(shell git rev-parse HEAD 2>/dev/null || echo "unknown")
# Directories
SRC_DIR := $(CURDIR)/..
TOOLS_DIR := $(CURDIR)
BUILD_DIR := $(SRC_DIR)/target
DIST_DIR := $(SRC_DIR)/dist
PACKAGES_DIR := $(SRC_DIR)/packages
# Build configuration
RUST_TARGET := x86_64-unknown-linux-gnu
BUILD_MODE := release
PLATFORMS := linux-amd64,macos-amd64,windows-amd64
VARIANTS := complete,minimal
# Tools
NU := nu
CARGO := cargo
DOCKER := docker
TAR := tar
ZIP := zip
# Flags
VERBOSE := false
DRY_RUN := false
PARALLEL := true
# ============================================================================
# Default target
# ============================================================================
.DEFAULT_GOAL := help
# ============================================================================
# Help system
# ============================================================================
.PHONY: help
help: ## Show this help message
@echo "Provisioning System Build System"
@echo "================================="
@echo ""
@echo "Usage: make [target] [options]"
@echo ""
@echo "Build Targets:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "(build|compile|bundle)"
@echo ""
@echo "Package Targets:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "(package|dist|archive)"
@echo ""
@echo "Release Targets:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "(release|tag|upload)"
@echo ""
@echo "Utility Targets:"
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | grep -E "(clean|test|validate|install)"
@echo ""
@echo "Variables:"
@echo " VERSION=$(VERSION)"
@echo " BUILD_MODE=$(BUILD_MODE)"
@echo " PLATFORMS=$(PLATFORMS)"
@echo " VARIANTS=$(VARIANTS)"
@echo ""
@echo "Examples:"
@echo " make all # Complete build and package"
@echo " make build-platform # Build platform binaries"
@echo " make package-all # Create all distribution packages"
@echo " make release VERSION=2.1.0 # Create and upload release"
@echo " make clean # Clean all build artifacts"
# ============================================================================
# Build targets
# ============================================================================
.PHONY: all
all: clean build-all package-all test-dist ## Complete build, package, and test
.PHONY: build-all
build-all: build-platform build-core validate-kcl ## Build all components
.PHONY: build-platform
build-platform: ## Build platform binaries for all targets
@echo "Building platform binaries..."
$(NU) $(TOOLS_DIR)/build/compile-platform.nu \
--target $(RUST_TARGET) \
--$(BUILD_MODE) \
--output-dir $(DIST_DIR)/platform \
--verbose=$(VERBOSE)
.PHONY: build-core
build-core: ## Bundle core Nushell libraries
@echo "Building core libraries..."
$(NU) $(TOOLS_DIR)/build/bundle-core.nu \
--output-dir $(DIST_DIR)/core \
--config-dir $(DIST_DIR)/config \
--validate \
--exclude-dev \
--verbose=$(VERBOSE)
.PHONY: validate-kcl
validate-kcl: ## Validate and compile KCL schemas
@echo "Validating KCL schemas..."
$(NU) $(TOOLS_DIR)/build/validate-kcl.nu \
--output-dir $(DIST_DIR)/kcl \
--format-code \
--check-dependencies \
--verbose=$(VERBOSE)
.PHONY: build-cross
build-cross: ## Cross-compile for multiple platforms
@echo "Cross-compiling for multiple platforms..."
@for target in $(subst $(comma), ,$(PLATFORMS)); do \
echo "Building for $$target..."; \
$(NU) $(TOOLS_DIR)/build/compile-platform.nu \
--target $$target \
--$(BUILD_MODE) \
--output-dir $(DIST_DIR)/platform \
--verbose=$(VERBOSE) || exit 1; \
done
# ============================================================================
# Package targets
# ============================================================================
.PHONY: package-all
package-all: dist-generate package-binaries package-containers ## Create all distribution packages
.PHONY: dist-generate
dist-generate: ## Generate complete distributions
@echo "Generating distributions..."
$(NU) $(TOOLS_DIR)/distribution/generate-distribution.nu \
--version $(VERSION) \
--platforms $(PLATFORMS) \
--variants $(VARIANTS) \
--output-dir $(DIST_DIR) \
--compress \
--generate-docs \
--parallel-builds=$(PARALLEL) \
--validate-output \
--verbose=$(VERBOSE)
.PHONY: package-binaries
package-binaries: ## Package binaries for distribution
@echo "Packaging binaries..."
$(NU) $(TOOLS_DIR)/package/package-binaries.nu \
--source-dir $(DIST_DIR)/platform \
--output-dir $(PACKAGES_DIR)/binaries \
--platforms $(PLATFORMS) \
--format archive \
--compress \
--strip \
--verbose=$(VERBOSE)
.PHONY: package-containers
package-containers: ## Build container images
@echo "Building container images..."
$(NU) $(TOOLS_DIR)/package/build-containers.nu \
--dist-dir $(DIST_DIR) \
--tag-prefix $(PROJECT_NAME) \
--version $(VERSION) \
--platforms "linux/amd64" \
--cache \
--verbose=$(VERBOSE)
.PHONY: create-archives
create-archives: ## Create distribution archives
@echo "Creating distribution archives..."
$(NU) $(TOOLS_DIR)/package/create-tarball.nu \
--dist-dir $(DIST_DIR) \
--output-dir $(PACKAGES_DIR) \
--format both \
--platform all \
--variant complete \
--version $(VERSION) \
--compression-level 6 \
--checksum \
--verbose=$(VERBOSE)
.PHONY: create-installers
create-installers: ## Create installation packages
@echo "Creating installers..."
@for dist in $(DIST_DIR)/provisioning-$(VERSION)-*-complete; do \
if [ -d "$$dist" ]; then \
$(NU) $(TOOLS_DIR)/distribution/create-installer.nu \
"$$dist" \
--output-dir $(PACKAGES_DIR)/installers \
--installer-types shell,package \
--platforms linux,macos,windows \
--include-services \
--create-uninstaller \
--validate-installer \
--verbose=$(VERBOSE) || exit 1; \
fi; \
done
# ============================================================================
# Release targets
# ============================================================================
.PHONY: release
release: ## Create a complete release (requires VERSION)
@if [ -z "$(VERSION)" ]; then \
echo "Error: VERSION must be specified for release"; \
echo "Usage: make release VERSION=2.1.0"; \
exit 1; \
fi
@echo "Creating release $(VERSION)..."
$(NU) $(TOOLS_DIR)/release/create-release.nu \
--version $(VERSION) \
--asset-dir $(PACKAGES_DIR) \
--generate-changelog \
--push-tag \
--auto-upload \
--verbose=$(VERBOSE)
.PHONY: release-draft
release-draft: ## Create a draft release
@echo "Creating draft release..."
$(NU) $(TOOLS_DIR)/release/create-release.nu \
--version $(VERSION) \
--draft \
--asset-dir $(PACKAGES_DIR) \
--generate-changelog \
--push-tag \
--verbose=$(VERBOSE)
.PHONY: upload-artifacts
upload-artifacts: ## Upload release artifacts
@echo "Uploading release artifacts..."
$(NU) $(TOOLS_DIR)/release/upload-artifacts.nu \
--artifacts-dir $(PACKAGES_DIR) \
--release-tag v$(VERSION) \
--targets github,docker \
--verify-uploads \
--verbose=$(VERBOSE)
.PHONY: notify-release
notify-release: ## Send release notifications
@echo "Sending release notifications..."
$(NU) $(TOOLS_DIR)/release/notify-users.nu \
--channels slack,discord \
--release-version $(VERSION) \
--urgent=false \
--verbose=$(VERBOSE)
.PHONY: update-registry
update-registry: ## Update package manager registries
@echo "Updating package registries..."
$(NU) $(TOOLS_DIR)/release/update-registry.nu \
--registries homebrew \
--version $(VERSION) \
--auto-commit \
--verbose=$(VERBOSE)
# ============================================================================
# Development and testing targets
# ============================================================================
.PHONY: dev-build
dev-build: ## Quick development build
@echo "Development build..."
$(NU) $(TOOLS_DIR)/distribution/generate-distribution.nu quick \
--platform linux \
--variant minimal \
--output-dir $(DIST_DIR)
.PHONY: test-build
test-build: ## Test build system
@echo "Testing build system..."
$(NU) $(TOOLS_DIR)/build/compile-platform.nu \
--target $(RUST_TARGET) \
--release \
--output-dir $(DIST_DIR)/test \
--verbose
.PHONY: test-dist
test-dist: ## Test generated distributions
@echo "Testing distributions..."
$(NU) $(TOOLS_DIR)/build/test-distribution.nu \
--dist-dir $(DIST_DIR) \
--test-types basic \
--platform $(shell uname -s | tr '[:upper:]' '[:lower:]') \
--cleanup \
--verbose=$(VERBOSE)
.PHONY: validate-all
validate-all: ## Validate all components
@echo "Validating all components..."
$(NU) $(TOOLS_DIR)/build/validate-kcl.nu --verbose=$(VERBOSE)
$(NU) $(TOOLS_DIR)/package/validate-package.nu $(DIST_DIR) --validation-type complete
.PHONY: benchmark
benchmark: ## Run build benchmarks
@echo "Running build benchmarks..."
@time make build-platform BUILD_MODE=release
@echo "Build completed in:"
# ============================================================================
# Documentation targets
# ============================================================================
.PHONY: docs
docs: ## Generate documentation
@echo "Generating documentation..."
$(NU) $(TOOLS_DIR)/distribution/generate-docs.nu \
--output-dir $(DIST_DIR)/docs \
--doc-types all \
--format markdown \
--include-examples \
--generate-api \
--create-index \
--verbose=$(VERBOSE)
.PHONY: docs-serve
docs-serve: docs ## Generate and serve documentation locally
@echo "Serving documentation on http://localhost:8000"
@cd $(DIST_DIR)/docs && python3 -m http.server 8000
# ============================================================================
# Utility targets
# ============================================================================
.PHONY: clean
clean: ## Clean all build artifacts
@echo "Cleaning build artifacts..."
$(NU) $(TOOLS_DIR)/build/clean-build.nu \
--scope all \
--force \
--verbose=$(VERBOSE)
rm -rf $(DIST_DIR) $(PACKAGES_DIR) $(BUILD_DIR)
.PHONY: clean-dist
clean-dist: ## Clean only distribution artifacts
@echo "Cleaning distribution artifacts..."
$(NU) $(TOOLS_DIR)/build/clean-build.nu \
--scope dist \
--force
.PHONY: install
install: ## Install the built system locally
@echo "Installing system locally..."
@if [ ! -f $(DIST_DIR)/install.sh ]; then \
echo "Error: No installer found. Run 'make dist-generate' first."; \
exit 1; \
fi
@cd $(DIST_DIR) && sudo ./install.sh
.PHONY: uninstall
uninstall: ## Uninstall the system
@echo "Uninstalling system..."
@if [ -f /usr/local/bin/uninstall-provisioning.sh ]; then \
sudo /usr/local/bin/uninstall-provisioning.sh; \
else \
echo "No uninstaller found. Manual removal required."; \
fi
.PHONY: status
status: ## Show build system status
@echo "Build System Status"
@echo "==================="
@echo "Project: $(PROJECT_NAME)"
@echo "Version: $(VERSION)"
@echo "Git Commit: $(GIT_COMMIT)"
@echo "Build Time: $(BUILD_TIME)"
@echo ""
@echo "Directories:"
@echo " Source: $(SRC_DIR)"
@echo " Tools: $(TOOLS_DIR)"
@echo " Build: $(BUILD_DIR)"
@echo " Distribution: $(DIST_DIR)"
@echo " Packages: $(PACKAGES_DIR)"
@echo ""
@echo "Configuration:"
@echo " Rust Target: $(RUST_TARGET)"
@echo " Build Mode: $(BUILD_MODE)"
@echo " Platforms: $(PLATFORMS)"
@echo " Variants: $(VARIANTS)"
@echo ""
@$(NU) $(TOOLS_DIR)/distribution/generate-distribution.nu status
.PHONY: info
info: ## Show detailed system information
@echo "System Information"
@echo "=================="
@echo "OS: $(shell uname -s -r)"
@echo "Architecture: $(shell uname -m)"
@echo "User: $(shell whoami)"
@echo "Working Directory: $(CURDIR)"
@echo ""
@echo "Tool Versions:"
@echo " Nushell: $(shell $(NU) --version 2>/dev/null || echo 'not found')"
@echo " Rust: $(shell $(CARGO) --version 2>/dev/null || echo 'not found')"
@echo " Docker: $(shell $(DOCKER) --version 2>/dev/null || echo 'not found')"
@echo " Git: $(shell git --version 2>/dev/null || echo 'not found')"
# ============================================================================
# CI/CD integration targets
# ============================================================================
.PHONY: ci-build
ci-build: ## CI build pipeline
@echo "CI Build Pipeline"
@echo "=================="
$(MAKE) clean
$(MAKE) build-all
$(MAKE) test-dist
$(MAKE) package-all
.PHONY: ci-test
ci-test: ## CI test pipeline
@echo "CI Test Pipeline"
@echo "================"
$(MAKE) validate-all
$(MAKE) test-build
.PHONY: ci-release
ci-release: ## CI release pipeline
@echo "CI Release Pipeline"
@echo "=================="
$(MAKE) ci-build
$(MAKE) create-archives
$(MAKE) create-installers
.PHONY: cd-deploy
cd-deploy: ## CD deployment pipeline
@echo "CD Deployment Pipeline"
@echo "======================"
$(MAKE) release
$(MAKE) upload-artifacts
$(MAKE) update-registry
$(MAKE) notify-release
# ============================================================================
# Platform-specific targets
# ============================================================================
.PHONY: linux
linux: ## Build for Linux only
@echo "Building for Linux..."
$(MAKE) build-platform PLATFORMS=linux-amd64
$(MAKE) dist-generate PLATFORMS=linux-amd64
.PHONY: macos
macos: ## Build for macOS only
@echo "Building for macOS..."
$(MAKE) build-platform PLATFORMS=macos-amd64
$(MAKE) dist-generate PLATFORMS=macos-amd64
.PHONY: windows
windows: ## Build for Windows only
@echo "Building for Windows..."
$(MAKE) build-platform PLATFORMS=windows-amd64
$(MAKE) dist-generate PLATFORMS=windows-amd64
# ============================================================================
# Debugging targets
# ============================================================================
.PHONY: debug
debug: ## Build with debug information
@echo "Debug build..."
$(MAKE) build-all BUILD_MODE=debug VERBOSE=true
.PHONY: debug-info
debug-info: ## Show debug information
@echo "Debug Information"
@echo "================="
@echo "Make Variables:"
@echo " MAKEFILE_LIST: $(MAKEFILE_LIST)"
@echo " CURDIR: $(CURDIR)"
@echo " SHELL: $(SHELL)"
@echo ""
@echo "Environment Variables:"
@env | grep -E "(CARGO|RUST|NU|DOCKER)" | sort
# ============================================================================
# Phony targets declaration
# ============================================================================
.PHONY: help all build-all build-platform build-core validate-kcl build-cross
.PHONY: package-all dist-generate package-binaries package-containers create-archives create-installers
.PHONY: release release-draft upload-artifacts notify-release update-registry
.PHONY: dev-build test-build test-dist validate-all benchmark
.PHONY: docs docs-serve
.PHONY: clean clean-dist install uninstall status info
.PHONY: ci-build ci-test ci-release cd-deploy
.PHONY: linux macos windows debug debug-info
# ============================================================================
# Special targets
# ============================================================================
# Disable built-in rules
.SUFFIXES:
# Keep intermediate files
.SECONDARY:
# Delete targets on error
.DELETE_ON_ERROR:
# Export all variables to sub-make processes
.EXPORT_ALL_VARIABLES: