Spaces:
Sleeping
Sleeping
| # 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 "-s -w -X main.version=$(VERSION) -X main.gitCommit=$(GIT_COMMIT) -X main.buildTime=$(BUILD_TIME) -X main.goVersion=$(GO_VERSION)" | |
| # Go variables | |
| GO?=go | |
| GOFLAGS?=-v | |
| # Installation | |
| INSTALL_PREFIX?=$(HOME)/.local | |
| INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin | |
| INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1 | |
| # 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),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) | |
| ## run: Run the agent | |
| run: build | |
| @./$(BUILD_DIR)/$(BINARY_NAME) agent | |
| ## test: Run tests | |
| test: | |
| @$(GO) test ./... | |
| ## 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=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) | |
| @cp $(BUILD_DIR)/$(BINARY_NAME) $(INSTALL_BIN_DIR)/$(BINARY_NAME) | |
| @chmod +x $(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: | |
| @$(GO) vet ./... | |
| ## fmt: Format Go code | |
| fmt: | |
| @$(GO) fmt ./... | |
| ## 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 | |
| ## 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)" | |