build: use WEB_GO for web targets and preserve backend dist directory (#1671)

Separate web Go commands from the default Go toolchain so web builds,
tests, and vet can enable CGO on Darwin without affecting the rest of
the project. Also ensure frontend backend builds recreate backend/dist
with a .gitkeep file so the embedded output directory remains tracked.
This commit is contained in:
wenjie 2026-03-17 15:23:49 +08:00 committed by GitHub
parent b402888bfa
commit 0499cdab72
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 27 additions and 13 deletions

View file

@ -16,6 +16,7 @@ LDFLAGS=-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COM
# Go variables # Go variables
GO?=CGO_ENABLED=0 go GO?=CGO_ENABLED=0 go
WEB_GO?=$(GO)
GOFLAGS?=-v -tags stdjson GOFLAGS?=-v -tags stdjson
# Patch MIPS LE ELF e_flags (offset 36) for NaN2008-only kernels (e.g. Ingenic X2600). # Patch MIPS LE ELF e_flags (offset 36) for NaN2008-only kernels (e.g. Ingenic X2600).
@ -79,6 +80,7 @@ ifeq ($(UNAME_S),Linux)
endif endif
else ifeq ($(UNAME_S),Darwin) else ifeq ($(UNAME_S),Darwin)
PLATFORM=darwin PLATFORM=darwin
WEB_GO=CGO_ENABLED=1 go
ifeq ($(UNAME_M),x86_64) ifeq ($(UNAME_M),x86_64)
ARCH=amd64 ARCH=amd64
else ifeq ($(UNAME_M),arm64) else ifeq ($(UNAME_M),arm64)
@ -119,7 +121,7 @@ build-launcher:
echo "Building frontend..."; \ echo "Building frontend..."; \
cd web/frontend && pnpm install && pnpm build:backend; \ cd web/frontend && pnpm install && pnpm build:backend; \
fi fi
@$(GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH) ./web/backend @$(WEB_GO) build $(GOFLAGS) -o $(BUILD_DIR)/picoclaw-launcher-$(PLATFORM)-$(ARCH) ./web/backend
@ln -sf picoclaw-launcher-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/picoclaw-launcher @ln -sf picoclaw-launcher-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/picoclaw-launcher
@echo "Build complete: $(BUILD_DIR)/picoclaw-launcher" @echo "Build complete: $(BUILD_DIR)/picoclaw-launcher"
@ -219,7 +221,9 @@ clean:
## vet: Run go vet for static analysis ## vet: Run go vet for static analysis
vet: generate vet: generate
@$(GO) vet ./... @packages="$$(go list ./...)" && \
$(GO) vet $$(printf '%s\n' "$$packages" | grep -v '^github.com/sipeed/picoclaw/web/')
@cd web/backend && $(WEB_GO) vet ./...
## test: Test Go code ## test: Test Go code
test: generate test: generate

View file

@ -1,17 +1,18 @@
.PHONY: dev dev-frontend dev-backend build test lint clean .PHONY: dev dev-frontend dev-backend build test lint clean
# Go variables
GO?=CGO_ENABLED=0 go
WEB_GO?=$(GO)
GOFLAGS?=-v -tags stdjson
# Version # Version
VERSION?=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") VERSION?=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
GIT_COMMIT=$(shell git rev-parse --short=8 HEAD 2>/dev/null || echo "dev") GIT_COMMIT=$(shell git rev-parse --short=8 HEAD 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%FT%T%z) BUILD_TIME=$(shell date +%FT%T%z)
GO_VERSION=$(shell $(GO) version | awk '{print $$3}') GO_VERSION=$(shell $(WEB_GO) version | awk '{print $$3}')
CONFIG_PKG=github.com/sipeed/picoclaw/pkg/config CONFIG_PKG=github.com/sipeed/picoclaw/pkg/config
LDFLAGS=-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COMMIT) -X $(CONFIG_PKG).BuildTime=$(BUILD_TIME) -X $(CONFIG_PKG).GoVersion=$(GO_VERSION) -s -w LDFLAGS=-X $(CONFIG_PKG).Version=$(VERSION) -X $(CONFIG_PKG).GitCommit=$(GIT_COMMIT) -X $(CONFIG_PKG).BuildTime=$(BUILD_TIME) -X $(CONFIG_PKG).GoVersion=$(GO_VERSION) -s -w
# Go variables
GO?=CGO_ENABLED=0 go
GOFLAGS?=-v -tags stdjson
# OS detection # OS detection
UNAME_S:=$(shell uname -s) UNAME_S:=$(shell uname -s)
@ -37,7 +38,7 @@ ifeq ($(UNAME_S),Linux)
endif endif
else ifeq ($(UNAME_S),Darwin) else ifeq ($(UNAME_S),Darwin)
PLATFORM=darwin PLATFORM=darwin
GO=CGO_ENABLED=1 go WEB_GO=CGO_ENABLED=1 go
ifeq ($(UNAME_M),x86_64) ifeq ($(UNAME_M),x86_64)
ARCH=amd64 ARCH=amd64
else ifeq ($(UNAME_M),arm64) else ifeq ($(UNAME_M),arm64)
@ -69,21 +70,21 @@ dev-frontend:
# Start backend dev server # Start backend dev server
dev-backend: dev-backend:
cd backend && ${GO} run -ldflags "$(LDFLAGS)" . cd backend && ${WEB_GO} run -ldflags "$(LDFLAGS)" .
# Build frontend and embed into Go binary # Build frontend and embed into Go binary
build: build:
cd frontend && pnpm build:backend cd frontend && pnpm build:backend
cd backend && ${GO} build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o picoclaw-web . cd backend && ${WEB_GO} build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o picoclaw-web .
# Run all tests # Run all tests
test: test:
cd backend && ${GO} test ./... cd backend && ${WEB_GO} test ./...
cd frontend && pnpm lint cd frontend && pnpm lint
# Lint and format # Lint and format
lint: lint:
cd backend && ${GO} vet ./... cd backend && ${WEB_GO} vet ./...
cd frontend && pnpm check cd frontend && pnpm check
# Clean build artifacts # Clean build artifacts

View file

@ -6,7 +6,7 @@
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "tsc -b && vite build", "build": "tsc -b && vite build",
"build:backend": "tsc -b && vite build --outDir ../backend/dist --emptyOutDir", "build:backend": "tsc -b && vite build --outDir ../backend/dist --emptyOutDir && node ./scripts/ensure-backend-gitkeep.cjs",
"lint": "eslint .", "lint": "eslint .",
"preview": "vite preview", "preview": "vite preview",
"format": "prettier --check .", "format": "prettier --check .",

View file

@ -0,0 +1,9 @@
const fs = require("node:fs")
const path = require("node:path")
const gitkeepPath = path.resolve(__dirname, "../../backend/dist/.gitkeep")
const gitkeepContents =
"# Keep the embedded web backend dist directory in version control.\n"
fs.mkdirSync(path.dirname(gitkeepPath), { recursive: true })
fs.writeFileSync(gitkeepPath, gitkeepContents)