-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
288 lines (229 loc) · 9.93 KB
/
Copy pathMakefile
File metadata and controls
288 lines (229 loc) · 9.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# =============================================================================
# Longbow-Quarrel Makefile
# =============================================================================
# Build targets for all supported architectures:
# - CPU (linux/amd64, linux/arm64): Pure Go with SIMD fallbacks
# - Metal (darwin/arm64, darwin/amd64): Apple Metal GPU acceleration
# - NVIDIA (linux/amd64): CUDA/cuBLAS acceleration
# - TPU (linux/amd64): Google TPU/XLA acceleration
# =============================================================================
.PHONY: all clean test build cpu metal nvidia tpu install check deps help
# Default target
all: cpu
# =============================================================================
# Variables
# =============================================================================
BINARY_NAME ?= quarrel
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
BUILD_TIME ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
GO := go
GOARCH ?= $(shell go env GOARCH)
GOOS ?= $(shell go env GOOS)
# Build flags
LDFLAGS ?= -s -w -extldflags=-static
CGO_FLAGS ?=
# Output directories
BIN_DIR ?= bin
DIST_DIR ?= dist
# CUDA/TPU specific
CUDA_PATH ?= /usr/local/cuda
TPU_PATH ?= /usr/local/tpu
# SIMD options (auto-detect unless specified)
SIMD_LEVEL ?= auto # auto, avx512, avx2, scalar
# =============================================================================
# Build Targets
# =============================================================================
# Build for CPU (default, cross-platform)
build: cpu
# CPU builds (pure Go, no GPU)
cpu: cpu-linux-amd64 cpu-linux-arm64
cpu-linux-amd64:
@echo "Building $(BINARY_NAME) for linux/amd64 (CPU)..."
$(GO) build -ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64 ./cmd/quarrel
cpu-linux-arm64:
@echo "Building $(BINARY_NAME) for linux/arm64 (CPU)..."
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-arm64 ./cmd/quarrel
cpu-darwin-amd64:
@echo "Building $(BINARY_NAME) for darwin/amd64 (CPU)..."
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 $(GO) build -ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-destdir=$(BIN_DIR) -o $(BIN_DIR)/$(BINARY_NAME)-darwin-amd64 ./cmd/quarrel
cpu-darwin-arm64:
@echo "Building $(BINARY_NAME) for darwin/arm64 (CPU)..."
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 $(GO) build -ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-darwin-arm64 ./cmd/quarrel
# Metal builds (macOS with GPU)
metal: metal-darwin-arm64 metal-darwin-amd64
metal-darwin-arm64:
@echo "Building $(BINARY_NAME) for darwin/arm64 (Metal)..."
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 $(GO) build -tags metal \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-darwin-arm64-metal ./cmd/quarrel
metal-darwin-amd64:
@echo "Building $(BINARY_NAME) for darwin/amd64 (Metal)..."
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 $(GO) build -tags metal \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-darwin-amd64-metal ./cmd/quarrel
# NVIDIA CUDA builds (linux/amd64)
nvidia: nvidia-cuda
nvidia-cuda:
@echo "Building $(BINARY_NAME) for linux/amd64 (CUDA)..."
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 $(GO) build -tags cuda \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64-cuda ./cmd/quarrel
# TPU builds (linux/amd64)
tpu: tpu-xla
tpu-xla:
@echo "Building $(BINARY_NAME) for linux/amd64 (TPU)..."
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 $(GO) build -tags tpu \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64-tpu ./cmd/quarrel
# =============================================================================
# SIMD-specific builds (x86 with AVX512/AVX2 fallbacks)
# =============================================================================
# AVX-512 build (will auto-detect and fallback to AVX2 or scalar at runtime)
simd-avx512:
@echo "Building $(BINARY_NAME) with AVX-512 (auto-fallback to AVX2/scalar)..."
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 $(GO) build -tags cgo \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64-simd ./cmd/quarrel
# Force AVX2 only (no AVX512)
simd-avx2:
@echo "Building $(BINARY_NAME) with AVX2..."
DISABLE_AVX512=1 CGO_ENABLED=1 GOOS=linux GOARCH=amd64 $(GO) build -tags cgo \
-ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64-avx2 ./cmd/quarrel
# Pure scalar (no SIMD)
simd-scalar:
@echo "Building $(BINARY_NAME) with scalar fallbacks only..."
CGO_ENABLED=0 $(GO) build -ldflags "$(LDFLAGS) -X main.Version=$(VERSION) -X main.BuildTime=$(BUILD_TIME)" \
-o $(BIN_DIR)/$(BINARY_NAME)-linux-amd64-scalar ./cmd/quarrel
# =============================================================================
# Docker builds
# =============================================================================
docker-cpu:
@echo "Building Docker image for CPU..."
docker build -f Dockerfile.cpu -t $(BINARY_NAME):cpu .
docker-metal:
@echo "Building Docker image for Metal..."
docker build -f Dockerfile.metal -t $(BINARY_NAME):metal .
docker-nvidia:
@echo "Building Docker image for NVIDIA CUDA..."
docker build -f Dockerfile.nvidia -t $(BINARY_NAME):nvidia .
docker-tpu:
@echo "Building Docker image for TPU..."
docker build -f Dockerfile.tpu -t $(BINARY_NAME):tpu .
docker-all: docker-cpu docker-nvidia docker-tpu
# =============================================================================
# Development
# =============================================================================
# Install dependencies
deps:
$(GO) mod download
$(GO) mod tidy
# Run tests
test:
$(GO) test -v -race -cover ./...
# Run tests with specific build tags
test-cuda:
$(GO) test -v -tags cuda ./...
test-metal:
$(GO) test -v -tags metal ./...
test-tpu:
$(GO) test -v -tags tpu ./...
# SIMD tests (AVX-512/AVX-2)
test-simd:
CGO_ENABLED=1 $(GO) test -v -tags cgo ./internal/simd/...
test-simd-quick:
CGO_ENABLED=1 $(GO) test -v -tags cgo -run "QuickCheck" ./internal/simd/...
test-simd-fuzz:
CGO_ENABLED=1 $(GO) test -v -tags cgo -fuzz -fuzztime=10s ./internal/simd/...
# SIMD benchmarks
bench-simd:
CGO_ENABLED=1 $(GO) test -v -bench=AVX512 -benchmem ./internal/simd/...
bench-simd-all:
CGO_ENABLED=1 $(GO) test -bench=. -benchmem ./internal/simd/...
# Go vet
check:
$(GO) vet ./...
# Go vet with security
check-sec:
gosec ./...
# Run linter
lint:
golangci-lint run --timeout 5m
# Format code
fmt:
$(GO) fmt ./...
gofmt -s -w .
# =============================================================================
# CI/CD Targets
# =============================================================================
# Build all binaries for release
release: release-linux release-darwin release-docker
release-linux: cpu-linux-amd64 cpu-linux-arm64 nvidia-cuda tpu-xla
release-darwin: cpu-darwin-amd64 cpu-darwin-arm64 metal-darwin-arm64
release-docker: docker-all
# Build with race detector
race:
CGO_ENABLED=1 $(GO) build -race -o $(BIN_DIR)/$(BINARY_NAME)-race ./cmd/quarrel
# Benchmark
bench:
$(GO) test -bench=. -benchmem ./...
# =============================================================================
# Cleanup
# =============================================================================
clean:
rm -rf $(BIN_DIR)
rm -rf $(DIST_DIR)
$(GO) clean
# =============================================================================
# Help
# =============================================================================
help:
@echo "Longbow-Quarrel Build System"
@echo ""
@echo "Available targets:"
@echo " all Build all CPU binaries (default)"
@echo " cpu Build CPU versions (linux/amd64, linux/arm64)"
@echo " cpu-* Build for specific CPU platform"
@echo " metal Build Metal GPU versions (darwin)"
@echo " nvidia Build NVIDIA CUDA version"
@echo " tpu Build Google TPU version"
@echo " simd-* Build with specific SIMD level"
@echo " docker-* Build Docker images"
@echo " test Run tests"
@echo " check Run go vet"
@echo " check-sec Run security check (gosec)"
@echo " lint Run linter"
@echo " release Build all release binaries"
@echo " race Build with race detector"
@echo " bench Run benchmarks"
@echo " clean Clean build artifacts"
@echo " help Show this help"
@echo ""
@echo "Build examples:"
@echo " make cpu # Build CPU versions"
@echo " make nvidia # Build CUDA version"
@echo " make tpu # Build TPU version"
@echo " make simd-avx512 # Build with AVX-512"
@echo " make docker-nvidia # Build CUDA Docker image"
@echo ""
@echo "Environment variables:"
@echo " BINARY_NAME Output binary name (default: quarrel)"
@echo " VERSION Version string"
@echo " LDFLAGS Additional ldflags"
@echo " SIMD_LEVEL SIMD level: auto, avx512, avx2, scalar"
# =============================================================================
# Verify build environment
# =============================================================================
verify-env:
@echo "Build Environment:"
@echo " GOOS: $(GOOS)"
@echo " GOARCH: $(GOARCH)"
@echo " CGO_ENABLED: $(shell go env CGO_ENABLED)"
@echo " SIMD support:"
@echo " AVX-512: $$([ -r /proc/cpuinfo ] && grep -q avx512f /proc/cpuinfo && echo 'available' || echo 'N/A')"
@echo " AVX2: $$([ -r /proc/cpuinfo ] && grep -q avx2 /proc/cpuinfo && echo 'available' || echo 'N/A')"
@echo " NEON: $(shell echo $(GOARCH))"