mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
89bc7aaea5
make test and make vet fail on a fresh clone because the go:embed workspace directory does not exist until go generate runs. The build target already depends on generate, but test and vet did not. Also fixes the test target comment which incorrectly read '## fmt: Format Go code'.
190 lines
5.6 KiB
Makefile
190 lines
5.6 KiB
Makefile
.PHONY: all build install uninstall clean help test
|
|
|
|
# Build variables
|
|
BINARY_NAME=picoclaw
|
|
BUILD_DIR=build
|
|
CMD_DIR=cmd/$(BINARY_NAME)
|
|
MAIN_GO=$(CMD_DIR)/main.go
|
|
|
|
# Version
|
|
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")
|
|
BUILD_TIME=$(shell date +%FT%T%z)
|
|
GO_VERSION=$(shell $(GO) version | awk '{print $$3}')
|
|
LDFLAGS=-ldflags "-X main.version=$(VERSION) -X main.gitCommit=$(GIT_COMMIT) -X main.buildTime=$(BUILD_TIME) -X main.goVersion=$(GO_VERSION) -s -w"
|
|
|
|
# Go variables
|
|
GO?=go
|
|
GOFLAGS?=-v -tags stdjson
|
|
|
|
# Golangci-lint
|
|
GOLANGCI_LINT?=golangci-lint
|
|
|
|
# Installation
|
|
INSTALL_PREFIX?=$(HOME)/.local
|
|
INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin
|
|
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1
|
|
INSTALL_TMP_SUFFIX=.new
|
|
|
|
# Workspace and Skills
|
|
PICOCLAW_HOME?=$(HOME)/.picoclaw
|
|
WORKSPACE_DIR?=$(PICOCLAW_HOME)/workspace
|
|
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
|
|
BUILTIN_SKILLS_DIR=$(CURDIR)/skills
|
|
|
|
# OS detection
|
|
UNAME_S:=$(shell uname -s)
|
|
UNAME_M:=$(shell uname -m)
|
|
|
|
# Platform-specific settings
|
|
ifeq ($(UNAME_S),Linux)
|
|
PLATFORM=linux
|
|
ifeq ($(UNAME_M),x86_64)
|
|
ARCH=amd64
|
|
else ifeq ($(UNAME_M),aarch64)
|
|
ARCH=arm64
|
|
else ifeq ($(UNAME_M),loongarch64)
|
|
ARCH=loong64
|
|
else ifeq ($(UNAME_M),riscv64)
|
|
ARCH=riscv64
|
|
else
|
|
ARCH=$(UNAME_M)
|
|
endif
|
|
else ifeq ($(UNAME_S),Darwin)
|
|
PLATFORM=darwin
|
|
ifeq ($(UNAME_M),x86_64)
|
|
ARCH=amd64
|
|
else ifeq ($(UNAME_M),arm64)
|
|
ARCH=arm64
|
|
else
|
|
ARCH=$(UNAME_M)
|
|
endif
|
|
else
|
|
PLATFORM=$(UNAME_S)
|
|
ARCH=$(UNAME_M)
|
|
endif
|
|
|
|
BINARY_PATH=$(BUILD_DIR)/$(BINARY_NAME)-$(PLATFORM)-$(ARCH)
|
|
|
|
# Default target
|
|
all: build
|
|
|
|
## generate: Run generate
|
|
generate:
|
|
@echo "Run generate..."
|
|
@rm -r ./$(CMD_DIR)/workspace 2>/dev/null || true
|
|
@$(GO) generate ./...
|
|
@echo "Run generate complete"
|
|
|
|
## build: Build the picoclaw binary for current platform
|
|
build: generate
|
|
@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
|
|
@mkdir -p $(BUILD_DIR)
|
|
@$(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR)
|
|
@echo "Build complete: $(BINARY_PATH)"
|
|
@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)
|
|
|
|
## build-all: Build picoclaw for all platforms
|
|
build-all: generate
|
|
@echo "Building for multiple platforms..."
|
|
@mkdir -p $(BUILD_DIR)
|
|
GOOS=linux GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
|
|
GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
|
|
GOOS=linux GOARCH=loong64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-loong64 ./$(CMD_DIR)
|
|
GOOS=linux GOARCH=riscv64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
|
|
GOOS=darwin GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-arm64 ./$(CMD_DIR)
|
|
GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
|
|
@echo "All builds complete"
|
|
|
|
## install: Install picoclaw to system and copy builtin skills
|
|
install: build
|
|
@echo "Installing $(BINARY_NAME)..."
|
|
@mkdir -p $(INSTALL_BIN_DIR)
|
|
# Copy binary with temporary suffix to ensure atomic update
|
|
@cp $(BUILD_DIR)/$(BINARY_NAME) $(INSTALL_BIN_DIR)/$(BINARY_NAME)$(INSTALL_TMP_SUFFIX)
|
|
@chmod +x $(INSTALL_BIN_DIR)/$(BINARY_NAME)$(INSTALL_TMP_SUFFIX)
|
|
@mv -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)$(INSTALL_TMP_SUFFIX) $(INSTALL_BIN_DIR)/$(BINARY_NAME)
|
|
@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
|
|
@echo "Installation complete!"
|
|
|
|
## uninstall: Remove picoclaw from system
|
|
uninstall:
|
|
@echo "Uninstalling $(BINARY_NAME)..."
|
|
@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
|
|
@echo "Removed binary from $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
|
|
@echo "Note: Only the executable file has been deleted."
|
|
@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"
|
|
|
|
## uninstall-all: Remove picoclaw and all data
|
|
uninstall-all:
|
|
@echo "Removing workspace and skills..."
|
|
@rm -rf $(PICOCLAW_HOME)
|
|
@echo "Removed workspace: $(PICOCLAW_HOME)"
|
|
@echo "Complete uninstallation done!"
|
|
|
|
## clean: Remove build artifacts
|
|
clean:
|
|
@echo "Cleaning build artifacts..."
|
|
@rm -rf $(BUILD_DIR)
|
|
@echo "Clean complete"
|
|
|
|
## vet: Run go vet for static analysis
|
|
vet: generate
|
|
@$(GO) vet ./...
|
|
|
|
## test: Test Go code
|
|
test: generate
|
|
@$(GO) test ./...
|
|
|
|
## fmt: Format Go code
|
|
fmt:
|
|
@$(GOLANGCI_LINT) fmt
|
|
|
|
## lint: Run linters
|
|
lint:
|
|
@$(GOLANGCI_LINT) run
|
|
|
|
## deps: Download dependencies
|
|
deps:
|
|
@$(GO) mod download
|
|
@$(GO) mod verify
|
|
|
|
## update-deps: Update dependencies
|
|
update-deps:
|
|
@$(GO) get -u ./...
|
|
@$(GO) mod tidy
|
|
|
|
## check: Run vet, fmt, and verify dependencies
|
|
check: deps fmt vet test
|
|
|
|
## run: Build and run picoclaw
|
|
run: build
|
|
@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)
|
|
|
|
## help: Show this help message
|
|
help:
|
|
@echo "picoclaw Makefile"
|
|
@echo ""
|
|
@echo "Usage:"
|
|
@echo " make [target]"
|
|
@echo ""
|
|
@echo "Targets:"
|
|
@grep -E '^## ' $(MAKEFILE_LIST) | sed 's/## / /'
|
|
@echo ""
|
|
@echo "Examples:"
|
|
@echo " make build # Build for current platform"
|
|
@echo " make install # Install to ~/.local/bin"
|
|
@echo " make uninstall # Remove from /usr/local/bin"
|
|
@echo " make install-skills # Install skills to workspace"
|
|
@echo ""
|
|
@echo "Environment Variables:"
|
|
@echo " INSTALL_PREFIX # Installation prefix (default: ~/.local)"
|
|
@echo " WORKSPACE_DIR # Workspace directory (default: ~/.picoclaw/workspace)"
|
|
@echo " VERSION # Version string (default: git describe)"
|
|
@echo ""
|
|
@echo "Current Configuration:"
|
|
@echo " Platform: $(PLATFORM)/$(ARCH)"
|
|
@echo " Binary: $(BINARY_PATH)"
|
|
@echo " Install Prefix: $(INSTALL_PREFIX)"
|
|
@echo " Workspace: $(WORKSPACE_DIR)"
|