mirror of
https://github.com/Twigpine/zero.git
synced 2026-11-10 05:01:28 -10:00
* fix pinned Go quality toolchain * fix(make): use a POSIX GOTOOLCHAIN prefix for pinned tool targets The Windows_NT branch used cmd.exe syntax (set "..." &&), but GNU Make runs recipes through sh even on Windows (MSYS/Git Bash), where that form fails and breaks make lint-static/deadcode/vulncheck. A plain GOTOOLCHAIN=... prefix works everywhere, so the OS check is gone. Also switch GO_VERSION/GO_TOOLCHAIN to recursive expansion so 'go list -m' only runs when a tool target actually needs it, instead of at parse time for every target. Addresses PR review from CodeRabbit and Copilot. Co-Authored-By: Claude Fable 5 <[email protected]> * fix(build): make pinned-tool targets shell-neutral, fix README drift Address code review on PR #689: - lint-static/deadcode/vulncheck previously set GOTOOLCHAIN via a POSIX `VAR=value cmd` recipe prefix. GNU Make on Windows runs recipes through whatever SHELL is configured, and under a native cmd.exe setup that syntax is invalid — cmd.exe treats the whole "GOTOOLCHAIN=go1.26.5" token as the program to run and fails before go ever executes (reproduced locally: cmd.exe errors with "'MYVAR' is not recognized..." for the equivalent pattern). Switched to a target-specific `export`, which sets the variable in the child process environment via Make itself, before is invoked — works under sh, cmd.exe, and PowerShell alike (verified against all three targets with SHELL := cmd.exe). - README.md's Code Quality and Security Checks section still told contributors to run the raw `go run ...@version` commands this PR identifies as selecting the wrong (older) toolchain and failing to load this Go 1.26.5 module — only CI and AGENTS.md had been updated to the new make targets. Points steps 3-4 at `make lint-static` / `make vulncheck` instead, matching AGENTS.md. Verified end-to-end: `make vulncheck`, `make deadcode`, and `make lint-static` all run successfully and reach their tools (deadcode's advisory report and lint-static's 35 pre-existing findings match the PR's documented baseline). Co-Authored-By: Claude Sonnet 5 <[email protected]> * fix(build): support stock macOS make --------- Co-authored-by: Claude Fable 5 <[email protected]>
81 lines
2.8 KiB
Makefile
81 lines
2.8 KiB
Makefile
# Zero build/test/lint targets. AGENTS.md says to build and run quality checks
|
|
# with `make` — these targets back those instructions.
|
|
.DEFAULT_GOAL := build
|
|
GO_VERSION = $(word 2,$(shell git grep -G -h "^go[[:space:]]" -- go.mod))
|
|
GO_TOOLCHAIN = go$(GO_VERSION)
|
|
DEADCODE_VERSION := v0.46.0
|
|
GOLANGCI_LINT_VERSION := v2.12.2
|
|
GOVULNCHECK_VERSION := v1.3.0
|
|
|
|
.PHONY: build build-all test test-race vet fmt fmt-check lint lint-static deadcode vulncheck tidy clean baseline help
|
|
|
|
# Build the main CLI binary into ./zero.
|
|
build:
|
|
go build -o zero ./cmd/zero
|
|
|
|
# Build every command in cmd/.
|
|
build-all:
|
|
go build ./...
|
|
|
|
# Run the full test suite with the race detector (matches CI expectations).
|
|
test:
|
|
go test ./... -race -count=1
|
|
|
|
# Faster, no race detector.
|
|
test-quick:
|
|
go test ./...
|
|
|
|
vet:
|
|
go vet ./...
|
|
|
|
fmt:
|
|
gofmt -w $(shell git ls-files '*.go')
|
|
|
|
# Fail if any tracked Go file is not gofmt-clean.
|
|
fmt-check:
|
|
@out="$$(gofmt -l $$(git ls-files '*.go'))"; \
|
|
if [ -n "$$out" ]; then echo "gofmt needed:"; echo "$$out"; exit 1; fi
|
|
|
|
# Lint = formatting check + vet (no extra tooling required).
|
|
lint: fmt-check vet
|
|
|
|
# Versioned tools select the toolchain from their own modules when invoked with
|
|
# package@version. Read this module's go directive directly, without invoking
|
|
# the possibly stale Go toolchain or consulting a multi-module GOWORK. git grep
|
|
# works with both POSIX shells and cmd.exe, including GNU Make 3.81 on macOS.
|
|
# The target-specific export is shell-independent.
|
|
lint-static deadcode vulncheck: export GOTOOLCHAIN = $(GO_TOOLCHAIN)
|
|
|
|
lint-static:
|
|
go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION) run --enable-only unused,ineffassign,staticcheck ./...
|
|
|
|
deadcode:
|
|
go run golang.org/x/tools/cmd/deadcode@$(DEADCODE_VERSION) -test=false ./...
|
|
|
|
vulncheck:
|
|
go run golang.org/x/vuln/cmd/govulncheck@$(GOVULNCHECK_VERSION) ./...
|
|
|
|
tidy:
|
|
go mod tidy
|
|
|
|
clean:
|
|
rm -f zero
|
|
go clean ./...
|
|
|
|
# Run the per-turn benchmark harness over the checked-in baseline manifest and
|
|
# write the JSON result to internal/perfbench/reports/baseline.json. Requires a
|
|
# built `zero` binary and a model; set ZERO_BENCH_MODEL (required) and
|
|
# ZERO_BENCH_BINARY (defaults to ./zero) to configure the run. The report is
|
|
# machine-specific and regenerated, not hand-edited.
|
|
baseline: build
|
|
@if [ -z "$(ZERO_BENCH_MODEL)" ]; then echo "Set ZERO_BENCH_MODEL (and optionally ZERO_BENCH_BINARY) before running 'make baseline'"; exit 2; fi
|
|
@ZERO_BIN="$${ZERO_BENCH_BINARY:-./zero}"; \
|
|
go run ./cmd/zero-perf-bench turn \
|
|
--suite internal/perfbench/manifests/baseline.json \
|
|
--model $(ZERO_BENCH_MODEL) \
|
|
--binary "$$ZERO_BIN" \
|
|
--output internal/perfbench/reports/baseline.json
|
|
|
|
help:
|
|
@echo "Targets: build (default), build-all, test, test-quick, vet, fmt, fmt-check, lint, lint-static, deadcode, vulncheck, tidy, clean, baseline"
|