# HG changeset patch # User Rob Landley # Date 1448225656 21600 # Node ID 92d542aa6cebcaaab1892376de1f0fe14a54fec0 # Parent fb05f99ffccecc7533e3bcfbbcd2a36d475598a7 Teach system-image.sh to handle its own dependencies, rebuilding kernel and repackaging cpio/squashfs as appropraite, and _not_ doing so when unneeded. diff -r fb05f99ffcce -r 92d542aa6ceb build.sh --- a/build.sh Sat Nov 21 16:44:39 2015 -0600 +++ b/build.sh Sun Nov 22 14:54:16 2015 -0600 @@ -81,6 +81,7 @@ done } +# If $AFTER set, skip stages until we match $AFTER to implement $2="start here" do_stage() { STAGE="$1" @@ -95,10 +96,12 @@ } # The first two stages (download.sh and host-tools.sh) are architecture -# independent. In order to allow multiple builds in parallel, re-running +# independent. In order to allow multiple builds in parallel, re-running # them after they've already completed must be a safe NOP. -# Download source code. +# Download source code. If tarballs already there, verify sha1sums and +# delete/redownload if they don't match (to handle interrupted partial +# download). do_stage download @@ -116,7 +119,7 @@ then # If we need to build cross compiler, assume root filesystem is stale. - zap root-filesystem cross-compiler native-compiler system-image + zap root-filesystem cross-compiler native-compiler do_stage simple-cross-compiler "$ARCH" fi @@ -128,7 +131,7 @@ if [ -z "$MY_CROSS_PATH" ] && [ ! -z "$CROSS_COMPILER_HOST" ] && not_already cross-compiler then - zap root-filesystem native-compiler system-image + zap root-filesystem native-compiler # Build the host compiler if necessary @@ -149,9 +152,6 @@ if not_already root-filesystem then - zap system-image - [ "$SYSIMAGE_TYPE" == rootfs ] && zap system-image - do_stage root-filesystem "$ARCH" fi @@ -163,14 +163,10 @@ if [ -z "$MY_CROSS_PATH" ] && ! grep -q ELF2FLT sources/targets/"$ARCH" && not_already native-compiler then - zap system-image - do_stage native-compiler "$ARCH" fi -# Package it all up into something qemu can boot. +# Package it all up into something qemu can boot. Like host-tools.sh, +# this is always called and handles its own dependencies internally. -if not_already system-image -then - do_stage system-image "$ARCH" -fi +do_stage system-image "$ARCH" diff -r fb05f99ffcce -r 92d542aa6ceb sources/functions.sh --- a/sources/functions.sh Sat Nov 21 16:44:39 2015 -0600 +++ b/sources/functions.sh Sun Nov 22 14:54:16 2015 -0600 @@ -73,7 +73,7 @@ STAGE_DIR="$BUILD/${STAGE_NAME}-${ARCH_NAME}" - blank_tempdir "$STAGE_DIR" + [ -z "$KEEP_STAGEDIR" ] && blank_tempdir "$STAGE_DIR" NO_CLEANUP=${NO_CLEANUP/temp//} blank_tempdir "$WORK" export PATH="$(cc_path "$ARCH")$PATH" diff -r fb05f99ffcce -r 92d542aa6ceb system-image.sh --- a/system-image.sh Sat Nov 21 16:44:39 2015 -0600 +++ b/system-image.sh Sun Nov 22 14:54:16 2015 -0600 @@ -1,14 +1,31 @@ #!/bin/bash -# Combine a filesystem image and kernel with emulator launch scripts. - -# Package a root filesystem directory into a filesystem image file +# Combine filesystem images, kernel, and emulator launch scripts +# into something you can boot and run. source sources/include.sh || exit 1 -# Parse sources/targets/$1 +# We do our own dependency checking (like host-tool.sh) so don't delete stage +# dir when parsing sources/targets/$1 + +KEEP_STAGEDIR=1 load_target "$1" + +# Is $1 newer than cross compiler and all listed prerequisites ($2...)? -load_target "$1" +is_newer() +{ + X="$1" + shift + [ ! -e "$X" ] && return 0 + [ "$(which "${CC_PREFIX}cc")" -nt "$X" ] && return 0 + while [ ! -z "$1" ] + do + [ ! -z "$(find "$X" -newer "$X" 2>/dev/null)" ] && return 0 + shift + done + + return 1 +} # Provide qemu's common command line options between architectures. @@ -65,17 +82,27 @@ # Package root-filesystem into cpio file for initramfs -SYSIMAGE_TYPE=cpio image_filesystem "$BUILD/root-filesystem-$ARCH" \ - "$STAGE_DIR/rootfs" && -if [ -d "$BUILD/native-compiler-$ARCH" ] +if is_newer "$STAGE_DIR/rootfs.cpio.gz" "$BUILD/root-filesystem-$ARCH" +then + SYSIMAGE_TYPE=cpio image_filesystem "$BUILD/root-filesystem-$ARCH" \ + "$STAGE_DIR/temp" && + mv -f "$STAGE_DIR"/{temp,rootfs}.cpio.gz || dienow + [ "$SYSIMAGE_TYPE" == rootfs ] && rm -f "$STAGE_DIR/linux" +fi + +# Package native-compiler into squashfs for /dev/hda mount + +if is_newer "$STAGE_DIR/toolchain.sqf" "$BUILD/native-compiler-$ARCH" then SYSIMAGE_TYPE=squashfs image_filesystem "$BUILD/native-compiler-$ARCH" \ - "$STAGE_DIR/toolchain" || dienow + "$STAGE_DIR/temp" && + mv -f "$STAGE_DIR"/{temp,toolchain}.sqf || dienow fi # Build linux kernel for the target -if [ -z "$NO_CLEANUP" ] || [ ! -e "$STAGE_DIR/linux" ] +if is_newer "$STAGE_DIR/linux" "$BUILD/root-filesystem-$ARCH" \ + $(package_cache linux) then setupfor linux getconfig linux > mini.conf @@ -88,6 +115,7 @@ cp "$KERNEL_PATH" "$STAGE_DIR/linux" cleanup fi + # Tar it up. ARCH="$ARCH_NAME" create_stage_tarball