_ _
| |_ ___| |_ _
| | . | | | |
|_|_|___|_|_ |
|___|
git mirror - github.com/owenewans/holy - branch master
file tools/bootstrap-glibc.sh
#!/bin/sh
set -eu
umask 022
test "$#" -eq 3 || { echo 'usage: bootstrap-glibc.sh HOLYPKG INPUTS OUTPUT' >&2; exit 2; }
test "$(id -u)" != 0 && test "$(uname -m)" = x86_64 || exit 6
case "${ARCH:-x86_64}" in
x86_64) arch=x86_64; target=x86_64-linux-gnu; flags='-m64 -march=x86-64 -mtune=generic'; loader_name=ld-linux-x86-64.so.2; public=usr/lib64; link=../lib/holy; docs=glibc ;;
i686|x86) arch=x86; target=i686-linux-gnu; flags='-m32 -march=i686 -mtune=generic'; loader_name=ld-linux.so.2; public=usr/lib; link=holy; docs=glibc-i686 ;;
*) printf 'unsupported glibc target: %s\n' "$ARCH" >&2; exit 6 ;;
esac
unset ARCH MAKEFLAGS MAKEOVERRIDES MFLAGS
for tool in gcc make gawk bison python3 tar sha256sum patchelf; do
command -v "$tool" >/dev/null || { echo "$tool required" >&2; exit 6; }
done
bin=$(realpath "$1")
inputs=$(realpath "$2")
mkdir -p "$(dirname "$3")"
mkdir -m 0700 "$3"
out=$(realpath "$3")
started=$(date +%s)
finish() {
rc=$?
trap - EXIT
printf 'exit %s\nelapsed-seconds %s\n' "$rc" "$(($(date +%s) - started))" >> "$out/build.record"
exit "$rc"
}
trap finish EXIT
trap 'exit 1' HUP INT TERM
exec > "$out/build.log" 2>&1
printf 'format holy-glibc-bootstrap-1\narch %s\ntarget %s\ncompiler-flags %s\nlibc glibc\n' "$arch" "$target" "$flags" > "$out/build.record"
gcc --version >> "$out/build.record"
mkdir "$out/inputs" "$out/work" "$out/build"
cp "$inputs/glibc-2.42.tar.xz" "$out/inputs/"
digest=d1775e32e4628e64ef930f435b67bb63af7599acb6be2b335b9f19f16509f17f
printf '%s %s\n' "$digest" "$out/inputs/glibc-2.42.tar.xz" | sha256sum -c -
sha256sum "$out/inputs/glibc-2.42.tar.xz" "$0" >> "$out/build.record"
tar -xf "$out/inputs/glibc-2.42.tar.xz" -C "$out/work"
(
cd "$out/build"
unset CPPFLAGS LDFLAGS LDLIBS
CC="gcc $flags" CXX="g++ $flags" CFLAGS="-O2 $flags" \
"$out/work/glibc-2.42/configure" --prefix=/usr --host="$target" --build="$(gcc -dumpmachine)" \
--libdir="/usr/lib/holy/$target" --disable-werror --without-gd
make -j"${JOBS:-2}"
)
cp "$out/build/config.make" "$out/config.make"
sha256sum "$out/config.make" >> "$out/build.record"
tree="$out/tree"
runtime=/usr/lib/holy/$target
loader=$runtime/$loader_name
mkdir -p "$tree/HOLY" "$tree/DATA$runtime" "$tree/DATA/$public" \
"$tree/DATA/usr/share/licenses/$docs" "$tree/DATA/usr/share/doc/$docs"
cp "$out/build/elf/ld.so" "$tree/DATA$loader"
cp "$out/build/libc.so" "$tree/DATA$runtime/libc.so.6"
printf 'source https://ftp.gnu.org/gnu/glibc/glibc-2.42.tar.xz\nsource-sha256 %s\nverification hash-pinned-https\n' "$digest" > "$tree/HOLY/origin"
printf 'target %s\ncflags "%s"\n' "$target" "$flags" >> "$tree/HOLY/origin"
"$bin" elf "$tree/DATA$loader" > "$out/loader.elf"
grep -qx "machine $arch" "$out/loader.elf"
sha256sum "$tree/DATA$runtime/libc.so.6" "$tree/DATA$loader" >> "$tree/HOLY/origin"
patchelf --set-interpreter "$loader" --replace-needed "$loader_name" "$loader" "$tree/DATA$runtime/libc.so.6"
printf 'bootstrap-patchelf interpreter %s\nbootstrap-patchelf needed %s %s\n' "$loader" "$loader_name" "$loader" >> "$tree/HOLY/origin"
patchelf --version >> "$tree/HOLY/origin"
sha256sum "$tree/DATA$runtime/libc.so.6" >> "$tree/HOLY/origin"
ln -s "$link/$target/$loader_name" "$tree/DATA/$public/$loader_name"
cp "$out/work/glibc-2.42/COPYING" "$out/work/glibc-2.42/COPYING.LIB" "$tree/DATA/usr/share/licenses/$docs/"
cp "$out/work/glibc-2.42/README" "$tree/DATA/usr/share/doc/$docs/"
printf 'format holy-package-1\nname glibc-bootstrap\nversion 2.42\nrelease 1\nos linux\narch %s\nlibc glibc\n' "$arch" > "$tree/HOLY/meta"
for name in deps provides hooks transform; do : > "$tree/HOLY/$name"; done
"$bin" manifest generate "$tree" --output "$out/files"
mv "$out/files" "$tree/HOLY/files"
"$bin" pack "$tree" --output "$out/glibc.holy"
"$bin" scan "local:$out/glibc.holy"
sha256sum "$out/glibc.holy" >> "$out/build.record"
printf 'result built\nnot-tested upstream-check boot runtime-probes\n' >> "$out/build.record"