# Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
# Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
#    conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
#    of conditions and the following disclaimer in the documentation and/or other materials
#    provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
#    to endorse or promote products derived from this software without specific prior written
#    permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

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, $(wildcard $(SRC_DIR)/*.c))#过滤删除对应的driver_ble.c和driver_hostap.c文件
SHARED_LIB_OBJECTS = $(SHARED_LIB_SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

#不使用原来的demo.c注释掉
#DEMO_SOURCES = $(wildcard $(DEMO_DIR)/*.c)
#DEMO_OBJECTS = $(SHARED_LIB_SOURCES:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)

# 新增的ble_common_demo.c demo的文件路径
WIFI_DEMO_SRC = $(DEMO_DIR)/wifi_demo.c
WIFI_DEMO_OBJ = $(OBJ_DIR)/wifi_demo.o
WIFI_DEMO = $(BIN_DIR)/wifi_demo

# 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_LDFLAGS = $(SECURE_LDFLAG_FOR_SHARE_LIBRARY)
DEMO_CFLAGS = $(SECURE_CFLAG_FOR_DEMO)
DEMO_LDFLAGS = $(SECURE_LDFLAG_FOR_DEMO)

# shared library link
# LIBS += -lbluetooth-internal -lshared-mainloop
SHARED_LIB_LIBS += -lwpa_client -lbluetooth -lpthread -lglib-2.0 -lnl-3 -lnl-genl-3
DEMO_LIB_LIBS += -lwpa_client -lbluetooth -lpthread -lglib-2.0 -lnl-3 -lnl-genl-3

# thirdparty include and link
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/
SHARED_LIB_LDFLAGS += -L$(ROOT_DIR)/out/aarch64/wpa_supplicant-2.9//lib/.libs/ -L$(ROOT_DIR)/out/aarch64/wpa_supplicant-2.9/src

SHARED_LIB_INCLUDES += -I$(ROOT_DIR)/$(INCLUDE_DIR) -I$(ROOT_DIR)/lib_install/aarch64/include -I/usr/local/include -I$(ROOT_DIR)/lib_install/aarch64/include/libnl3
SHARED_LIB_CFLAGS += -O2 -Wall -Wextra -Werror=format-security
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/
DEMO_LDFLAGS += -L$(ROOT_DIR)/out/aarch64/wpa_supplicant-2.9//lib/.libs/ -L$(ROOT_DIR)/out/aarch64/wpa_supplicant-2.9/src

DEMO_INCLUDES += -I$(ROOT_DIR)/$(INCLUDE_DIR) -I$(ROOT_DIR)/lib_install/aarch64/include -I$(ROOT_DIR)/lib_install/aarch64/include/libnl3
DEMO_LDFLAGS += -L./$(BIN_DIR)/#指定demo链接时查找共享库的路径
DEMO_CFLAGS += -O2 -Wall -Wextra -Werror=format-security
GLIB_INCLUDES += -I$(ROOT_DIR)/lib_install/aarch64/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/



# for debug
DEBUG_SHARED_LIB_CFLAGS = -g3 -DDEBUG -fsanitize=address -fsanitize=undefined
DEBUG_SHARED_LIB_LDFLAGS = -fsanitize=address -fsanitize=undefined

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

# default compile target and default arch
TARGET_ARCH=aarch64-linux-gnu
SHARED_LIB = $(BIN_DIR)/sharekit_driver.so
#原来的demo所在位置和名称
#DEMO = $(BIN_DIR)/ShareKit_TX_Demo
UNSTRIP_SHARED_LIB = $(BIN_DIR)/sharekit_driver.unstripped.so

# define compile commmand
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 $@

# shared library compile and link
# 修改目标文件的生成路径  疑问
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(SHARED_LIB_CFLAGS) $(SHARED_LIB_INCLUDES) -c $< -o $@ $(GLIB_INCLUDES)


#疑问
$(SHARED_LIB):$(SHARED_LIB_OBJECTS)
	@echo "==========start link========="
	$(CC) -shared $(SHARED_LIB_LDFLAGS) -o $(SHARED_LIB) $(SHARED_LIB_OBJECTS) $(LIBS) $(SHARED_LIB_LIBS) 
	cp $(SHARED_LIB)  $(UNSTRIP_SHARED_LIB)
	$(STRIP) --strip-all $(UNSTRIP_SHARED_LIB)
	@echo "==========link finished========="

sharekit_driver:$(SHARED_LIB)

# demo compile and link
# 注释掉重名的部分,防止更改编译规则
# $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
# 	$(CC) $(SHARED_LIB_CFLAGS) $(INCLUDES) -c $< -o $@

# $(SHARED_LIB):$(SHARED_LIB_OBJECTS)
# 	@echo "==========start link========="
# 	$(CC) -shared $(SHARED_LIB_LDFLAGS) -o $(SHARED_LIB) $(SHARED_LIB_OBJECTS) $(LIBS) $(SHARED_LIB_LIBS)
# 	cp $(SHARED_LIB)  $(UNSTRIP_SHARED_LIB)
# 	$(STRIP) --strip-all $(UNSTRIP_SHARED_LIB)
# 	@echo "==========link finished========="

# 指定新的wifi_demo的编译规则
$(WIFI_DEMO_OBJ): $(WIFI_DEMO_SRC) | $(OBJ_DIR)
	$(CC) $(DEMO_CFLAGS) $(DEMO_INCLUDES) -c $< -o $@ $(GLIB_INCLUDES)

# 链接新的wifi_demo可执行文件
$(WIFI_DEMO): $(WIFI_DEMO_OBJ) | $(BIN_DIR)
	@echo "==========start link wifi_demo========="
#	$(CC) $(DEMO_LDFLAGS) -o $@ $< $(SHARED_LIB) $(DEMO_LIB_LIBS) 运行时会删除库
	$(CC) $(DEMO_LDFLAGS) -Wl,-rpath=$(BIN_DIR) -o $@ $< $(SHARED_LIB) $(DEMO_LIB_LIBS)
	@echo "==========wifi_demo link finished========="

# 原来的demo编译链接规则注释掉
#demo:$(DEMO)

demo:$(WIFI_DEMO)



# clean
clean:
	@echo "==========start cleaning========="
	rm -f $(OBJ_DIR)/*.o $(OBJ_DIR)/*.d
	@echo "==========clean finished========="

all: sharekit_driver demo

rebuild: clean all

#将对应的demo加入伪目标
.PHONY: all clean rebuild sharekit_driver demo