# PROTO_FORWARD BUILD SYSTEM
# 2026-03-27
MAKEFLAGS += -r -R

TARGET := proto_forward
TARGET_LC := emu_lc
EMS_BUILD_DIR := build/ems
LC_BUILD_DIR := build/lc

WITH_OPC ?= 1
WITH_EMS ?= 1

VERSION_YEAR     := $(shell date +%Y)
VERSION_MAJOR    := $(shell expr $(VERSION_YEAR) - 2018)
VERSION_MINOR    := $(shell date +%02V%u)
VERSION_REVISION := 0000

PACKAGE_VERSION  := $(shell jq -r '.version // empty' ../package.json 2>/dev/null)
PROJECT_VERSION  := $(shell tail -n 1 ../pro_changelog.md 2>/dev/null | cut -d ':' -f 1)
CURRENT_BRANCH   := $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
CURRENT_COMMIT   := $(shell git rev-parse --short HEAD 2>/dev/null)

ifndef SOFT_VERSION
ifneq ($(strip $(PACKAGE_VERSION)),)
SOFT_VERSION := "$(PACKAGE_VERSION)_$(PROJECT_VERSION)_$(CURRENT_BRANCH)_$(CURRENT_COMMIT)"
else
$(warning .version not found in ../package.json)
SOFT_VERSION := "$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_REVISION)"
endif
endif

ifneq ($(strip $(PACKAGE_VERSION)),)
MAJOR_PRO_VERSION := "$(PACKAGE_VERSION)_$(PROJECT_VERSION)"
else
MAJOR_PRO_VERSION := "$(VERSION_MAJOR).$(VERSION_MINOR)"
endif

ifdef NON_OPENWRT_LED
SUPPORT_LED := $(NON_OPENWRT_LED)
else
SUPPORT_LED := 1
endif

STRICT_CFLAGS = -Werror -Wextra \
				-Wno-unused-parameter \
				-Wno-sign-compare \
				-Wno-empty-body \
				-Wno-old-style-declaration \
				-Wlogical-op \
				-Wduplicated-cond \
				-Wduplicated-branches \
				-Wformat-overflow=2
BASE_CFLAGS := $(CFLAGS) $(STRICT_CFLAGS) -Wall -fstack-protector-all -fno-strict-aliasing -D_GNU_SOURCE
ifdef WITH_DEBUG
BASE_CFLAGS += -g
else
BASE_CFLAGS += -DNDEBUG -g -O0
endif

EMS_CFLAGS := $(BASE_CFLAGS)
EMS_CFLAGS += -DSUPPORT_LED=$(SUPPORT_LED)
EMS_CFLAGS += '-DSW_VERSION=$(SOFT_VERSION)' '-DMAJOR_PRO_VERSION=$(MAJOR_PRO_VERSION)'

LC_CFLAGS := $(BASE_CFLAGS)
LC_CFLAGS += -DSUPPORT_LED=$(SUPPORT_LED) -DEN_LC -DEN_OPCUA
LC_CFLAGS += '-DSW_VERSION=$(SOFT_VERSION)' '-DMAJOR_PRO_VERSION=$(MAJOR_PRO_VERSION)'

COMMON_INCLUDES := -I./libmodbus -I. -I./cloud -I./log_module -I./business_log
COMMON_INCLUDES += $(if $(STAGING_DIR),-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/usr/include/lib60870)

EMS_CFLAGS += $(COMMON_INCLUDES)
EMS_CFLAGS += -I./mqtt_emms2 -I./snapshoot -I./abnormal_log

LC_CFLAGS += $(COMMON_INCLUDES)
LC_CFLAGS += -I./cc_lc_com -I$(STAGING_DIR)/usr/include/open62541

COMMON_LIBS := $(LDFLAGS) -ldyutils -lpthread -lmqtt_session -llib60870 -llz4
COMMON_LIBS += -lcrypto -lcurl -llua -lxlsxwriter -lz -lm -llnxhal -luv -lrt -lubuslog

EMS_LIBS := $(COMMON_LIBS)
LC_LIBS := $(COMMON_LIBS) -lopen62541 -lsqlite3

ROOT_SRCS := $(wildcard *.c)
ADAPTER_SRCS := $(wildcard adapter/*.c) $(wildcard adapter/*/*.c)
COMMON_SRCS := $(ROOT_SRCS)
COMMON_SRCS += $(wildcard libmodbus/*.c)
COMMON_SRCS += $(wildcard cloud/*.c)
COMMON_SRCS += $(wildcard mac_mul/*.c)
COMMON_SRCS += $(wildcard mqtt_emms2/*.c)
COMMON_SRCS += $(wildcard log_module/*.c)
COMMON_SRCS += $(wildcard iec104_server/*.c)
COMMON_SRCS += $(wildcard snapshoot/*.c)
COMMON_SRCS += $(wildcard north_mqtt/*.c)
COMMON_SRCS += $(wildcard ota_upgrade/*.c)
COMMON_SRCS += $(wildcard rate/*.c)
COMMON_SRCS += $(wildcard automatic_north/*.c)
COMMON_SRCS += $(wildcard abnormal_log/*.c)
COMMON_SRCS += $(wildcard business_log/*.c)
COMMON_SRCS += $(wildcard frpc_proxy/*.c)
COMMON_SRCS += $(wildcard mqtt_dp/*.c)
COMMON_SRCS += $(wildcard bmser/*.c)
COMMON_SRCS += $(wildcard pcs_business_adapter/*.c)
COMMON_SRCS += $(wildcard alarm_control/*.c)
COMMON_SRCS += $(ADAPTER_SRCS)

EMS_SRCS := $(COMMON_SRCS)

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

ifeq ($(WITH_OPC),1)
EMS_CFLAGS += -DEN_OPCUA -I$(STAGING_DIR)/usr/include/open62541
EMS_SRCS += $(wildcard opcua/*.c)
EMS_LIBS += -lopen62541 -lsqlite3
endif

ifeq ($(EN_TDENGINE),1)
EMS_CFLAGS += -DEN_TDENGINE
LC_CFLAGS += -DEN_TDENGINE
EMS_SRCS += $(wildcard database/*.c)
LC_SRCS += $(wildcard database/*.c)
EMS_LIBS += -ltaos
LC_LIBS += -ltaos
else
EMS_CFLAGS += -DEN_SQLITE
LC_CFLAGS += -DEN_SQLITE
endif

ifeq ($(WITH_EMS),1)
EMS_CFLAGS += -DEN_EMS -I./cc_lc_com
EMS_SRCS += $(wildcard cc_lc_com/*.c)
EMS_SRCS += $(wildcard ems/*.c)
endif

ifdef EN_BMSER_LIB
ifneq ($(EN_BMSER_DB_CTROL_LIB),0)
EMS_CFLAGS += -DEN_BMSER_DB_CTROL_LIB -DEN_BMSER_VIRTUAL_DEV
LC_CFLAGS += -DEN_BMSER_DB_CTROL_LIB -DEN_BMSER_VIRTUAL_DEV
EMS_LIBS += -ldb_control
LC_LIBS += -ldb_control
endif
endif

ifeq ($(MMCK),true)
EMS_CFLAGS += -fsanitize=address -fno-omit-frame-pointer
LC_CFLAGS += -fsanitize=address -fno-omit-frame-pointer
EMS_LIBS += -fsanitize=address -fno-omit-frame-pointer
LC_LIBS += -fsanitize=address -fno-omit-frame-pointer
endif

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

LC_SRCS += $(ROOT_SRCS)
LC_SRCS += $(wildcard libmodbus/*.c)
LC_SRCS += $(wildcard mac_mul/*.c)
LC_SRCS += $(wildcard log_module/*.c)
LC_SRCS += $(wildcard opcua/*.c)
LC_SRCS += $(wildcard business_log/*.c)
LC_SRCS += $(wildcard cc_lc_com/*.c)
LC_SRCS += $(wildcard lc/*.c)
LC_SRCS += $(ADAPTER_SRCS)

EMS_SRCS := $(sort $(patsubst ./%,%,$(EMS_SRCS)))
LC_SRCS := $(sort $(patsubst ./%,%,$(LC_SRCS)))

EMS_OBJS := $(patsubst %.c,$(EMS_BUILD_DIR)/%.o,$(EMS_SRCS))
LC_OBJS := $(patsubst %.c,$(LC_BUILD_DIR)/%.o,$(LC_SRCS))
EMS_DEPS := $(EMS_OBJS:.o=.d)
LC_DEPS := $(LC_OBJS:.o=.d)

COLOR_GRE := \033[1;32m
COLOR_RST := \033[0m

ifeq ($(V),1)
Q :=
SHOW_CC = @:
SHOW_LD = @:
SHOW_GEN = @:
SHOW_TAR = @:
else
Q := @
SHOW_CC = @printf  '[ CC  ] $(COLOR_GRE)%s$(COLOR_RST)\n' "$<"
SHOW_LD = @printf  '[ LD  ] $(COLOR_GRE)%s$(COLOR_RST)\n' "$@"
SHOW_GEN = @printf '[ GEN ] $(COLOR_GRE)%s$(COLOR_RST)\n' "$@"
SHOW_TAR = @printf '[ TAR ] $(COLOR_GRE)%s$(COLOR_RST)\n' "$@.tar"
endif

all: $(TARGET)
	@printf 'ver: %s\n' $(SOFT_VERSION)

.PHONY: version-for-ipkg version.log
version-for-ipkg version.log:
	$(SHOW_GEN)
	$(Q)printf '%s\n' $(SOFT_VERSION) > $@

$(TARGET): $(EMS_OBJS) version-for-ipkg version.log
	$(SHOW_LD)
	$(Q)$(CC) -o $@ $(EMS_OBJS) $(EMS_LIBS)
	$(SHOW_TAR)
	$(Q)tar -czf $@.tar $@

$(TARGET_LC): $(LC_OBJS) version-for-ipkg version.log
	$(SHOW_LD)
	$(Q)$(CC) -o $@ $(LC_OBJS) $(LC_LIBS)

$(EMS_BUILD_DIR)/%.o: %.c
	@mkdir -p $(dir $@)
	$(SHOW_CC)
	$(Q)$(PCLNT_WRAPPER) $(CC) $(EMS_CFLAGS) -MMD -MP -c $< -o $@

$(LC_BUILD_DIR)/%.o: %.c
	@mkdir -p $(dir $@)
	$(SHOW_CC)
	$(Q)$(PCLNT_WRAPPER) $(CC) $(LC_CFLAGS) -MMD -MP -c $< -o $@

po:
	./update_po.sh

clean:
	rm -rf $(TARGET) $(TARGET_LC) $(TARGET).tar
	rm -rf $(EMS_BUILD_DIR) $(LC_BUILD_DIR)
	rm -rf .obj_ems .obj_lc .depends_ems .depends_lc
	find . -name '*.a' -type f -print -exec rm -f {} \;

rebuild: clean all

.PHONY: all clean po rebuild

-include $(EMS_DEPS)
-include $(LC_DEPS)
