143 lines
3.9 KiB
Makefile
143 lines
3.9 KiB
Makefile
# 检测架构
|
||
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)/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)/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 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)
|
||
|
||
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 -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)
|
||
|
||
clean:
|
||
rm -rf $(BUILD_DIR)
|
||
|
||
debug:
|
||
rm -rf $(BUILD_DIR)
|
||
$(MAKE) DEBUG=1
|
||
|
||
hook:
|
||
rm -rf $(BUILD_DIR)
|
||
$(MAKE) HOOK=1
|
||
|
||
rebuild: clean all
|