|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +set -o errexit |
| 4 | +set -o nounset |
| 5 | +set -o pipefail |
| 6 | + |
| 7 | +MUSL_VERS=1.1.14 |
| 8 | +BUSYBOX_VERS=1.24.2 |
| 9 | +OPENRC_VERS=0.21 |
| 10 | + |
| 11 | +BASE=$(dirname $(readlink -f $0)) |
| 12 | +mkdir -p $BASE/initramfs |
| 13 | +mkdir -p $BASE/initramfs/3rd_party/MIT |
| 14 | +mkdir -p $BASE/initramfs/3rd_party/GPL |
| 15 | + |
| 16 | +INSTALLROOT="${BASE}/initramfs/.install" |
| 17 | +mkdir -p "${INSTALLROOT}" |
| 18 | +BUILDROOT="${BASE}/initramfs/.build" |
| 19 | +mkdir -p "${BUILDROOT}" |
| 20 | +KHDR_BASE=/usr |
| 21 | + |
| 22 | +### MUSL-C ### |
| 23 | +cd "${BASE}/initramfs/3rd_party/MIT" |
| 24 | +if [ ! -e "${BASE}/initramfs/3rd_party/MIT/musl-${MUSL_VERS}.tar.gz" ]; then |
| 25 | + curl -O https://www.musl-libc.org/releases/musl-${MUSL_VERS}.tar.gz |
| 26 | +fi |
| 27 | + |
| 28 | +tar -C "${BUILDROOT}" -xf musl-${MUSL_VERS}.tar.gz |
| 29 | +cd "${BUILDROOT}/musl-${MUSL_VERS}" |
| 30 | +./configure \ |
| 31 | + --disable-wrapper \ |
| 32 | + --prefix=/usr \ |
| 33 | + --sysconfdir=/etc \ |
| 34 | + --localstatedir=/var \ |
| 35 | + --syslibdir=/lib \ |
| 36 | + --includedir="/../.build/include" |
| 37 | +make -j2 |
| 38 | + |
| 39 | +make DESTDIR="${INSTALLROOT}" install |
| 40 | +LDSO=$(make -f Makefile --eval "$(echo -e 'print-ldso:\n\t@echo $$(basename $(LDSO_PATHNAME))')" print-ldso) |
| 41 | +mv -f "${INSTALLROOT}/usr/lib/libc.so" "${INSTALLROOT}/lib/${LDSO}" |
| 42 | +ln -sf "../../lib/${LDSO}" "${INSTALLROOT}/usr/lib/libc.so" |
| 43 | +mkdir -p "${INSTALLROOT}/usr/bin" |
| 44 | +ln -sf "../../lib/${LDSO}" "${INSTALLROOT}/usr/bin/ldd" |
| 45 | + |
| 46 | +mkdir -p "${BUILDROOT}/bin" "${BUILDROOT}/etc" |
| 47 | + |
| 48 | +sh "${BUILDROOT}/musl-${MUSL_VERS}/tools/musl-gcc.specs.sh" "${BUILDROOT}/include" "${INSTALLROOT}/usr/lib" "/lib/${LDSO}" > "${BUILDROOT}/etc/musl-gcc.specs" |
| 49 | + |
| 50 | +cat <<EOF > "${BUILDROOT}/bin/musl-gcc" |
| 51 | +#!/bin/sh |
| 52 | +exec "\${REALGCC:-gcc}" "\$@" -specs "${BUILDROOT}/etc/musl-gcc.specs" |
| 53 | +EOF |
| 54 | + |
| 55 | +chmod +x "${BUILDROOT}/bin/musl-gcc" |
| 56 | + |
| 57 | +PATH="${BUILDROOT}/bin":$PATH |
| 58 | + |
| 59 | +cd "${BUILDROOT}/bin" |
| 60 | + |
| 61 | +# TODO: Using binutils from the build host for now |
| 62 | +ln -s `which ar` musl-ar |
| 63 | +ln -s `which strip` musl-strip |
| 64 | + |
| 65 | +# TODO: Using linux-headers from the buildhost for now |
| 66 | +cd "${BUILDROOT}/include" |
| 67 | +ln -s "${KHDR_BASE}/include/linux" linux |
| 68 | +ln -s "${KHDR_BASE}/include/mtd" mtd |
| 69 | +if [ -d "${KHDR_BASE}/include/asm" ] |
| 70 | +then |
| 71 | + ln -s "${KHDR_BASE}/include/asm" asm |
| 72 | +else |
| 73 | + ln -s "${KHDR_BASE}/include/asm-generic" asm |
| 74 | +fi |
| 75 | +ln -s "${KHDR_BASE}/include/asm-generic" asm-generic |
| 76 | + |
| 77 | +### Busybox (static) ### |
| 78 | +cd "${BASE}/initramfs/3rd_party/GPL" |
| 79 | +if [ ! -e "${BASE}/initramfs/3rd_party/GPL/busybox-${BUSYBOX_VERS}.tar.bz2" ]; then |
| 80 | + curl -O https://www.busybox.net/downloads/busybox-${BUSYBOX_VERS}.tar.bz2 |
| 81 | +fi |
| 82 | + |
| 83 | +tar -C "${BUILDROOT}" -xf busybox-${BUSYBOX_VERS}.tar.bz2 |
| 84 | +cd "${BUILDROOT}/busybox-${BUSYBOX_VERS}" |
| 85 | +cp "${BASE}/busybox.config" .config |
| 86 | +sed -i -e "s/CONFIG_EXTRA_COMPAT=y/CONFIG_EXTRA_COMPAT=n/" \ |
| 87 | + -e "s/.*CONFIG_CROSS_COMPILER_PREFIX.*/CONFIG_CROSS_COMPILER_PREFIX=\"musl-\"/" \ |
| 88 | + -e "s|.*CONFIG_PREFIX.*|CONFIG_PREFIX=\"${INSTALLROOT}\"|" \ |
| 89 | + -e "s/.*CONFIG_PIE.*/\# CONFIG_PIE is not set/" \ |
| 90 | + -e "s/.*CONFIG_INSTALL_APPLET_DONT.*/\# CONFIG_INSTALL_APPLET_DONT is not set/" \ |
| 91 | + -e "s/.*CONFIG_STATIC.*/CONFIG_STATIC=y/" \ |
| 92 | + -e "s/.*CONFIG_INSTALL_APPLET_SYMLINKS.*/CONFIG_INSTALL_APPLET_SYMLINKS=y/" \ |
| 93 | + .config |
| 94 | + |
| 95 | +make V=1 -j2 |
| 96 | +make install |
| 97 | + |
| 98 | +### OpenRC ### |
| 99 | +cd "${BASE}/initramfs/3rd_party/MIT" |
| 100 | +if [ ! -e "${BASE}/initramfs/3rd_party/MIT/openrc-${OPENRC_VERS}.tar.gz" ]; then |
| 101 | + curl -L -o openrc-${OPENRC_VERS}.tar.gz https://github.com/OpenRC/openrc/archive/${OPENRC_VERS}.tar.gz |
| 102 | +fi |
| 103 | + |
| 104 | +tar -C "${BUILDROOT}" -xf openrc-${OPENRC_VERS}.tar.gz |
| 105 | +cd "${BUILDROOT}/openrc-${OPENRC_VERS}" |
| 106 | + |
| 107 | +make install \ |
| 108 | + LIBNAME=lib \ |
| 109 | + DESTDIR="${INSTALLROOT}" \ |
| 110 | + MKNET=yes \ |
| 111 | + MKPKGCONFIG=no \ |
| 112 | + MKSTATICLIBS=no \ |
| 113 | + MKTOOLS=yes \ |
| 114 | + LOCAL_PREFIX=/usr/local \ |
| 115 | + BRANDING=\"Warewulf/$(uname -s)\" \ |
| 116 | + CC=musl-gcc |
| 117 | + |
| 118 | +# systemd-nspawn needs os-release |
| 119 | +echo 'NAME="Warewulf 4.0 Bootstrap"' > "${INSTALLROOT}/etc/os-release" |
| 120 | + |
| 121 | +cat <<EOF > "${INSTALLROOT}/etc/inittab" |
| 122 | +# /etc/inittab |
| 123 | +
|
| 124 | +::sysinit:/sbin/openrc sysinit |
| 125 | +::sysinit:/sbin/openrc boot |
| 126 | +::wait:/sbin/openrc default |
| 127 | +
|
| 128 | +# Set up a couple of getty's |
| 129 | +console::respawn:/sbin/getty 38400 /dev/console |
| 130 | +
|
| 131 | +# Put a getty on the serial port |
| 132 | +#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 |
| 133 | +#ttyS1::respawn:/sbin/getty -L ttyS1 115200 vt100 |
| 134 | +
|
| 135 | +# Stuff to do for the 3-finger salute |
| 136 | +::ctrlaltdel:/sbin/reboot |
| 137 | +
|
| 138 | +# Stuff to do before rebooting |
| 139 | +::shutdown:/sbin/openrc shutdown |
| 140 | +EOF |
0 commit comments