# ========================================== # 编译选项(在文件开头定义) # ========================================== DEBUG ?= 0 HOOK ?= 0 NO_CONFIG_CHECK ?= 0 LZ4 ?= 0 # ========================================== # 架构检测与交叉编译配置 # ========================================== ARCH ?= $(shell uname -m) ifeq ($(ARCH),arm64) CC = aarch64-linux-gnu-gcc TARGET_SUFFIX = _arm64 else ifeq ($(ARCH),aarch64) CC = aarch64-linux-gnu-gcc TARGET_SUFFIX = _arm64 ARCH = arm64 else ifeq ($(ARCH),arm) CC = arm-linux-gnueabihf-gcc TARGET_SUFFIX = _arm else ifeq ($(ARCH),x86_64) CC = gcc TARGET_SUFFIX = _x86_64 else CC = gcc TARGET_SUFFIX = _x86_64 endif # ========================================== # 目录配置 # ========================================== BUILD_DIR = build SRC_DIR = src TESTS_DIR = tests # ========================================== # LZ4 压缩支持检测(必须在使用前完成) # ========================================== LZ4_CFLAGS = LZ4_LDFLAGS = HAVE_LZ4 = 0 ifeq ($(LZ4),1) LZ4_AVAILABLE := $(shell pkg-config --exists liblz4 2>/dev/null && echo 1 || echo 0) ifeq ($(LZ4_AVAILABLE),1) LZ4_CFLAGS := -DHAVE_LZ4 $(shell pkg-config --cflags liblz4) LZ4_LDFLAGS := $(shell pkg-config --libs liblz4) HAVE_LZ4 = 1 else LZ4_DIRECT := $(shell echo 'int LZ4_compress_default(void);int main(){return 0;}' | $(CC) -x c - -llz4 -o /dev/null 2>/dev/null && echo 1 || echo 0) ifeq ($(LZ4_DIRECT),1) LZ4_CFLAGS := -DHAVE_LZ4 LZ4_LDFLAGS := -llz4 HAVE_LZ4 = 1 endif endif endif # ========================================== # 编译标志 # ========================================== CFLAGS_BASE = -Wall -Wextra -Werror -fno-strict-aliasing -fno-omit-frame-pointer -fno-stack-protector CFLAGS_SHARED = -shared -fPIC -Wl,-z,relro,-z,now LDFLAGS_BASE = -ldl # 条件编译标志 ifeq ($(DEBUG),1) CFLAGS_BASE += -DDEBUG -g endif ifeq ($(HOOK),1) CFLAGS_BASE += -DHOOK endif ifeq ($(NO_CONFIG_CHECK),1) CFLAGS_BASE += -DNO_CONFIG_CHECK endif # 添加 LZ4 标志 CFLAGS_BASE += $(LZ4_CFLAGS) LDFLAGS_BASE += $(LZ4_LDFLAGS) # 最终编译标志 CFLAGS = $(CFLAGS_BASE) $(CFLAGS_SHARED) LDFLAGS = $(LDFLAGS_BASE) # 测试程序编译标志(不需要 -shared) TEST_CFLAGS = $(CFLAGS_BASE) -pthread TEST_LDFLAGS = $(LZ4_LDFLAGS) # ========================================== # 源文件与目标文件 # ========================================== TARGET_NAME = libbash_smart$(TARGET_SUFFIX).so TARGET = $(BUILD_DIR)/$(TARGET_NAME) # 条件编译的 compression.o ifeq ($(HAVE_LZ4),1) COMPRESSION_OBJ = $(BUILD_DIR)/compression.o else COMPRESSION_OBJ = endif # 源文件(排除 compression.c,它是条件编译的) SRC = $(filter-out $(SRC_DIR)/compression.c, $(wildcard $(SRC_DIR)/*.c)) OBJ = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC)) $(COMPRESSION_OBJ) # ========================================== # 测试程序配置 # ========================================== # 公共依赖 TEST_COMMON_DEPS = $(BUILD_DIR)/client.o $(BUILD_DIR)/socket_protocol.o $(BUILD_DIR)/debug.o $(COMPRESSION_OBJ) # 测试客户端 TEST_CLIENT = $(BUILD_DIR)/test_client TEST_CLIENT_SRC = $(TESTS_DIR)/test_client.c # 并发测试客户端 TEST_CONCURRENT_CLIENT = $(BUILD_DIR)/test_concurrent_client TEST_CONCURRENT_CLIENT_SRC = $(TESTS_DIR)/test_concurrent_client.c # Socket通信测试客户端 TEST_SOCKET_CLIENT = $(BUILD_DIR)/test_socket_client TEST_SOCKET_CLIENT_SRC = $(TESTS_DIR)/test_socket_client.c # ========================================== # 伪目标声明 # ========================================== .PHONY: all clean debug hook rebuild pre_build \ test_client test_concurrent_client test_socket_client \ arm64 arm install-cross-tools install-lz4 # ========================================== # 主要构建目标 # ========================================== all: pre_build $(TARGET) # 快捷方式:交叉编译到 ARM64 arm64: $(MAKE) ARCH=arm64 # 快捷方式:交叉编译到 ARM32 arm: $(MAKE) ARCH=arm # ========================================== # 测试程序构建 # ========================================== test_client: pre_build $(TEST_CLIENT) test_concurrent_client: pre_build $(TEST_CONCURRENT_CLIENT) test_socket_client: pre_build $(TEST_SOCKET_CLIENT) # ========================================== # 预构建信息输出 # ========================================== pre_build: @echo "==========================================" @echo "编译配置:" @echo " 架构: $(ARCH)" @echo " 编译器: $(CC)" @echo " 目标文件: $(TARGET_NAME)" @echo " DEBUG: $(DEBUG)" @echo " HOOK: $(HOOK)" @echo " NO_CONFIG_CHECK: $(NO_CONFIG_CHECK)" @echo " LZ4: $(LZ4) (可用: $(HAVE_LZ4))" @echo "==========================================" # ========================================== # 编译规则 # ========================================== # 通用 .o 文件编译规则 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(BUILD_DIR) $(CC) $(CFLAGS) -c $< -o $@ # 主目标链接 $(TARGET): $(OBJ) @mkdir -p $(BUILD_DIR) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) @rm -f $(OBJ) # 测试程序编译 $(TEST_CLIENT): $(TEST_CLIENT_SRC) $(TEST_COMMON_DEPS) @mkdir -p $(BUILD_DIR) $(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS) $(TEST_CONCURRENT_CLIENT): $(TEST_CONCURRENT_CLIENT_SRC) $(TEST_COMMON_DEPS) @mkdir -p $(BUILD_DIR) $(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS) $(TEST_SOCKET_CLIENT): $(TEST_SOCKET_CLIENT_SRC) $(TEST_COMMON_DEPS) @mkdir -p $(BUILD_DIR) $(CC) $(TEST_CFLAGS) -o $@ $< $(TEST_COMMON_DEPS) $(TEST_LDFLAGS) # ========================================== # 清理与重建 # ========================================== clean: rm -rf $(BUILD_DIR) rebuild: clean all # 快捷方式:debug 模式重建 debug: $(MAKE) clean $(MAKE) DEBUG=1 # 快捷方式:hook 模式重建 hook: $(MAKE) clean $(MAKE) HOOK=1 # ========================================== # 工具安装 # ========================================== # 安装交叉编译工具链 install-cross-tools: @echo "安装 ARM 交叉编译工具链..." @if ! command -v aarch64-linux-gnu-gcc > /dev/null 2>&1; then \ echo "正在安装 gcc-aarch64-linux-gnu..."; \ sudo apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu || \ (echo "安装失败,尝试不更新源..." && sudo apt-get install -y --no-update gcc-aarch64-linux-gnu g++-aarch64-linux-gnu); \ else \ echo "aarch64-linux-gnu-gcc 已安装"; \ fi @if ! command -v arm-linux-gnueabihf-gcc > /dev/null 2>&1; then \ echo "正在安装 gcc-arm-linux-gnueabihf..."; \ sudo apt-get install -y gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf || \ (echo "安装失败,尝试不更新源..." && sudo apt-get install -y --no-update gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf); \ else \ echo "arm-linux-gnueabihf-gcc 已安装"; \ fi @echo "交叉编译工具链安装完成!" # 安装 LZ4 库 install-lz4: @echo "安装 LZ4 压缩库..." @if command -v apt-get > /dev/null 2>&1; then \ sudo apt-get install -y liblz4-dev; \ elif command -v yum > /dev/null 2>&1; then \ sudo yum install -y lz4-devel; \ elif command -v pacman > /dev/null 2>&1; then \ sudo pacman -S --noconfirm lz4; \ elif command -v brew > /dev/null 2>&1; then \ brew install lz4; \ else \ echo "无法自动安装,请手动安装 liblz4-dev"; \ exit 1; \ fi @echo "LZ4 安装完成!"