#!/bin/bash

# Created by jiaqiang.ye@lnxall.com
# Simple Module list for LNXALL WooLinkOS core
# 2022/06/28

lcore_dummy_config() {
    : Welcome to WooLinkOS by Lnxall
    return 0
}

lcore_common_build() {
    make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS}" \
        CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
    return $?
}

lcore_common_clean() {
    make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}" clean
    return $?
}

lcore_dummy_clean() {
	: NOTHING TODO FOR DUMMY CLEAN
	return 0
}

lua_libutils_build() {
    make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS}" \
        CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	[ $? -ne 0 ] && return 1
	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/lib/lua"
	cp -v tty_rw "${LNXDESTPFX}/bin/" || return 1
    cp -v *.so ../files/*.lua "${LNXDESTPFX}/lib/lua/"
    return $?
}

ubus_log_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
		LDFLAGS="${LNX_LDFLAGS}" all || return 1

	mkdir -p "${LNXDESTPFX}/include" "${LNXDESTPFX}/bin" || return 2
	cp -v lnxall_ubuslog.h "${LNXDESTPFX}/include/" || return 3

	mkdir -p "${LNXDESTPFX}/lib/lua/ubuslog" && \
		cp -v core.so "${LNXDESTPFX}/lib/lua/ubuslog/" && \
		cp -v ubuslog.lua "${LNXDESTPFX}/lib/lua/" && \
		cp -v libubuslog.so "${LNXDESTPFX}/lib/" && \
		cp -v ulog "${LNXDESTPFX}/bin/"
	return $?
}

libipc_session_build() {
	local retv=0
	make V=1 -j1 CC=${LNX_CC} CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" ; retv=$?
	[ ${retv} -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}"/{include/dy_utils,lib}
	cp -v -P ./include/* "${LNXDESTPFX}/include/dy_utils/" ; retv=$?
	[ ${retv} -ne 0 ] && return 2

	cp -v -P *.so "${LNXDESTPFX}/lib/" ; retv=$?
	return $retv
}

lnxall_simple_build() {
	local retv=0
	local CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	make V=1 -j1 CC="${LNX_CC}" CFLAGS="${CFLAGS}" \
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" SUPPORT_LED=1; retv=$?
	[ ${retv} -ne 0 ] && return 1

	if [ -n "$1" ] ; then
		[ ! -d "${LNXDESTPFX}/bin" ] && mkdir -p "${LNXDESTPFX}/bin"
		cp -v -r "$1" "${LNXDESTPFX}/bin/"
		retv=$?
	fi
	return ${retv}
}

libdyutils_build() {
	local retv=0
	lnxall_simple_build || return 1
	mkdir -p "${LNXDESTPFX}"/{include/dy_utils,lib}
	cp -r -v -P ./include/* "${LNXDESTPFX}/include/dy_utils/" ; retv=$?
	[ ${retv} -ne 0 ] && return 2

	cp -v -P *.so "${LNXDESTPFX}/lib/" ; retv=$?
	return $retv
}

rs485_build() {
	lnxall_simple_build dy_rs485
	return $?
}

modbus_tcp_build() {
	lnxall_simple_build dy_modbus_tcp
	return $?
}

rs485_slave_build() {
	lnxall_simple_build rs485_slave
	return $?
}

data_reporter_build() {
	lnxall_simple_build dy_data_reporter
	return $?
}

config_manager_build() {
	lnxall_simple_build dy_config_manager
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/app"
	cp -v -f network_restart.lua "${LNXDESTPFX}/app/"
	return $?
}

cloud_mqtt_build() {
	lnxall_simple_build cloud_mqtt
	return $?
}

protocol_parser_build() {
	local retv=0
	local CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	make PP_USE_PYTHON3=yes V=1 -j1 CC="${LNX_CC}" CFLAGS="${CFLAGS}" \
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" ; retv=$?
	[ ${retv} -ne 0 ] && return 1
    cp -v -f dy_protocol_parser "${LNXDESTPFX}/bin/"
	return $retv
}

cloud_conn_dayun_build() {
    lnxall_simple_build cloud_conn_dayun
    return $?
}

lib60870_build() {
	make V=1 AR="${LNX_TCP}-ar" RANLIB="${LNX_TCP}-ranlib" \
		CC=${LNX_CC} -j1 lib
	local retv=$?
	[ ${retv} -ne 0 ] && return 1

	make V=1 AR="${LNX_TCP}-ar" RANLIB="${LNX_TCP}-ranlib" \
		CC=${LNX_CC} -j1 INSTALL_PREFIX=${LNXDESTPFX} install
	retv=$?
	[ ${retv} -ne 0 ] && return 2
	mkdir -p "${LNXDESTPFX}/lib"
	cp -v -f ./build/lib60870.a "${LNXDESTPFX}/lib/liblib60870.a"
	return $?
}

scada_iec104_build() {
	lnxall_simple_build dy_scada_iec104
	return $?
}

init_lnxall_build() {
	local retv=0

	cp -v -f linit.lua "${LNXDESTPFX}/bin/"
	retv=$?
	[ $retv -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/app/config" ; retv=$?
	[ $retv -ne 0 ] && return 2

	cp -v lnxall_applist.json "${LNXDESTPFX}/app/config/" ; retv=$?
	[ $retv -ne 0 ] && return 3

	return 0
}

base_files_build() {
	local OLDDIR="${PWD}"
	mkdir -p "${LNXDESTPFX}/etc/gcom"
	# copy 4G related files for comgt
	cd ${FTOPDIR}/package_repos/dy_base-files/etc/gcom && \
		cp -v -f * "${LNXDESTPFX}/etc/gcom/"

	cd "${OLDDIR}"
	cp -f -v -r -p -P * "${LNXDESTPFX}/"
	[ $? -ne 0 ] && return 1

	local direc="${LNXDESTPFX}/lib/dyiot/bin"
	mkdir -p "$direc"

	cd ${FTOPDIR}/package_repos/dy_base-files/lib/dyiot/bin && \
		cp -v -f set_wan.sh "$direc/"
	return $?
}

function nodes_upgrade_build {
	lnxall_simple_build dy_upgrade
	return $?
}

function device_monitor_build {
	lnxall_simple_build dy_device_monitor
	return $?
}

lua_pack_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LIBFLAG="-shared ${LNX_LDFLAGS}" \
		LUA_LIBDIR="${LNXDESTPFX}/lib" LUA_INCDIR="${LNXDESTPFX}/include"
	local retv=$?
	[ $retv -ne 0 ] && return 1
	cp -v -f *.so dyutils.lua "${LNXDESTPFX}/lib/lua/"
	return $?
}

lua_lpack_build() {
	make CC=${LNX_CC} INCS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" && \
		cp -v -f *.so "${LNXDESTPFX}/lib/lua/"
	return $?
}

lua_pack_clean() {
	rm -rf *.o *.so
	return 0
}

lsocket_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LIBFLAG="-shared ${LNX_LDFLAGS}" \
		LUA_LIBDIR="${LNXDESTPFX}/lib" LUA_INCDIR="${LNXDESTPFX}/include"
	local retv=$?
	[ $retv -ne 0 ] && return 1
	cp -v -f *.so "${LNXDESTPFX}/lib/lua/"
	return $?
}

lsocket_clean() {
	rm -rf *.o *.so
	return 0
}

youcan_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	cp -f -v youcan "${LNXDESTPFX}/bin/" && cp -f -v cmod/libcmod.so "${LNXDESTPFX}/lib/"
	return $?
}

sdmount_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	mkdir -p "${LNXDESTPFX}/bin/"
	cp -f -v sdmount "${LNXDESTPFX}/bin/"
	return $?
}

gpio_powerchk_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	mkdir -p "${LNXDESTPFX}/bin/"
	cp -f -v gpio_powerchk "${LNXDESTPFX}/bin/"
	#cp -f -v system-power-down.sh "/app/"
	return $?
}

ems_ctrl_build() {
	local retv=0
	local CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	make  V=1 -j1 CC="${LNX_CC}" CFLAGS="${CFLAGS}" \
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" ; retv=$?
	[ ${retv} -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/app/config/ems"
	cp -v -f ../files/*.json "${LNXDESTPFX}/app/config/ems/" && cp -v -f ems_ctrl \
		"${LNXDESTPFX}/bin/"
	return $?
}

energy_assign_build() {
	local retv=0
	local CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	make V=1 -j1 CC="${LNX_CC}" CFLAGS="${CFLAGS}" LD="${LNX_LD}"\
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" ; retv=$?
	[ ${retv} -ne 0 ] && return 1

    cp -v -f ../files/*.json "${LNXDESTPFX}/app/config/ems/" && cp -v -f energy_assign \
         "${LNXDESTPFX}/bin/"
	return $retv
}

multi_meters_build() {
	local retv=0
	local CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include"
	make V=1 -j1 CC="${LNX_CC}" CFLAGS="${CFLAGS}" \
		LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" ; retv=$?
	[ ${retv} -ne 0 ] && return 1
    
    cp -v -f ../files/*.json "${LNXDESTPFX}/app/config/ems/" && cp -v -f multi_meters \
        "${LNXDESTPFX}/bin/"
	return $retv
}

cloud_emmsv2_build() {
    lnxall_simple_build cloud_emmsv2
    [ $? -ne 0 ] && return 1

    cp -v -f ../files/* "${LNXDESTPFX}/app/config/" && cp -v -f cloud_emmsv2 \
        "${LNXDESTPFX}/bin/"
    return $?
}

ems_redis_build() {
    lnxall_simple_build ems_redis
       [ $? -ne 0 ] && return 1
       [ ! -d '${LNXDESTPFX}/app/config' ] && mkdir -p "${LNXDESTPFX}/app/config/ems_redis"

    cp -v -rf ../files/* "${LNXDESTPFX}/app/config/ems_redis" && cp -v -f ems_redis \
        "${LNXDESTPFX}/bin/"
    return $?
}

ua_mqttv1_build() {
    lnxall_simple_build ua_mqttv1
    [ $? -ne 0 ] && return 1

    cp -v -rf ../files/* "${LNXDESTPFX}/app/config/" && cp -v -f ua_mqttv1 \
        "${LNXDESTPFX}/bin/"
    return $?
}

iec104_server_new_build() {
    lnxall_simple_build iec104_server_new
    [ $? -ne 0 ] && return 1

    cp -v -f iec104_server_new "${LNXDESTPFX}/bin/"
}

modbus_tcp_slave_build() {
    lnxall_simple_build modbus_tcp_slave
    [ $? -ne 0 ] && return 1

    cp -v -f modbus_tcp_slave "${LNXDESTPFX}/bin/"
}

dido_modbus_new_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	cp -f -v dido_modbus_new "${LNXDESTPFX}/bin/"
	return $?
}


xl9555_build() {
	export -n DIDO_I2CDEV_PATH DIDO_DINT_GPIO
	if [ "${LNX_TARGET_DEV}" = 'iMX6ULL' ] ; then
		export DIDO_DINT_GPIO=118
	elif [ "${LNX_TARGET_DEV}" = "RK3568_FORLINX" ] ; then
		export DIDO_DINT_GPIO=103
		export DIDO_I2CDEV_PATH=/dev/i2c-1
	elif [ "${LNX_TARGET_DEV}" = 'RK3588' ] ; then
		export DIDO_DINT_GPIO=121
		export DIDO_I2CDEV_PATH=/dev/i2c-7
	fi
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	# install compiled application
	cp -f -v dido-xl9555 "${LNXDESTPFX}/bin/"
	return $?
}

xl9555_xddl() {
	export -n DIDO_DINT_GPIO
	export DIDO_I2CDEV_PATH=/dev/i2c-0
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	# install compiled application
	cp -f -v dido-xl9555 "${LNXDESTPFX}/bin/"
	return $?
}

poweroff_check_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	mkdir -p "${LNXDESTPFX}/bin/"
	cp -f -v poweroff_check "${LNXDESTPFX}/bin/"
	return $?
}

rust_clean() {
	rm -rf *.o
	make TARGET_CC="${LNX_CC}" TARGET_CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
		TARGET_STRIP="${LNX_TCP}-strip" clean
	return 0
}

sysmon_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/platspec"
	cp -v -f location_4g sysmonitor.lua fancontrol.lua dns4gcheck.lua "${LNXDESTPFX}/bin/"
	cp -v -f location_4g.service dns4gcheck.service mmc1watch.service "${LNXDESTPFX}/platspec/"
	cp -v -f verify_serial_sn.lua imx6ul_mmc1_watch "${LNXDESTPFX}/bin/"
	return $?
}

lnxbinlog_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/lib" "${LNXDESTPFX}/include"
	cp -v -f transblog "${LNXDESTPFX}/bin/" && \
		cp -v -f liblnxblog.so "${LNXDESTPFX}/lib/" && \
		cp -v -f lnxbinlog.h "${LNXDESTPFX}/include/"
	return $?
}

lnxhal_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/lib" "${LNXDESTPFX}/include"
	cp -v -f liblnxhal.so "${LNXDESTPFX}/lib/" && \
		cp -v -f lnxall_hal.h "${LNXDESTPFX}/include/"
	return $?
}

misctools_build() {
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin" && cp -v nothup mmap \
		hdmi-display.sh elf-update-blink-no-gwsn.lua \
		bdhcpd.sh "${LNXDESTPFX}/bin/"
	[ $? -ne 0 ] && return 2

	mkdir -p "${LNXDESTPFX}/app/config"
	cp -v -f *-tp-*.conf "${LNXDESTPFX}/app/config/"
	return $?
}

rathole_build() {
	make CC="${LNX_CC}"
	[ $? -ne 0 ] && return 1

	cp -v -f rathole "${LNXDESTPFX}/bin/" || return 2
	mkdir -p "${LNXDESTPFX}/app/config"
	cp -v -f rathole.toml "${LNXDESTPFX}/app/config/"
	return $?
}

rathole_config_build() {
	mkdir -p "${LNXDESTPFX}/app/config"
	cp -v -f src/rathole.toml "${LNXDESTPFX}/app/config/"
	return $?
}

em1k_facini_build() {
	EXTRA_LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" make \
		TARGET_CC="${LNX_CC}" TARGET_CFLAGS="${LNX_CFLAGS}" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	cp -f -v -P get_facini set_facini "${LNXDESTPFX}/bin/"
	return $?
}

facini_build() {
	EXTRA_LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" make \
		TARGET_CC="${LNX_CC}" TARGET_CFLAGS="${LNX_CFLAGS}" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	cp -f -v -P facini get_facini set_facini "${LNXDESTPFX}/bin/"
	return $?
}

checkutils_build() {
	EXTRA_LDFLAGS="-Wl,-rpath-link=${LNXDESTPFX}/lib" make TARGET_CC="${LNX_CC}" \
		TARGET_CFLAGS="${LNX_CFLAGS}" TARGET_STRIP="${LNX_TCP}-strip"
	[ $? -ne 0 ] && return 1

	# install compiled application
	cp -f -v checkutils "${LNXDESTPFX}/bin/"
	return $?
}

deb4gnet_build() {
	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/share/lua"
	# install script application
	cp -f -v deb4gnet.lua "${LNXDESTPFX}/bin/" && \
		cp -v -f modem4g.lua "${LNXDESTPFX}/share/lua/"
	return $?
}

ucinet_build() {
	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/lib/lua"
	cp -v netuci uci_set_mac "${LNXDESTPFX}/bin/" && \
		cp -v nmcli.lua "${LNXDESTPFX}/lib/lua/"
	return $?
}

lz4_build() {
	make CC=${LNX_CC}
	cp -f -v -d lib/liblz4.so* "${LNXDESTPFX}/lib/"
	cp -v -arf lib/*.h "${LNXDESTPFX}/include/"
	return $?
}

proto_forward_build() {
	local use_tdengine=0
	if (srcpkg_enabled tdengine); then
		use_tdengine=1
	fi
	if (srcpkg_enabled libdb_control); then
		make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
			 CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/lib60870 \
			 -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include/libdb_control/db_control"\
			 NON_OPENWRT_LED=1 EN_BMSER_LIB=1 EN_TDENGINE=${use_tdengine}
	else
		make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
			CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/lib60870 -I${LNXDESTPFX}/include/dy_utils" \
			NON_OPENWRT_LED=1  EN_TDENGINE=${use_tdengine}
	fi
	[ $? -ne 0 ] && return 1

	if [ -f "install.sh" ]; then
		bash ./install.sh
		return $?
	fi
	return 0
}

proto_forward_clean() {
    make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}" clean

	# 删除制作升级应用拷贝

	build_dir="${LNXDESTPFX}/../../build_dir"


	# 删除证书文件
	echo "删除证书文件 ${LNXDESTPFX}/app/cert"
	rm -rf "${LNXDESTPFX}/app/cert"

	# 删除多语言相关文件
	echo "删除多语言相关文件 ${LNXDESTPFX}/app/global"
	rm -rf "${LNXDESTPFX}/app/template"
	rm -rf "${LNXDESTPFX}/app/global"

	# 删除配置文件和目录

	ls "$build_dir/proto_forward/config/" | while read -r config; do
		target_config="${LNXDESTPFX}/app/config/$(basename "$config")"
			echo "删除配置文件 $target_config"
			rm -rvf "$target_config"
	done

	echo "删除制作升级应用拷贝 $build_dir/proto_forward"
	rm -rf "$build_dir/proto_forward"

	# 删除与LNXALL_文件相关
	echo "删除与可执行文件 ${LNXDESTPFX}/bin/"
	rm -rfv "${LNXDESTPFX}/platspec/em*d.service"
	rm -rfv "${LNXDESTPFX}/bin/scripts"
	rm -fv "${LNXDESTPFX}/bin/em*d_startup.sh"
	rm -fv "${LNXDESTPFX}/bin/emu_lc"
	rm -fv "${LNXDESTPFX}/bin/proto_forward"
	rm -rf "${LNXDESTPFX}/bin/inits"

	return $?
}

proto_forward_misctool() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f opcua_cli "${LNXDESTPFX}/bin/"
	return $?
}

ems_smu_build() {
    lnxall_simple_build ems_smu
    [ $? -ne 0 ] && return 1

    if [ -f "install.sh" ]; then
        bash ./install.sh
    fi

    return $?
}

libdb_control_build() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/lib"
	cp -v -f ./output/lib/* "${LNXDESTPFX}/lib/"

	mkdir -p "${LNXDESTPFX}/include/libdb_control"
	cp -v -arf ./output/include/* "${LNXDESTPFX}/include/libdb_control"
	return $?
}

xieneng_can_build() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/libdb_control/utility \
		-I${LNXDESTPFX}/include/libdb_control/mqtt -I${LNXDESTPFX}/include/libdb_control/can \
		-I${LNXDESTPFX}/include/libdb_control/db_control -I${LNXDESTPFX}/include/libdb_control/dev \
		-I${LNXDESTPFX}/include/libdb_control/cjson -I${LNXDESTPFX}/include/libdb_control/utils \
		-I${LNXDESTPFX}/include/libdb_control/sqlite_api"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f ./xieneng_can "${LNXDESTPFX}/bin"
	return $?
}

bmser_db_dump_build() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/libdb_control/utility \
		-I${LNXDESTPFX}/include/libdb_control/mqtt -I${LNXDESTPFX}/include/libdb_control/can \
		-I${LNXDESTPFX}/include/libdb_control/db_control -I${LNXDESTPFX}/include/libdb_control/dev \
		-I${LNXDESTPFX}/include/libdb_control/cjson -I${LNXDESTPFX}/include/libdb_control/utils \
		-I${LNXDESTPFX}/include/libdb_control/sqlite_api"
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f ./bmser_db_dump "${LNXDESTPFX}/bin"
	return $?
}

bmser_virtual_device_clean() {
	[ -f Makefile ] && make clean
	[ -d CMakeFiles ] && lcore_common_clean && rm CMakeFiles -rf
	[ -f CMakeCache.txt ] && rm CMakeCache.txt -r
	for file in *.cmake; do [ -f $file ] && rm $file; done
	[ -f Makefile ] && rm Makefile
	return $?
}

bmser_virtual_device_build() {
	cmake  CMakeLists.txt -DCMAKE_C_COMPILER=${TC_DIR}/${LNX_CC} \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DWLOS_TARGET=`pwd`/../../target
	make
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f ./bmser_virtual_device "${LNXDESTPFX}/bin"
	return $?
}

bmser_modbus_tcp_poll_clean() {
	[ -f Makefile ] && make clean
	[ -d CMakeFiles ] && lcore_common_clean && rm CMakeFiles -rf
	[ -f CMakeCache.txt ] && rm CMakeCache.txt -r
	for file in *.cmake; do [ -f $file ] && rm $file; done
	[ -f Makefile ] && rm Makefile
	[ -f DartConfiguration.tcl ] && rm DartConfiguration.tcl
	return $?
}

bmser_modbus_tcp_poll_build() {
	cmake  CMakeLists.txt -DCMAKE_C_COMPILER=${TC_DIR}/${LNX_CC} \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DWLOS_TARGET=`pwd`/../../target
	make
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f ./bmser_modbus_tcp_poll "${LNXDESTPFX}/bin"
	return $?
}


bmser_upgrade_clean() {
	[ -f Makefile ] && make clean
	[ -d CMakeFiles ] && lcore_common_clean && rm CMakeFiles -rf
	[ -f CMakeCache.txt ] && rm CMakeCache.txt -r
	for file in *.cmake; do [ -f $file ] && rm $file; done
	[ -f Makefile ] && rm Makefile
	return $?
}

bmser_upgrade_build() {
	cmake  CMakeLists.txt -DCMAKE_C_COMPILER=${TC_DIR}/${LNX_CC} \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		-DWLOS_TARGET=`pwd`/../../target
	make
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f ./bmser_upgrade "${LNXDESTPFX}/bin"
	return $?
}

dido_modbus_tcp_build() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include/modbus"
	[ $? -ne 0 ] && return 1
	cp -f -v dido_modbus_tcp "${LNXDESTPFX}/bin/"
	return $?
}

dido_modbus_tcp_vm1220() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${LNXDESTPFX}/include/dy_utils -I${LNXDESTPFX}/include/modbus"
	[ $? -ne 0 ] && return 1
	cp -f -v dido_modbus_tcp "${LNXDESTPFX}/bin/"
	return $?
}

frpc_install() {
	mkdir -p "${LNXDESTPFX}/app/config"
	cp -v -f frpc.ini "${LNXDESTPFX}/app/config/" || return 1

	mkdir -p "${LNXDESTPFX}/platspec/"
	cp -v -f frpc frpc-sn frpc.service "${LNXDESTPFX}/platspec/"
	return $?
}

elect_resources_install() {
	mkdir -p "${LNXDESTPFX}/app/"
	cp -v -r -f resources "${LNXDESTPFX}/app/" || return 1
	return $?
}

rk3568_qywdt_build() {
	make TARGET_CC="${LNX_CC}" TARGET_CFLAGS="${LNX_CFLAGS}" TARGET_STRIP="${LNX_TCP}-strip" -f Makefile
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/bin"
	# install compiled application
	cp -f -v qywdt "${LNXDESTPFX}/bin/"
	return $?
}

newdiags_build() {
	mkdir -p "${LNXDESTPFX}/bin" "${LNXDESTPFX}/platspec"
	cp -v -f -p diag.sh "${LNXDESTPFX}/bin/"
	[ $? -ne 0 ] && return 1

	cp -v -f -p diag_*.lua "${LNXDESTPFX}/platspec/"
	return $?
}

verification_build() {
	make CC=${LNX_CC} clean >/dev/null 2>/dev/null
	make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
		LDFLAGS="${LNX_LDFLAGS}" -j1
	[ $? -ne 0 ] && return 1

	mkdir -p ${LNXDESTPFX}/bin
	cp -v -f lnxall_verify ${LNXDESTPFX}/bin/
	return $?
}

cmdsvr_build() {
	mkdir -p "${LNXDESTPFX}/bin"
	cp -v -f cmdsvr.lua "${LNXDESTPFX}/bin/"
	return $?
}

register_source 'package_repos/ubuslog/src' \
	lcore_dummy_config ubus_log_build lcore_common_clean

register_source 'package_repos/libipc_session/src' \
	lcore_dummy_config libipc_session_build lcore_common_clean

register_source 'package_repos/libdyutils/src' \
	lcore_dummy_config libdyutils_build lcore_common_clean

register_source 'package_repos/lua-libutils/src' \
	lcore_dummy_config lua_libutils_build lcore_common_clean

srcpkg_enabled libdb_control && \
	register_source 'package_repos/libdb_control' \
		lcore_dummy_config libdb_control_build lcore_common_clean

srcpkg_enabled xieneng_can && \
	register_source 'package_repos/xieneng_can' \
		lcore_dummy_config xieneng_can_build lcore_common_clean

srcpkg_enabled bmser_db_dump && \
	register_source 'package_repos/bmser_db_dump/src' \
		lcore_dummy_config bmser_db_dump_build lcore_common_clean

srcpkg_enabled bmser_virtual_device && \
	register_source 'package_repos/bmser_virtual_device' \
		lcore_dummy_config bmser_virtual_device_build bmser_virtual_device_clean
		
srcpkg_enabled bmser_modbus_tcp_poll && \
	register_source 'package_repos/bmser_modbus_tcp_poll' \
		lcore_dummy_config bmser_modbus_tcp_poll_build bmser_modbus_tcp_poll_clean

srcpkg_enabled bmser_upgrade && \
	register_source 'package_repos/bmser_upgrade' \
		lcore_dummy_config bmser_upgrade_build bmser_upgrade_clean

srcpkg_enabled rs485 && \
	register_source 'package_repos/rs485/src' \
		lcore_dummy_config rs485_build lcore_common_clean

srcpkg_enabled data_reporter && \
	register_source 'package_repos/data_reporter/src' \
		lcore_dummy_config data_reporter_build lcore_common_clean

srcpkg_enabled config_manager && \
	register_source 'package_repos/config_manager/src' \
		lcore_dummy_config config_manager_build lcore_common_clean

srcpkg_enabled cloud_mqtt && \
	register_source 'package_repos/cloud_mqtt/src' \
		lcore_dummy_config cloud_mqtt_build lcore_common_clean

srcpkg_enabled protocol_parser && \
	register_source 'package_repos/protocol_parser/src' \
		lcore_dummy_config protocol_parser_build lcore_common_clean

srcpkg_enabled cloud_conn_dayun && \
	register_source 'package_repos/cloud_conn_dayun/src' \
		lcore_dummy_config cloud_conn_dayun_build lcore_common_clean

register_source 'package_repos/lib60870/lib60870/lib60870-C' \
	lcore_dummy_config lib60870_build lcore_common_clean

srcpkg_enabled scada_iec104 && \
	register_source 'package_repos/scada_iec104/src' \
		lcore_dummy_config scada_iec104_build lcore_common_clean

srcpkg_enabled rs485_slave && \
	register_source 'package_repos/rs485_slave/src' \
		lcore_dummy_config rs485_slave_build lcore_common_clean

srcpkg_enabled pp_upgrade && \
	register_source 'package_repos/upgrade/src' \
		lcore_dummy_config nodes_upgrade_build lcore_common_clean

srcpkg_enabled pp_device_monitor && \
	register_source 'package_repos/device_monitor/src' \
		lcore_dummy_config device_monitor_build lcore_common_clean

register_source 'package_repos/lua-pack/src' \
	lcore_dummy_config lua_pack_build lua_pack_clean

register_source 'package_repos/lua-lpack/src' \
	lcore_dummy_config lua_lpack_build lua_pack_clean

register_source 'package_repos/lua-lsocket/src' \
	lcore_dummy_config lsocket_build lsocket_clean

srcpkg_enabled rathole && \
	register_source 'package_repos/rathole-client/src' \
		lcore_dummy_config rathole_build lcore_dummy_clean

# only install rathole configuration file,
# as rathole binary has already been included
# in rootfs (larger that 800MB rootfs image),
# so we can greatly minimize upgrade package size.
srcpkg_enabled rathole_config && \
	register_source 'package_repos/rathole-client' \
		lcore_dummy_config rathole_config_build lcore_dummy_clean

register_source 'lnxall_core/binlog' \
	lcore_dummy_config lnxbinlog_build lcore_common_clean

register_source 'lnxall_core/lnxhal' \
	lcore_dummy_config lnxhal_build lcore_common_clean

srcpkg_enabled proto_forward && \
	register_source 'package_repos/proto_forward/src' \
		lcore_dummy_config proto_forward_build proto_forward_clean

srcpkg_enabled proto_forward && \
	register_source 'package_repos/pf_misctools' \
		lcore_dummy_config proto_forward_misctool lcore_common_clean

srcpkg_enabled ems_smu && \
    register_source 'package_repos/ems_smu/src' \
        lcore_dummy_config ems_smu_build lcore_common_clean

srcpkg_enabled lz4 && \
    register_source 'package_repos/lz4/src' \
        lcore_dummy_config lz4_build lcore_common_clean

srcpkg_enabled dido_modbus_tcp && \
	register_source 'package_repos/dido_modbus_tcp/src' \
		lcore_dummy_config dido_modbus_tcp_build lcore_common_clean

srcpkg_enabled dido_modbus_moxa && \
	register_source 'lnxall_core/dido_modbus_vm1220/src' \
		lcore_dummy_config dido_modbus_tcp_vm1220 lcore_common_clean

srcpkg_enabled modbus_tcp && \
	register_source 'package_repos/modbus_tcp/src' \
		lcore_dummy_config modbus_tcp_build lcore_common_clean

srcpkg_enabled youcan && \
	register_source 'package_repos/youcan/src' \
		lcore_dummy_config youcan_build rust_clean

srcpkg_enabled ems_ctrl && \
	register_source 'package_repos/ems_ctrl/src' \
		lcore_dummy_config ems_ctrl_build lcore_common_clean

srcpkg_enabled energy_assign && \
	register_source 'package_repos/energy_assign/src' \
		lcore_dummy_config energy_assign_build lcore_common_clean

srcpkg_enabled multi_meters && \
	register_source 'package_repos/multi_meters/src' \
		lcore_dummy_config multi_meters_build lcore_common_clean

srcpkg_enabled cloud_emmsv2 && \
	register_source 'package_repos/cloud_emmsv2/src' \
		lcore_dummy_config cloud_emmsv2_build lcore_common_clean

srcpkg_enabled ems_redis && \
	register_source 'package_repos/ems_redis/src' \
		lcore_dummy_config ems_redis_build lcore_common_clean

srcpkg_enabled ua_mqttv1 && \
	register_source 'package_repos/ua_mqttv1/src' \
		lcore_dummy_config ua_mqttv1_build lcore_common_clean

srcpkg_enabled iec104_server_new && \
	register_source 'package_repos/iec104_server_new/src' \
		lcore_dummy_config iec104_server_new_build lcore_common_clean

srcpkg_enabled modbus_tcp_slave && \
	register_source 'package_repos/modbus_tcp_slave/src' \
		lcore_dummy_config modbus_tcp_slave_build lcore_common_clean

srcpkg_enabled ucinet && \
	register_source 'lnxall_core/ucinet' \
		lcore_dummy_config ucinet_build lcore_dummy_clean

srcpkg_enabled em1k_dido && \
	register_source 'package_repos/dido_modbus_new/src' \
		lcore_dummy_config dido_modbus_new_build rust_clean

srcpkg_enabled rk3568_dido && \
	register_source 'lnxall_core/dido-xl9555' \
		lcore_dummy_config xl9555_build rust_clean

srcpkg_enabled dido_xddl && \
	register_source 'lnxall_core/dido-xddl' \
		lcore_dummy_config xl9555_xddl rust_clean

srcpkg_enabled em1k_poweroff && \
	register_source 'package_repos/poweroff_check/src' \
		lcore_dummy_config poweroff_check_build rust_clean

srcpkg_enabled deb4gnet && \
	register_source 'lnxall_core/deb4gnet' \
		lcore_dummy_config deb4gnet_build lcore_dummy_clean

srcpkg_enabled em1k_facini && \
	register_source 'lnxall_core/em1k_facini' \
		lcore_dummy_config em1k_facini_build lcore_common_clean

srcpkg_enabled factory_info && \
	register_source 'lnxall_core/facini' \
		lcore_dummy_config facini_build rust_clean

srcpkg_enabled frpc_lnxall && \
	register_source 'package_repos/frpc-lnxall/files' \
		lcore_dummy_config frpc_install rust_clean

srcpkg_enabled qywdt && \
	register_source 'lnxall_core/rk3568_qywdt' \
		lcore_dummy_config rk3568_qywdt_build rust_clean

srcpkg_enabled newdiags && \
	register_source 'lnxall_core/newdiags' \
		lcore_dummy_config newdiags_build lcore_dummy_clean

srcpkg_enabled sdmount && \
	register_source 'lnxall_core/sdmount' \
		lcore_dummy_config sdmount_build rust_clean

srcpkg_enabled gpio_powerchk && \
	register_source 'package_repos/gpio-powerchk/src' \
		lcore_dummy_config gpio_powerchk_build rust_clean

# It's copy to rootfs ,not into elf
# srcpkg_enabled elect_resources && \
# 	register_source 'package_repos/elect_resources' \
# 		lcore_dummy_config elect_resources_install lcore_common_clean

# build private packages for non-openwrt systems
register_source 'base-files' \
	lcore_dummy_config base_files_build lcore_dummy_clean
register_source 'init_lnxall' \
	lcore_dummy_config init_lnxall_build lcore_dummy_clean
register_source 'lnxall_core/misctools' \
	lcore_dummy_config misctools_build lcore_common_clean
register_source 'lnxall_core/sysmon' \
	lcore_dummy_config sysmon_build lcore_common_clean
register_source 'lnxall_core/checkutils' \
	lcore_dummy_config checkutils_build rust_clean
register_source 'lnxall_core/verification' \
	lcore_dummy_config verification_build lcore_common_clean
register_source 'lnxall_core/cmdsvr' \
	lcore_dummy_config cmdsvr_build lcore_dummy_clean
