changeset 783:db06a8c1bfed

Lots of changes to move buildall.sh functionality into build.sh. Upgrade build.sh to be able to create static cross compilers and static native compilers via canadian cross. Teach build stages to use $STAGE_NAME for their output directory (and tarballs, and === notifications). Remove LFS style /tools support (since host-tools.sh performs an equivalent cleaning step and it's a pain to maintain it), add ROOT_NODIRS instead.
author Rob Landley <rob@landley.net>
date Sun, 05 Jul 2009 17:50:44 -0500
parents 5c6ebb711b72
children 037488e9889d
files config cross-compiler.sh host-tools.sh root-filesystem.sh sources/functions.sh sources/native/sbin/init.sh system-image.sh
diffstat 7 files changed, 110 insertions(+), 108 deletions(-) [+]
line wrap: on
line diff
--- a/config	Sun Jul 05 17:30:01 2009 -0500
+++ b/config	Sun Jul 05 17:50:44 2009 -0500
@@ -17,20 +17,32 @@
 # export NATIVE_TOOLCHAIN=headers
 # export NATIVE_TOOLCHAIN=only
 
-# If this is set, root-filesystem will build a Linux From Scratch style /tools
-# directory instead of a more conventional filesystem layout in /usr.
+# If this is set, root-filesystem.sh won't bother to create the normal
+# directory hierarchy of /usr, /tmp, /etc, and so on.
 
-# export NATIVE_TOOLSDIR=1
+# export ROOT_NODIRS=1
 
 # If this is set, the build records the command lines run by each build into
 # log files in the build directory, ala "build/cmdlines.$PACKAGENAME"
 
 # export RECORD_COMMANDS=1
 
-# If this is set, the compiler is built with --static.
+# If this is set, packages are statically linked.
 
 # export BUILD_STATIC=1
 
+# If this is set, build.sh will build a compiler statically linked
+# against uClibc.  This indicates which host that compiler should run on.
+# Note that most x86_64 systems can run a statically linked i686 binary even
+# if they don't have the 32-bit libraries installed.
+
+# export STATIC_CROSS_COMPILER_HOST=i686
+
+# If this is set, build a standalone statically linked native compiler, to
+# use an a target system that doesn't have development tools.
+
+# export BUILD_STATIC_NATIVE_COMPILER=1
+
 # This may be set by the target's "details" file, but you can override it here.
 # You can set it to ext2, initramfs, or squashfs.  It defaults to squashfs
 # if blank.
--- a/cross-compiler.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/cross-compiler.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -10,14 +10,14 @@
 
 # If this target has a base architecture that's already been built, use that.
 
-check_for_base_arch cross-compiler || exit 0
+check_for_base_arch || exit 0
 
 # Ok, we have work to do.  Announce start of stage.
 
 echo -e "$CROSS_COLOR"
-echo "=== Building cross compiler"
+echo "=== Building $STAGE_NAME"
 
-CROSS="${BUILD}/cross-compiler-${ARCH}"
+CROSS="${BUILD}/${STAGE_NAME}-${ARCH}"
 blank_tempdir "$CROSS"
 blank_tempdir "$WORK"
 
@@ -136,9 +136,9 @@
 
 # Tar it up
 
-create_stage_tarball cross-compiler
+create_stage_tarball
 
-# A quick hello world program to test the cross-compiler out.
+# A quick hello world program to test the cross compiler out.
 # Build hello.c dynamic, then static, to verify header/library paths.
 
 echo "Sanity test: building Hello World."
--- a/host-tools.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/host-tools.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -5,7 +5,7 @@
 source sources/include.sh || exit 1
 
 echo -e "$HOST_COLOR"
-echo "=== Building host tools"
+echo "=== Building $STAGE_NAME"
 
 export LC_ALL=C
 
--- a/root-filesystem.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/root-filesystem.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -10,7 +10,7 @@
 
 # If this target has a base architecture that's already been built, use that.
 
-check_for_base_arch root-filesystem || exit 0
+check_for_base_arch || exit 0
 
 # Die if our prerequisite isn't there.
 
@@ -26,38 +26,34 @@
 # Announce start of stage.
 
 echo -e "$NATIVE_COLOR"
-echo "=== Building minimal native development environment"
+echo "=== Building $STAGE_NAME"
 
 blank_tempdir "$WORK"
-blank_tempdir "$NATIVE_ROOT"
+blank_tempdir "$STAGE_DIR"
 
 # Determine which directory layout we're using
 
-if [ ! -z "${NATIVE_TOOLSDIR}" ]
+if [ -z "$ROOT_NODIRS" ]
 then
-  mkdir -p "${TOOLS}/bin" || dienow
-
-  # Tell the wrapper script where to find the dynamic linker.
-  export UCLIBC_DYNAMIC_LINKER=/tools/lib/ld-uClibc.so.0
-  UCLIBC_TOPDIR="${NATIVE_ROOT}"
-  UCLIBC_DLPREFIX="/tools"
-else
-  mkdir -p "${NATIVE_ROOT}"/{tmp,proc,sys,dev,home} || dienow
-  UCLIBC_TOPDIR="${TOOLS}"
+  ROOT_TOPDIR="$STAGE_DIR/usr"
+  mkdir -p "$STAGE_DIR"/{tmp,proc,sys,dev,home} || dienow
   for i in bin sbin lib etc
   do
-    mkdir -p "$TOOLS/$i" || dienow
-    ln -s "usr/$i" "${NATIVE_ROOT}/$i" || dienow
+    mkdir -p "$ROOT_TOPDIR/$i" || dienow
+    ln -s "usr/$i" "$STAGE_DIR/$i" || dienow
   done
+else
+  ROOT_TOPDIR="$STAGE_DIR"
+  mkdir -p "$STAGE_DIR/bin" || dienow
 fi
 
 # Install Linux kernel headers.
 
 setupfor linux
 # Install Linux kernel headers (for use by uClibc).
-make headers_install -j "$CPUS" ARCH="${KARCH}" INSTALL_HDR_PATH="${TOOLS}" &&
+make headers_install -j "$CPUS" ARCH="${KARCH}" INSTALL_HDR_PATH="$ROOT_TOPDIR" &&
 # This makes some very old package builds happy.
-ln -s ../sys/user.h "${TOOLS}/include/asm/page.h" &&
+ln -s ../sys/user.h "$ROOT_TOPDIR/include/asm/page.h" &&
 cd ..
 
 cleanup linux
@@ -73,9 +69,9 @@
 # -j > 1, it dies.  Not SMP safe.
 for i in install install_utils
 do
-  make CROSS="${ARCH}-" KERNEL_HEADERS="${TOOLS}/include" \
-       PREFIX="${UCLIBC_TOPDIR}/" $VERBOSITY \
-       RUNTIME_PREFIX="$UCLIBC_DLPREFIX/" DEVEL_PREFIX="$UCLIBC_DLPREFIX/" \
+  make CROSS="${ARCH}-" KERNEL_HEADERS="$ROOT_TOPDIR/include" \
+       PREFIX="$ROOT_TOPDIR/" $VERBOSITY \
+       RUNTIME_PREFIX="/" DEVEL_PREFIX="/" \
        UCLIBC_LDSO_NAME=ld-uClibc -j $CPUS $i || dienow
 done
 
@@ -85,7 +81,7 @@
 then
   for i in ldd readelf
   do
-    mv "${TOOLS}"/bin/{"$i","${PROGRAM_PREFIX}$i"} || dienow
+    mv "$ROOT_TOPDIR"/bin/{"$i","${PROGRAM_PREFIX}$i"} || dienow
   done
 fi
 
@@ -98,9 +94,9 @@
     # If we're not installing a compiler, delete the headers, static libs,
 	# and example source code.
 
-    rm -rf "${TOOLS}"/include &&
-    rm -rf "${TOOLS}"/lib/*.a &&
-    rm -rf "${TOOLS}/src" || dienow
+    rm -rf "$ROOT_TOPDIR"/include &&
+    rm -rf "$ROOT_TOPDIR"/lib/*.a &&
+    rm -rf "$ROOT_TOPDIR/src" || dienow
 
 elif [ "$NATIVE_TOOLCHAIN" == "headers" ]
 then
@@ -114,7 +110,7 @@
 # Build and install native binutils
 
 setupfor binutils build-binutils
-CC="${FROM_ARCH}-cc" AR="${FROM_ARCH}-ar" "${CURSRC}/configure" --prefix="${TOOLS}" \
+CC="${FROM_ARCH}-cc" AR="${FROM_ARCH}-ar" "${CURSRC}/configure" --prefix="$ROOT_TOPDIR" \
   --build="${CROSS_HOST}" --host="${FROM_HOST}" --target="${CROSS_TARGET}" \
   --disable-nls --disable-shared --disable-multilib --disable-werror \
   --program-prefix="$PROGRAM_PREFIX" $BINUTILS_FLAGS &&
@@ -122,8 +118,8 @@
 make -j $CPUS CFLAGS="-O2 $STATIC_FLAGS" &&
 make -j $CPUS install &&
 cd .. &&
-mkdir -p "${TOOLS}/include" &&
-cp binutils/include/libiberty.h "${TOOLS}/include"
+mkdir -p "$ROOT_TOPDIR/include" &&
+cp binutils/include/libiberty.h "$ROOT_TOPDIR/include"
 
 cleanup binutils build-binutils
 
@@ -148,7 +144,7 @@
   ac_cv_path_NM_FOR_TARGET="${ARCH}-nm" \
   ac_cv_path_AS_FOR_TARGET="${ARCH}-as" \
   ac_cv_path_LD_FOR_TARGET="${ARCH}-ld" \
-  "${CURSRC}/configure" --prefix="${TOOLS}" --disable-multilib \
+  "${CURSRC}/configure" --prefix="$ROOT_TOPDIR" --disable-multilib \
   --build="${CROSS_HOST}" --host="${CROSS_TARGET}" --target="${CROSS_TARGET}" \
   --enable-long-long --enable-c99 --enable-shared --enable-threads=posix \
   --enable-__cxa_atexit --disable-nls --enable-languages=c,c++ \
@@ -159,49 +155,49 @@
 make -j $CPUS configure-host &&
 make -j $CPUS all-gcc LDFLAGS="$STATIC_FLAGS" &&
 # Work around gcc bug; we disabled multilib but it doesn't always notice.
-ln -s lib "$TOOLS/lib64" &&
+ln -s lib "$ROOT_TOPDIR/lib64" &&
 make -j $CPUS install-gcc &&
-rm "$TOOLS/lib64" &&
-ln -s "${PROGRAM_PREFIX}gcc" "${TOOLS}/bin/${PROGRAM_PREFIX}cc" &&
+rm "$ROOT_TOPDIR/lib64" &&
+ln -s "${PROGRAM_PREFIX}gcc" "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}cc" &&
 # Now we need to beat libsupc++ out of gcc (which uClibc++ needs to build).
 # But don't want to build the whole of libstdc++-v3 because
 # A) we're using uClibc++ instead,  B) the build breaks.
 make -j $CPUS configure-target-libstdc++-v3 &&
 cd "$CROSS_TARGET"/libstdc++-v3/libsupc++ &&
 make -j $CPUS &&
-mv .libs/libsupc++.a "$TOOLS"/lib &&
+mv .libs/libsupc++.a "$ROOT_TOPDIR"/lib &&
 cd ../../../..
 
 cleanup gcc-core build-gcc
 
 # Move the gcc internal libraries and headers somewhere sane
 
-mkdir -p "${TOOLS}"/gcc &&
-mv "${TOOLS}"/lib/gcc/*/*/include "${TOOLS}"/gcc/include &&
-mv "${TOOLS}"/lib/gcc/*/* "${TOOLS}"/gcc/lib &&
+mkdir -p "$ROOT_TOPDIR"/gcc &&
+mv "$ROOT_TOPDIR"/lib/gcc/*/*/include "$ROOT_TOPDIR"/gcc/include &&
+mv "$ROOT_TOPDIR"/lib/gcc/*/* "$ROOT_TOPDIR"/gcc/lib &&
 
 # Rub gcc's nose in the binutils output.
-cd "${TOOLS}"/libexec/gcc/*/*/ &&
+cd "$ROOT_TOPDIR"/libexec/gcc/*/*/ &&
 cp -s "../../../../$CROSS_TARGET/bin/"* . &&
 
 # build and install gcc wrapper script.
-mv "${TOOLS}/bin/${PROGRAM_PREFIX}gcc" "${TOOLS}/bin/${PROGRAM_PREFIX}rawgcc" &&
+mv "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}gcc" "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}rawgcc" &&
 "${FROM_ARCH}-cc" "${SOURCES}"/toys/ccwrap.c -Os -s \
-  -o "${TOOLS}/bin/${PROGRAM_PREFIX}gcc" -DGIMME_AN_S $STATIC_FLAGS \
+  -o "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}gcc" -DGIMME_AN_S $STATIC_FLAGS \
   -DGCC_UNWRAPPED_NAME='"'"${PROGRAM_PREFIX}rawgcc"'"' &&
 
 # Wrap C++
-mv "${TOOLS}/bin/${PROGRAM_PREFIX}g++" "${TOOLS}/bin/${PROGRAM_PREFIX}rawg++" &&
-ln "${TOOLS}/bin/${PROGRAM_PREFIX}gcc" "${TOOLS}/bin/${PROGRAM_PREFIX}g++" &&
-rm "${TOOLS}/bin/${PROGRAM_PREFIX}c++" &&
-ln -s "${PROGRAM_PREFIX}g++" "${TOOLS}/bin/${PROGRAM_PREFIX}c++"
+mv "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}g++" "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}rawg++" &&
+ln "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}gcc" "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}g++" &&
+rm "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}c++" &&
+ln -s "${PROGRAM_PREFIX}g++" "$ROOT_TOPDIR/bin/${PROGRAM_PREFIX}c++"
 
-cleanup "${TOOLS}"/{lib/gcc,gcc/lib/install-tools,bin/${ARCH}-unknown-*}
+cleanup "$ROOT_TOPDIR"/{lib/gcc,gcc/lib/install-tools,bin/${ARCH}-unknown-*}
 
-# Tell future packages to link against the libraries in root-filesystem,
+# Tell future packages to link against the libraries in the new root filesystem,
 # rather than the ones in the cross compiler directory.
 
-export WRAPPER_TOPDIR="${TOOLS}"
+export WRAPPER_TOPDIR="$ROOT_TOPDIR"
 
 # Build and install uClibc++
 
@@ -211,14 +207,14 @@
 sed -r -i '/UCLIBCXX_RUNTIME_PREFIX=/s/".*"/""/' .config &&
 CROSS= make oldconfig &&
 CROSS="$ARCH"- make &&
-CROSS= make install PREFIX="${TOOLS}/c++" &&
+CROSS= make install PREFIX="$ROOT_TOPDIR/c++" &&
 
 # Move libraries somewhere useful.
 
-mv "${TOOLS}"/c++/lib/* "${TOOLS}"/lib &&
-rm -rf "${TOOLS}"/c++/{lib,bin} &&
-ln -s libuClibc++.so "${TOOLS}"/lib/libstdc++.so &&
-ln -s libuClibc++.a "${TOOLS}"/lib/libstdc++.a &&
+mv "$ROOT_TOPDIR"/c++/lib/* "$ROOT_TOPDIR"/lib &&
+rm -rf "$ROOT_TOPDIR"/c++/{lib,bin} &&
+ln -s libuClibc++.so "$ROOT_TOPDIR"/lib/libstdc++.so &&
+ln -s libuClibc++.a "$ROOT_TOPDIR"/lib/libstdc++.a &&
 cd ..
 
 cleanup uClibc++
@@ -230,14 +226,9 @@
 
 # Copy qemu setup script and so on.
 
-cp -r "${SOURCES}/native/." "${TOOLS}/" &&
-cp "$SRCDIR"/MANIFEST "${TOOLS}/src" &&
-cp "${WORK}/config-uClibc" "${TOOLS}/src/config-uClibc" || dienow
-
-if [ -z "${NATIVE_TOOLSDIR}" ]
-then
-  sed -i -e 's@/tools/@/usr/@g' "${TOOLS}/sbin/init.sh" || dienow
-fi
+cp -r "${SOURCES}/native/." "$ROOT_TOPDIR/" &&
+cp "$SRCDIR"/MANIFEST "$ROOT_TOPDIR/src" &&
+cp "${WORK}/config-uClibc" "$ROOT_TOPDIR/src/config-uClibc" || dienow
 
 # Build and install toybox
 
@@ -246,14 +237,14 @@
 if [ -z "$USE_TOYBOX" ]
 then
   CFLAGS="$CFLAGS $STATIC_FLAGS" make CROSS="${ARCH}-" &&
-  cp toybox "$TOOLS/bin" &&
-  ln -s toybox "$TOOLS/bin/patch" &&
-  ln -s toybox "$TOOLS/bin/oneit" &&
-  ln -s toybox "$TOOLS/bin/netcat" &&
+  cp toybox "$ROOT_TOPDIR/bin" &&
+  ln -s toybox "$ROOT_TOPDIR/bin/patch" &&
+  ln -s toybox "$ROOT_TOPDIR/bin/oneit" &&
+  ln -s toybox "$ROOT_TOPDIR/bin/netcat" &&
   cd ..
 else
   CFLAGS="$CFLAGS $STATIC_FLAGS" \
-    make install_flat PREFIX="${TOOLS}"/bin CROSS="${ARCH}-" &&
+    make install_flat PREFIX="$ROOT_TOPDIR"/bin CROSS="${ARCH}-" &&
   cd ..
 fi
 
@@ -263,18 +254,18 @@
 
 setupfor busybox
 make allyesconfig KCONFIG_ALLCONFIG="${SOURCES}/trimconfig-busybox" &&
-cp .config "${TOOLS}"/src/config-busybox &&
+cp .config "$ROOT_TOPDIR"/src/config-busybox &&
 LDFLAGS="$LDFLAGS $STATIC_FLAGS" \
   make -j $CPUS CROSS_COMPILE="${ARCH}-" $VERBOSITY &&
 make busybox.links &&
-cp busybox "${TOOLS}/bin"
+cp busybox "$ROOT_TOPDIR/bin"
 
 [ $? -ne 0 ] && dienow
 
 for i in $(sed 's@.*/@@' busybox.links)
 do
   # Allowed to fail.
-  ln -s busybox "${TOOLS}/bin/$i" 2>/dev/null
+  ln -s busybox "$ROOT_TOPDIR/bin/$i" 2>/dev/null
 done
 cd ..
 
@@ -283,7 +274,7 @@
 # Build and install make
 
 setupfor make
-CC="${ARCH}-cc" ./configure --prefix="${TOOLS}" --build="${CROSS_HOST}" \
+CC="${ARCH}-cc" ./configure --prefix="$ROOT_TOPDIR" --build="${CROSS_HOST}" \
   --host="${CROSS_TARGET}" &&
 make -j $CPUS &&
 make -j $CPUS install &&
@@ -295,7 +286,7 @@
 
 setupfor bash
 # Remove existing /bin/sh link (busybox) so the bash install doesn't get upset.
-#rm "$TOOLS"/bin/sh
+#rm "$ROOT_TOPDIR"/bin/sh
 # wire around some tests ./configure can't run when cross-compiling.
 cat > config.cache << EOF &&
 ac_cv_func_setvbuf_reversed=no
@@ -303,28 +294,28 @@
 bash_cv_have_mbstate_t=yes
 bash_cv_getenv_redef=no
 EOF
-CC="${ARCH}-cc" RANLIB="${ARCH}-ranlib" ./configure --prefix="${TOOLS}" \
+CC="${ARCH}-cc" RANLIB="${ARCH}-ranlib" ./configure --prefix="$ROOT_TOPDIR" \
   --build="${CROSS_HOST}" --host="${CROSS_TARGET}" --cache-file=config.cache \
   --without-bash-malloc --disable-readline &&
 # note: doesn't work with -j
 make &&
 make install &&
 # Make bash the default shell.
-ln -sf bash "${TOOLS}/bin/sh" &&
+ln -sf bash "$ROOT_TOPDIR/bin/sh" &&
 cd ..
 
 cleanup bash
 
 setupfor distcc
-CC="${ARCH}-cc" ./configure --host="${CROSS_TARGET}" --prefix="${TOOLS}" \
+CC="${ARCH}-cc" ./configure --host="${CROSS_TARGET}" --prefix="$ROOT_TOPDIR" \
   --with-included-popt --disable-Werror &&
 make -j $CPUS &&
 make -j $CPUS install &&
-mkdir -p "${TOOLS}/distcc" || dienow
+mkdir -p "$ROOT_TOPDIR/distcc" || dienow
 
 for i in gcc cc g++ c++
 do
-  ln -s ../bin/distcc "${TOOLS}/distcc/$i" || dienow
+  ln -s ../bin/distcc "$ROOT_TOPDIR/distcc/$i" || dienow
 done
 cd ..
 
@@ -333,8 +324,8 @@
 # Put statically and dynamically linked hello world programs on there for
 # test purposes.
 
-"${ARCH}-cc" "${SOURCES}/toys/hello.c" -Os -s -o "${TOOLS}/bin/hello-dynamic" &&
-"${ARCH}-cc" "${SOURCES}/toys/hello.c" -Os -s -static -o "${TOOLS}/bin/hello-static"
+"${ARCH}-cc" "${SOURCES}/toys/hello.c" -Os -s -o "$ROOT_TOPDIR/bin/hello-dynamic" &&
+"${ARCH}-cc" "${SOURCES}/toys/hello.c" -Os -s -static -o "$ROOT_TOPDIR/bin/hello-static"
 
 [ $? -ne 0 ] && dienow
 
@@ -342,14 +333,14 @@
 
 # Delete some unneeded files
 
-rm -rf "${TOOLS}"/{info,man,libexec/gcc/*/*/install-tools}
+rm -rf "$ROOT_TOPDIR"/{info,man,libexec/gcc/*/*/install-tools}
 
 # Clean up and package the result
 
-"${ARCH}-strip" "${TOOLS}"/{bin/*,sbin/*,libexec/gcc/*/*/*}
-"${ARCH}-strip" --strip-unneeded "${TOOLS}"/lib/*.so
+"${ARCH}-strip" "$ROOT_TOPDIR"/{bin/*,sbin/*,libexec/gcc/*/*/*}
+"${ARCH}-strip" --strip-unneeded "$ROOT_TOPDIR"/lib/*.so
 
-create_stage_tarball root-filesystem
+create_stage_tarball
 
 # Color back to normal
 echo -e "\e[0mBuild complete"
--- a/sources/functions.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/sources/functions.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -48,14 +48,12 @@
 
   # Setup directories and add the cross compiler to the start of the path.
 
-  [ -z "$NATIVE_ROOT" ] && export NATIVE_ROOT="${BUILD}/root-filesystem-$ARCH"
+  STAGE_DIR="$BUILD/${STAGE_NAME}-${ARCH}"
+
   export PATH="${BUILD}/cross-compiler-$ARCH/bin:$PATH"
   [ "$FROM_ARCH" != "$ARCH" ] &&
     PATH="${BUILD}/cross-compiler-${FROM_ARCH}/bin:$PATH"
 
-  [ ! -z "${NATIVE_TOOLSDIR}" ] && TOOLS="${NATIVE_ROOT}/tools" ||
-    TOOLS="${NATIVE_ROOT}/usr"
-
   return 0
 }
 
@@ -524,13 +522,13 @@
   # If we're building something with a base architecture, symlink to actual
   # target.
 
-  if [ "$ARCH" != "$ARCH_NAME" ] && [ -e "$BUILD/$1-$ARCH" ]
+  if [ "$ARCH" != "$ARCH_NAME" ] && [ -e "$BUILD/$STAGE_NAME-$ARCH" ]
   then
-    echo === Using existing $1-"$ARCH"
+    echo === Using existing $STAGE_NAME-"$ARCH"
 
-    link_arch_name $1-{"$ARCH","$ARCH_NAME"}
-    [ -e $1-"$ARCH".tar.bz2 ] &&
-      link_arch_name $1-{"$ARCH","$ARCH_NAME"}.tar.bz2
+    link_arch_name $STAGE_NAME-{"$ARCH","$ARCH_NAME"}
+    [ -e $STAGE_NAME-"$ARCH".tar.bz2 ] &&
+      link_arch_name $STAGE_NAME-{"$ARCH","$ARCH_NAME"}.tar.bz2
 
     return 1
   fi
@@ -541,16 +539,16 @@
   # Handle linking to base architecture if we just built a derivative target.
 
   cd "$BUILD" || dienow
-  link_arch_name $1-{$ARCH,$ARCH_NAME}
+  link_arch_name $STAGE_NAME-{$ARCH,$ARCH_NAME}
 
   if [ -z "$SKIP_STAGE_TARBALLS" ]
   then
-    echo -n creating "$1-${ARCH}".tar.bz2
+    echo -n creating "$STAGE_NAME-${ARCH}".tar.bz2
 
-    { tar cjvf "$1-${ARCH}".tar.bz2 "$1-${ARCH}" || dienow
+    { tar cjvf "$STAGE_NAME-${ARCH}".tar.bz2 "$STAGE_NAME-${ARCH}" || dienow
     } | dotprogress
 
-    link_arch_name $1-{$ARCH,$ARCH_NAME}.tar.bz2
+    link_arch_name $STAGE_NAME-{$ARCH,$ARCH_NAME}.tar.bz2
   fi
 }
 
--- a/sources/native/sbin/init.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/sources/native/sbin/init.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -1,4 +1,4 @@
-#!/tools/bin/sh
+#!/bin/sh
 
 # If you're doing a Linux From Scratch build, the /tools directory is
 # sufficient.  (Start by installing kernel headers and building a C library.)
--- a/system-image.sh	Sun Jul 05 17:30:01 2009 -0500
+++ b/system-image.sh	Sun Jul 05 17:50:44 2009 -0500
@@ -10,6 +10,7 @@
 
 # Do we have our prerequisites?
 
+[ -z "$NATIVE_ROOT" ] && NATIVE_ROOT="$BUILD/root-filesystem-$ARCH"
 if [ ! -d "$NATIVE_ROOT" ]
 then
   [ -z "$FAIL_QUIET" ] && echo No "$NATIVE_ROOT" >&2
@@ -44,8 +45,8 @@
 
 [ -z "$SYSIMAGE_TYPE" ] && SYSIMAGE_TYPE=squashfs
 
-TOOLSDIR=tools
-[ -z "$NATIVE_TOOLSDIR" ] && TOOLSDIR=usr
+USRDIR=""
+[ -z "$ROOT_NODIRS" ] && USRDIR=/usr
 
 # This next bit is a little complicated; we generate the root filesystem image
 # in the middle of building a kernel.  This is necessary to embed an
@@ -84,7 +85,7 @@
   (./my_gen_init_cpio <(
       "$SOURCES"/toys/gen_initramfs_list.sh "$NATIVE_ROOT"
       [ ! -e "$NATIVE_ROOT"/init ] &&
-        echo "slink /init /$TOOLSDIR/sbin/init.sh 755 0 0"
+        echo "slink /init $USRDIR/sbin/init.sh 755 0 0"
       [ ! -d "$NATIVE_ROOT"/dev ] && echo "dir /dev 755 0 0"
       echo "nod /dev/console 660 0 0 c 5 1"
     ) || dienow
@@ -176,11 +177,11 @@
   if [ "$SYSIMAGE_TYPE" != "initramfs" ]
   then
     HDA="-hda \"$1\" "
-    APPEND="root=/dev/$ROOT rw init=/$TOOLSDIR/sbin/init.sh "
+    APPEND="root=/dev/$ROOT rw init=$USRDIR/sbin/init.sh "
   fi
 
   echo "-nographic -no-reboot -kernel \"$2\" \$WITH_HDB ${HDA}" \
-    "-append \"${APPEND}panic=1 PATH=\$DISTCC_PATH_PREFIX/${TOOLSDIR}/bin" \
+    "-append \"${APPEND}panic=1 PATH=\$DISTCC_PATH_PREFIX${USRDIR}/bin" \
     "console=$CONSOLE \$KERNEL_EXTRA\" \$QEMU_EXTRA"
 }