diff --git a/Makefile b/Makefile index e69de29..a0deb72 100644 --- a/Makefile +++ b/Makefile @@ -0,0 +1,284 @@ +# ========================================================= +# Variable +# ========================================================= + +# Framework +# Identity and metadata of framework. Human-readable name, machine-readable names(lower and upper), and semantic version. +FRAMEWORK_REGULAR=Framework Regular +FRAMEWORK_LOWER=frameworklower +FRAMEWORK_UPPER=FRAMEWORKUPPER +FRAMEWORK_VERSION=0.0.0 + +# Software +# Identity and metadata of software. Human-readable name, machine-readable names(lower and upper), and semantic version. +SOFTWARE_REGULAR=Software Regular +SOFTWARE_LOWER=softwarelower +SOFTWARE_UPPER=SOFTWAREUPPER +SOFTWARE_VERSION=0.0.0 + +# Go Module +# App module and import path used by go.mod and source imports. Valid Go module path. +GO_MODULE=go/module + +# Directory +# Locations used by build and management commands. Relative or absolute paths. +SOURCE_DIR=./run/main +RELEASE_DIR=./release +FRAMEWORK_METADATA_DIR=./data/framework/metadata +SOFTWARE_METADATA_DIR=./data/software/metadata + +# File +# Metadata file names without extension. File name only. +FRAMEWORK_METADATA_FLE=resource +SOFTWARE_METADATA_FLE=resource + +# Derived Path +# Automatically generated from directory and file variables. Do not edit. +FRAMEWORK_METADATA_PATH=$(FRAMEWORK_METADATA_DIR)/$(FRAMEWORK_METADATA_FLE) +SOFTWARE_METADATA_PATH=$(SOFTWARE_METADATA_DIR)/$(SOFTWARE_METADATA_FLE) + +# Target File Type +# File types scanned by update commands. Valid find expression. +TARGET_FILE_TYPE=\ + -name "*.go" \ + -o -name "*.json" \ + -o -name "*.yaml" \ + -o -name "*.yml" + +# Go Module Placeholder +# Replacement rules applied by upd-gm-ph. Valid sed replacement expressions. +GO_MODULE_REPLACEMENT=\ + -e 's|gomodule|$(GO_MODULE)|g' \ + -e 's|go/module|$(GO_MODULE)|g' \ + -e 's|go-module|$(GO_MODULE)|g' \ + -e 's|go_module|$(GO_MODULE)|g' + +# ========================================================= +# Command +# ========================================================= + +# PHONY Target +.PHONY: \ + help \ + upd-gm-ph \ + upd-fw-md \ + upd-sw-md \ + go-ini \ + go-tid \ + go-stp \ + pre-rel \ + go-bld \ + go-bld-lin \ + go-bld-win \ + go-bld-mac \ + bld-lin-amd \ + bld-lin-arm \ + bld-win-amd \ + bld-win-arm \ + bld-mac-amd \ + bld-mac-arm + +# Default Command +.DEFAULT_GOAL := help + +# ========================================================= +# Help +# ========================================================= + +help: + @echo "" + @echo "Available Commands:" + @echo "" + @printf " %-18s %s\n" "upd-gm-ph" "Update Go module placeholder" + @printf " %-18s %s\n" "upd-fw-md" "Update framework metadata" + @printf " %-18s %s\n" "upd-sw-md" "Update software metadata" + @echo "" + @printf " %-18s %s\n" "go-ini" "Initialize Go module" + @printf " %-18s %s\n" "go-tid" "Tidy Go module dependencies" + @printf " %-18s %s\n" "go-stp" "Initialize Go module and tidy dependencies" + @echo "" + @printf " %-18s %s\n" "go-bld" "Build all platform binaries" + @printf " %-18s %s\n" "go-bld-lin" "Build all Linux binaries" + @printf " %-18s %s\n" "go-bld-win" "Build all Windows binaries" + @printf " %-18s %s\n" "go-bld-mac" "Build all macOS binaries" + @echo "" + @printf " %-18s %s\n" "bld-lin-amd" "Build Linux AMD64 binary" + @printf " %-18s %s\n" "bld-lin-arm" "Build Linux ARM64 binary" + @echo "" + @printf " %-18s %s\n" "bld-win-amd" "Build Windows AMD64 binary" + @printf " %-18s %s\n" "bld-win-arm" "Build Windows ARM64 binary" + @echo "" + @printf " %-18s %s\n" "bld-mac-amd" "Build macOS AMD64 binary" + @printf " %-18s %s\n" "bld-mac-arm" "Build macOS ARM64 binary" + @echo "" + +# ========================================================= +# Update +# ========================================================= + +upd-gm-ph: + + @find . -type f \ + \( $(TARGET_FILE_TYPE) \) \ + -exec sed -i \ + $(GO_MODULE_REPLACEMENT) \ + {} + + + @if [ -f go.mod ]; then \ + sed -i \ + $(GO_MODULE_REPLACEMENT) \ + go.mod; \ + fi + + @go mod tidy + + @echo "Go Module Updated!" + +upd-fw-md: + + @jq \ + --arg framework_regular "$(FRAMEWORK_REGULAR)" \ + --arg framework_lower "$(FRAMEWORK_LOWER)" \ + --arg framework_upper "$(FRAMEWORK_UPPER)" \ + --arg framework_version "$(FRAMEWORK_VERSION)" \ + '.framework.regular=$$framework_regular|.framework.lower=$$framework_lower|.framework.upper=$$framework_upper|.framework.version=$$framework_version' \ + $(FRAMEWORK_METADATA_PATH).json \ + > $(FRAMEWORK_METADATA_PATH).json.tmp + + @mv $(FRAMEWORK_METADATA_PATH).json.tmp $(FRAMEWORK_METADATA_PATH).json + + @echo "Framework Metadata Updated!" + +upd-sw-md: + + @jq \ + --arg software_regular "$(SOFTWARE_REGULAR)" \ + --arg software_lower "$(SOFTWARE_LOWER)" \ + --arg software_upper "$(SOFTWARE_UPPER)" \ + --arg software_version "$(SOFTWARE_VERSION)" \ + '.software.regular=$$software_regular|.software.lower=$$software_lower|.software.upper=$$software_upper|.software.version=$$software_version' \ + $(SOFTWARE_METADATA_PATH).json \ + > $(SOFTWARE_METADATA_PATH).json.tmp + + @mv $(SOFTWARE_METADATA_PATH).json.tmp $(SOFTWARE_METADATA_PATH).json + + @echo "Software Metadata Updated!" + +# ========================================================= +# Release +# ========================================================= + +pre-rel: + @test -n "$(RELEASE_DIR)" + @mkdir -p "$(RELEASE_DIR)" + @find "$(RELEASE_DIR)" -mindepth 1 -delete + +# ========================================================= +# Initialize +# ========================================================= + +go-ini: + @test -f go.mod || go mod init $(GO_MODULE) + +go-tid: + go mod tidy + +go-stp: \ + go-ini \ + go-tid + +# ========================================================= +# Build Group +# ========================================================= + +go-bld: \ + pre-rel \ + go-tid \ + bld-lin-amd \ + bld-lin-arm \ + bld-win-amd \ + bld-win-arm \ + bld-mac-amd \ + bld-mac-arm + +go-bld-lin: \ + pre-rel \ + go-tid \ + bld-lin-amd \ + bld-lin-arm + +go-bld-win: \ + pre-rel \ + go-tid \ + bld-win-amd \ + bld-win-arm + +go-bld-mac: \ + pre-rel \ + go-tid \ + bld-mac-amd \ + bld-mac-arm + +# ========================================================= +# Build Target +# ========================================================= + +# Linux AMD64 +bld-lin-amd: + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-linux-amd64 \ + $(SOURCE_DIR) + +# Linux ARM64 +bld-lin-arm: + CGO_ENABLED=0 GOOS=linux GOARCH=arm64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-linux-arm64 \ + $(SOURCE_DIR) + +# Windows AMD64 +bld-win-amd: + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-windows-amd64.exe \ + $(SOURCE_DIR) + +# Windows ARM64 +bld-win-arm: + CGO_ENABLED=0 GOOS=windows GOARCH=arm64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-windows-arm64.exe \ + $(SOURCE_DIR) + +# macOS AMD64 +bld-mac-amd: + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-macos-amd64 \ + $(SOURCE_DIR) + +# macOS ARM64 +bld-mac-arm: + CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 \ + go build \ + -trimpath \ + -buildvcs=false \ + -ldflags="-s -w" \ + -o $(RELEASE_DIR)/$(SOFTWARE_LOWER)-v$(SOFTWARE_VERSION)-macos-arm64 \ + $(SOURCE_DIR) \ No newline at end of file