# 可以编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