# Contributor: Olliver Schinagl <oliver@schinagl.nl>
# Maintainer: Olliver Schinagl <oliver@schinagl.nl>
pkgname=klibc
pkgver=2.0.14
pkgrel=1
pkgdesc="A minimalistic libc subset for use with initramfs"
url="https://git.kernel.org/pub/scm/libs/klibc/klibc.git/"
arch="all"
license="GPL-2.0-or-later"
makedepends="linux-headers perl"
install="
	lib$pkgname.post-deinstall
	lib$pkgname.post-install
"
subpackages="
	$pkgname-dash
	$pkgname-dev
	$pkgname-doc
	$pkgname-static:static
	$pkgname-fstype:bins
	$pkgname-ipconfig:bins
	$pkgname-kinit::noarch
	$pkgname-klcc::noarch
	$pkgname-nfsmount:bins
	$pkgname-resume:bins
	$pkgname-run-init:bins
	$pkgname-utils
	lib$pkgname:libs
"
source="
	https://git.kernel.org/pub/scm/libs/klibc/klibc.git/snapshot/klibc-$pkgver.tar.gz
"
_installdir="/usr/lib/$pkgname-$CARCH/"

# secfixes:
#   2.0.9-r0:
#     - CVE-2021-31870
#     - CVE-2021-31871
#     - CVE-2021-31872
#     - CVE-2021-31873

build() {
	# klibc's header misses the struct declaration, Linux's misses
	# the function declaration. Combine them here.
	if [ ! -e "$builddir/usr/include/sys/sysinfo.h.orig" ]; then
		mv "$builddir/usr/include/sys/sysinfo.h" \
		   "$builddir/usr/include/sys/sysinfo.h.orig"
	fi
	cat \
	    "/usr/include/linux/sysinfo.h" \
	    "$builddir/usr/include/sys/sysinfo.h.orig" > \
	    "$builddir/usr/include/sys/sysinfo.h"

	make \
	     KBUILD_REPRODUCIBLE=1 \
	     KLIBCKERNELSRC="/usr/"
}

check() {
	make \
	     KBUILD_REPRODUCIBLE=1 \
	     KLIBCKERNELSRC="/usr/" \
	     test
}

package() {
	depends="
		lib$pkgname
		$pkgname-dash
		$pkgname-kinit
		$pkgname-utils
	"

case "$CARCH" in
	aarch64)
		_klibcarch="arm64"
		;;
	armhf)
		_klibcarch="arm"
		CPU_ARCH="armv6zk"
		CPU_TUNE="arm1176jzf-s"
		;;
	armv7)
		_klibcarch="arm"
		CPU_ARCH="armv7"
		CPU_TUNE="generic-armv7-a"
		;;
	ppc)
		_klibcarch="ppc"
		;;
	ppc64|ppc64le)
		_klibcarch="ppc64"
		;;
	riscv64)
		_klibcarch="riscv64"
		;;
	s390x)
		_klibcarch="s390"
		;;
	x86)
		_klibcarch="i386"
		;;
	x86_64)
		_klibcarch="x86_64"
		;;
	*)
		echo 'Unsupported architecture'
		;;
	esac
	export CPU_ARCH
	export CPU_TUNE
	make \
	     INSTALLDIR="$_installdir" \
	     INSTALLROOT="$pkgdir" \
	     KBUILD_REPRODUCIBLE=1 \
	     KLIBCKERNELSRC="/usr/" \
	     mandir="/usr/share/man" \
	     install

	# Duplicated in INSTALLDIR/lib and replaced with post.install
	rm -r "${pkgdir:?}/lib"

	for _arch in "$pkgdir/$_installdir/include/arch/"*; do
		if [ "${_arch##*/}" != "$_klibcarch" ]; then
			rm -r "${_arch:?}"
		fi
	done

	# Replace hardlinks with symlinks
	unlink "$pkgdir/$_installdir/bin/gunzip"
	unlink "$pkgdir/$_installdir/bin/poweroff"
	unlink "$pkgdir/$_installdir/bin/reboot"
	unlink "$pkgdir/$_installdir/bin/zcat"

	ln -s "gzip" "$pkgdir/$_installdir/bin/gunzip"
	ln -s "gzip" "$pkgdir/$_installdir/bin/zcat"

	ln -s "halt" "$pkgdir/$_installdir/bin/poweroff"
	ln -s "halt" "$pkgdir/$_installdir/bin/reboot"
}

klcc() {
	depends="perl"

	mkdir -p "$subpkgdir/usr/bin"
	mv "$pkgdir/usr/bin/klcc" "$subpkgdir/usr/bin/"
}

libs() {
	install="lib$pkgname.post-deinstall lib$pkgname.post-install"

	mkdir -p "$subpkgdir/$_installdir"
	mv "$pkgdir/$_installdir/lib" "$subpkgdir/$_installdir/"
}

bins() {
	depends="lib$pkgname"

	mkdir -p "$subpkgdir/$_installdir/bin"
	mv "$pkgdir/$_installdir/bin/${subpkgname#"$pkgname"-}" "$subpkgdir/$_installdir/bin/"
}

dash() {
	depends="lib$pkgname"

	mkdir -p "$subpkgdir/$_installdir/bin"
	mv "$pkgdir/$_installdir/bin/sh" "$subpkgdir/$_installdir/bin/"
}

kinit() {
	depends="
		$pkgname-fstype
		$pkgname-ipconfig
		$pkgname-nfsmount
		$pkgname-resume
		$pkgname-run-init
	"

	mkdir -p "$subpkgdir"
}

utils() {
	depends="lib$pkgname"

	mkdir -p "$subpkgdir/$_installdir/"
	mv "$pkgdir/$_installdir/bin" "$subpkgdir/$_installdir/"
}

static() {
	mkdir -p "$subpkgdir/$_installdir/bin"

	find "$builddir" -type d -name 'static' | while read -r _staticbins; do
		for _bin in "$_staticbins/"*; do
			if [ -z "${_bin%%*.g}" ]; then
				continue
			fi

			install -D -m 755 "${_bin}" \
			        "$subpkgdir/$_installdir/bin/${_bin##*/}.static"
		done
	done

	mv "$pkgdir/$_installdir/bin/gunzip" \
	   "$subpkgdir/$_installdir/bin/gunzip.static"

	mv "$pkgdir/$_installdir/bin/gzip" \
	   "$subpkgdir/$_installdir/bin/gzip.static"

	mv "$pkgdir/$_installdir/bin/zcat" \
	   "$subpkgdir/$_installdir/bin/zcat.static"
}

sha512sums="
4a0a1a1fb7c1e52519a1e403f3c5050ca311394aebe09f131baec2204bb3ff46198f18ea84c0eff5a22e94ffb776dea3b16f9ca0db1a4a3ac850b6038edef866  klibc-2.0.14.tar.gz
"
