
# make          编译并下载
# make VERBOSE=1  显示编译详细过程
# make clean    清除编译临时文件
#
# 注意： Linux 下编译方式：
#     1. 从 http://pkgman.jieliapp.com/doc/all 下载 pi32v2 工具链
#     2. 解压到 /opt/jieli 目录下，使 /opt/jieli/common/bin/clang 存在
#     3. ulimit -n 8096   （否则链接可能因文件描述符过多而失败）
#

# ---- Toolchain -----------------------------------------------------------
ifeq ($(OS), Windows_NT)
TOOL_DIR := C:/JL/pi32/bin
CC    := clang.exe
CXX   := clang.exe
LD    := pi32v2-lto-wrapper.exe
AR    := llvm-ar.exe
MKDIR := mkdir_win -p
RM    := rm -rf
SYS_LIB_DIR :=
SYS_INC_DIR :=
EXT_CFLAGS  :=
export PATH:=$(TOOL_DIR);$(PATH)
FIXBAT          := ..\..\..\..\..\..\..\..\tools\utils\fixbat.exe
POST_SCRIPT     := ../../../../../../../../cpu/wl82/tools/download.bat
RUN_POST_SCRIPT := ..\..\..\..\..\..\..\..\cpu\wl82\tools\download.bat
else
TOOL_DIR := /opt/jieli/pi32v2/bin
CC    := clang
CXX   := clang
LD    := lto-wrapper
AR    := lto-ar
MKDIR := mkdir -p
RM    := rm -rf
export OBJDUMP := $(TOOL_DIR)/objdump
export OBJCOPY := $(TOOL_DIR)/objcopy
export OBJSIZEDUMP := $(TOOL_DIR)/objsizedump
SYS_LIB_DIR := $(TOOL_DIR)/../lib/r3
SYS_INC_DIR := $(TOOL_DIR)/../include
EXT_CFLAGS  := -D__SHELL__
export PATH:=$(TOOL_DIR):$(PATH)
FIXBAT          := touch
POST_SCRIPT     := ../../../../../../../../cpu/wl82/tools/download.sh
RUN_POST_SCRIPT := bash $(POST_SCRIPT)
endif

CC  := $(TOOL_DIR)/$(CC)
CXX := $(TOOL_DIR)/$(CXX)
LD  := $(TOOL_DIR)/$(LD)
AR  := $(TOOL_DIR)/$(AR)

# ---- Output --------------------------------------------------------------
OUT_ELF   := ../../../../../../../../cpu/wl82/tools/sdk.elf
OBJ_FILE  := $(OUT_ELF).objs.txt
BUILD_DIR := objs
# 8 levels up: board/wl82/ -> demo/ -> ac79/ -> customer-release/
#              -> auth-sdk-release/ -> rtc-agent-token-auth/ -> apps/ -> SDK_ROOT
ROOT_PREFIX := ../../../../../../../..

# Convenience shortcut for auth-sdk demo paths.
DEMO_DIR    := $(ROOT_PREFIX)/apps/rtc-agent-token-auth/auth-sdk-release/customer-release/ac79/demo

# ---- Compiler flags (identical to demo_wifi baseline) --------------------
CFLAGS := \
	-target pi32v2 \
	-integrated-as \
	-mcpu=r3 \
	-mfprev1 \
	-Wuninitialized \
	-Wno-invalid-noreturn \
	-fno-common \
	-integrated-as \
	-Oz \
	-g \
	-flto \
	-fallow-pointer-null \
	-fprefer-gnu-section \
	-femulated-tls \
	-Wno-shift-negative-value \
	-Wframe-larger-than=2560 \
	-mllvm -pi32v2-large-program=true \
	-fms-extensions \
	-w \


CXXFLAGS :=

# ---- Preprocessor defines ------------------------------------------------
DEFINES := \
	-DSUPPORT_MS_EXTENSIONS \
	-DCONFIG_RELEASE_ENABLE \
	-DCONFIG_CPU_WL82 \
	-DCONFIG_FREE_RTOS_ENABLE \
	-DCONFIG_THREAD_ENABLE \
	-DCONFIG_AUDIO_ONCHIP \
	-D__GCC_PI32V2__ \
	-DCONFIG_NEW_ECC_ENABLE \
	-DCONFIG_EQ_SUPPORT_ASYNC \
	-DEQ_CORE_V1 \
	-DCONFIG_NET_ENABLE=1 \
	-DEVENT_HANDLER_NUM_CONFIG=2 \
	-DEVENT_TOUCH_ENABLE_CONFIG=0 \
	-DEVENT_POOL_SIZE_CONFIG=256 \
	-DCONFIG_EVENT_KEY_MAP_ENABLE=0 \
	-DTIMER_POOL_NUM_CONFIG=15 \
	-DAPP_ASYNC_POOL_NUM_CONFIG=0 \
	-DVFS_ENABLE=1 \
	-DUSE_SDFILE_NEW=1 \
	-DSDFILE_STORAGE=1 \
	-DVFS_FILE_POOL_NUM_CONFIG=8 \
	-DVM_MAX_PAGE_ALIGN_SIZE_CONFIG=64*1024 \
	-DVM_MAX_SECTOR_ALIGN_SIZE_CONFIG=64*1024 \
	-DVM_ITEM_MAX_NUM=256 \
	-DCONFIG_UPDATA_ENABLE \
	-DCONFIG_OTA_UPDATA_ENABLE \
	-DCONFIG_ITEM_FORMAT_VM \


DEFINES += $(EXT_CFLAGS)

# ---- Include paths -------------------------------------------------------
INCLUDES := \
	-I$(ROOT_PREFIX)/include_lib/c++ \
	-I$(ROOT_PREFIX)/include_lib/c++/include \
	-I$(ROOT_PREFIX)/include_lib/newlib/include \
	-I$(ROOT_PREFIX)/include_lib/c++/simple_pthread \
	-I$(ROOT_PREFIX)/include_lib \
	-I$(ROOT_PREFIX)/include_lib/driver \
	-I$(ROOT_PREFIX)/include_lib/driver/device \
	-I$(ROOT_PREFIX)/include_lib/driver/cpu/wl82 \
	-I$(ROOT_PREFIX)/include_lib/system \
	-I$(ROOT_PREFIX)/include_lib/system/generic \
	-I$(ROOT_PREFIX)/include_lib/btctrler \
	-I$(ROOT_PREFIX)/include_lib/btctrler/port/wl82 \
	-I$(ROOT_PREFIX)/include_lib/update \
	-I$(ROOT_PREFIX)/include_lib/btstack/third_party/common \
	-I$(ROOT_PREFIX)/include_lib/btstack/third_party/rcsp \
	-I$(ROOT_PREFIX)/include_lib/utils \
	-I$(ROOT_PREFIX)/include_lib/utils/syscfg \
	-I$(ROOT_PREFIX)/include_lib/utils/event \
	-I$(ROOT_PREFIX)/include_lib/media \
	-I$(ROOT_PREFIX)/include_lib/media/cpu/wl82 \
	-I$(ROOT_PREFIX)/apps \
	-I$(ROOT_PREFIX)/apps/common \
	-I$(ROOT_PREFIX)/apps/common/include \
	-I$(ROOT_PREFIX)/apps/common/rf_fcc_tool/include \
	-I$(ROOT_PREFIX)/include_lib/net \
	-I$(ROOT_PREFIX)/include_lib/net/mbedtls_2_2_1 \
	-I$(ROOT_PREFIX)/include_lib/net/lwip_2_1_3/lwip/src/include \
	-I$(ROOT_PREFIX)/include_lib/net/lwip_2_1_3/lwip/src/include/lwip \
	-I$(ROOT_PREFIX)/include_lib/net/lwip_2_1_3/lwip/port \
	-I$(ROOT_PREFIX)/include_lib/net/lwip_2_1_3/lwip/app \
	-I$(DEMO_DIR)/include \
	-I$(DEMO_DIR) \
	-I$(DEMO_DIR)/../include \


# ---- C source files ------------------------------------------------------
# Common AC79 app baseline (same set demo_wifi links against; if any file
# is missing on a specific SDK snapshot, remove the corresponding line).
c_SRC_FILES := \
	$(ROOT_PREFIX)/apps/common/config/log_config/lib_driver_config.c \
	$(ROOT_PREFIX)/apps/common/config/log_config/lib_system_config.c \
	$(ROOT_PREFIX)/apps/common/config/log_config/lib_update_config.c \
	$(ROOT_PREFIX)/apps/common/config/user_cfg.c \
	$(ROOT_PREFIX)/apps/common/debug/debug.c \
	$(ROOT_PREFIX)/apps/common/debug/debug_user.c \
	$(ROOT_PREFIX)/apps/common/net/assign_macaddr.c \
	$(ROOT_PREFIX)/apps/common/net/config_network.c \
	$(ROOT_PREFIX)/apps/common/net/platform_cfg.c \
	$(ROOT_PREFIX)/apps/common/net/wifi_conf.c \
	$(ROOT_PREFIX)/apps/common/rf_fcc_tool/bt.c \
	$(ROOT_PREFIX)/apps/common/rf_fcc_tool/rf_fcc_main.c \
	$(ROOT_PREFIX)/apps/common/system/init.c \
	$(ROOT_PREFIX)/apps/common/system/system_reset_reason.c \
	$(ROOT_PREFIX)/apps/common/system/version.c \
	$(ROOT_PREFIX)/apps/common/update/update.c \
	$(ROOT_PREFIX)/cpu/wl82/debug.c \
	$(ROOT_PREFIX)/cpu/wl82/iic.c \
	$(ROOT_PREFIX)/cpu/wl82/key/adc_api.c \
	$(ROOT_PREFIX)/cpu/wl82/key/ctmu.c \
	$(ROOT_PREFIX)/cpu/wl82/key/irflt.c \
	$(ROOT_PREFIX)/cpu/wl82/key/plcnt.c \
	$(ROOT_PREFIX)/cpu/wl82/key/rdec.c \
	$(ROOT_PREFIX)/cpu/wl82/port_waked_up.c \
	$(ROOT_PREFIX)/cpu/wl82/setup.c \
	$(DEMO_DIR)/app_main.c \
	$(DEMO_DIR)/wifi_demo_task.c \
	$(DEMO_DIR)/auth_sdk_demo_task.c \
	$(DEMO_DIR)/board/wl82/board.c \


# ---- .S source files (version stamps) ------------------------------------
S_SRC_FILES := \
	$(ROOT_PREFIX)/include_lib/btctrler/version.z.S \
	$(ROOT_PREFIX)/include_lib/btstack/version.z.S \
	$(ROOT_PREFIX)/include_lib/driver/version.z.S \
	$(ROOT_PREFIX)/include_lib/media/version.z.S \
	$(ROOT_PREFIX)/include_lib/net/version.z.S \
	$(ROOT_PREFIX)/include_lib/server/version.z.S \
	$(ROOT_PREFIX)/include_lib/system/version.z.S \
	$(ROOT_PREFIX)/include_lib/update/version.z.S \
	$(ROOT_PREFIX)/include_lib/utils/version.z.S \
	$(ROOT_PREFIX)/lib/net/version.z.S \
	$(ROOT_PREFIX)/lib/server/version.z.S \
	$(ROOT_PREFIX)/lib/utils/version.z.S \


s_SRC_FILES   :=
cpp_SRC_FILES :=
cc_SRC_FILES  :=
cxx_SRC_FILES :=

# ---- Linker flags --------------------------------------------------------
LFLAGS := \
	--plugin-opt=-pi32v2-always-use-itblock=false \
	--plugin-opt=-enable-ipra=true \
	--plugin-opt=-pi32v2-merge-max-offset=4096 \
	--plugin-opt=-pi32v2-enable-simd=true \
	--plugin-opt=mcpu=r3 \
	--plugin-opt=-global-merge-on-const \
	--plugin-opt=-inline-threshold=5 \
	--plugin-opt=-inline-max-allocated-size=32 \
	--plugin-opt=-inline-normal-into-special-section=true \
	--plugin-opt=-dont-used-symbol-list=malloc,free,sprintf,printf,puts,putchar \
	--plugin-opt=save-temps \
	--plugin-opt=-pi32v2-enable-rep-memop \
	--plugin-opt=-emulated-tls \
	--sort-common \
	--plugin-opt=-used-symbol-file=$(ROOT_PREFIX)/cpu/wl82/sdk_used_list.used \
	--plugin-opt=-enable-movable-region=true \
	--plugin-opt=-movable-region-section-prefix=.movable.slot. \
	--plugin-opt=-movable-region-stub-section-prefix=.movable.stub. \
	--plugin-opt=-movable-region-prefix=.movable.region. \
	--plugin-opt=-movable-region-stub-prefix=__movable_stub_ \
	--plugin-opt=-movable-region-stub-swi-number=-2 \
	--plugin-opt=-movable-region-map-file-list=$(ROOT_PREFIX)/apps/common/movable/funcname.txt \
	--plugin-opt=-movable-region-section-map-file-list=$(ROOT_PREFIX)/apps/common/movable/section.txt \
	--plugin-opt=-movable-region-exclude-func-file-list=$(ROOT_PREFIX)/apps/common/movable/exclude.txt \
	--plugin-opt=-pi32v2-large-program=true \
	--start-group \
	$(ROOT_PREFIX)/include_lib/newlib/pi32v2-lib/libm.a \
	$(ROOT_PREFIX)/include_lib/newlib/pi32v2-lib/libc.a \
	$(ROOT_PREFIX)/include_lib/newlib/pi32v2-lib/libcompiler_rt.a \
	--start-group \
	$(ROOT_PREFIX)/cpu/wl82/liba/cpu.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/fs.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/event.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/system.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/cfg_tool.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/common_lib.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/update.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/wl_rf_common.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/hsm.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/wpasupplicant.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/http_cli.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/json.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/libmbedtls_2_2_1.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/lwip_2_1_3.a \
	$(ROOT_PREFIX)/cpu/wl82/liba/wl_wifi_sta.a \
	$(DEMO_DIR)/libs/libauth_sdk.a \
	--end-group \
	-T$(ROOT_PREFIX)/cpu/wl82/sdk.ld \
	-M=$(ROOT_PREFIX)/cpu/wl82/tools/sdk.map \
	--end-group  \
	--plugin-opt=mcpu=r3 \
	--plugin-opt=-mattr=+fprev1 \


# ---- Object-file bookkeeping (identical to demo_wifi baseline) -----------
c_OBJS    := $(c_SRC_FILES:%.c=%.c.o)
S_OBJS    := $(S_SRC_FILES:%.S=%.S.o)
s_OBJS    := $(s_SRC_FILES:%.s=%.s.o)
cpp_OBJS  := $(cpp_SRC_FILES:%.cpp=%.cpp.o)
cxx_OBJS  := $(cxx_SRC_FILES:%.cxx=%.cxx.o)
cc_OBJS   := $(cc_SRC_FILES:%.cc=%.cc.o)

OBJS      := $(c_OBJS) $(S_OBJS) $(s_OBJS) $(cpp_OBJS) $(cxx_OBJS) $(cc_OBJS)
DEP_FILES := $(OBJS:%.o=%.d)

OBJS      := $(addprefix $(BUILD_DIR)/, $(OBJS:$(ROOT_PREFIX)/%=%))
DEP_FILES := $(addprefix $(BUILD_DIR)/, $(DEP_FILES:$(ROOT_PREFIX)/%=%))

VERBOSE ?= 0
ifeq ($(VERBOSE), 1)
QUITE :=
else
QUITE := @
endif

LINK_AT ?= 1

.PHONY: all clean pre_build
.SUFFIXES:

all: pre_build $(OUT_ELF)
	$(info +POST-BUILD)
	$(QUITE) $(RUN_POST_SCRIPT) sdk

pre_build:
	$(info +PRE-BUILD)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/cpu/wl82/sdk_used_list.c -o $(ROOT_PREFIX)/cpu/wl82/sdk_used_list.used
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/apps/common/movable/section.c -o $(ROOT_PREFIX)/apps/common/movable/section.txt
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/cpu/wl82/sdk_ld.c -o $(ROOT_PREFIX)/cpu/wl82/sdk.ld
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/cpu/wl82/tools/download.c -o $(POST_SCRIPT)
	$(QUITE) $(FIXBAT) $(POST_SCRIPT)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/cpu/wl82/tools/isd_config_rule.c -o $(ROOT_PREFIX)/cpu/wl82/tools/isd_config.ini
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -D__LD__ -E -P $(ROOT_PREFIX)/cpu/wl82/tools/isd_config_rule_loader.c -o $(ROOT_PREFIX)/cpu/wl82/tools/isd_config_loader.ini

clean:
	$(QUITE) $(RM) $(OUT_ELF)
	$(QUITE) $(RM) $(BUILD_DIR)

ifeq ($(LINK_AT), 1)
$(OUT_ELF): $(OBJS)
	$(info +LINK $@)
	$(shell $(MKDIR) $(@D))
	$(file >$(OBJ_FILE), $(OBJS))
	$(QUITE) $(LD) -o $(OUT_ELF) @$(OBJ_FILE) $(LFLAGS) $(LIBPATHS) $(LIBS)
else
$(OUT_ELF): $(OBJS)
	$(info +LINK $@)
	$(shell $(MKDIR) $(@D))
	$(QUITE) $(LD) -o $(OUT_ELF) $(OBJS) $(LFLAGS) $(LIBPATHS) $(LIBS)
endif

$(BUILD_DIR)/%.c.o : $(ROOT_PREFIX)/%.c
	$(info +CC $<)
	$(QUITE) $(MKDIR) $(@D)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -MM -MT $@ $< -o $(@:.o=.d)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c $< -o $@

$(BUILD_DIR)/%.S.o : $(ROOT_PREFIX)/%.S
	$(info +AS $<)
	$(QUITE) $(MKDIR) $(@D)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -MM -MT $@ $< -o $(@:.o=.d)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c $< -o $@

$(BUILD_DIR)/%.s.o : $(ROOT_PREFIX)/%.s
	$(info +AS $<)
	$(QUITE) $(MKDIR) $(@D)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -MM -MT $@ $< -o $(@:.o=.d)
	$(QUITE) $(CC) $(CFLAGS) $(DEFINES) $(INCLUDES) -c $< -o $@

-include $(DEP_FILES)
