255 lines
7.4 KiB
Makefile
255 lines
7.4 KiB
Makefile
# ==========================================
|
||
# 编译选项(在文件开头定义)
|
||
# ==========================================
|
||
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 安装完成!"
|