diff options
author | Rob Landley <rob@landley.net> | 2021-11-20 02:57:51 -0600 |
---|---|---|
committer | Rob Landley <rob@landley.net> | 2021-11-20 02:57:51 -0600 |
commit | a0d8377466ee7333966fc0dcbdb311f36bc9df68 (patch) | |
tree | b76b1f06c8bfc984392272aed49bc60122d72c68 /scripts | |
parent | eff1703cc300a34befd72c7adb99972b54893594 (diff) | |
download | toybox-a0d8377466ee7333966fc0dcbdb311f36bc9df68.tar.gz |
More mkroot changes. Add record-commands logging, more error checking,
ensure package scripts run in order, reorder for intelligibility.
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/mkroot.sh | 94 |
1 files changed, 51 insertions, 43 deletions
diff --git a/scripts/mkroot.sh b/scripts/mkroot.sh index f4040f3d..9c605cb9 100755 --- a/scripts/mkroot.sh +++ b/scripts/mkroot.sh @@ -9,64 +9,69 @@ announce() { echo -e "\033]2;$CROSS $*\007\n=== $*"; } [ -z "$NOCLEAR" ] && exec env -i NOCLEAR=1 HOME="$HOME" PATH="$PATH" \ LINUX="$LINUX" CROSS="$CROSS" CROSS_COMPILE="$CROSS_COMPILE" "$0" "$@" -# assign command line NAME=VALUE args to env vars, keeping rest as packages +# assign command line NAME=VALUE args to env vars, the rest are packages while [ $# -ne 0 ]; do - [ "${1/=/}" != "$1" ] && eval "export ${1/=*/}=\"\${1#*=}\"" || - { [ "$1" != '--' ] && PKG="${PKG:-plumbing} $1"; } + [ "${1/=/}" != "$1" ] && export "$1" || + { [ "$1" != -- ] && PKG="${PKG:-plumbing} $1"; } shift done -mkdir -p ${TOP:=$PWD/root} ${LOG:=$TOP/log} ${BUILD:=$TOP/build} || exit 1 -: ${PKGDIR:=$PWD/scripts/root} -# Are we cross compiling? -if [ ! -z "$CROSS" ]; then +# Create work/output directories (command line can override these) +mkdir -p ${TOP:=$PWD/root} ${BUILD:=$TOP/build} ${LOG:=$BUILD/log} || exit 1 + +# ----- Set up for cross compling (optional) + +if [ -n "$CROSS_COMPILE" ]; then + CROSS_COMPILE="$(realpath -s "$CROSS_COMPILE")" # absolute path for airlock + [ -z "$CROSS" ] && CROSS=${CROSS_COMPILE/*[/]/} CROSS=${CROSS/-*/} +elif [ -n "$CROSS" ]; then # CROSS=all, CROSS=target, or list available targets [ ! -d "${CCC:=$PWD/ccc}" ] && die "No ccc symlink to compiler directory." - if [ "${CROSS::3}" == all ]; then # loop calling ourselves each target in ccc - for i in $(ls "$CCC" | sed -n 's/-.*//p' | sort -u); do - rm -f "$LOG/$i".{n,y} + TARGETS="$(ls "$CCC" | sed -n 's/-.*//p' | sort -u)" + if [ "${CROSS::3}" == all ]; then # loop calling ourselves for each target + for i in $TARGETS; do rm -f "$LOG/$i".{n,y} { "$0" "$@" CROSS=$i && mv "$LOG/$i".{n,y};} |& tee "$LOG/$i.n" [ ! -e "$LOG/$i.y" ] && [ "$CROSS" != allnonstop ] && exit 1; - done - exit - else # Set $CROSS_COMPILE and $CROSS_PATH from $CROSS using ccc directory + done; exit + else # Set $CROSS_COMPILE from $CROSS using ccc directory CROSS_COMPILE="$(echo "$CCC/$CROSS"-*cross/bin/"$CROSS"*-cc)" - [ ! -e "$CROSS_COMPILE" ] && # Show available targets - { ls "$CCC" | sed -n 's/-.*//p' | sort -u | xargs; exit;} - CROSS_PATH="$(dirname "$(which "$CROSS_COMPILE")")" - [ -z "$CROSS_PATH" ] && die "no $CROSS_COMPILE in path" - CROSS_COMPILE="${CROSS_COMPILE%cc}" + [ ! -e "$CROSS_COMPILE" ] && echo $TARGETS && exit # list available targets + CROSS_COMPILE="${CROSS_COMPILE%cc}" # keep prefix, not path to compiler fi fi +# Smoketest target compiler +echo "Building for ${CROSS:=host}" ${CROSS_COMPILE}cc --static -xc - -o /dev/null <<< "int main(void){return 0;}"|| die "${CROSS_COMPILE}cc can't create static binaries" -echo "Building for ${CROSS:=host}" - -# Create work/output directories (command line can override these) -mkdir -p ${OUTPUT:=$TOP/$CROSS} || exit 1 -MYBUILD="$BUILD/${CROSS}-tmp" # only rm -r things WE SET -rm -rf "$MYBUILD" && mkdir -p "$MYBUILD" || exit 1 -[ -z "$ROOT" ] && ROOT="$OUTPUT/fs" && rm -rf "$ROOT" -# ----- Build airlock +# ----- Build airlock (Optional) # When cross compiling build under a host toybox with known behavior -if [ ! -z "$CROSS_COMPILE" ]; then - if [ ! -e "${AIRLOCK:=$TOP/airlock}/toybox" ]; then +if [ -n "$CROSS_COMPILE" ]; then + if [ ! -e "${AIRLOCK:=$BUILD/airlock}/toybox" ]; then announce "airlock" - PREFIX="$AIRLOCK" KCONFIG_CONFIG="$TOP"/.airlock CROSS_COMPILE= \ - make clean defconfig toybox install_airlock && rm "$TOP"/.airlock ||exit 1 + PREFIX="$AIRLOCK" KCONFIG_CONFIG="$BUILD"/.airlock CROSS_COMPILE= \ + make clean defconfig toybox install_airlock && + rm "$BUILD"/.airlock || exit 1 fi - export PATH="${CROSS_PATH:+$CROSS_PATH:}$AIRLOCK" + export PATH="$AIRLOCK" +fi - # Install command line logging wrapper - if [ ! -z "$LLOG" ]; then - WRAPDIR="$TOP/$AIRLOCK/record-commands" && - export WRAPLOG="$LOG/commands-$CROSS.txt" && - KCONFIG_CONFIG="$TOP"/airlock source scripts/record-commands || exit 1 - fi +# Install command line recording wrapper, logs all commands run from $PATH +if [ -z "$NO_LOGPATH" ]; then + # Move cross compiler into $PATH so calls to it get logged + [ -n "$CROSS_COMPILE" ] && PATH="${CROSS_COMPILE%/*}:$PATH" && + CROSS_COMPILE=${CROSS_COMPILE##*/} + export WRAPDIR="$BUILD/record-commands" LOGPATH="$LOG/commands-$CROSS.txt" + rm -rf "$WRAPDIR" "$LOGPATH" && + WRAPDIR="$WRAPDIR" CROSS_COMPILE= source scripts/record-commands || exit 1 fi +# Create per-target work directories +MYBUILD="$BUILD/${CROSS}-tmp" && rm -rf "$MYBUILD" && mkdir -p "$MYBUILD" && +mkdir -p ${OUTPUT:=$TOP/$CROSS} || exit 1 +[ -z "$ROOT" ] && ROOT="$OUTPUT/fs" && rm -rf "$ROOT" + # ----- Create new root filesystem's directory layout. # FHS wants boot media opt srv usr/{local,share}, stuff under /var... @@ -99,7 +104,7 @@ if [ $$ -eq 1 ]; then # Setup networking for QEMU (needs /proc) [ "$(date +%s)" -lt 10000000 ] && sntp -sq time.google.com # Run package scripts (if any) - for i in /etc/rc/*; do [ -e "$i" ] && . "$i"; done + for i in $(ls -1 /etc/rc 2>/dev/null | sort); do . "$i"; done [ -z "$CONSOLE" ] && CONSOLE="$(</sys/class/tty/console/active)" [ -z "$HANDOFF" ] && HANDOFF=/bin/sh && echo Type exit when done. @@ -130,9 +135,12 @@ LDFLAGS=--static PREFIX="$ROOT" make clean \ # Build any packages listed on command line for i in $PKG; do - announce "$i"; PATH="$PKGDIR:$PATH" source $i || die $i + announce "$i" + ( PATH="${PKGDIR:=$PWD/scripts/root}:$PATH" source $i ) || die $i done +# ----- Build kernel for target + if [ -z "$LINUX" ] || [ ! -d "$LINUX/kernel" ]; then echo 'No $LINUX directory, kernel build skipped.' else @@ -208,7 +216,7 @@ CONFIG_CMDLINE="console=ttyUL0 earlycon"' BUILTIN=1 fi # Write the qemu launch script - if [ ! -z "$QEMU" ]; then + if [ -n "$QEMU" ]; then [ -z "$BUILTIN" ] && INITRD="-initrd ${CROSS}root.cpio.gz" echo qemu-system-"$QEMU" '"$@"' $QEMU_MORE -nographic -no-reboot -m 256 \ -kernel $(basename $VMLINUX) $INITRD \ @@ -235,7 +243,7 @@ CONFIG_CMDLINE="console=ttyUL0 earlycon"' BUILTIN=1 sed -E '/^$/d;s/([^,]*)($|,)/CONFIG_\1=y\n/g' <<< "$i" X=specific done - [ ! -z "$BUILTIN" ] && echo -e CONFIG_INITRAMFS_SOURCE="\"$OUTPUT/fs\"" + [ -n "$BUILTIN" ] && echo -e CONFIG_INITRAMFS_SOURCE="\"$OUTPUT/fs\"" echo "$KERNEL_CONFIG" } > "$OUTPUT/miniconfig-$TARGET" && make ARCH=$KARCH allnoconfig KCONFIG_ALLCONFIG="$OUTPUT/miniconfig-$TARGET" && @@ -250,12 +258,12 @@ CONFIG_CMDLINE="console=ttyUL0 earlycon"' BUILTIN=1 # Build kernel. Copy config, device tree binary, and kernel binary to output make ARCH=$KARCH CROSS_COMPILE="$CROSS_COMPILE" -j $(nproc) && cp .config "$OUTPUT/linux-fullconfig" || exit 1 - [ ! -z "$DTB" ] && { cp "$DTB" "$OUTPUT" || exit 1 ;} + [ -n "$DTB" ] && { cp "$DTB" "$OUTPUT" || exit 1 ;} cp "$VMLINUX" "$OUTPUT" && cd .. && rm -rf linux && popd || exit 1 fi # clean up and package root filesystem for initramfs. [ -z "$BUILTIN" ] && announce "${CROSS}root.cpio.gz" && (cd "$ROOT" && find . | cpio -o -H newc ${CROSS_COMPILE:+--no-preserve-owner} | gzip) \ - > "$OUTPUT/$CROSS"root.cpio.gz + > "$OUTPUT/$CROSS"root.cpio.gz || exit 1 rmdir "$MYBUILD" "$BUILD" 2>/dev/null || exit 0 # remove if empty, not an error |