Files
nyaKazuhaandClaude Fable 5 962261ba12 fix(ffi): 统一 cgo 链接与 release 构建 profile
internal/ffi/ffi.go 的 cgo LDFLAGS 硬编码 -L target/debug,而 build-rust 用
--release(产物落 target/release),干净环境下 make build/test-go/ci 必然
报 cannot find -lbat_ffi。

- LDFLAGS 指向 target/release,并加 -Wl,-rpath 让产物运行时无需 LD_LIBRARY_PATH
  即可定位 libbat_ffi.so;删除指向不存在目录的无效 CFLAGS -I(C 声明本就内联)。
- 新增 build-ffi target(cargo build --release -p bat-ffi),build-go 与 test-go
  依赖它,确保链接前 release FFI 库已存在。

验证:make build-go 成功产出并可运行 bin/bat;make test-go 链接并通过;
go vet(check-go)通过。

对应 issue #18 维护清单 1-6。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 07:46:37 -07:00

191 lines
6.0 KiB
Makefile

.PHONY: help build build-ffi test clean check fmt lint install dev docker-build docker-up docker-down official-smoke
# 默认目标
.DEFAULT_GOAL := help
# 颜色输出
BLUE := \033[0;34m
GREEN := \033[0;32m
YELLOW := \033[0;33m
NC := \033[0m # No Color
help: ## 显示帮助信息
@echo "$(BLUE)BlueArchive Toolkit - Makefile 命令$(NC)"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " $(GREEN)%-15s$(NC) %s\n", $$1, $$2}'
# ============================================================================
# 构建相关
# ============================================================================
build: build-rust build-go ## 构建所有组件
build-rust: ## 构建 Rust 组件
@echo "$(BLUE)Building Rust workspace...$(NC)"
cargo build --release --workspace
build-ffi: ## 构建 bat-ffi release 库(cgo 链接依赖)
@echo "$(BLUE)Building bat-ffi (release)...$(NC)"
cargo build --release -p bat-ffi
build-go: build-ffi ## 构建 Go 组件
@echo "$(BLUE)Building Go CLI...$(NC)"
@if [ -f cmd/bat/main.go ]; then \
go build -o bin/bat ./cmd/bat; \
else \
echo "$(YELLOW)Go CLI entrypoint not implemented yet, skipping...$(NC)"; \
fi
install: ## 安装到本地
@echo "$(BLUE)Installing bat CLI...$(NC)"
@if [ -f cmd/bat/main.go ]; then \
go install ./cmd/bat; \
else \
echo "$(YELLOW)Go CLI entrypoint not implemented yet, skipping...$(NC)"; \
fi
# ============================================================================
# 测试相关
# ============================================================================
test: test-rust test-go ## 运行所有测试
test-rust: ## 运行 Rust 测试
@echo "$(BLUE)Running Rust tests...$(NC)"
cargo test --workspace
test-go: build-ffi ## 运行 Go 测试
@echo "$(BLUE)Running Go tests...$(NC)"
@if [ -n "$$(go list ./... 2>/dev/null)" ]; then \
go test -v ./...; \
else \
echo "$(YELLOW)No Go packages yet, skipping...$(NC)"; \
fi
bench: ## 运行性能基准测试
@echo "$(BLUE)Running benchmarks...$(NC)"
cargo bench --workspace
@if [ -n "$$(go list ./... 2>/dev/null)" ]; then \
go test -bench=. -benchmem ./...; \
else \
echo "$(YELLOW)No Go packages yet, skipping Go benchmarks...$(NC)"; \
fi
official-smoke: ## 运行真实官方全量拉取 smoke(默认写入 /tmp 隔离目录)
@echo "$(BLUE)Running official full pull smoke...$(NC)"
./scripts/official-full-pull-smoke.sh
# ============================================================================
# 代码质量
# ============================================================================
check: check-rust check-go ## 检查代码(不编译)
check-rust: ## 检查 Rust 代码
@echo "$(BLUE)Checking Rust code...$(NC)"
cargo check --workspace
check-go: ## 检查 Go 代码
@echo "$(BLUE)Checking Go code...$(NC)"
@if [ -n "$$(go list ./... 2>/dev/null)" ]; then \
go vet ./...; \
else \
echo "$(YELLOW)No Go packages yet, skipping...$(NC)"; \
fi
fmt: fmt-rust fmt-go ## 格式化所有代码
fmt-rust: ## 格式化 Rust 代码
@echo "$(BLUE)Formatting Rust code...$(NC)"
cargo fmt --all
fmt-go: ## 格式化 Go 代码
@echo "$(BLUE)Formatting Go code...$(NC)"
@if [ -n "$$(go list ./... 2>/dev/null)" ]; then \
go fmt ./...; \
else \
echo "$(YELLOW)No Go packages yet, skipping...$(NC)"; \
fi
lint: lint-rust lint-go ## 运行所有 Linter
lint-rust: ## Rust Clippy 检查
@echo "$(BLUE)Running Clippy...$(NC)"
cargo clippy --workspace -- -D warnings
lint-go: ## Go Linter 检查
@echo "$(BLUE)Running golangci-lint...$(NC)"
@command -v golangci-lint >/dev/null 2>&1 || { echo "$(YELLOW)golangci-lint not installed, skipping...$(NC)"; exit 0; }
@if [ -n "$$(go list ./... 2>/dev/null)" ]; then \
golangci-lint run ./...; \
else \
echo "$(YELLOW)No Go packages yet, skipping...$(NC)"; \
fi
# ============================================================================
# 清理
# ============================================================================
clean: ## 清理构建产物
@echo "$(BLUE)Cleaning build artifacts...$(NC)"
cargo clean
rm -rf bin/
go clean
# ============================================================================
# 开发环境
# ============================================================================
dev: ## 启动开发环境(数据库等)
@echo "$(BLUE)Starting development environment...$(NC)"
docker compose -f deployments/docker-compose.dev.yml up -d
dev-stop: ## 停止开发环境
@echo "$(BLUE)Stopping development environment...$(NC)"
docker compose -f deployments/docker-compose.dev.yml down
# ============================================================================
# Docker
# ============================================================================
docker-build: ## 构建 Docker 镜像
@echo "$(BLUE)Building Docker images...$(NC)"
docker compose -f deployments/docker-compose.yml build
docker-up: ## 启动 Docker 容器
@echo "$(BLUE)Starting Docker containers...$(NC)"
docker compose -f deployments/docker-compose.yml up -d
docker-down: ## 停止 Docker 容器
@echo "$(BLUE)Stopping Docker containers...$(NC)"
docker compose -f deployments/docker-compose.yml down
# ============================================================================
# 依赖管理
# ============================================================================
deps: ## 安装/更新依赖
@echo "$(BLUE)Updating dependencies...$(NC)"
go mod download
cargo fetch
tidy: ## 整理依赖
@echo "$(BLUE)Tidying dependencies...$(NC)"
go mod tidy
cargo update --workspace
# ============================================================================
# 文档
# ============================================================================
docs: ## 生成文档
@echo "$(BLUE)Generating documentation...$(NC)"
cargo doc --workspace --no-deps --open
# ============================================================================
# CI/CD
# ============================================================================
ci: fmt lint test ## 运行 CI 检查(本地模拟)
@echo "$(GREEN)✓ All CI checks passed!$(NC)"