_ _
| |_ ___| |_ _
| | . | | | |
|_|_|___|_|_ |
|___|
git mirror - github.com/owenewans/holy - branch master
file tools/bootstrap-musl.sh
#!/bin/sh
set -eu
test "$#" -eq 3 || { echo 'usage: bootstrap-musl.sh HOLYPKG INPUTS OUTPUT' >&2; exit 2; }
test "$(id -u)" != 0 || exit 6
case "${ARCH:-x86_64}" in
x86_64) arch=x86_64; target=x86_64-linux-musl; machine=x86_64; suffix=x86_64; flags=-m64; docs=musl ;;
i686|x86) arch=x86; target=i686-linux-musl; machine=x86; suffix=i386; flags='-m32 -march=i686 -mtune=generic'; docs=musl-i686 ;;
*) printf 'unsupported musl target: %s\n' "$ARCH" >&2; exit 6 ;;
esac
unset ARCH MAKEFLAGS MAKEOVERRIDES MFLAGS
case "$(uname -m)" in x86_64|i?86) ;; *) exit 6 ;; esac
bin=$(realpath "$1")
inputs=$(realpath "$2")
project=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd)
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-musl-bootstrap-1\narch %s\ntarget %s\nlibc musl\ncompiler-flags %s\n' "$arch" "$target" "$flags" > "$out/build.record"
gcc --version >> "$out/build.record"
mkdir "$out/inputs" "$out/work"
cp "$inputs/musl-1.2.5.tar.gz" "$out/inputs/"
digest=$(awk '$2 == "musl-1.2.5.tar.gz" { print $1 }' "$project/profiles/static-sources")
test "${#digest}" -eq 64
printf '%s %s\n' "$digest" "$out/inputs/musl-1.2.5.tar.gz" | sha256sum -c -
sha256sum "$out/inputs/musl-1.2.5.tar.gz" "$0" >> "$out/build.record"
tar -xf "$out/inputs/musl-1.2.5.tar.gz" -C "$out/work"
(
cd "$out/work/musl-1.2.5"
unset CPPFLAGS LDLIBS
CC=gcc CFLAGS="$flags" LDFLAGS="$flags -Wl,-soname,libc.musl-$suffix.so.1" AR=ar RANLIB=ranlib \
./configure --target="$target" --prefix=/usr --syslibdir=/usr/lib
make -j"${JOBS:-2}" lib/libc.so
)
loader="$out/work/musl-1.2.5/lib/libc.so"
if "$loader" > "$out/loader.stdout" 2> "$out/loader.stderr"; then exit 1; else test "$?" -eq 1; fi
grep -q 'Version 1.2.5' "$out/loader.stderr"
"$bin" elf "$loader" > "$out/loader.elf"
grep -qx 'runtime musl' "$out/loader.elf"
grep -qx "machine $machine" "$out/loader.elf"
tree="$out/tree"
mkdir -p "$tree/HOLY" "$tree/DATA/usr/lib/holy/$target" \
"$tree/DATA/usr/share/licenses/$docs" "$tree/DATA/usr/share/doc/$docs"
cp "$loader" "$tree/DATA/usr/lib/holy/$target/ld-musl-$suffix.so.1"
ln -s "holy/$target/ld-musl-$suffix.so.1" "$tree/DATA/usr/lib/ld-musl-$suffix.so.1"
cp "$out/work/musl-1.2.5/COPYRIGHT" "$tree/DATA/usr/share/licenses/$docs/"
cp "$out/work/musl-1.2.5/README" "$tree/DATA/usr/share/doc/$docs/"
printf 'format holy-package-1\nname musl\nversion 1.2.5\nrelease 1\nos linux\narch %s\nlibc musl\n' "$arch" > "$tree/HOLY/meta"
for name in deps provides hooks transform; do : > "$tree/HOLY/$name"; done
printf 'source https://musl.libc.org/releases/musl-1.2.5.tar.gz\nsource-sha256 %s\ntarget %s\ncflags "%s"\nldflags "%s -Wl,-soname,libc.musl-%s.so.1"\n' "$digest" "$target" "$flags" "$flags" "$suffix" > "$tree/HOLY/origin"
sha256sum "$loader" >> "$tree/HOLY/origin"
"$bin" manifest generate "$tree" --output "$out/files"
mv "$out/files" "$tree/HOLY/files"
"$bin" pack "$tree" --output "$out/musl.holy"
"$bin" scan "local:$out/musl.holy"
sha256sum "$out/musl.holy" >> "$out/build.record"
printf 'result built-loader-probed\n' >> "$out/build.record"