Files
chatlog2/Makefile
T

156 lines
5.7 KiB
Makefile

BINARY_NAME := chatlog
GO := go
# Embed version into binary
ifeq ($(VERSION),)
VERSION := $(shell git describe --tags --always --dirty="-dev" 2>/dev/null)
endif
ifeq ($(VERSION),)
VERSION := dev
endif
LDFLAGS := -ldflags '-X "github.com/sjzar/chatlog/pkg/version.Version=$(VERSION)" -w -s'
PLATFORMS := \
darwin/amd64 \
darwin/arm64 \
linux/amd64 \
linux/arm64 \
windows/amd64 \
windows/arm64
UPX_PLATFORMS := \
darwin/amd64 \
linux/amd64 \
linux/arm64 \
windows/amd64
# Cross-compiler hints (override if paths differ)
CC_WIN_AMD64 ?= x86_64-w64-mingw32-gcc
CC_WIN_ARM64 ?= aarch64-w64-mingw32-gcc
CC_DARWIN_AMD64 ?= o64-clang
CC_DARWIN_ARM64 ?= oa64-clang
.PHONY: all clean lint tidy test build upx
all: clean lint tidy test build
clean:
@echo "🧹 Cleaning..."
@rm -rf bin/
lint:
@echo "🕵️‍♂️ Running linters..."
golangci-lint run ./...
tidy:
@echo "🧼 Tidying up dependencies..."
$(GO) mod tidy
test:
@echo "🧪 Running tests..."
$(GO) test ./... -cover
build:
@echo "🔨 Building for current platform..."
@mkdir -p bin
@CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME) main.go
buildcross:
@echo "[cross] Interactive cross-compilation selection (Windows/macOS)"
@mkdir -p bin
@printf "\nSelect target platforms to build (enter digits, e.g., 134):\n 1) windows/amd64\n 2) windows/arm64\n 3) darwin/amd64 (macOS Intel)\n 4) darwin/arm64 (Apple Silicon)\n> "; \
read choices; \
opts=$$(printf "%s" "$$choices" | tr -cd '1234' | sed 's/./& /g'); \
for ch in $$opts; do \
case $$ch in \
1) \
ccbin=$${CC_WIN_AMD64:-x86_64-w64-mingw32-gcc}; \
: # On Windows host: do not force CC, use local toolchain \
if [ "$(OS)" = "Windows_NT" ]; then \
echo "🧭 Host: Windows"; \
tmp="bin/$(BINARY_NAME)_windows_amd64.exe.new.$$RANDOM"; \
GOOS=windows GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \
{ mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_amd64.exe" 2>/dev/null || \
echo "⚠️ Target locked, kept: $$tmp"; }; \
else \
if command -v "$$ccbin" >/dev/null 2>&1; then \
echo "⚙️ Using CC=$$ccbin"; \
tmp="bin/$(BINARY_NAME)_windows_amd64.exe.new.$$RANDOM"; \
env CC="$$ccbin" GOOS=windows GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \
{ mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_amd64.exe" 2>/dev/null || \
echo "⚠️ Target locked, kept: $$tmp"; }; \
else \
echo "⏭️ Skip windows/amd64: $$ccbin not found (Arch: sudo pacman -S --needed mingw-w64-gcc)"; \
fi; \
fi \
;; \
2) \
ccbin=$${CC_WIN_ARM64:-aarch64-w64-mingw32-gcc}; \
: # windows/arm64 needs aarch64 toolchain \
if [ "$(OS)" = "Windows_NT" ]; then \
if command -v "$$ccbin" >/dev/null 2>&1; then \
echo "⚙️ Using CC=$$ccbin"; \
tmp="bin/$(BINARY_NAME)_windows_arm64.exe.new.$$RANDOM"; \
env CC="$$ccbin" GOOS=windows GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \
{ mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_arm64.exe" 2>/dev/null || \
echo "⚠️ Target locked, kept: $$tmp"; }; \
else \
echo "⏭️ Skip windows/arm64: $$ccbin not found (MSYS2: pacman -S mingw-w64-aarch64-gcc)"; \
fi; \
else \
if command -v "$$ccbin" >/dev/null 2>&1; then \
echo "⚙️ Using CC=$$ccbin"; \
tmp="bin/$(BINARY_NAME)_windows_arm64.exe.new.$$RANDOM"; \
env CC="$$ccbin" GOOS=windows GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o "$$tmp" main.go && \
{ mv -f "$$tmp" "bin/$(BINARY_NAME)_windows_arm64.exe" 2>/dev/null || \
echo "⚠️ Target locked, kept: $$tmp"; }; \
else \
echo "⏭️ Skip windows/arm64: $$ccbin not found (Arch: sudo pacman -S --needed mingw-w64-gcc)"; \
fi; \
fi \
;; \
3) \
ccdarwin=$${CC_DARWIN_AMD64:-o64-clang}; \
if [ "$(OS)" = "Windows_NT" ] || [ "$$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]')" = "linux" ]; then \
: # Non-macOS hosts need osxcross o64-clang \
if command -v "$$ccdarwin" >/dev/null 2>&1; then \
echo "⚙️ Using CC=$$ccdarwin"; \
env CC="$$ccdarwin" GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_amd64; \
else \
echo "⏭️ Skip darwin/amd64: $$ccdarwin not found (need osxcross)"; \
fi; \
else \
: # macOS host: try system clang \
if command -v clang >/dev/null 2>&1; then \
echo "⚙️ Using CC=clang"; \
env CC=clang GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_amd64; \
else \
echo "⏭️ Skip darwin/amd64: clang not found"; \
fi; \
fi \
;; \
4) \
ccdarwin=$${CC_DARWIN_ARM64:-oa64-clang}; \
if [ "$(OS)" = "Windows_NT" ] || [ "$$(uname -s 2>/dev/null | tr '[:upper:]' '[:lower:]')" = "linux" ]; then \
: # Non-macOS hosts need osxcross oa64-clang \
if command -v "$$ccdarwin" >/dev/null 2>&1; then \
echo "⚙️ Using CC=$$ccdarwin"; \
env CC="$$ccdarwin" GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_arm64; \
else \
echo "⏭️ Skip darwin/arm64: $$ccdarwin not found (need osxcross)"; \
fi; \
else \
: # macOS host: try system clang \
if command -v clang >/dev/null 2>&1; then \
echo "⚙️ Using CC=clang"; \
env CC=clang GOOS=darwin GOARCH=arm64 CGO_ENABLED=1 $(GO) build -trimpath $(LDFLAGS) -o bin/$(BINARY_NAME)_darwin_arm64; \
else \
echo "⏭️ Skip darwin/arm64: clang not found"; \
fi; \
fi \
;; \
*) \
echo "❓ Unknown option: $$ch (valid: 1 2 3 4)"; \
;; \
esac; \
done