#!/bin/bash

# Created by jiaqiang.ye@lnxall.com
# Application sources for EMS1.0
# 2025/08/14
# Function to copy files from customer source to src without checking
check_and_override_oem_files() {
    # Check if oem parameter is provided
    if [ -z "$1" ]; then
        echo "Error: OEM parameter is required"
        echo "Usage: check_and_override_oem_files <oem_name>"
        return 1
    fi
    
    local oem="$1"
    echo "oem dir is ${oem}" 
    # Define source and destination directories
    local SRC="${FTOPDIR}/package_repos/proto_forward/src"
    local OEM_SRC="${FTOPDIR}/package_repos/proto_forward/customer/${oem}/src"

    echo "oem src ${OEM_SRC}"
    # Check if FTOPDIR is set
    if [ -z "${FTOPDIR}" ]; then
        echo "Error: FTOPDIR environment variable is not set"
        return 1
    fi

    # Check if src directory exists
    if [ ! -d "${SRC}" ]; then
        echo "Error: ${SRC} directory does not exist"
        return 1
    fi

    # Check if customer source directory exists
    if [ ! -d "${OEM_SRC}" ]; then
        echo "Warning: ${OEM_SRC} directory does not exist, using original src files"
        return 1
    fi

    # Directories to process
    local directories=("ems" "lc" "cc_lc_com" "log_module" "database" "cloud" "alarm_control" "adapter" "iec104_server" "libmodbus" "mqtt_emms2" "north_mqtt" "opcua" "snapshoot" "scripts" "mac_mul")
    
    echo "Copying files from ${OEM_SRC} to ${SRC} for specific directories..."
    
    local dir='' # defined for use of `for
    for dir in "${directories[@]}"; do
        local src_dir="${SRC}/$dir"
        local oem_src_dir="${OEM_SRC}/$dir"
        
        # Skip if customer directory doesn't exist
        if [ ! -d "$oem_src_dir" ]; then
            echo "Warning: $oem_src_dir directory does not exist, skipping"
            continue
        fi
        
        echo "Processing directory: $dir"
        
        # Find all files in the customer source directory
        find "$oem_src_dir" -type f | while read oem_file; do
            # Get the relative path by removing OEM_SRC prefix
            rel_path=${oem_file#${OEM_SRC}/}
            # Construct the corresponding path in src
            src_file="${SRC}/$rel_path"
            
            # Create directory structure if it doesn't exist
            mkdir -p "$(dirname "$src_file")"
            # Copy the file from customer source to src
            cp "$oem_file" "$src_file"
            echo "Copied $oem_file to $src_file"
        done
    done

    if [ -d "${OEM_SRC}../translation" ]; then
        cp "${OEM_SRC}../translation/*" "${SRC}../translation/"
    fi
    
    echo "File copy completed for OEM: $oem"
	return 0
}

# Read OEM configuration from config file
determine_oem() {
    # Default OEM if none is specified
    local default_oem="none"
    local config_file="${FTOPDIR}/lnxall_core/oemconfig"
    #echo "oem config file is ${config_file}" 
    # Check if config file exists
    if [ -f "$config_file" ]; then
        #echo "Reading OEM configuration from $config_file"
        
        # Read the first non-empty line from the config file
        local line=""
        local current_line=""
        while IFS= read -r current_line || [ -n "$current_line" ]; do
            # Skip empty lines and lines that start with #
            if [ -z "$current_line" ] || [[ "$current_line" =~ ^[[:space:]]*# ]]; then
                continue
            fi
            
            line="$current_line"
            break
        done < "$config_file"
        
        local word=''
        if [ -n "$line" ]; then
            # Split the line by spaces
            for word in $line; do
                # If the word doesn't start with #, it's the active OEM
                if [[ ! "$word" =~ ^# ]]; then
                    echo "$word"
                    return
                fi
            done
        fi
        #echo "No active OEM found in config file"
    fi
    
    # If no OEM is found in config file, return the provided default or empty
    echo "${default_oem}"
}

proto_forward_build() {
	local OLDDIR="${PWD}"
	local oem=$(determine_oem)
	echo "${oem}"
	check_and_override_oem_files "${oem}"
	local ret=$?
	echo "$ret"
	local use_tdengine=0
	if srcpkg_enabled tdengine ; then
		use_tdengine=1
	fi
	local make_ret=0
	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}
		make_ret=$?
	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}
		make_ret=$?
	fi
	if [ $ret -eq 0 ]; then
		cd ${FTOPDIR}/package_repos/proto_forward
		git checkout ./
		git clean -fd src
		cd -
	fi
	if [ $make_ret -ne 0 ]; then 
		return 1
	fi

	cd "${OLDDIR}"
	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init proto_forward "${pkg_ver}"
	[ $? -ne 0 ] && return 2

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}"

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 3
	fi
	mkdir -p "${LPKGDIR}/app/upstart"
	cp -r -v ./ipkg-skeleton/CONTROL/postinst "${LPKGDIR}/app/upstart/$(printf "8%02d" ${FTPIDX})-proto_forward.sh"
	[ $? -ne 0 ] && return 4

	lnxbf_add_conf_files "${LNX_PREFIX}/app/config"
	lnxbf_add_conf_files "${LNX_PREFIX}/app/global/alarminfo"
	lnxbf_add_conf_files "${LNX_PREFIX}/app/global/template"
	lnxbf_ipkg_generate proto_forward "${pkg_ver}"
	return $?
}

proto_forward_clean() {
    make CC=${LNX_CC} CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}" clean
    rm -rf ipkg-dir && rm -rf -v "${FINSTALL_DIR}/packages"/proto_forward*.ipk
    local build_dir="${LNXDESTPFX}/../../build_dir/proto_forward"

    # 直接使用find处理所有文件
    if [[ -d "$build_dir" ]]; then
        find "$build_dir" -type f -print0 | while IFS= read -r -d '' file; do
            # 计算目标路径并删除文件
            target_file="${file/"$build_dir"/$LNXDESTPFX}"
            if [[ -e "$target_file" ]]; then
                rm -f "$target_file"
                # 记录父目录用于后续处理
                echo "$(dirname "$target_file")"
            fi
        done | sort -zu | while IFS= read -r -d '' dir; do
            # 从深到浅删除空目录
            find "$dir" -depth -type d -empty -delete 2>/dev/null
        done
    fi
    # 最后清理构建目录
    rm -rf "$build_dir"
	return $?
}

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

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init pf_misctools "${pkg_ver}"
	[ $? -ne 0 ] && return 2

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/lib"
	cp -v -P -f opcua_cli "${LPKGDIR}/bin/"
	[ $? -ne 0 ] && return 3

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 4
	fi
	lnxbf_ipkg_generate pf_misctools "${pkg_ver}"
	return $?
}

pf_misctool_clean() {
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/pf_misctools*.ipk
	return 0
}

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

	mkdir -p "${LNXDESTPFX}/include/libdb_control" "${LNXDESTPFX}/app/config/bmser"
	cp -v -P -f ./output/lib/* "${LNXDESTPFX}/lib/" && \
		cp -v -f ./config/* "${LNXDESTPFX}/app/config/bmser/" && \
		cp -v -P -r -f ./output/include/* "${LNXDESTPFX}/include/libdb_control/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init libdb_control "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/app/config/bmser" "${LPKGDIR}/lib"
	cp -v -P -f ./output/lib/*.so* "${LPKGDIR}/lib/" && \
		cp -v -P -f ./config/* "${LPKGDIR}/app/config/bmser/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate libdb_control "${pkg_ver}"
	return $?
}

libdb_control_clean() {
	rm -rf *.so ./output
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/libdb_control*.ipk
	return 0
}

libmodbus_xn_config() {
	if [ ! -e configure ] ; then
		./autogen.sh 
		[ $? -ne 0 ] && return 1
	fi

    ./configure --prefix=${LNX_PREFIX} --host=${LNX_TCP} CC=${LNX_CC} ac_cv_func_malloc_0_nonnull=yes --disable-tests \
        CFLAGS="${LNX_CFLAGS}" --enable-static=no LDFLAGS="${LNX_LDFLAGS}" --without-documentation
    return $?
}

libmodbus_xn_build() {
	make V=1 -j${OJOBN:-8} && \
		make DESTDIR="${PWD}/install_dir" install
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/lib/modbus_xn" "${LNXDESTPFX}/include/modbus_xn"
	cp -v -P -rf "./install_dir/${LNX_PREFIX}/lib"/*.so* "${LNXDESTPFX}/lib/modbus_xn/"
		cp -v -P -rf "./install_dir/${LNX_PREFIX}/include"/* "${LNXDESTPFX}/include/modbus_xn/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 3.1.4)
	lnxbf_ipkg_init libmodbus-xn "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/lib/modbus_xn"
	cp -v -P -f "./install_dir/${LNX_PREFIX}/lib"/*.so* "${LPKGDIR}/lib/modbus_xn/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate libmodbus-xn "${pkg_ver}"
	return $?
}

libmodbus_xn_clean() {
	rm -rf ./install_dir
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/libmodbus-xn*.ipk
	return 0
}

bmser_trans_config() {
	local use_tdengine=0
	if srcpkg_enabled tdengine ; then
		use_tdengine=1
	fi
	cmake . -DCMAKE_C_COMPILER=${LNX_CC} -DBUILD_TESTING=OFF -DBMSER_TRANS_TEST_MODE=OFF \
		-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath=${LNX_PREFIX}/lib/modbus_xn -L${LNXDESTPFX}/lib/modbus_xn ${LNX_LDFLAGS}" \
		-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath=${LNX_PREFIX}/lib/modbus_xn -L${LNXDESTPFX}/lib/modbus_xn ${LNX_LDFLAGS}" \
		-DCMAKE_MODULE_LINKER_FLAGS="-Wl,-rpath=${LNX_PREFIX}/lib/modbus_xn -L${LNXDESTPFX}/lib/modbus_xn ${LNX_LDFLAGS}" \
		-DCMAKE_PREFIX_PATH=${LNXDESTPFX} -DEN_TDENGINE=${use_tdengine} 
	return $?
}

bmser_trans_build() {
    make V=1 VERBOSE=1 -j${OJOBN:-8}
	[ $? -ne 0 ] && return 1
	mkdir -p "${LNXDESTPFX}/app/config/bmser/"
	cp -v -f ./bmser_trans "${LNXDESTPFX}/bin/" && \
		cp -v -P -f ./config/* "${LNXDESTPFX}/app/config/bmser/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_trans "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/app/config/bmser" "${LPKGDIR}/app/config/applist" "${LPKGDIR}/platspec/" "${LPKGDIR}/app/upstart/"
	cp -v -P -f bmser_trans temp/start_trans.py "${LPKGDIR}/bin/" && \
		cp -v -P -f ./config/* "${LPKGDIR}/app/config/bmser/" && \
		cp -v temp/bmser_lib.service "${LPKGDIR}/platspec/bmser_lib.service" &&\
		cp -r -v ./ipkg-dir/CONTROL/postinst "${LPKGDIR}/app/upstart/$(printf "%03d" ${FTPIDX})-bmser_module.sh"

	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_trans "${pkg_ver}"
    lnxbf_add_conf_files "${LNX_PREFIX}/app/config/bmser"
	return $?
}

bmser_trans_clean(){
	rm -rf CMakeFiles bmser_trans cmake_install.cmake \
		CTestTestfile.cmake Makefile CMakeCache.txt \
		CPackSourceConfig.cmake CPackConfig.cmake
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_trans*.ipk
	return 0
}

bmser_alarm_build() {
	make CC=${LNX_CC} LDFLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib -L${LNXDESTPFX}/lib -lpthread -lmosquitto -lbmser_hardware -lbmser_utils -ldb_control -lsqlite3 -luv -llua -lrt" \
		CFLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include " DB_CONTROL_INC=${LNXDESTPFX}/include/libdb_control
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/app/config/bmser"
	cp -v -f ./alarm_common "${LNXDESTPFX}/bin/bmser_alarm" && \
		cp -v -P -f ./config/* "${LNXDESTPFX}/app/config/bmser/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_alarm "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/app/config/bmser"
	cp -v -P -f alarm_common "${LPKGDIR}/bin/bmser_alarm" && \
		cp -v -P -f ./config/* "${LPKGDIR}/app/config/bmser/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_alarm "${pkg_ver}"
	return $?
}

bmser_alarm_clean() {
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_alarm*.ipk
	return 0
}

bmser_virtual_device_config(){
	cmake -DCMAKE_C_COMPILER=${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" \
		-DCMAKE_PREFIX_PATH=${LNXDESTPFX} .
	return $?
}

bmser_virtual_device_build() {
    make V=1 -j${OJOBN:-8}
	[ $? -ne 0 ] && return 1
	cp -v -f ./bmser_virtual_device "${LNXDESTPFX}/bin/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_virtual_device "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin"
	cp -v -P -f bmser_virtual_device "${LPKGDIR}/bin/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_virtual_device "${pkg_ver}"
	return $?
}

bmser_virtual_device_clean() {
	rm -rf CMakeCache.txt CMakeFiles CPackConfig.cmake \
		CPackSourceConfig.cmake CTestTestfile.cmake DartConfiguration.tcl \
		Makefile bmser_virtual_device cmake_install.cmake
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_virtual_device*.ipk
	return 0
}

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

	cp -v -f ./bmser_db_dump "${LNXDESTPFX}/bin"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_db_dump "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin"
	cp -v -P -f bmser_db_dump "${LPKGDIR}/bin/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_db_dump "${pkg_ver}"
	return $?
}

bmser_db_dump_clean() {
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_db_dump*.ipk
	return 0
}

bmser_modbus_tcp_poll_config() {
	cmake CMakeLists.txt -DCMAKE_C_COMPILER=${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=${FTOPDIR}/target
	return $?
}

bmser_modbus_tcp_poll_build() {
	make VERBOSE=1 -j8
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/app/config/bmser/"
	cp -v -f ./bmser_modbus_tcp_poll "${LNXDESTPFX}/bin/" && \
		cp -v -f ./config/slave_ip_cfg.json "${LNXDESTPFX}/app/config/bmser/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_modbus_tcp_poll "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/app/config/bmser"
	cp -v -P -f bmser_modbus_tcp_poll "${LPKGDIR}/bin/" && \
		cp -v -P -f ./config/slave_ip_cfg.json "${LPKGDIR}/app/config/bmser/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_modbus_tcp_poll "${pkg_ver}"
	return $?
}

bmser_modbus_tcp_poll_clean() {
	rm -rf CMakeFiles bmser_modbus_tcp_poll mqtt_test \
		cmake_install.cmake CTestTestfile.cmake Makefile CMakeCache.txt \
		CPackSourceConfig.cmake CPackConfig.cmake DartConfiguration.tcl Testing
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_modbus_tcp_poll*.ipk
	return 0
}

bmser_upgrade_config() {
	cmake CMakeLists.txt -DCMAKE_C_COMPILER=${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=${FTOPDIR}/target
	return $?
}

bmser_upgrade_build() {
	make VERBOSE=1 -j8
	[ $? -ne 0 ] && return 1
	cp -v -f ./bmser_upgrade "${LNXDESTPFX}/bin/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init bmser_upgrade "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin"
	cp -v -P -f bmser_upgrade "${LPKGDIR}/bin/"
	[ $? -ne 0 ] && return 4

	if [ -f ./install.sh ] ; then
		FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
		[ $? -ne 0 ] && return 5
	fi
	lnxbf_ipkg_generate bmser_upgrade "${pkg_ver}"
	return $?
}

bmser_upgrade_clean() {
	lnxbf_package_clean
	rm -rf CMakeFiles bmser_upgrade cmake_install.cmake Makefile CMakeCache.txt
	rm -rf -v "${FINSTALL_DIR}/packages"/bmser_upgrade*.ipk
	return 0
}

smu_nodejs_build() {
	local pkg_ver=$(version-lnxget "${IPKG_VERFILE}" 0.1.0)
	lnxbf_ipkg_init smu_nodejs "${pkg_ver}"
	[ $? -ne 0 ] && return 1

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	FTPIDX=${FTPIDX} bash ./install.sh "${LPKGDIR}"
	[ $? -ne 0 ] && return 2

	lnxbf_ipkg_generate smu_nodejs "${pkg_ver}"
	return $?
}

smu_nodejs_clean() {
	rm ./build -rvf
	# rm ./files/node_modules -rvf
	rm ./uploads/.gitkeep -rvf
	rm ./bin/packapp -vf
	rm ./bin/packapp.tar.gz -vf
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/smu_nodejs_*.ipk
	return 0
}

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_db_control' \
		lcore_dummy_config libdb_control_build libdb_control_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_libmodbus' \
		libmodbus_xn_config libmodbus_xn_build libmodbus_xn_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_trans' \
		bmser_trans_config bmser_trans_build bmser_trans_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_alarm' \
		lcore_dummy_config bmser_alarm_build bmser_alarm_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_virtual_device' \
		bmser_virtual_device_config bmser_virtual_device_build bmser_virtual_device_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_db_dump/src' \
		lcore_dummy_config bmser_db_dump_build bmser_db_dump_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_modbus_tcp_poll' \
		bmser_modbus_tcp_poll_config bmser_modbus_tcp_poll_build bmser_modbus_tcp_poll_clean

srcpkg_enabled bmser_lib && \
	register_source 'package_repos/bmser_lib/bmser_upgrade' \
		bmser_upgrade_config bmser_upgrade_build bmser_upgrade_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 pf_misctool_build pf_misctool_clean

# SMU_NODEJS enabled unconditionally
srcpkg_enabled smu_nodejs && \
	register_source 'package_repos/smu_nodejs' \
		lcore_dummy_config smu_nodejs_build smu_nodejs_clean
