ROOT_DIR = $(shell pwd)
SRC_DIR = src
OBJ_DIR = out
BIN_DIR = build
SHARED_LIB_TARGET = $(BIN_DIR)/libbleadapter.so
UNSTRIP_SHARED_LIBBLE_ADAPTER = $(BIN_DIR)/libbleadapter.unstripped.so

# for linux secure compile options
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_CFLAGS += -O2 -Wall -Wextra -Werror=format-security -std=gnu11

SHARED_LIB_LDFLAGS = $(SECURE_LDFLAG_FOR_SHARE_LIBRARY)
SHARED_LIB_LDFLAGS += -L$(ROOT_DIR)/out/aarch64/bluez-5.63/lib/.libs
SHARED_LIB_LDFLAGS += -L$(ROOT_DIR)/out/aarch64/glib-2.58.3/glib/.libs

SHARED_LIB_LIBS += -lbluetooth -lpthread  -lglib-2.0 #-lnl-3 -lnl-genl-3

SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/include
SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/lib_install/aarch64/include
SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/out/aarch64/glib-2.58.3
SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/out/aarch64/glib-2.58.3/glib

# for release
RELEASE_CFLAGS = -DNDEBUG -flto
RELEASE_LDFLAGS = -flto

# default compile target and default arch
TARGET_ARCH=aarch64-linux-gnu

# define compile commmand
TARGET_ARCH = aarch64-none-linux-gnu
TOOLCHAIN_PATH = /opt/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/
CROSS_COMPILE = $(TOOLCHAIN_PATH)/bin/$(TARGET_ARCH)

SPDLOG_INCLUDE = -I$(TOOLCHAIN_PATH)/include
SPDLOG_LIB_DIR = -L$(TOOLCHAIN_PATH)/lib -L$(TOOLCHAIN_PATH)/$(TARGET_ARCH)/lib64

SYSROOT = $(TOOLCHAIN_PATH)/aarch64-none-linux-gnu/libc

# 工具定义
CC = $(CROSS_COMPILE)-gcc
CXX = $(CROSS_COMPILE)-g++
AR = $(CROSS_COMPILE)-ar
RANLIB = $(CROSS_COMPILE)-ranlib
LD = $(CROSS_COMPILE)-ld
STRIP = $(CROSS_COMPILE)-strip

#原本想防止目录没有新建,确保文件夹存在
#$(OBJ_DIR) $(BIN_DIR):
#	mkdir -p $@

# shared library compile and link
SHARED_LIB_SRC = \
	$(SRC_DIR)/driver_ble_client.c \
	$(SRC_DIR)/driver_ble_client_callback_wrapper.c \
	$(SRC_DIR)/driver_ble_common.c \
	$(SRC_DIR)/driver_ble_common_utility.c \
	$(SRC_DIR)/driver_ble_discovery.c \
	$(SRC_DIR)/driver_ble_mem.c \
	$(SRC_DIR)/driver_ble_server.c \
	$(SRC_DIR)/driver_ble_thread.c

SHARED_LIB_OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SHARED_LIB_SRC))

$(SHARED_LIB_OBJECTS): $(OBJ_DIR)/%.o : $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(SHARED_LIB_CFLAGS) $(SHARED_LIB_INCLUDES) -c $< -o $@

$(SHARED_LIB_TARGET): $(SHARED_LIB_OBJECTS)
	@echo "==========start link========="
	$(CC) -shared $(SHARED_LIB_LDFLAGS) -o $(SHARED_LIB_TARGET) $(SHARED_LIB_OBJECTS) $(SHARED_LIB_LIBS) 
	cp $(SHARED_LIB_TARGET)  $(UNSTRIP_SHARED_LIBBLE_ADAPTER)
	$(STRIP) --strip-all $(UNSTRIP_SHARED_LIBBLE_ADAPTER)
	@echo "==========link finished========="

bleadapter:$(SHARED_LIB_TARGET)

# clean
clean:
	@echo "==========start cleaning========="
	rm -f $(SHARED_LIB_OBJECTS) $(BIN_DIR)/libbleadapter.*
	@echo "==========clean finished========="

all: bleadapter

#目标
.PHONY: all clean bleadapter