|
1 | | -APP_NAME = laclm |
2 | | -CMD_DIR = ./cmd/$(APP_NAME) |
3 | | -BIN_DIR = ./bin |
4 | | -BIN_PATH = $(BIN_DIR)/$(APP_NAME) |
| 1 | +APP_NAME := laclm |
| 2 | +CMD_DIR := ./cmd/$(APP_NAME) |
| 3 | +BIN_DIR := ./bin |
| 4 | +BUILD_DIR := ./build |
5 | 5 |
|
6 | 6 | GOFILES := $(shell find . -name '*.go' -type f) |
7 | 7 |
|
8 | | -.PHONY: all build clean run test lint build-linux build-mac build-win |
| 8 | +# Target platforms: OS_ARCH |
| 9 | +TARGETS := \ |
| 10 | + linux_amd64 \ |
| 11 | + linux_arm64 |
9 | 12 |
|
| 13 | +.PHONY: all build build-cross clean run test lint vendor package |
| 14 | + |
| 15 | +## Default target |
10 | 16 | all: build |
11 | 17 |
|
12 | | -## Build the app |
13 | | -build: $(GOFILES) |
| 18 | +## Build for local OS/arch using vendored deps |
| 19 | +build: vendor $(GOFILES) |
14 | 20 | @echo "Building $(APP_NAME)..." |
15 | 21 | @mkdir -p $(BIN_DIR) |
16 | | - go build -o $(BIN_PATH) $(CMD_DIR) |
| 22 | + GOOS="" GOARCH="" go build -mod=vendor -o $(BIN_DIR)/$(APP_NAME) $(CMD_DIR) |
| 23 | + |
| 24 | +## Build cross-compiled binaries for all Linux targets |
| 25 | +build-cross: vendor $(GOFILES) |
| 26 | + @echo "Cross building for targets: $(TARGETS)" |
| 27 | + @mkdir -p $(BIN_DIR) |
| 28 | + @for target in $(TARGETS); do \ |
| 29 | + OS=$${target%_*}; \ |
| 30 | + ARCH=$${target#*_}; \ |
| 31 | + OUT=$(BIN_DIR)/$(APP_NAME)-$$OS-$$ARCH; \ |
| 32 | + echo "Building $$OUT..."; \ |
| 33 | + GOOS=$$OS GOARCH=$$ARCH go build -mod=vendor -o $$OUT $(CMD_DIR); \ |
| 34 | + done |
17 | 35 |
|
18 | 36 | ## Run the app |
19 | 37 | run: build |
20 | 38 | @echo "Running $(APP_NAME)..." |
21 | | - @$(BIN_PATH) |
| 39 | + @$(BIN_DIR)/$(APP_NAME) |
22 | 40 |
|
23 | | -## Clean build artifacts |
| 41 | +## Clean build and package directories |
24 | 42 | clean: |
25 | 43 | @echo "Cleaning..." |
26 | | - @rm -rf $(BIN_DIR) |
| 44 | + @rm -rf $(BIN_DIR) $(BUILD_DIR) vendor |
27 | 45 |
|
28 | 46 | ## Run tests |
29 | 47 | test: |
|
35 | 53 | @echo "Linting..." |
36 | 54 | @golangci-lint run |
37 | 55 |
|
38 | | -## Cross-build for Linux |
39 | | -build-linux: |
40 | | - GOOS=linux GOARCH=amd64 go build -o $(BIN_DIR)/$(APP_NAME)-linux $(CMD_DIR) |
| 56 | +## Vendor dependencies |
| 57 | +vendor: |
| 58 | + @echo "Vendoring dependencies..." |
| 59 | + go mod vendor |
| 60 | + |
| 61 | +## Package full project source (with vendor) for each target |
| 62 | +package: clean vendor |
| 63 | + @echo "Packaging full source tarballs for: $(TARGETS)" |
| 64 | + @mkdir -p $(BUILD_DIR) |
| 65 | + @for target in $(TARGETS); do \ |
| 66 | + OS=$${target%_*}; \ |
| 67 | + ARCH=$${target#*_}; \ |
| 68 | + NAME=$(APP_NAME)-$$OS-$$ARCH; \ |
| 69 | + TARBALL=$$NAME-source.tar.gz; \ |
| 70 | + echo "Creating $$TARBALL..."; \ |
| 71 | + mkdir -p tmp/$$NAME; \ |
| 72 | + cp -r * tmp/$$NAME; \ |
| 73 | + rm -rf tmp/$$NAME/$(BUILD_DIR) tmp/$$NAME/$(BIN_DIR); \ |
| 74 | + tar -czf $(BUILD_DIR)/$$TARBALL -C tmp $$NAME; \ |
| 75 | + rm -rf tmp/$$NAME; \ |
| 76 | + done |
| 77 | + @rm -rf tmp |
0 commit comments