# 检测架构 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 CFLAGS = -shared -fPIC -Wall -Wextra -Werror -fno-strict-aliasing -fPIC -fno-omit-frame-pointer -fno-stack-protector -Wl,-z,relro,-z,now LDFLAGS = -ldl TARGET_NAME = libbash_smart$(TARGET_SUFFIX).so BUILD_DIR = build SRC_DIR = src TESTS_DIR = tests SRC = $(wildcard $(SRC_DIR)/*.c) OBJ = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRC)) TARGET = $(BUILD_DIR)/$(TARGET_NAME) # 测试客户端 TEST_CLIENT = $(BUILD_DIR)/test_client TEST_CLIENT_SRC = $(TESTS_DIR)/test_client.c TEST_CLIENT_DEPS = $(BUILD_DIR)/client.o $(BUILD_DIR)/socket_protocol.o $(BUILD_DIR)/debug.o # 并发测试客户端 TEST_CONCURRENT_CLIENT = $(BUILD_DIR)/test_concurrent_client TEST_CONCURRENT_CLIENT_SRC = $(TESTS_DIR)/test_concurrent_client.c TEST_CONCURRENT_CLIENT_DEPS = $(BUILD_DIR)/client.o $(BUILD_DIR)/socket_protocol.o $(BUILD_DIR)/debug.o # Socket通信测试客户端 TEST_SOCKET_CLIENT = $(BUILD_DIR)/test_socket_client TEST_SOCKET_CLIENT_SRC = $(TESTS_DIR)/test_socket_client.c TEST_SOCKET_CLIENT_DEPS = $(BUILD_DIR)/client.o $(BUILD_DIR)/socket_protocol.o $(BUILD_DIR)/debug.o # 如果需要开启 debug,只需执行 make DEBUG=1 ifeq ($(DEBUG),1) CFLAGS += -DDEBUG -g endif # 如果需要开启 hook,只需执行 make HOOK=1 ifeq ($(HOOK),1) CFLAGS += -DHOOK endif # 如果跳过检查,只需执行 make NO_CONFIG_CHECK=1 ifeq ($(NO_CONFIG_CHECK),1) CFLAGS += -DNO_CONFIG_CHECK endif .PHONY: all clean debug hook rebuild pre_build test_client test_concurrent_client test_socket_client arm64 arm install-cross-tools all: pre_build $(TARGET) # 快捷方式:交叉编译到 ARM64 arm64: $(MAKE) ARCH=arm64 # 快捷方式:交叉编译到 ARM32 arm: $(MAKE) ARCH=arm # 安装交叉编译工具链 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 "交叉编译工具链安装完成!" 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 "==========================================" ifeq ($(DEBUG),1) @echo "Building with debug flags..." endif ifeq ($(HOOK),1) @echo "Building with hook flags..." endif ifeq ($(NO_CONFIG_CHECK),1) @echo "Building with NO_CONFIG_CHECK defined..." endif $(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_CLIENT_DEPS) @mkdir -p $(BUILD_DIR) $(CC) -Wall -Wextra -pthread -o $@ $(TEST_CLIENT_SRC) $(TEST_CLIENT_DEPS) $(TEST_CONCURRENT_CLIENT): $(TEST_CONCURRENT_CLIENT_SRC) $(TEST_CONCURRENT_CLIENT_DEPS) @mkdir -p $(BUILD_DIR) $(CC) -Wall -Wextra -pthread -o $@ $(TEST_CONCURRENT_CLIENT_SRC) $(TEST_CONCURRENT_CLIENT_DEPS) $(TEST_SOCKET_CLIENT): $(TEST_SOCKET_CLIENT_SRC) $(TEST_SOCKET_CLIENT_DEPS) @mkdir -p $(BUILD_DIR) $(CC) -Wall -Wextra -pthread -o $@ $(TEST_SOCKET_CLIENT_SRC) $(TEST_SOCKET_CLIENT_DEPS) clean: rm -rf $(BUILD_DIR) debug: rm -rf $(BUILD_DIR) $(MAKE) DEBUG=1 hook: rm -rf $(BUILD_DIR) $(MAKE) HOOK=1 rebuild: clean all