#!/bin/bash

# Created by jiaqiang.ye@lnxall.com
# Opensource packages definitiion
# 2022-06-26

opensrc_dummy_config() {
    # nothing TODO for dummy config
    return 0
}

python3_config() {
	local retv=0
	local OLDP="${PWD}"

	local HOST_PY3DIR='/opt/Python3.9.13/bin'
	if [ ! -d "${HOST_PY3DIR}" ] ; then
		echo "Error, directory not found: '${HOST_PY3DIR}'" 1>&2
		[ -f 'Python3.9.13.tar.xz' ] && \
			echo "To fix this problem: sudo tar -Jxf ${OLDP}/Python3.9.13.tar.xz -C /opt" 1>&2
		return 1
	fi

	local SSLARG=""
	srcpkg_enabled openssl && SSLARG="--with-openssl=${LNXDESTPFX}"
	mkdir -p ./build_dir && cd ./build_dir || return 2

	PATH="${HOST_PY3DIR}:${PATH}" ../configure --prefix="${LNX_PREFIX}" \
		CC="${LNX_CC}" CFLAGS="${LNX_CFLAGS} -Os -I${LNXDESTPFX}/include" \
		LDFLAGS="${LNX_LDFLAGS}" CXX="${LNX_CXX}" CXXFLAGS="${LNX_CFLAGS}" \
		--host=${LNX_TCP} --build=x86_64-linux-gnu \
		--enable-shared --enable-optimizations --enable-ipv6 ${SSLARG} \
		--enable-big-digits=30 --with-system-ffi=no --with-system-expat=no \
		--with-ensurepip=no ac_cv_file__dev_ptmx=yes ac_cv_file__dev_ptc=no \
		ac_cv_buggy_getaddrinfo=no ac_cv_header_uuid_h=no
	return $?
}

python3_build() {
	local PKG_ODIR="${PWD}"
	cd ./build_dir || return 1
	PYTHONPATH= make V=1 -j${OJOBN:-8}
	[ $? -ne 0 ] && return 2

	PYTHONPATH= make V=1 DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 3

	cd "${PKG_ODIR}"
	local pkg_ver=3.9.13
	lnxbf_ipkg_init python "${pkg_ver}"
	[ $? -ne 0 ] && return 4

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/lib/python3.9"
	# copy python3 interpreter
	cp -r -P -f "${LNXDESTPFX}/bin"/{python3,python3.9} "${LPKGDIR}/bin/"
	[ $? -ne 0 ] && return 5

	# copy python3 libraries
	cp -r -P -f "${LNXDESTPFX}/lib"/{libpython3.so,libpython3.9.so,libpython3.9.so.1.0} \
		"${LPKGDIR}/lib/"
	[ $? -ne 0 ] && return 6

	# copy python3 wheels
	cp -r -P -f "${LNXDESTPFX}/lib"/python3.9/* "${LPKGDIR}/lib/python3.9/"
	[ $? -ne 0 ] && return 7

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

python3_clean() {
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/python_3.9.13*.ipk
	return 0
}

redis_server_build() {
	make CC=${LNX_CC} BUILD_TLS=no USE_SYSTEMD=no -j${OJOBN:-8} \
		CFLAGS="${LNX_CFLAGS}" REDIS_LDFLAGS="${LNX_LDFLAGS}" \
		DESTDIR=${LNXDESTDIR} MALLOC=libc PREFIX=${LNX_PREFIX} V=1 all # install
	# Note that with multiple GNU make jobs, cannot place `install after `all
	[ $? -ne 0 ] && return 1

	make CC=${LNX_CC} BUILD_TLS=no USE_SYSTEMD=no -j${OJOBN:-8} \
		CFLAGS="${LNX_CFLAGS}" REDIS_LDFLAGS="${LNX_LDFLAGS}" \
		DESTDIR=${LNXDESTDIR} MALLOC=libc PREFIX=${LNX_PREFIX} V=1 install
	[ $? -ne 0 ] && return 2

	cd "${LNXDESTPFX}" && rm -v -rf ./build
	cd "${FTOPDIR}/${SB_DIR}"

	local pkg_ver=7.0.3
	lnxbf_ipkg_init redis_server "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

hiredis_config() {
	mkdir -p ./build_dir && cd ./build_dir || return 1

	cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
		-DCMAKE_C_STANDARD=99 -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
		-DENABLE_SSL=OFF -DDISABLE_TESTS=OFF -DENABLE_EXAMPLES=OFF \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS}" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" ..
	return $?
}

hiredis_build() {
	cd ./build_dir 
	[ $? -ne 0 ] && return 1
	make VERBOSE=1 DESTDIR=${LNXDESTDIR} -j${OJOBN:-8} install
	[ $? -ne 0 ] && return 2

	cd "${LNXDESTPFX}/lib" && rm -v -rf libhiredis.a ../build
	cd "${FTOPDIR}/${SB_DIR}"

	local pkg_ver=1.0.3
	lnxbf_ipkg_init hiredis "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

cyrus_sasl_config() {
	git checkout HEAD -- .
    local OPENSSL="${STAGING_DIR}/usr"
    srcpkg_enabled openssl && OPENSSL="${LNX_PREFIX}"
    ./configure --prefix=${LNX_PREFIX} --host=${LNX_TCP} CC=${LNX_CC} \
        CFLAGS="${LNX_CFLAGS}" LDFLAGS="${LNX_LDFLAGS}" \
        --enable-shared --enable-static=no --disable-sample \
        --enable-staticdlopen --disable-java --disable-alwaystrue \
        --disable-checkapop --enable-cram --enable-digest \
        --without-auth-sasldb --disable-otp --disable-srp \
        --disable-srp-setpass --disable-krb4 --disable-gssapi \
        --disable-gss_mutexes --enable-plain --enable-anon \
        --disable-login --disable-ntlm --disable-sql --disable-ldapdb \
        --without-dblib --without-gdbm --with-devrandom="/dev/urandom" \
        --without-pam --without-saslauthd --without-authdaemond \
        --without-pwcheck --with-ipctype=unix \
        --with-openssl="${OPENSSL}" --without-des --without-opie \
        --without-ldap --without-mysql --without-pgsql --without-sqlite \
        --without-rc4 --without-dmalloc --without-sfio --disable-sample
    return $?
}

cyrus_sasl_build() {
	make -C ./include CC="gcc" LINK="gcc -o makemd5 -lc" \
		CFLAGS="" CPPFLAGS="" makemd5 -j${OJOBN:-8}
	[ $? -ne 0 ] && return 1
	make DESTDIR="${LNXDESTDIR}" -j1 install
	[ $? -ne 0 ] && return 2

	local pkg_ver=2.1.27
	lnxbf_ipkg_init cyrus_sasl "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/sbin" "${LPKGDIR}/lib/sasl2"
	cp -v -P -f ./utils/.libs/pluginviewer "${LPKGDIR}/sbin/" && \
		cp -v -P -f ./lib/.libs/libsasl2.so* "${LPKGDIR}/lib/" && \
		cp -v -P -f ./plugins/.libs/*.so* "${LPKGDIR}/lib/sasl2/"
	[ $? -ne 0 ] && return 4

	lnxbf_ipkg_generate cyrus_sasl "${pkg_ver}"
	local retv=$?

	git checkout HEAD -- .
	return ${retv}
}

cyrus_sasl_clean() {
	make distclean
	lnxbf_package_clean
	rm -rf -v "${FINSTALL_DIR}/packages"/cyrus_sasl*.ipk
	git checkout HEAD -- .
	return 0
}

librdkafka_config() {
    local SSLDIR="${STAGING_DIR}/usr"
    if [ ! -e "${SSLDIR}/include/openssl" ] ; then
        SSLDIR="${LNXDESTPFX}"
    fi
	PKG_CONFIG_PATH="${LNXDESTPFX}/lib/pkgconfig" \
		cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
        -DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
        -DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
        -DWITH_SASL=1 -DWITH_SASL_SCRAM=1 -DWITH_SASL_OAUTHBEARER=1 \
        -DWITH_SASL_CYRU=1 \
        -DOPENSSL_INCLUDE_DIR="${SSLDIR}/include" \
        -DOPENSSL_CRYPTO_LIBRARY="${SSLDIR}/lib/libcrypto.so" \
        -DOPENSSL_SSL_LIBRARY="${SSLDIR}/lib/libssl.so" \
        -DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
        -DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
        -DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" .
    return $?
}

librdkafka_build() {
    make VERBOSE=1 -j${OJOBN:-8}
    [ $? -ne 0 ] && return 1

    make VERBOSE=1 DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 2

	cd "${LNXDESTPFX}/lib64" 2>/dev/null && \
		mv -v -f librdkafka*.so* ../lib/ 2>/dev/null
	cd "${FTOPDIR}/${SB_DIR}"

	local pkg_ver=1.5.2
	lnxbf_ipkg_init librdkafka "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

open62541_config() {
	mkdir -p ./deps/ua-nodeset/ 
	mkdir -p ./build_dir && cd ./build_dir
	[ $? -ne 0 ] && return 1

	local PCFLAGS='-Wno-error=sign-conversion -Wno-error=redundant-decls '
	PCFLAGS="${PCFLAGS} -Wno-error=misleading-indentation -Wno-error=deprecated-declarations"
	PCFLAGS="${PCFLAGS} -Wno-error=incompatible-pointer-types -Wno-error=format="
	PCFLAGS="${PCFLAGS} -Wno-error=missing-prototypes"

	if srcpkg_enabled tdengine ; then
		PCFLAGS="${PCFLAGS} -Wno-error=missing-prototypes -Wno-error=strict-prototypes"
		PCFLAGS="${PCFLAGS} -Wno-error=format-nonliteral -Wno-error=strict-overflow -finstrument-functions"

		cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
			-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
			-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include ${PCFLAGS}" \
			-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
			-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -ltaos" \
			-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" \
			-DBUILD_SHARED_LIBS=ON -DUA_NAMESPACE_ZERO=REDUCED \
			-DUA_LOGLEVEL=500 -DUA_ARCHITECTURE=posix \
			-DUA_MULTITHREADING=199 -DUA_BUILD_EXAMPLES=OFF -DUA_BUILD_TOOLS=OFF \
			-DUA_ENABLE_NODEMANAGEMENT=ON -DUA_ENABLE_IMMUTABLE_NODES=OFF \
			-DUA_ENABLE_TYPEDESCRIPTION=ON -DUA_ENABLE_STATUSCODE_DESCRIPTIONS=ON \
			-DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_SUBSCRIPTIONS_EVENTS=ON \
			-DUA_ENABLE_DISCOVERY=ON -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
			-DUA_ENABLE_HISTORIZING=ON -DUA_ENABLE_AMALGAMATION=ON -DUA_ENABLE_HISTORIZING_TDENGINE=ON \
			-DUA_ENABLE_SUBSCRIPTIONS=ON -DUA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS=OFF \
			-DUA_ENABLE_METHODCALLS=ON -DUA_ENABLE_PUBSUB=ON -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
			-DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON -DUA_ENABLE_PUBSUB_MONITORING=ON \
			-DUA_ENCRYPTION_PLUGINS=OFF -DSQLITE3_LIBRARIES="${LNXDESTPFX}/lib/libsqlite3.so" \
			-DMBEDTLS_INCLUDE_DIRS="${LNXDESTPFX}/include" \
			-DMBEDTLS_LIBRARY="${LNXDESTPFX}/lib/libmbedtls.so" \
			-DMBEDX509_LIBRARY="${LNXDESTPFX}/lib/libmbedx509.so" \
			-DMBEDCRYPTO_LIBRARY="${LNXDESTPFX}/lib/libmbedcrypto.so" ..
	else 
		cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
			-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
			-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include ${PCFLAGS}" \
			-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS}" \
			-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS}" \
			-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS}" \
			-DBUILD_SHARED_LIBS=ON -DUA_NAMESPACE_ZERO=REDUCED \
			-DUA_LOGLEVEL=500 -DUA_ARCHITECTURE=posix \
			-DUA_MULTITHREADING=199 -DUA_BUILD_EXAMPLES=OFF -DUA_BUILD_TOOLS=OFF \
			-DUA_ENABLE_NODEMANAGEMENT=ON -DUA_ENABLE_IMMUTABLE_NODES=OFF \
			-DUA_ENABLE_TYPEDESCRIPTION=ON -DUA_ENABLE_STATUSCODE_DESCRIPTIONS=ON \
			-DUA_ENABLE_ENCRYPTION=ON -DUA_ENABLE_SUBSCRIPTIONS_EVENTS=ON \
			-DUA_ENABLE_DISCOVERY=ON -DUA_ENABLE_DISCOVERY_MULTICAST=ON \
			-DUA_ENABLE_HISTORIZING=ON -DUA_ENABLE_AMALGAMATION=ON \
			-DUA_ENABLE_SUBSCRIPTIONS=ON -DUA_ENABLE_SUBSCRIPTIONS_ALARMS_CONDITIONS=OFF \
			-DUA_ENABLE_METHODCALLS=ON -DUA_ENABLE_PUBSUB=ON -DUA_ENABLE_PUBSUB_DELTAFRAMES=ON \
			-DUA_ENABLE_PUBSUB_INFORMATIONMODEL=ON -DUA_ENABLE_PUBSUB_MONITORING=ON \
			-DUA_ENCRYPTION_PLUGINS=OFF -DSQLITE3_LIBRARIES="${LNXDESTPFX}/lib/libsqlite3.so" \
			-DMBEDTLS_INCLUDE_DIRS="${LNXDESTPFX}/include" \
			-DMBEDTLS_LIBRARY="${LNXDESTPFX}/lib/libmbedtls.so" \
			-DMBEDX509_LIBRARY="${LNXDESTPFX}/lib/libmbedx509.so" \
			-DMBEDCRYPTO_LIBRARY="${LNXDESTPFX}/lib/libmbedcrypto.so" ..
	fi
	return $?
}

open62541_build() {
	cd ./build_dir || return 1
	make VERBOSE=1 -j${OJOBN:-8} && make VERBOSE=1 DESTDIR="${LNXDESTDIR}" install
	[ $? -ne 0 ] && return 2

	cd "${LNXDESTPFX}/lib64" 2>/dev/null && \
		mv -v -f libopen62541*.so* ../lib/ 2>/dev/null

	cd "${FTOPDIR}/${SB_DIR}"
	local pkg_ver=1.3.6
	lnxbf_ipkg_init libopen62541 "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

argp_build() {
	make "CC=${LNX_CC}" "CFLAGS=${LNX_CFLAGS}" -j${OJOBN:-8}
	[ $? -ne 0 ] && return 1

	mkdir -p "${LNXDESTPFX}/include" "${LNXDESTPFX}/lib"
	cp -v -f argp.h "${LNXDESTPFX}/include/" && \
		cp -v -f libargp.so "${LNXDESTPFX}/lib/"
	[ $? -ne 0 ] && return 2

	local pkg_ver=0.1.0
	lnxbf_ipkg_init libargp "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

avro_config() {
	local retv=1
	mkdir -p ./build_dir && cd ./build_dir && {
		CMAKE_PREFIX_PATH="${LNXDESTPFX}/lib" cmake -DCMAKE_BUILD_TYPE=release \
			-DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
			"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" \
			-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
			-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
			-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
			-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
			-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" ..
		retv=$?
		cd ..
	}
	return ${retv}
}

libavro_build() {
	cd ./build_dir || return 1
	make VERBOSE=1 -j${OJOBN:-8} && make VERBOSE=1 DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 2

	cd "${LNXDESTPFX}/lib" && rm -rf libavro.a
	cd "${FTOPDIR}/${SB_DIR}"

	local pkg_ver=0.1.1
	lnxbf_ipkg_init libavro "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

tdengin_config() {
	mkdir -p ./build_dir && cd ./build_dir
	[ $? -ne 0 ] && return 1

	local cputype=x64
	if [[ "${LNX_CC}" =~ ^aarch64.+ ]] ; then
		cputype=aarch64
	elif [[ "${LNX_CC}" =~ ^arm.+ ]] ; then
		cputype=aarch32
	fi

	local no_warn="-Wno-error=unused-variable -Wno-error=unused-function"
	no_warn="${no_warn} -Wno-error=unknown-pragmas -Wno-error=strict-aliasing"
	no_warn="${no_warn} -Wno-error=unused-but-set-variable -Wno-error=missing-braces"
	no_warn="${no_warn} -Wno-error=pointer-sign -Wno-error=parentheses -Wno-error=address"

	local gccver=$(${LNX_CC} --version |& head -n 1 | sed -r -n -e 's#^.+([0-9]+)\.[0-9]+\.[0-9]+.*$#\1#p')
	[ -z "${gccver}" ] && gccver=0
	if [ ${gccver} -ge 8 ] ; then
		# for gcc version greater or equal to 8, append following compilation flags:
		no_warn="${no_warn} -Wno-error=maybe-uninitialized -Wno-error=sizeof-pointer-memaccess"
		no_warn="${no_warn} -Wno-error=stringop-truncation"
	fi

	CMAKE_PREFIX_PATH="${LNXDESTPFX}/lib" cmake -DCMAKE_BUILD_TYPE=release \
		"-DCMAKE_C_COMPILER_RANLIB=$(which ${LNX_TCP}-ranlib)" "-DCMAKE_AR=$(which ${LNX_TCP}-ar)" \
		-DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" -DDISABLE_ASSERT=false \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} ${no_warn} -I${LNXDESTPFX}/include" \
		-DCMAKE_CXX_FLAGS="${LNX_CFLAGS} ${no_warn} -I${LNXDESTPFX}/include" \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib -lpthread" \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib -lpthread" \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -Wl,-rpath-link=${LNXDESTPFX}/lib -lpthread" \
		-DCPUTYPE=${cputype} -DBUILD_WITH_SQLITE=OFF -DBUILD_TOOLS=true \
		-DZLIB_LIBRARY=${LNXDESTPFX}/lib/libz.so ..
	return $?
}

tdengine_build() {
	cd ./build_dir || return 1
	make VERBOSE=1 -j${OJOBN:-8} && make DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 2

	cd "${FTOPDIR}/${SB_DIR}"
	local pkg_ver=3.1.0.3
	lnxbf_ipkg_init tdengine "${pkg_ver}"
	[ $? -ne 0 ] && return 3

	local LPKGDIR="ipkg-dir${LNX_PREFIX}"
	mkdir -p "${LPKGDIR}/bin" "${LPKGDIR}/lib" "${LPKGDIR}/app/config" \
		"${LPKGDIR}/platspec" "${LPKGDIR}/app/upstart"
	cp -r -v -P -f ./build_dir/build/bin/* "${LPKGDIR}/bin/" && \
		cp -r -v -P -f ./build_dir/build/lib/*.so* "${LPKGDIR}/lib/" && \
		cp -r -v ./ipkg-dir/CONTROL/postinst "${LPKGDIR}/app/upstart/$(printf "%03d" ${FTPIDX})-tdengine.sh"
	[ $? -ne 0 ] && return 4

	cp -f -v packaging/cfg/init_taosd "${LPKGDIR}/bin/" && \
		cp -f -v packaging/cfg/taos.cfg "${LPKGDIR}/app/config/" && \
		cp -f -v packaging/cfg/taosd.service "${LPKGDIR}/platspec/"
	[ $? -ne 0 ] && return 5

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

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

jansson_config() {
	if [ ! -x 'configure' ] ; then
		autoreconf -i
		[ $? -ne 0 ] && return 1
	fi

	mkdir -p ./build_dir && cd ./build_dir
	[ $? -ne 0 ] && return 2

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

jansson_build() {
	cd ./build_dir || return 1
	make V=1 -j${OJOBN:-8} && make DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 2

	cd "${FTOPDIR}/${SB_DIR}"
	local pkg_ver=4.14.0
	lnxbf_ipkg_init libjansson "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

snappy_config() {
	mkdir -p ./build_dir && cd ./build_dir && {
        cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
            -DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
            -DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include" \
			-DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_BUILD_BENCHMARKS=OFF \
            -DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
            -DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
            -DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} -lpthread" \
			-DBUILD_SHARED_LIBS=ON ..
		return $?
	}
	return 1
}

snappy_build() {
	cd ./build_dir || return 1
	make VERBOSE=1 -j${OJOBN:-8} && make VERBOSE=1 DESTDIR=${LNXDESTDIR} install
	[ $? -ne 0 ] && return 2

	cd "${FTOPDIR}/${SB_DIR}"
	local pkg_ver=1.1.10
	lnxbf_ipkg_init libsnappy "${pkg_ver}"
	[ $? -ne 0 ] && return 3

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

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

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

libcan1939_config() {
	mkdir -p build_dir && cd ./build_dir && \
		cmake -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX="${LNX_PREFIX}" \
		-DOPENSAE_J1939_TARGET_PLATFORM=SOCKETCAN \
		-DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
		-DCMAKE_C_COMPILER=${LNX_CC} -DCMAKE_CXX_COMPILER=${LNX_CXX} \
		-DCMAKE_C_FLAGS="${LNX_CFLAGS} -I${LNXDESTPFX}/include " \
		-DCMAKE_EXE_LINKER_FLAGS="${LNX_LDFLAGS} " \
		-DCMAKE_SHARED_LINKER_FLAGS="${LNX_LDFLAGS} " \
		-DCMAKE_MODULE_LINKER_FLAGS="${LNX_LDFLAGS} " ..
	return $?
}

libcan1939_build() {
	cd ./build_dir
	[ $? -ne 0 ] && return 1
	make VERBOSE=1 -j${OJOBN:-8} && \
		make DESTDIR=${LNXDESTDIR} VERBOSE=1 install
	[ $? -ne 0 ] && return 2

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

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

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

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

srcpkg_enabled python3 && \
	register_source 'opensource/Python-3.9.13' \
		python3_config python3_build python3_clean

if srcpkg_enabled redis ; then
	register_source 'opensource/redis-7.0.3' \
		opensrc_dummy_config redis_server_build redis_server_clean
	register_source 'opensource/hiredis' \
		hiredis_config hiredis_build hiredis_clean
fi

if srcpkg_enabled librdkafka ; then
	register_source 'opensource/cyrus-sasl-2.1.27' \
		cyrus_sasl_config cyrus_sasl_build cyrus_sasl_clean
	register_source 'opensource/librdkafka-1.5.2' \
		librdkafka_config librdkafka_build librdkafka_clean
fi

if srcpkg_enabled tdengine ; then
	register_source 'opensource/argp-standalone' \
		opensrc_dummy_config argp_build argp_clean

	register_source 'opensource/jansson' \
		jansson_config jansson_build jansson_clean

	register_source 'opensource/snappy' \
		snappy_config snappy_build snappy_clean

	register_source 'opensource/taos-tools/deps/avro/lang/c' \
		avro_config libavro_build libavro_clean

	register_source 'opensource/TDengine' \
		tdengin_config tdengine_build tdengine_clean
fi

register_source 'opensource/open62541' \
	open62541_config open62541_build open62541_clean

srcpkg_enabled can1939 && \
	register_source 'opensource/can1939' \
		libcan1939_config libcan1939_build libcan1939_clean
