.PHONY: help build-all build-linux build-glibc build-windows build-macos install-targets install-cross install-glibc-targets build-cross clean stop
PROJECT_ROOT := $(shell dirname $(shell dirname $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST))))))
LINUX_X86_64 = x86_64-unknown-linux-musl
LINUX_ARM64 = aarch64-unknown-linux-musl
WINDOWS_X86_64 = x86_64-pc-windows-gnu
MACOS_X86_64 = x86_64-apple-darwin
MACOS_ARM64 = aarch64-apple-darwin
TARGETS = $(LINUX_X86_64) $(LINUX_ARM64) $(WINDOWS_X86_64) $(MACOS_X86_64) $(MACOS_ARM64)
OUTPUT_DIR = target/release
CROSS_LINUX_X86_64 = x86_64-unknown-linux-gnu
CROSS_LINUX_ARM64 = aarch64-unknown-linux-gnu
CROSS_WINDOWS_X86_64 = x86_64-pc-windows-msvc
GLIBC_TARGETS = $(CROSS_LINUX_X86_64) $(CROSS_LINUX_ARM64)
help:
@echo "可用命令:"
@echo " make build-all - 构建所有平台 (使用 musl/gnu 目标)"
@echo " make build-linux - 构建 Linux 平台 (x86_64 和 ARM64, musl)"
@echo " make build-glibc - 构建 Linux glibc 平台 (x86_64 和 ARM64, 需要 cross)"
@echo " make build-windows - 构建 Windows 平台 (GNU 工具链)"
@echo " make build-macos - 构建 macOS 平台 (Intel 和 Apple Silicon)"
@echo " make build-cross - 使用 cross 工具构建 (需要先安装 cross)"
@echo " make install-targets - 安装所有目标平台工具链"
@echo " make install-cross - 安装 cross 工具"
@echo " make stop - 停止正在运行的构建进程"
@echo " make clean - 清理构建文件"
stop:
@echo "=========================================="
@echo "停止正在运行的构建进程"
@echo "=========================================="
@if pgrep -f "cargo build" > /dev/null 2>&1; then \
echo "发现 cargo build 进程,正在停止..."; \
pkill -9 -f "cargo build" 2>/dev/null || true; \
echo "已停止 cargo build 进程"; \
else \
echo "未发现 cargo build 进程"; \
fi
@if pgrep -f "cross build" > /dev/null 2>&1; then \
echo "发现 cross build 进程,正在停止..."; \
pkill -9 -f "cross build" 2>/dev/null || true; \
echo "已停止 cross build 进程"; \
else \
echo "未发现 cross build 进程"; \
fi
@if pgrep -f "rustc" > /dev/null 2>&1; then \
echo "发现 rustc 进程,正在停止..."; \
pkill -9 -f "rustc" 2>/dev/null || true; \
echo "已停止 rustc 进程"; \
else \
echo "未发现 rustc 进程"; \
fi
@sleep 1
@echo "进程停止完成"
install-targets:
@echo "安装目标平台工具链..."
@cd $(PROJECT_ROOT) && for target in $(TARGETS); do \
if ! rustup target list --installed | grep -q "^$$target$$"; then \
echo "安装 $$target..."; \
rustup target add $$target || echo "警告: 无法安装 $$target"; \
fi \
done
build-all: stop install-targets
@echo "构建所有平台 (使用 musl/gnu 目标)..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && success=0; fail=0; \
for target in $(TARGETS); do \
echo "构建 $$target..."; \
binary_name="secra-plugins"; \
output_name="secra-plugins-$$target"; \
lib_ext=""; \
if echo $$target | grep -q "windows"; then \
binary_name="$$binary_name.exe"; \
output_name="$$output_name.exe"; \
lib_ext=".dll"; \
elif echo $$target | grep -q "linux"; then \
lib_ext=".so"; \
elif echo $$target | grep -q "darwin"; then \
lib_ext=".dylib"; \
fi; \
if cargo build --workspace --release --target $$target; then \
build_success=1; \
if [ -f "target/$$target/release/$$binary_name" ]; then \
cp "target/$$target/release/$$binary_name" "$(OUTPUT_DIR)/$$output_name"; \
echo " ✓ 主程序构建成功"; \
else \
echo " ✗ 主程序二进制文件不存在"; \
build_success=0; \
fi; \
if [ -n "$$lib_ext" ]; then \
parent_lib=""; \
child_lib=""; \
if echo $$target | grep -q "windows"; then \
parent_lib="parent_plugin$$lib_ext"; \
child_lib="child_plugin$$lib_ext"; \
else \
parent_lib="libparent_plugin$$lib_ext"; \
child_lib="libchild_plugin$$lib_ext"; \
fi; \
if [ -f "target/$$target/release/$$parent_lib" ]; then \
cp "target/$$target/release/$$parent_lib" "$(OUTPUT_DIR)/$$parent_lib-$$target"; \
echo " ✓ parent-plugin 构建成功"; \
fi; \
if [ -f "target/$$target/release/$$child_lib" ]; then \
cp "target/$$target/release/$$child_lib" "$(OUTPUT_DIR)/$$child_lib-$$target"; \
echo " ✓ child-plugin 构建成功"; \
fi; \
fi; \
if [ $$build_success -eq 1 ]; then \
echo "✓ $$target 构建成功"; \
success=$$((success + 1)); \
else \
echo "✗ $$target 构建失败"; \
fail=$$((fail + 1)); \
fi; \
else \
echo "✗ $$target 构建失败"; \
fail=$$((fail + 1)); \
fi; \
done; \
echo ""; \
echo "=========================================="; \
echo "构建统计: 成功 $$success 个,失败 $$fail 个"; \
echo "=========================================="; \
echo ""; \
if [ $$success -gt 0 ]; then \
echo "构建完成的二进制文件:"; \
echo ""; \
for target in $(TARGETS); do \
output_name="secra-plugins-$$target"; \
platform_name=""; \
lib_ext=""; \
if echo $$target | grep -q "x86_64-unknown-linux-musl"; then \
platform_name="Linux (x86_64)"; \
lib_ext=".so"; \
elif echo $$target | grep -q "aarch64-unknown-linux-musl"; then \
platform_name="Linux (ARM64)"; \
lib_ext=".so"; \
elif echo $$target | grep -q "x86_64-pc-windows-gnu"; then \
platform_name="Windows (x86_64)"; \
output_name="$$output_name.exe"; \
lib_ext=".dll"; \
elif echo $$target | grep -q "x86_64-apple-darwin"; then \
platform_name="macOS (Intel)"; \
lib_ext=".dylib"; \
elif echo $$target | grep -q "aarch64-apple-darwin"; then \
platform_name="macOS (Apple Silicon)"; \
lib_ext=".dylib"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$output_name" ]; then \
echo " ✓ $$platform_name 主程序: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$output_name"; \
fi; \
if [ -n "$$lib_ext" ]; then \
parent_lib=""; \
child_lib=""; \
if echo $$target | grep -q "windows"; then \
parent_lib="parent_plugin$$lib_ext"; \
child_lib="child_plugin$$lib_ext"; \
else \
parent_lib="libparent_plugin$$lib_ext"; \
child_lib="libchild_plugin$$lib_ext"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$parent_lib-$$target" ]; then \
echo " ✓ $$platform_name parent-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$parent_lib-$$target"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$child_lib-$$target" ]; then \
echo " ✓ $$platform_name child-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$child_lib-$$target"; \
fi; \
fi; \
done; \
echo ""; \
fi; \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
build-glibc: stop install-cross install-glibc-targets
@if ! command -v cross >/dev/null 2>&1; then \
echo "错误: 未找到 cross 工具,请先运行 make install-cross"; \
exit 1; \
fi
@echo "使用 cross 工具构建 Linux glibc 平台..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && success=0; fail=0; \
for target in $(GLIBC_TARGETS); do \
echo "构建 $$target (glibc)..."; \
binary_name="secra-plugins"; \
output_name="secra-plugins-$$target"; \
lib_ext=".so"; \
if cross build --workspace --release --target $$target; then \
build_success=1; \
if [ -f "target/$$target/release/$$binary_name" ]; then \
cp "target/$$target/release/$$binary_name" "$(OUTPUT_DIR)/$$output_name"; \
echo " ✓ 主程序构建成功"; \
else \
echo " ✗ 主程序二进制文件不存在"; \
build_success=0; \
fi; \
parent_lib="libparent_plugin$$lib_ext"; \
child_lib="libchild_plugin$$lib_ext"; \
if [ -f "target/$$target/release/$$parent_lib" ]; then \
cp "target/$$target/release/$$parent_lib" "$(OUTPUT_DIR)/$$parent_lib-$$target"; \
echo " ✓ parent-plugin 构建成功"; \
fi; \
if [ -f "target/$$target/release/$$child_lib" ]; then \
cp "target/$$target/release/$$child_lib" "$(OUTPUT_DIR)/$$child_lib-$$target"; \
echo " ✓ child-plugin 构建成功"; \
fi; \
if [ $$build_success -eq 1 ]; then \
echo "✓ $$target 构建成功"; \
success=$$((success + 1)); \
else \
echo "✗ $$target 构建失败"; \
fail=$$((fail + 1)); \
fi; \
else \
echo "✗ $$target 构建失败"; \
fail=$$((fail + 1)); \
fi; \
done; \
echo ""; \
echo "=========================================="; \
echo "构建统计: 成功 $$success 个,失败 $$fail 个"; \
echo "=========================================="; \
echo ""; \
if [ $$success -gt 0 ]; then \
echo "构建完成的二进制文件:"; \
echo ""; \
for target in $(GLIBC_TARGETS); do \
output_name="secra-plugins-$$target"; \
platform_name=""; \
lib_ext=".so"; \
if echo $$target | grep -q "x86_64-unknown-linux-gnu"; then \
platform_name="Linux (x86_64, glibc)"; \
elif echo $$target | grep -q "aarch64-unknown-linux-gnu"; then \
platform_name="Linux (ARM64, glibc)"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$output_name" ]; then \
echo " ✓ $$platform_name 主程序: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$output_name"; \
fi; \
parent_lib="libparent_plugin$$lib_ext"; \
child_lib="libchild_plugin$$lib_ext"; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$parent_lib-$$target" ]; then \
echo " ✓ $$platform_name parent-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$parent_lib-$$target"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/$$child_lib-$$target" ]; then \
echo " ✓ $$platform_name child-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/$$child_lib-$$target"; \
fi; \
done; \
echo ""; \
fi; \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
build-cross: stop install-cross
@if ! command -v cross >/dev/null 2>&1; then \
echo "错误: 未找到 cross 工具,请先运行 make install-cross"; \
exit 1; \
fi
@echo "使用 cross 工具构建所有平台..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && cross build --release --target $(CROSS_LINUX_X86_64) && \
cp "target/$(CROSS_LINUX_X86_64)/release/secra-plugins" "$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_X86_64)" && \
echo "✓ $(CROSS_LINUX_X86_64) 构建成功" || echo "✗ $(CROSS_LINUX_X86_64) 构建失败"
@cd $(PROJECT_ROOT) && cross build --release --target $(CROSS_LINUX_ARM64) && \
cp "target/$(CROSS_LINUX_ARM64)/release/secra-plugins" "$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_ARM64)" && \
echo "✓ $(CROSS_LINUX_ARM64) 构建成功" || echo "✗ $(CROSS_LINUX_ARM64) 构建失败"
@cd $(PROJECT_ROOT) && cross build --release --target $(CROSS_WINDOWS_X86_64) && \
cp "target/$(CROSS_WINDOWS_X86_64)/release/secra-plugins.exe" "$(OUTPUT_DIR)/secra-plugins-$(CROSS_WINDOWS_X86_64).exe" && \
echo "✓ $(CROSS_WINDOWS_X86_64) 构建成功" || echo "✗ $(CROSS_WINDOWS_X86_64) 构建失败"
@cd $(PROJECT_ROOT) && echo "" && \
echo "构建完成的二进制文件:" && \
if [ -f "$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_X86_64)" ]; then \
echo " ✓ Linux (x86_64): $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_X86_64)"; \
fi && \
if [ -f "$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_ARM64)" ]; then \
echo " ✓ Linux (ARM64): $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$(CROSS_LINUX_ARM64)"; \
fi && \
if [ -f "$(OUTPUT_DIR)/secra-plugins-$(CROSS_WINDOWS_X86_64).exe" ]; then \
echo " ✓ Windows (x86_64): $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$(CROSS_WINDOWS_X86_64).exe"; \
fi && \
echo "" && \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
install-cross:
@if command -v cross >/dev/null 2>&1; then \
echo "cross 工具已安装"; \
else \
echo "安装 cross 工具..."; \
cargo install cross --git https://github.com/cross-rs/cross || echo "安装失败,请检查网络连接"; \
fi
install-glibc-targets:
@echo "安装 glibc 目标平台工具链..."
@cd $(PROJECT_ROOT) && for target in $(GLIBC_TARGETS); do \
if ! rustup target list --installed | grep -q "^$$target$$"; then \
echo "安装 $$target (glibc)..."; \
rustup target add $$target || echo "警告: 无法安装 $$target"; \
fi \
done
build-linux: stop install-targets
@echo "构建 Linux 平台..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && for target in $(LINUX_X86_64) $(LINUX_ARM64); do \
echo "构建 $$target..."; \
if cargo build --workspace --release --target $$target; then \
if [ -f "target/$$target/release/secra-plugins" ]; then \
cp "target/$$target/release/secra-plugins" "$(OUTPUT_DIR)/secra-plugins-$$target"; \
echo " ✓ 主程序构建成功"; \
fi; \
if [ -f "target/$$target/release/libparent_plugin.so" ]; then \
cp "target/$$target/release/libparent_plugin.so" "$(OUTPUT_DIR)/libparent_plugin-$$target.so"; \
echo " ✓ parent-plugin 构建成功"; \
fi; \
if [ -f "target/$$target/release/libchild_plugin.so" ]; then \
cp "target/$$target/release/libchild_plugin.so" "$(OUTPUT_DIR)/libchild_plugin-$$target.so"; \
echo " ✓ child-plugin 构建成功"; \
fi; \
echo "✓ $$target 构建成功"; \
fi; \
done; \
echo ""; \
echo "构建完成的二进制文件:"; \
for target in $(LINUX_X86_64) $(LINUX_ARM64); do \
platform_name=""; \
if echo $$target | grep -q "x86_64-unknown-linux-musl"; then \
platform_name="Linux (x86_64)"; \
elif echo $$target | grep -q "aarch64-unknown-linux-musl"; then \
platform_name="Linux (ARM64)"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$$target" ]; then \
echo " ✓ $$platform_name 主程序: $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$$target"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/libparent_plugin-$$target.so" ]; then \
echo " ✓ $$platform_name parent-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/libparent_plugin-$$target.so"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/libchild_plugin-$$target.so" ]; then \
echo " ✓ $$platform_name child-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/libchild_plugin-$$target.so"; \
fi; \
done; \
echo ""; \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
build-windows: stop install-targets
@echo "构建 Windows 平台..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && if cargo build --workspace --release --target $(WINDOWS_X86_64); then \
if [ -f "target/$(WINDOWS_X86_64)/release/secra-plugins.exe" ]; then \
cp "target/$(WINDOWS_X86_64)/release/secra-plugins.exe" "$(OUTPUT_DIR)/secra-plugins-$(WINDOWS_X86_64).exe"; \
echo " ✓ 主程序构建成功"; \
fi; \
if [ -f "target/$(WINDOWS_X86_64)/release/parent_plugin.dll" ]; then \
cp "target/$(WINDOWS_X86_64)/release/parent_plugin.dll" "$(OUTPUT_DIR)/parent_plugin-$(WINDOWS_X86_64).dll"; \
echo " ✓ parent-plugin 构建成功"; \
fi; \
if [ -f "target/$(WINDOWS_X86_64)/release/child_plugin.dll" ]; then \
cp "target/$(WINDOWS_X86_64)/release/child_plugin.dll" "$(OUTPUT_DIR)/child_plugin-$(WINDOWS_X86_64).dll"; \
echo " ✓ child-plugin 构建成功"; \
fi; \
echo "✓ $(WINDOWS_X86_64) 构建成功"; \
fi; \
echo ""; \
echo "构建完成的二进制文件:"; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$(WINDOWS_X86_64).exe" ]; then \
echo " ✓ Windows (x86_64) 主程序: $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$(WINDOWS_X86_64).exe"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/parent_plugin-$(WINDOWS_X86_64).dll" ]; then \
echo " ✓ Windows (x86_64) parent-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/parent_plugin-$(WINDOWS_X86_64).dll"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/child_plugin-$(WINDOWS_X86_64).dll" ]; then \
echo " ✓ Windows (x86_64) child-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/child_plugin-$(WINDOWS_X86_64).dll"; \
fi; \
echo ""; \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
build-macos: stop install-targets
@echo "构建 macOS 平台..."
@cd $(PROJECT_ROOT) && mkdir -p $(OUTPUT_DIR)
@cd $(PROJECT_ROOT) && for target in $(MACOS_X86_64) $(MACOS_ARM64); do \
echo "构建 $$target..."; \
if cargo build --workspace --release --target $$target; then \
if [ -f "target/$$target/release/secra-plugins" ]; then \
cp "target/$$target/release/secra-plugins" "$(OUTPUT_DIR)/secra-plugins-$$target"; \
echo " ✓ 主程序构建成功"; \
fi; \
if [ -f "target/$$target/release/libparent_plugin.dylib" ]; then \
cp "target/$$target/release/libparent_plugin.dylib" "$(OUTPUT_DIR)/libparent_plugin-$$target.dylib"; \
echo " ✓ parent-plugin 构建成功"; \
fi; \
if [ -f "target/$$target/release/libchild_plugin.dylib" ]; then \
cp "target/$$target/release/libchild_plugin.dylib" "$(OUTPUT_DIR)/libchild_plugin-$$target.dylib"; \
echo " ✓ child-plugin 构建成功"; \
fi; \
echo "✓ $$target 构建成功"; \
fi; \
done; \
echo ""; \
echo "构建完成的二进制文件:"; \
for target in $(MACOS_X86_64) $(MACOS_ARM64); do \
platform_name=""; \
if echo $$target | grep -q "x86_64-apple-darwin"; then \
platform_name="macOS (Intel)"; \
elif echo $$target | grep -q "aarch64-apple-darwin"; then \
platform_name="macOS (Apple Silicon)"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$$target" ]; then \
echo " ✓ $$platform_name 主程序: $(PROJECT_ROOT)/$(OUTPUT_DIR)/secra-plugins-$$target"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/libparent_plugin-$$target.dylib" ]; then \
echo " ✓ $$platform_name parent-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/libparent_plugin-$$target.dylib"; \
fi; \
if [ -f "$(PROJECT_ROOT)/$(OUTPUT_DIR)/libchild_plugin-$$target.dylib" ]; then \
echo " ✓ $$platform_name child-plugin: $(PROJECT_ROOT)/$(OUTPUT_DIR)/libchild_plugin-$$target.dylib"; \
fi; \
done; \
echo ""; \
echo "所有二进制文件位于: $(PROJECT_ROOT)/$(OUTPUT_DIR)"
clean:
@echo "清理构建文件..."
@cd $(PROJECT_ROOT) && cargo clean
@cd $(PROJECT_ROOT) && rm -rf $(OUTPUT_DIR)
@echo "清理完成"