# Modified for non-openwrt system
MAKEFLAGS += -r -R

VERSION_YEAR=$(shell date +%Y)
VERSION_MAJOR=$(shell expr $(VERSION_YEAR) - 2018)
VERSION_MINOR=$(shell date +%02V%u)
VERSION_REVISION=0000
#
MAJOR_VERSION:=$(shell jq .version ../package.json | tr -d '"')
PROJECT_VERSION:=$(shell tail -n 1 ../pro_changelog.md | cut -d ':' -f 1)
CUR_BRACH:=$(shell git rev-parse --abbrev-ref HEAD)
CUR_COMMIT:=$(shell git rev-parse --short HEAD)
ifeq ($(SOFT_VERSION),)
SOFT_VERSION:="$(MAJOR_VERSION)_$(PROJECT_VERSION)_$(CUR_BRACH)_$(CUR_COMMIT)"
endif
MAJOR_PRO_VERSION:="$(MAJOR_VERSION)_$(PROJECT_VERSION)"
ifeq ($(SOFT_VERSION),)
  $(warning .version not found in ../package.json)
  SOFT_VERSION:="$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)"
endif

$(shell echo $(SOFT_VERSION) > version-for-ipkg) # IPK包使用
$(shell echo $(SOFT_VERSION) > version.log) # 生产elf的时候添加版本使用

BUILD_TIME := $(shell date +%Y%m%d%H%M)
SOFT_VERSION_UNQUOTED := $(patsubst "%",%,$(SOFT_VERSION))
DISPLAY_VERSION := $(MAJOR_VERSION).$(BUILD_TIME)

TARGET=proto_forward
TARGET_LC=emu_lc
WITH_OPC=1
WITH_EMS=1
ifneq ("$(NON_OPENWRT_LED)","")
SUPPORT_LED=$(NON_OPENWRT_LED)
else
SUPPORT_LED=1
endif

ifdef WITH_DEBUG
  MYCFLAGS := -g
else
  MYCFLAGS := -DNDEBUG -g
endif

ifeq ("$(SUPPORT_LED)","1")
  MYCFLAGS += -DSUPPORT_LED=1
  CFLAGS_LC += -DSUPPORT_LED=1
else
  MYCFLAGS += -DSUPPORT_LED=0
  CFLAGS_LC += -DSUPPORT_LED=0
endif
MYCFLAGS +=  $(CFLAGS) -Wall -fstack-protector-all -fno-strict-aliasing '-DSW_VERSION="$(DISPLAY_VERSION)"' '-DMAJOR_PRO_VERSION=$(MAJOR_PRO_VERSION)' '-DDISPLAY_VERSION="$(SOFT_VERSION_UNQUOTED)"' -D_GNU_SOURCE -g -O0
CFLAGS_LC += $(CFLAGS) -Wall -fstack-protector-all -fno-strict-aliasing '-DSW_VERSION="$(DISPLAY_VERSION)"' '-DMAJOR_PRO_VERSION=$(MAJOR_PRO_VERSION)' '-DDISPLAY_VERSION="$(SOFT_VERSION_UNQUOTED)"' -D_GNU_SOURCE
SOURCES=$(wildcard *.c) $(wildcard ./libmodbus/*.c) $(wildcard ./cloud/*.c) $(wildcard ./mac_mul/*.c)  $(wildcard ./mqtt_emms2/*.c )  $(wildcard ./log_module/*.c ) $(wildcard ./iec104_server/*.c )   $(wildcard ./snapshoot/*.c) $(wildcard ./north_mqtt/*.c) $(wildcard ./ota_upgrade/*.c)  $(wildcard ./rate/*.c) $(wildcard ./automatic_north/*.c) $(wildcard ./abnormal_log/*.c) $(wildcard ./business_log/*.c)
SOURCES+= $(wildcard ./frpc_proxy/*.c) $(wildcard ./mqtt_dp/*.c) 
SOURCES+= $(wildcard ./bmser/*.c)
SOURCES+= $(wildcard ./pcs_business_adapter/*.c) 

ifeq ($(filter iMX6ULL, $(LNX_TARGET_DEV)),)
    MYCFLAGS += -DEN_ACCIDENT
	SOURCES += $(wildcard ./accident/*.c)
endif

MYCFLAGS += -I./libmodbus -I./common -I./cloud -I./mqtt_emms2 -I./log_module -I./snapshoot -I./abnormal_log -I./business_log\
	$(if $(STAGING_DIR),-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/usr/include/lib60870)


MYLDFLAGS := $(LDFLAGS) -ldyutils  -lpthread -lmqtt_session -llib60870 -llz4 -lcrypto -lcurl -llua -lxlsxwriter -lz -lm -llnxhal -luv -lrt -lubuslog
LDFLAGS_LC=$(LDFLAGS) -ldyutils  -lpthread -lopen62541 -lsqlite3 -lmqtt_session -llib60870 -llz4 -lcrypto -lcurl -lopen62541 -lsqlite3 -llua -lxlsxwriter -lz -lm -llnxhal -luv -lrt -lubuslog
#使用strlcpy需要-lbsd
ifdef WITH_OPC
    MYCFLAGS += -DEN_OPCUA
	MYCFLAGS += -I$(STAGING_DIR)/usr/include/open62541
	SOURCES += $(wildcard ./opcua/*.c)
	MYLDFLAGS += -lopen62541 -lsqlite3
endif
SOURCES +=  $(wildcard ./alarm_control/*.c ) 
ifeq ("$(EN_TDENGINE)","1")
  MYCFLAGS += -DEN_TDENGINE
  CFLAGS_LC += -DEN_TDENGINE
  MYLDFLAGS +=-ltaos
  LDFLAGS_LC += -ltaos
  SOURCES += $(wildcard ./database/*.c)
  SOURCES_LC += $(wildcard ./database/*.c)
else 
  MYCFLAGS += -DEN_SQLITE
  CFLAGS_LC += -DEN_SQLITE
endif

ifdef WITH_EMS
	MYCFLAGS += -DEN_EMS -I./cc_lc_com
	SOURCES += $(wildcard ./cc_lc_com/*.c) $(wildcard ./ems/*.c)
endif
SOURCES += $(wildcard ./adapter/*.c) $(wildcard ./adapter/*/*.c)  
OBJECTS := $(SOURCES:.c=.o)

ifdef EN_BMSER_LIB
	ifneq ($(EN_BMSER_DB_CTROL_LIB),0)  
		MYCFLAGS += -DEN_BMSER_DB_CTROL_LIB -DEN_BMSER_VIRTUAL_DEV
		MYLDFLAGS += -ldb_control
		CFLAGS_LC += -DEN_BMSER_DB_CTROL_LIB -DEN_BMSER_VIRTUAL_DEV
		LDFLAGS_LC += -ldb_control
	endif
endif

SOURCES_LC += $(wildcard *.c)
SOURCES_LC += $(wildcard ./libmodbus/*.c)
SOURCES_LC += $(wildcard ./mac_mul/*.c)
SOURCES_LC += $(wildcard ./log_module/*.c ) $(wildcard ./opcua/*.c) $(wildcard ./business_log/*.c)
SOURCES_LC += $(wildcard ./cc_lc_com/*.c) $(wildcard ./lc/*.c) $(wildcard ./adapter/*.c) $(wildcard ./adapter/*/*.c)
# SOURCES_LC += $(wildcard ./alarm_control/*.c ) 
OBJECTS_LC := $(SOURCES_LC:.c=.o)
OBJECTS_LC := $(notdir $(OBJECTS_LC))
OBJECTS_LC := $(addprefix .obj_lc/,$(OBJECTS_LC))

OBJECTS_EMS := $(SOURCES:.c=.o)
OBJECTS_EMS := $(notdir $(OBJECTS_EMS))
OBJECTS_EMS := $(addprefix .obj_ems/,$(OBJECTS_EMS))

CFLAGS_LC += -I./libmodbus -I./common -I./cloud -I./cc_lc_com -I./log_module -I./business_log -I$(STAGING_DIR)/usr/include/open62541 -DEN_LC -DEN_OPCUA
CFLAGS_LC += $(if $(STAGING_DIR),-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/usr/include/lib60870)

# 多语言库
# LDFLAGS_LC += -lgettextlib  -I${LNXDESTPFX}/include/gettext -L${LNXDESTPFX}/lib/gettext

# 编译的时候添加环境变量MMCK=true,就会链接内存检测工具，可以检测内存泄漏和堆访问越界问题
# 会一定的性能损耗，需要连接到代码，所以只适合在需要检测内存问题的适合链接到代码中。
# 依赖gcc编译器自带的libasan.so.4库，如果板子上面没有需要拷贝过去
ifeq ("$(MMCK)","true")
   MYCFLAGS += -fsanitize=address -fno-omit-frame-pointer
   MYLDFLAGS += -fsanitize=address -fno-omit-frame-pointer
   CFLAGS_LC += -fsanitize=address -fno-omit-frame-pointer
   LDFLAGS_LC += -fsanitize=address -fno-omit-frame-pointer
endif

undefine PCLNT_WRAPPER
ifneq ("$(COLNT_DIR)","")
ifneq ("$(wildcard $(COLNT_DIR))","")
$(info Trying to linting C/C++ sources files...)
PCLNT_WRAPPER :=pclnt_wrapper
endif
endif

define EMS_OBJ_RULE
.obj_ems/$(1): $2
	$(PCLNT_WRAPPER) $$(CC) $$(MYCFLAGS) -MT $$@ -MP -MMD -MF ".depends_ems/$(1).d" -c -o $$@ $$<
endef

define LC_OBJ_RULE
.obj_lc/$(1): $2
	$(PCLNT_WRAPPER) $$(CC) $$(CFLAGS_LC) -MT $$@ -MP -MMD -MF ".depends_lc/$(1).d" -c -o $$@ $$<
endef

all: $(TARGET) # $(TARGET_LC)
	@echo "ver: $(DISPLAY_VERSION)"

$(OBJECTS_EMS): | .obj_ems .depends_ems
.obj_ems .depends_ems:
	mkdir -p $@
$(TARGET): $(OBJECTS_EMS)
	$(CC) -o $(TARGET) $^ $(MYLDFLAGS)
	tar -czvf $(TARGET).tar $(TARGET)

$(OBJECTS_LC): | .obj_lc .depends_lc
.obj_lc .depends_lc:
	mkdir -p $@
$(TARGET_LC): $(OBJECTS_LC)
	$(CC) -o $(TARGET_LC) $^ $(LDFLAGS_LC)

$(foreach src,$(SOURCES),$(eval $(call EMS_OBJ_RULE,$(notdir $(patsubst %.c,%.o,$(src))),$(src))))
$(foreach src,$(SOURCES_LC),$(eval $(call LC_OBJ_RULE,$(notdir $(patsubst %.c,%.o,$(src))),$(src))))


po:
	$(shell ./update_po.sh)

clean:
	-rm -rf .depends_lc/*.d .depends_ems/*.d
	find . -name '*.o' -type f -print -exec rm -rf {} \;
	find . -name '*.a' -type f -print -exec rm -rf {} \;
	rm -f $(TARGET)
	rm -f $(TARGET_LC)
-include $(wildcard .depends_lc/*.d)
-include $(wildcard .depends_ems/*.d)
