Files
autoglue/Makefile
2025-11-02 22:30:34 +00:00

278 lines
9.3 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# --- variables ---
GOCMD ?= go
GOINSTALL := $(GOCMD) install
BIN ?= autoglue
MAIN ?= main.go
UI_DIR ?= ui
UI_DEST_DIR ?= internal/web
# Module path (used for ldflags to internal/version)
GIT_HOST ?= github.com
GIT_USER ?= glueops
MODULE_PATH ?= $(GIT_HOST)/$(GIT_USER)/$(BIN)
# SDK / module settings (Go)
SDK_REPO ?= $(BIN)-sdk-go # repo name used for module path
SDK_OUTDIR ?= sdk/go # output directory (inside repo)
SDK_PKG ?= ${BIN} # package name inside the SDK
UI_SSG_ROUTES ?= /,/login,/docs,/pricing
# Go versioning (go.mod uses major.minor; youre on 1.25.3)
GO_VERSION ?= 1.25.3
# SDK / package settings (TypeScript)
SDK_TS_OUTDIR ?= sdk/ts
SDK_TS_GEN ?= typescript-fetch
SDK_TS_NPM_NAME ?= @glueops/$(SDK_REPO)
SDK_TS_NPM_VER ?= 0.1.0
SDK_TS_DIR := $(abspath $(SDK_TS_OUTDIR))
SDK_TS_PROPS ?= supportsES6=true,typescriptThreePlus=true,useSingleRequestParameter=true,withSeparateModelsAndApi=true,modelPropertyNaming=original,enumPropertyNaming=original,useUnionTypes=true
SDK_TS_PROPS_FLAGS := $(foreach p,$(subst , ,$(SDK_TS_PROPS)),-p $(p))
# Path for vendored UI SDK (absolute, path-safe)
SDK_TS_UI_OUTDIR ?= ui/src/sdk
SDK_TS_UI_DIR := $(abspath $(SDK_TS_UI_OUTDIR))
SWAG := $(shell command -v swag 2>/dev/null)
GMU := $(shell command -v go-mod-upgrade 2>/dev/null)
YARN := $(shell command -v yarn 2>/dev/null)
NPM := $(shell command -v npm 2>/dev/null)
OGC := $(shell command -v openapi-generator-cli 2>/dev/null || command -v openapi-generator 2>/dev/null)
BROTLI := $(shell command -v brotli 2>/dev/null)
GZIP := $(shell command -v gzip 2>/dev/null)
.DEFAULT_GOAL := build
# --- version metadata (ldflags) ---
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
COMMIT := $(shell git rev-parse HEAD 2>/dev/null || echo "none")
DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
BUILT_BY := $(shell whoami)
LDFLAGS := -X '$(MODULE_PATH)/internal/version.Version=$(VERSION)' \
-X '$(MODULE_PATH)/internal/version.Commit=$(COMMIT)' \
-X '$(MODULE_PATH)/internal/version.Date=$(DATE)' \
-X '$(MODULE_PATH)/internal/version.BuiltBy=$(BUILT_BY)'
# --- phony targets ---
.PHONY: all prepare ui-install ui-build ui swagger build clean fmt vet tidy upgrade \
sdk sdk-go sdk-ts sdk-ts-ui sdk-all worksync wire-sdk-replace help dev ui-compress \
print-version
# --- meta targets ---
all: build
prepare: fmt vet tidy upgrade
# --- go hygiene ---
fmt:
@$(GOCMD) fmt ./...
vet:
@$(GOCMD) vet ./...
tidy:
@$(GOCMD) mod tidy
upgrade:
@echo ">> Checking go-mod-upgrade..."
@if [ -z "$(GMU)" ]; then \
echo "Installing go-mod-upgrade..."; \
$(GOINSTALL) github.com/oligot/go-mod-upgrade@latest; \
fi
@go-mod-upgrade -f || true
# --- ui ---
ui-install:
@echo ">> Installing UI deps in $(UI_DIR)..."
@if [ -n "$(YARN)" ]; then \
cd $(UI_DIR) && yarn install --frozen-lockfile; \
elif [ -n "$(NPM)" ]; then \
cd $(UI_DIR) && npm ci; \
else \
echo "Error: neither yarn nor npm is installed." >&2; exit 1; \
fi
ui-build: ui-install
@echo ">> Building UI in $(UI_DIR)..."
@rm -rf $(UI_DEST_DIR)/dist
@if [ -n "$(YARN)" ]; then \
cd $(UI_DIR) && yarn build; \
else \
cd $(UI_DIR) && npm run build; \
fi
ui-compress: ui-build
@echo ">> Precompressing assets (brotli + gzip) in $(UI_DEST_DIR)/dist"
@if [ -n "$(BROTLI)" ]; then \
find "$(UI_DEST_DIR)/dist" -type f \( -name '*.js' -o -name '*.css' -o -name '*.html' \) -print0 | \
xargs -0 -I{} brotli -f {}; \
else echo "brotli not found; skipping .br"; fi
@if [ -n "$(GZIP)" ]; then \
find "$(UI_DEST_DIR)/dist" -type f \( -name '*.js' -o -name '*.css' -o -name '*.html' \) -print0 | \
xargs -0 -I{} gzip -kf {}; \
else echo "gzip not found; skipping .gz"; fi
ui: ui-compress
# --- swagger ---
swagger:
@echo ">> Generating Swagger docs..."
@if [ -z "$(SWAG)" ]; then \
echo "Installing swag..."; \
$(GOINSTALL) github.com/swaggo/swag/cmd/swag@latest; \
fi
@rm -rf docs/swagger.* docs/docs.go
@swag init -g $(MAIN) -o docs
# --- build ---
build: prepare ui swagger sdk-all
@echo ">> Building Go binary: $(BIN)"
@$(GOCMD) build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN) $(MAIN)
# Handy: print resolved version metadata
print-version:
@echo "VERSION = $(VERSION)"
@echo "COMMIT = $(COMMIT)"
@echo "DATE = $(DATE)"
@echo "BUILT_BY = $(BUILT_BY)"
@echo "LDFLAGS = $(LDFLAGS)"
# --- development ---
dev: ui-install swagger
@echo ">> Starting Vite (frontend) and Go API (backend) with dev env..."
@cd $(UI_DIR) && \
( \
if command -v yarn >/dev/null 2>&1; then \
yarn dev & \
elif command -v npm >/dev/null 2>&1; then \
npm run dev & \
else \
echo "Error: neither yarn nor npm is installed." >&2; exit 1; \
fi; \
cd .. && \
$(GOCMD) run . serve & \
wait \
)
# --- sdk generation (Go) ---
sdk-go: swagger
@echo ">> Generating Go SDK (module $(GIT_HOST)/$(GIT_USER)/$(SDK_REPO), Go $(GO_VERSION))..."
@set -e; \
export GO_POST_PROCESS_FILE="gofmt -w"; \
if [ -z "$(OGC)" ]; then \
if [ -z "$(NPM)" ]; then \
echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; \
fi; \
echo "Installing openapi-generator-cli..."; \
$(NPM) i -g @openapitools/openapi-generator-cli; \
OGC_BIN=openapi-generator-cli; \
else \
OGC_BIN="$(OGC)"; \
fi; \
rm -rf "$(SDK_OUTDIR)"; \
mkdir -p "$(SDK_OUTDIR)"; \
"$$OGC_BIN" generate \
--enable-post-process-file \
--generate-alias-as-model \
-i docs/swagger.json \
-g go \
-o "$(SDK_OUTDIR)" \
--additional-properties=packageName=$(SDK_PKG) \
--git-host "$(GIT_HOST)" \
--git-user-id "$(GIT_USER)" \
--git-repo-id "$(SDK_REPO)"; \
cd "$(SDK_OUTDIR)"; \
$(GOCMD) mod edit -go=$(GO_VERSION); \
$(GOCMD) mod tidy
# --- sdk generation (TypeScript) ---
sdk-ts: swagger
@set -e; \
if [ -z "$(OGC)" ]; then \
if [ -z "$(NPM)" ]; then echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; fi; \
echo "Installing openapi-generator-cli..."; \
$(NPM) i -g @openapitools/openapi-generator-cli; \
OGC_BIN=openapi-generator-cli; \
else \
OGC_BIN="$(OGC)"; \
fi; \
rm -rf "$(SDK_TS_DIR)"; \
mkdir -p "$(SDK_TS_DIR)"; \
"$$OGC_BIN" generate \
-i docs/swagger.json \
-g "$(SDK_TS_GEN)" \
-o "$(SDK_TS_DIR)" \
-p npmName=$(SDK_TS_NPM_NAME) \
-p npmVersion=$(SDK_TS_NPM_VER) \
$(SDK_TS_PROPS_FLAGS); \
if [ ! -d "$(SDK_TS_DIR)" ]; then \
echo "Generation failed: $(SDK_TS_DIR) not found." >&2; exit 1; \
fi; \
if command -v npx >/dev/null 2>&1; then \
echo ">> Prettier: formatting generated TS SDK"; \
cd "$(SDK_TS_DIR)" && npx --yes prettier -w . || true; \
fi; \
echo ">> Installing & building TS SDK in $(SDK_TS_DIR)"; \
if command -v yarn >/dev/null 2>&1; then \
cd "$(SDK_TS_DIR)" && yarn install --frozen-lockfile || true; \
cd "$(SDK_TS_DIR)" && yarn build || true; \
elif command -v npm >/dev/null 2>&1; then \
cd "$(SDK_TS_DIR)" && npm ci || npm install || true; \
cd "$(SDK_TS_DIR)" && npm run build || true; \
else \
echo "Warning: neither yarn nor npm is installed; skipping install/build for TS SDK."; \
fi
# --- sdk generation (TypeScript into UI/src) ---
sdk-ts-ui: swagger
@echo ">> Generating TypeScript SDK directly into UI source: $(SDK_TS_UI_DIR)"
@set -e; \
if [ -z "$(OGC)" ]; then \
if [ -z "$(NPM)" ]; then \
echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; \
fi; \
echo "Installing openapi-generator-cli..."; \
$(NPM) i -g @openapitools/openapi-generator-cli; \
OGC_BIN=openapi-generator-cli; \
else \
OGC_BIN="$(OGC)"; \
fi; \
rm -rf "$(SDK_TS_UI_DIR)"; \
mkdir -p "$(SDK_TS_UI_DIR)"; \
"$$OGC_BIN" generate \
-i docs/swagger.json \
-g typescript-fetch \
-o "$(SDK_TS_UI_DIR)" \
-p npmName=$(SDK_TS_NPM_NAME) \
-p npmVersion=$(SDK_TS_NPM_VER) \
$(SDK_TS_PROPS_FLAGS); \
# --- move src/* up one level ---
@if [ -d "$(SDK_TS_UI_DIR)/src" ]; then \
mv "$(SDK_TS_UI_DIR)/src/"* "$(SDK_TS_UI_DIR)/"; \
rm -rf "$(SDK_TS_UI_DIR)/src"; \
fi; \
rm -f "$(SDK_TS_UI_DIR)/package.json" "$(SDK_TS_UI_DIR)/tsconfig.json" "$(SDK_TS_UI_DIR)/README.md"
# convenience
sdk-all: sdk-go sdk-ts sdk-ts-ui
sdk: sdk-go
# --- clean/help ---
clean:
@echo ">> Cleaning artifacts..."
@rm -rf "$(BIN)" docs/swagger.* docs/docs.go $(UI_DEST_DIR)/dist $(UI_DIR)/dist $(UI_DIR)/node_modules "$(SDK_OUTDIR)" "$(SDK_TS_OUTDIR)"
help:
@echo "Targets:"
@echo " build - fmt, vet, tidy, upgrade, build UI, generate Swagger, build Go binary (with ldflags)"
@echo " ui - build the Vite UI and copy to $(UI_DEST_DIR)/dist (with compression)"
@echo " swagger - (re)generate Swagger docs using swag"
@echo " sdk-go (sdk) - generate Go SDK with correct module path and Go version"
@echo " sdk-ts - generate TypeScript SDK (typescript-fetch) with package.json"
@echo " sdk-ts-ui - generate TypeScript SDK directly into ui/src for inline consumption"
@echo " sdk-all - generate both Go and TypeScript SDKs"
@echo " dev - run Vite UI dev server + Go API"
@echo " clean - remove binary, Swagger outputs, UI dist, and SDKs"
@echo " prepare - fmt, vet, tidy, upgrade deps"
@echo " print-version - show computed ldflags values"