A Transparent and Verifiable Way to Sync the AT Protocol's PLC Directory
1.PHONY: all build install test clean fmt lint help version bump-patch bump-minor bump-major release release-build
2.PHONY: docker-build docker-buildx docker-push docker-run docker-clean docker-shell compose-up compose-down compose-logs
3
4# Binary name
5BINARY_NAME=plcbundle
6INSTALL_PATH=$(GOPATH)/bin
7
8# Docker configuration
9DOCKER_IMAGE=plcbundle
10DOCKER_TAG=$(VERSION)
11DOCKER_REGISTRY?=atscan
12DOCKER_FULL_IMAGE=$(if $(DOCKER_REGISTRY),$(DOCKER_REGISTRY)/,)$(DOCKER_IMAGE):$(DOCKER_TAG)
13DOCKER_LATEST=$(if $(DOCKER_REGISTRY),$(DOCKER_REGISTRY)/,)$(DOCKER_IMAGE):latest
14DOCKER_PLATFORMS?=linux/amd64,linux/arm64
15
16# Version information
17VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
18GIT_COMMIT := $(shell git rev-parse --short HEAD 2>/dev/null || echo "unknown")
19BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
20
21# Go commands
22GOCMD=go
23GOBUILD=$(GOCMD) build
24GOINSTALL=$(GOCMD) install
25GOCLEAN=$(GOCMD) clean
26GOTEST=$(GOCMD) test
27GOGET=$(GOCMD) get
28GOFMT=$(GOCMD) fmt
29GOMOD=$(GOCMD) mod
30
31# Build flags
32LDFLAGS=-ldflags "-X main.version=$(VERSION) -X main.gitCommit=$(GIT_COMMIT) -X main.buildDate=$(BUILD_DATE)"
33
34# Default target
35all: build
36
37# Build the CLI tool with version info
38build:
39 @echo "Building $(BINARY_NAME) $(VERSION)..."
40 $(GOBUILD) $(LDFLAGS) -o $(BINARY_NAME) ./cmd/plcbundle
41
42# Install the CLI tool globally
43install:
44 @echo "Installing $(BINARY_NAME) $(VERSION)..."
45 $(GOINSTALL) $(LDFLAGS) ./cmd/plcbundle
46
47# Run tests
48test:
49 @echo "Running tests..."
50 $(GOTEST) -v ./...
51
52# Run tests with coverage
53test-coverage:
54 @echo "Running tests with coverage..."
55 $(GOTEST) -v -cover ./...
56
57# Clean build artifacts
58clean:
59 @echo "Cleaning..."
60 $(GOCLEAN)
61 rm -f $(BINARY_NAME)
62 rm -rf dist/
63
64# Format code
65fmt:
66 @echo "Formatting code..."
67 $(GOFMT) ./...
68
69# Download dependencies
70deps:
71 @echo "Downloading dependencies..."
72 $(GOMOD) download
73 $(GOMOD) tidy
74
75# Verify dependencies
76verify:
77 @echo "Verifying dependencies..."
78 $(GOMOD) verify
79
80# Show current version
81version:
82 @echo "Current version: $(VERSION)"
83 @echo "Git commit: $(GIT_COMMIT)"
84 @echo "Build date: $(BUILD_DATE)"
85
86# Bump patch version (0.1.0 -> 0.1.1)
87bump-patch:
88 @echo "Bumping patch version..."
89 @./scripts/bump-version.sh patch
90
91# Bump minor version (0.1.0 -> 0.2.0)
92bump-minor:
93 @echo "Bumping minor version..."
94 @./scripts/bump-version.sh minor
95
96# Bump major version (0.1.0 -> 1.0.0)
97bump-major:
98 @echo "Bumping major version..."
99 @./scripts/bump-version.sh major
100
101# Create release
102release:
103 @echo "Creating release for version $(VERSION)..."
104 @./scripts/release.sh
105
106# ============================================================================
107# Docker Commands
108# ============================================================================
109
110# Build Docker image (local)
111docker-build:
112 @echo "Building Docker image $(DOCKER_FULL_IMAGE)..."
113 docker build \
114 --build-arg VERSION=$(VERSION) \
115 --build-arg GIT_COMMIT=$(GIT_COMMIT) \
116 --build-arg BUILD_DATE="$(BUILD_DATE)" \
117 -t $(DOCKER_FULL_IMAGE) \
118 -t $(DOCKER_LATEST) \
119 .
120 @echo "✓ Built: $(DOCKER_FULL_IMAGE)"
121
122# Build multi-platform and push
123docker-buildx:
124 @echo "Building multi-platform image $(DOCKER_FULL_IMAGE)..."
125 docker buildx build \
126 --platform $(DOCKER_PLATFORMS) \
127 --build-arg VERSION=$(VERSION) \
128 --build-arg GIT_COMMIT=$(GIT_COMMIT) \
129 --build-arg BUILD_DATE="$(BUILD_DATE)" \
130 --tag $(DOCKER_FULL_IMAGE) \
131 --tag $(DOCKER_LATEST) \
132 --push \
133 .
134 @echo "✓ Built and pushed: $(DOCKER_FULL_IMAGE) ($(DOCKER_PLATFORMS))"
135
136# Push Docker image
137docker-push:
138 @echo "Pushing Docker image..."
139 docker push $(DOCKER_FULL_IMAGE)
140 docker push $(DOCKER_LATEST)
141 @echo "✓ Pushed: $(DOCKER_FULL_IMAGE)"
142
143# Run Docker container as CLI
144docker-run:
145 @docker run --rm -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) plcbundle $(CMD)
146
147# Shortcuts
148docker-info:
149 @docker run --rm -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) plcbundle info
150
151docker-fetch:
152 @docker run --rm -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) plcbundle fetch
153
154docker-verify:
155 @docker run --rm -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) plcbundle verify
156
157# Run as server
158docker-serve:
159 docker run --rm -it -p 8080:8080 -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) plcbundle serve --host 0.0.0.0
160
161# Open shell
162docker-shell:
163 docker run --rm -it -v $(PWD)/data:/data $(DOCKER_FULL_IMAGE) sh
164
165# Clean Docker artifacts
166docker-clean:
167 @echo "Cleaning Docker images..."
168 docker rmi $(DOCKER_FULL_IMAGE) $(DOCKER_LATEST) 2>/dev/null || true
169 docker image prune -f
170
171# ============================================================================
172# Help
173# ============================================================================
174
175help:
176 @echo "Available targets:"
177 @echo ""
178 @echo "Build & Install:"
179 @echo " make build - Build the CLI tool"
180 @echo " make install - Install CLI tool globally"
181 @echo " make clean - Clean build artifacts"
182 @echo ""
183 @echo "Development:"
184 @echo " make test - Run tests"
185 @echo " make test-coverage - Run tests with coverage"
186 @echo " make fmt - Format code"
187 @echo " make deps - Download dependencies"
188 @echo ""
189 @echo "Release:"
190 @echo " make version - Show current version"
191 @echo " make bump-patch - Bump patch (0.1.0 -> 0.1.1)"
192 @echo " make bump-minor - Bump minor (0.1.0 -> 0.2.0)"
193 @echo " make bump-major - Bump major (0.1.0 -> 1.0.0)"
194 @echo " make release - Push tag to trigger release"
195 @echo ""
196 @echo "Docker:"
197 @echo " make docker-build - Build image (current platform)"
198 @echo " make docker-buildx - Build multi-platform and push"
199 @echo " make docker-run - Run CLI (CMD='info')"
200 @echo " make docker-info - Show bundle info"
201 @echo " make docker-serve - Run as server"
202 @echo " make docker-shell - Open shell"
203 @echo ""