# 可以编arm版本的so和demo
ROOT_DIR = $(shell pwd)
SRC_DIR = src
OBJ_DIR = out
BIN_DIR = build
DEMO_DIR = demo
INCLUDE_DIR = include
# 源文件(排除不需要的)
SHARED_LIB_SOURCES = $(filter-out $(SRC_DIR)/driver_ble.c $(SRC_DIR)/driver_hostap.c $(SRC_DIR)/driver_wifi_adapter.c, $(wildcard $(SRC_DIR)/*.c))
SHARED_LIB_OBJECTS = $(SHARED_LIB_SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
# Demo源文件
DEMO_SOURCES = $(DEMO_DIR)/demo_ble_server.c
DEMO_OBJECTS = $(DEMO_SOURCES:$(DEMO_DIR)/%.c=$(OBJ_DIR)/demo_%.o)
# 安全编译选项
SECURE_CFLAG_FOR_SHARE_LIBRARY = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-common -fPIC
SECURE_LDFLAG_FOR_SHARE_LIBRARY = -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -Wl,--no-undefined -Wl,--as-needed
SECURE_CFLAG_FOR_DEMO = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-common -fPIC
SECURE_LDFLAG_FOR_DEMO = -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -Wl,--no-undefined -Wl,--as-needed
SHARED_LIB_CFLAGS = $(SECURE_CFLAG_FOR_SHARE_LIBRARY)
SHARED_LIB_LDFLAGS = $(SECURE_LDFLAG_FOR_SHARE_LIBRARY)
DEMO_CFLAGS = $(SECURE_CFLAG_FOR_DEMO)
DEMO_LDFLAGS = $(SECURE_LDFLAG_FOR_DEMO)
# 链接库
SHARED_LIB_LIBS += -lbluetooth -lpthread -lglib-2.0
DEMO_LIB_LIBS += -lbluetooth -lpthread -lglib-2.0
# 第三方库路径(ARM64)
SHARED_LIB_LDFLAGS += -L$(ROOT_DIR)/lib_install/aarch64/lib \
-L$(ROOT_DIR)/out/aarch64/bluez-5.63/lib/.libs/ \
-L$(ROOT_DIR)/out/aarch64/bluez-5.63/src/.libs/
# GLib头文件路径(使用编译好的)
GLIB_CFLAGS = -I$(ROOT_DIR)/lib_install/aarch64/include/glib-2.0 \
-I$(ROOT_DIR)/lib_install/aarch64/lib/glib-2.0/include
# 包含路径
SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/$(INCLUDE_DIR) \
-I$(ROOT_DIR)/lib_install/aarch64/include \
$(GLIB_CFLAGS)
SHARED_LIB_CFLAGS += -O2 -Wall -std=gnu11
# Demo路径和选项
DEMO_LDFLAGS += -L$(ROOT_DIR)/lib_install/aarch64/lib \
-L$(ROOT_DIR)/out/aarch64/bluez-5.63/lib/.libs/ \
-L$(ROOT_DIR)/out/aarch64/bluez-5.63/src/.libs/ \
-L./$(BIN_DIR)/
DEMO_INCLUDES += -I$(ROOT_DIR)/$(INCLUDE_DIR) \
-I$(ROOT_DIR)/lib_install/aarch64/include \
$(GLIB_CFLAGS)
DEMO_CFLAGS += -O2 -Wall -std=gnu11
# 目标架构
TARGET_ARCH = aarch64-linux-gnu
SHARED_LIB = $(BIN_DIR)/libbleadapter.so
DEMO = $(BIN_DIR)/Server_Demo
UNSTRIP_SHARED_LIB = $(BIN_DIR)/libbleadapter.unstripped.so
# 编译工具
export CC = /usr/bin/$(TARGET_ARCH)-gcc
export CXX = /usr/bin/$(TARGET_ARCH)-g++
export AR = /usr/bin/$(TARGET_ARCH)-ar
export RANLIB = /usr/bin/$(TARGET_ARCH)-ranlib
export LD = /usr/bin/$(TARGET_ARCH)-ld
export STRIP = /usr/bin/$(TARGET_ARCH)-strip
# 创建目录
$(OBJ_DIR) $(BIN_DIR):
mkdir -p $@
# 编译共享库
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
@echo "Compiling $< for ARM64..."
$(CC) $(SHARED_LIB_CFLAGS) $(SHARED_LIB_INCLUDES) -c $< -o $@
$(SHARED_LIB): $(SHARED_LIB_OBJECTS) | $(BIN_DIR)
@echo "========== Linking ARM64 shared library =========="
$(CC) -shared $(SHARED_LIB_LDFLAGS) -o $(SHARED_LIB) $(SHARED_LIB_OBJECTS) $(SHARED_LIB_LIBS)
cp $(SHARED_LIB) $(UNSTRIP_SHARED_LIB)
$(STRIP) --strip-all $(UNSTRIP_SHARED_LIB)
@file $(SHARED_LIB)
@echo "========== Link finished =========="
sharekit_driver: $(SHARED_LIB)
# 编译demo
$(OBJ_DIR)/demo_%.o: $(DEMO_DIR)/%.c | $(OBJ_DIR)
@echo "Compiling demo $< for ARM64..."
$(CC) $(DEMO_CFLAGS) $(DEMO_INCLUDES) -c $< -o $@
$(DEMO): $(DEMO_OBJECTS) $(SHARED_LIB) | $(BIN_DIR)
@echo "========== Linking ARM64 demo =========="
$(CC) $(DEMO_LDFLAGS) -o $(DEMO) $(DEMO_OBJECTS) -L$(BIN_DIR) -lbleadapter $(DEMO_LIB_LIBS)
@file $(DEMO)
@echo "========== Demo link finished =========="
demo: $(DEMO)
# 普通清理 - 只删除编译生成的.o和.so文件,不删除第三方库
clean:
@echo "========== Cleaning build files =========="
rm -f $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d
rm -f $(BIN_DIR)/*.so $(BIN_DIR)/*.unstripped.so $(BIN_DIR)/Server_Demo
@echo "========== Clean finished =========="
# 深度清理 - 删除out和build目录(第三方库源码仍保留)
distclean:
@echo "========== Deep cleaning =========="
rm -rf $(OBJ_DIR) $(BIN_DIR)
@echo "Thirdparty libraries in lib_install/ are preserved"
@echo "To remove thirdparty, run: ./build_thirdparty.sh --clean"
@echo "=================================="
# 检查环境
check:
@echo "=========================================="
@echo "Checking cross compilation environment..."
@echo "=========================================="
@which $(CC) || echo "ERROR: $(CC) not found"
@echo ""
@echo "GLib headers:"
@ls -la $(ROOT_DIR)/lib_install/aarch64/include/glib-2.0/glib.h 2>/dev/null && echo "✓ GLib found" || echo "✗ GLib not found in lib_install/"
@ls -la $(ROOT_DIR)/lib_install/aarch64/lib/glib-2.0/include/glibconfig.h 2>/dev/null && echo "✓ glibconfig.h found" || echo "✗ glibconfig.h not found"
@echo ""
@echo "BlueZ library:"
@ls -la $(ROOT_DIR)/lib_install/aarch64/lib/libbluetooth* 2>/dev/null && echo "✓ BlueZ found" || echo "✗ BlueZ not found"
@echo "=========================================="
# 帮助
help:
@echo "=========================================="
@echo "Available targets:"
@echo " make all - Build everything"
@echo " make clean - Remove build files only (preserves thirdparty)"
@echo " make distclean - Remove build and out directories"
@echo " make check - Check build environment"
@echo " make help - Show this help"
@echo ""
@echo "First time setup:"
@echo " 1. ./build_thirdparty.sh --target=aarch64-linux-gnu"
@echo " 2. make all"
@echo "=========================================="
all: sharekit_driver demo
.PHONY: all clean distclean sharekit_driver demo check help