#!/bin/bash

# Created by jiaqiang.ye@lnxall.com
# build openwrt core components with WLOS2.1
# 2022/07/28

declare -x BOT_PREFIX=${LNX_PREFIX}
declare -x BOTDESTDIR="${FINSTALL_DIR}"
declare -x BOTDESTPFX="${BOTDESTDIR}/${BOT_PREFIX}"

jsonc_config() {
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS}" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_STATIC_LIBS=OFF -DBUILD_SHARED_LIBS=ON \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" .
    return $?
}

common_jsonc_build() {
	local retv=0
	make VERBOSE=1 -j${OJOBN:-8} ; retv=$?
	if [ $retv -eq 0 ] ; then
		make DESTDIR=${BOTDESTDIR} VERBOSE=1 -j1 install ; retv=$?
	fi

	if [ $retv -eq 0 ] ; then
		cd "${LNXDESTPFX}/lib64" 2>/dev/null
		[ $? -eq 0 ] && mv -v -f libjson-c*.so* ../lib/ 2>/dev/null
	fi
    return $retv
}

common_openwrt1_build() {
	local retv=0
	make VERBOSE=1 -j${OJOBN:-8} ; retv=$?
	if [ $retv -eq 0 ] ; then
		make DESTDIR=${BOTDESTDIR} VERBOSE=1 -j1 install ; retv=$?
	fi
    return $retv
}

libubox_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_LUA=ON -DBUILD_EXAMPLES=OFF \
		-DJSONC_INCLUDE_DIRS=${BOTDESTPFX}/include/json-c \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-DLUA_CFLAGS="-I${LNXDESTPFX}/include" \
		-DLUAPATH="${BOT_PREFIX}/lib/lua" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

libubox_build() {
	common_openwrt1_build
	local retv=$?
	[ $retv -eq 0 ] && cd "${BOTDESTPFX}/lib" && \
		rm -rf -v libblobmsg_json.a libubox.a
	return $retv
}

uci_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -Wno-error=clobbered -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_LUA=ON -DBUILD_STATIC=OFF \
		-DLUA_CFLAGS="-I${LNXDESTPFX}/include" \
		-DLUAPATH="${BOT_PREFIX}/lib/lua" \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubox_include_dir="${BOTDESTPFX}/include" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

ubus_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_LUA=ON -DBUILD_EXAMPLES=OFF -DBUILD_STATIC=OFF \
		-DLUA_CFLAGS="-I${LNXDESTPFX}/include" \
		-DLUAPATH="${BOT_PREFIX}/lib/lua" \
		-Dubox_library=${BOTDESTPFX}/lib/libubox.so \
		-Dblob_library=${BOTDESTPFX}/lib/libblobmsg_json.so \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-Dubox_include_dir="${BOTDESTPFX}/include" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

ubox_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include -Wno-error=missing-braces" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-Duci_include_dir=${BOTDESTPFX}/include \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

procd_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubus=${BOTDESTPFX}/lib/libubus.so \
		-Duci=${BOTDESTPFX}/lib/libuci.so \
		-Dblobmsg_json=${BOTDESTPFX}/lib/libblobmsg_json.so \
		-Djson_script=${BOTDESTPFX}/lib/libjson_script.so \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-DSELINUX=OFF -Dubox_include_dir=${BOTDESTPFX}/include \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

netifd_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include -I${BOTDESTPFX}/include/libnl-tiny" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubus=${BOTDESTPFX}/lib/libubus.so \
		-Duci=${BOTDESTPFX}/lib/libuci.so \
		-Dblobmsg_json=${BOTDESTPFX}/lib/libblobmsg_json.so \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-DLIBNL_LIBS=${BOTDESTPFX}/lib/libnl-tiny.so \
		-DSELINUX=OFF -Dubox_include_dir=${BOTDESTPFX}/include \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

libnl_tiny_config() {
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS}" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" .
    return $?
}

uclient_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_STATIC=OFF -Dubox_include_dir=${BOTDESTPFX}/include \
		-Dubox_library=${BOTDESTPFX}/lib/libubox.so \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

ustream_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DBUILD_STATIC=OFF -Dubox_include_dir=${BOTDESTPFX}/include \
		-DMBEDTLS=OFF -DWOLFSSL=OFF \
		-Dubox_library=${BOTDESTPFX}/lib/libubox.so \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

fstools_config() {
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include -I${PWD}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-Dubox_include_dir="${BOTDESTPFX}/include" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

opkg_config() {
	local hcpu
	if [[ "${LNX_TCP}" =~ ^arm-.+ ]] ; then
		hcpu=arm
	elif [[ "${LNX_TCP}" =~ ^aarch64-.+ ]] ; then
		hcpu=aarch64
	else
		echo "Error, unknown HOST_CPU for opkg" 1>&2
		return 1
	fi
	PKG_CONFIG_PATH=${BOTDESTPFX}/lib/pkgconfig \
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DSTATIC_UBOX=OFF -DHOST_CPU=${hcpu} -DENABLE_USIGN=ON -DBUILD_TESTS=OFF \
		-DPATH_SPEC=${BOT_PREFIX}/bin:/usr/sbin:/usr/bin:/sbin:/bin \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubox_include_dir="${BOTDESTPFX}/include" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
    return $?
}

ucode_config() {
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS}" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DJSONC_INCLUDE_DIRS=${BOTDESTPFX}/include/json-c \
		-DJSONC_LINK_LIBRARIES=${BOTDESTPFX}/lib/libjson-c.so \
		-DFS_SUPPORT=ON -DMATH_SUPPORT=ON -DUBUS_SUPPORT=ON \
		-DUCI_SUPPORT=ON -DRTNL_SUPPORT=ON -DNL80211_SUPPORT=ON \
		-DRESOLV_SUPPORT=ON -DSTRUCT_SUPPORT=ON -DULOOP_SUPPORT=ON \
		-DBUILD_STATIC_LIBS=OFF -DBUILD_SHARED_LIBS=ON \
		-Dubus_include_dir="${BOTDESTPFX}/include" \
		-Dblobmsg_json="${BOTDESTPFX}/lib/libblobmsg_json.so" \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubus=${BOTDESTPFX}/lib/libubus.so \
		-Duci=${BOTDESTPFX}/lib/libuci.so \
		-Duci_include_dir="${BOTDESTPFX}/include" \
		-Dnl_include_dir="${BOTDESTPFX}/include/libnl-tiny" \
		-Dnl=${BOTDESTPFX}/lib/libnl-tiny.so \
		-Duloop_include_dir=${BOTDESTPFX}/include \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" .
    return $?
}

firewall4_config() {
	: WHAT THE FUCK
	: NOTHING TODO FOR FIREWALL4 CONFIG
	return 0
}

firewall4_install() {
	cd ./root || return 1
	tar -c -f - usr | (cd ${BOTDESTPFX}/.. && tar -x -v -f -)
	return $?
}

jsonfilter_config() {
	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${BOT_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${BOTDESTPFX}/include" \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DJSONC_INCLUDE_DIRS=${BOTDESTPFX}/include/json-c \
		-Djson=${BOTDESTPFX}/lib/libjson-c.so \
		-Dubox=${BOTDESTPFX}/lib/libubox.so \
		-Dubox_include_dir=${BOTDESTPFX}/include \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -L${BOTDESTPFX}/lib" .
	return $?
}

jsonfilter_install() {
	common_openwrt1_build || return 1
	cd "${BOTDESTPFX}/bin" || return 2

	local retv=0
	rm -rf jsonfilter
	if mv -v jsonpath jsonfilter ; then
		ln -sv jsonfilter jsonpath
		retv=$?
	fi

	return $retv
}

common_core_clean() {
	local mkfile
	for mkfile in Makefile makefile GNUmakefile ; do
		if [ -f ${mkfile} ] ; then
			make -f ${mkfile} clean
			break
		fi
	done
	rm -rf ./build_dir CMakeFiles CMakeCache.txt
	return 0
}

register_source 'base_openwrt/json-c-0.15' \
	jsonc_config common_jsonc_build common_core_clean
register_source 'base_openwrt/libubox-2022-05-15-d2223ef9' \
	libubox_config libubox_build common_core_clean
register_source 'base_openwrt/uci-2021-10-22-f84f49f0' \
	uci_config common_openwrt1_build common_core_clean
register_source 'base_openwrt/ubus-2022-06-01-2bebf93c' \
	ubus_config common_openwrt1_build common_core_clean
register_source 'base_openwrt/ubox-2021-08-03-205defb5' \
	ubox_config common_openwrt1_build common_core_clean
false && register_source 'base_openwrt/procd-2022-06-01-7a009685' \
	procd_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/libnl-tiny-2021-11-21-8e0555fb' \
	libnl_tiny_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/netifd-2022-06-01-39ef9fe1' \
	netifd_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/ustream-ssl-2022-01-16-868fd881' \
	ustream_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/uclient-2021-05-14-6a6011df' \
	uclient_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/opkg-2022-02-24-d038e5b6' \
	opkg_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/fstools-2022-06-02-93369be0' \
	fstools_config common_openwrt1_build common_core_clean

false && register_source 'base_openwrt/ucode-2022-06-01-b211ca0e' \
	ucode_config common_openwrt1_build common_core_clean

# register_source 'base_openwrt/firewall4-2022-05-31-210991df' \
	# firewall4_config firewall4_install common_core_clean

register_source 'base_openwrt/jsonfilter-2018-02-04-c7e938d6' \
	jsonfilter_config jsonfilter_install common_core_clean
