#!/bin/bash set -e set +h set -u BASEDIR=$(dirname $(readlink -f $0)) LFS="$(pwd)/tree" LFS="${LFS/\/\///}" tools="$LFS/tools" buildwhat="$1" export LC_ALL=C case "$(uname -m)" in *armv7*) export LFS_TGT=$(uname -m)-lfs-linux-gnueabi export TARGET_CFLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -O2" export PASS3_STRATUM="bootstrap-pass3-imx53" ;; *armv5*) export LFS_TGT=$(uname -m)-lfs-linux-gnueabi export TARGET_CFLAGS="-march=armv5 -O2" export PASS3_STRATUM="bootstrap-pass3-imx53" ;; *) export LFS_TGT=$(uname -m)-lfs-linux-gnu export TARGET_CFLAGS="-O2" export PASS3_STRATUM="bootstrap-pass3-x86_64-generic" ;; esac HOST_CAT=`which cat` HOST_CP=`which cp` HOST_MKDIR=`which mkdir` HOST_CHMOD=`which chmod` export CCACHE_DIR="/var/tmp/ccache" export PATH="$tools/lib/ccache:$tools/bin:$tools/sbin:/usr/lib/ccache:/usr/bin:/bin:/usr/sbin:/sbin" pass1_directories() { $HOST_MKDIR -p "$LFS" $HOST_MKDIR -p "$tools" $HOST_MKDIR -p "$tools/bin" $HOST_MKDIR -p "$tools/lib" [ -h "$tools/sbin" ] || ln -sf "bin" "$tools/sbin" [ -h "$tools/lib64" ] || ln -sf "lib" "$tools/lib64" [ -h "$tools/libexec" ] || ln -sf "lib" "$tools/libexec" [ -e "$LFS/proc" ] || $HOST_MKDIR -p "$LFS/proc" [ -e "$LFS/sys" ] || $HOST_MKDIR -p "$LFS/sys" [ -e "$LFS/tmp" ] || $HOST_MKDIR -p "$LFS/tmp" [ -e "$LFS/dev" ] || $HOST_MKDIR -p "$LFS/dev" [ -e "$LFS/dev/console" ] || \ mknod -m 600 "$LFS/dev/console" c 5 1 [ -e "$LFS/dev/null" ] || mknod -m 666 "$LFS/dev/null" c 1 3 [ -e "$LFS/dev/random" ] || mknod -m 644 "$LFS/dev/random" c 1 8 [ -e "$LFS/dev/urandom" ] || \ mknod -m 644 "$LFS/dev/urandom" c 1 9 } pass1_get_sources_with_morph() { cd $LFS/baserock/gits/morph $HOST_MKDIR -p $LFS/baserock/cache python ./morph --verbose update-gits \ baserock:baserock/morphs master bootstrap-pass1 \ --cachedir=$LFS/baserock/cache \ --log=$LFS/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --tarball-server="$GIT_TARBALLS" } pass1_build_with_morph() { cd $LFS/baserock/gits/morph $HOST_MKDIR -p $LFS/baserock/cache $HOST_MKDIR -p $LFS/tmp python ./morph --verbose build-morphology \ baserock:baserock/morphs master bootstrap-pass1 \ --no-git-update \ --no-distcc \ --no-ccache \ --bootstrap \ --cachedir=$LFS/baserock/cache \ --tempdir=$LFS/tmp \ --log=$LFS/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --prefix="$tools" \ --toolchain-target="$LFS_TGT" \ --target-cflags="$TARGET_CFLAGS" } pass1_dump_build_times() { echo "Dumping pass 1 build times" cd $LFS/baserock/gits/morph python ./dump-build-times $LFS/baserock/cache/artifacts } pass2_get_morph() { echo "Get morph" if [ ! -e "$LFS/baserock/gits" ] then $HOST_MKDIR -p "$LFS/baserock/gits" cp -al "$HOME/baserock/gits/morph" "$LFS/baserock/gits/morph" fi } pass2_prepare_for_chroot() { echo "Preparing $LFS for chroot" cd "$LFS" if [ ! -h "$LFS/$LFS" ] then $HOST_MKDIR -p "$LFS/$LFS" /bin/rmdir "$LFS/$LFS" /bin/ln -s / "$LFS/$LFS" fi if [ ! -d "$LFS/etc" ] then mkdir -p "$LFS/etc" chmod 777 "$LFS/etc" touch "$LFS/etc/ld.so.conf" chmod 666 "$LFS/etc/ld.so.conf" cat < "$LFS/etc/ld.so.conf" /lib64 /lib /usr/lib64 /usr/lib EOF fi # $HOST_MKDIR -p "$LFS/etc" [ -e "$LFS/etc/passwd" ] || \ echo 'root::0:0:root:/root:/bin/bash' > "$LFS/etc/passwd" [ -e "$LFS/etc/group" ] || echo 'root::0:' > "$LFS/etc/group" # [ -e "$LFS/etc/hostname" ] || echo 'baserock-boot' | # /usr/bin/tee "$LFS/etc/hostname" > /dev/null # Add symlinks for common locations of specific tools # These are needed for #! lines in scripts [ -e "$LFS/bin" ] || $HOST_MKDIR -p "$LFS/bin" [ -e "$LFS/bin/sh" ] || ln -sf ../tools/bin/bash "$LFS/bin/sh" [ -e "$LFS/bin/bash" ] || \ ln -sf ../tools/bin/bash "$LFS/bin/bash" [ -e "$LFS/bin/pwd" ] || ln -sf ../tools/bin/pwd "$LFS/bin/pwd" [ -e "$LFS/bin/echo" ] || \ ln -sf ../tools/bin/echo "$LFS/bin/echo" if [ ! -e "$LFS/usr/bin/perl" ]; then $HOST_MKDIR -p $LFS/usr/bin ln -sf ../../tools/bin/perl "$LFS/usr/bin/perl" fi } pass2_get_sources_with_morph_in_chroot() { echo "Getting sources with morph" cat < "$LFS/baserock/build.sh" #!/tools/bin/bash set -e set -x cd /baserock/gits/morph mkdir -p /baserock/cache export PATH="/usr/bin:/bin:$tools/bin:$tools/sbin" python ./morph --verbose update-gits \ baserock:baserock/morphs master bootstrap-pass2 \ --bootstrap \ --cachedir=/baserock/cache \ --log=/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --tarball-server="$GIT_TARBALLS" EOF $HOST_CHMOD +x "$LFS/baserock/build.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT <"$do_chroot" #!/bin/bash trap "umount $LFS/proc $LFS/sys || true" INT TERM EXIT set -e set -x if ! mount | grep "$LFS/proc" >/dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /tools/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin" \\ BOOTSTRAP_TOOLS="$LFS/tools" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/build.sh } pass2_build_with_morph_in_chroot() { echo "Building Baserock with morph" cat < "$LFS/baserock/build.sh" #!/tools/bin/bash set -e set -x cd /baserock/gits/morph mkdir -p /baserock/cache export PATH="/usr/bin:/bin:$tools/bin:$tools/sbin" export LD_LIBRARY_PATH="/usr/lib:/lib:/lib64:/tools/lib:/tools/lib64" python ./morph --verbose build-morphology \ baserock:baserock/morphs master bootstrap-pass2 \ --bootstrap \ --no-git-update \ --cachedir=/baserock/cache \ --log=/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --tarball-server="$GIT_TARBALLS" \ --target-cflags="$TARGET_CFLAGS" EOF $HOST_CHMOD +x "$LFS/baserock/build.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT <"$do_chroot" #!/bin/bash trap "umount $LFS/proc $LFS/sys || true" INT TERM EXIT set -e set -x if ! mount | grep "$LFS/proc" >/dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /tools/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin" \\ BOOTSTRAP_TOOLS="$LFS/tools" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/build.sh } pass2_dump_build_times() { echo "Dumping pass 2 build times" cat < "$LFS/baserock/dump-pass2-build-times.sh" #!/tools/bin/bash set -e set -x cd /baserock/gits/morph python ./dump-build-times /baserock/cache/artifacts EOF $HOST_CHMOD +x "$LFS/baserock/dump-pass2-build-times.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT <"$do_chroot" #!/bin/bash trap "umount $LFS/proc $LFS/sys || true" INT TERM EXIT set -e set -x if ! mount | grep "$LFS/proc" >/dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /tools/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin" \\ BOOTSTRAP_TOOLS="$LFS/tools" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/dump-pass2-build-times.sh } pass2a_cleanup_at_end() { echo "Remove unnecessary stuff at the end of pass2a" rm -f "$LFS/baserock/cache/gits/"*.bndl } pass2b_cleanup_at_end() { echo "Remove unnecessary stuff at the end of pass2b" rm -rf "$LFS/tools" } pass3_remove_tools() { echo "Removing $LFS/tools" rm -rf "$LFS/tools" } pass3_get_sources_with_morph_in_chroot() { echo "Getting sources with morph" cd "$LFS/baserock/gits/morph" cat < "$LFS/baserock/build.sh" #!/bin/bash set -e set -x cd /baserock/gits/morph python ./morph --verbose update-gits \ baserock:baserock/morphs master $PASS3_STRATUM \ --cachedir=/baserock/cache \ --log=/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --tarball-server="$GIT_TARBALLS" EOF $HOST_CHMOD +x "$LFS/baserock/build.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT <"$do_chroot" #!/bin/bash trap "umount $LFS/proc $LFS/sys || true" INT TERM EXIT set -e set -x if ! mount | grep "$LFS/proc" >/dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /usr/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/build.sh } pass3_build_with_morph_in_chroot() { echo "Building Baserock with morph" cat < "$LFS/baserock/build_pass3.sh" #!/bin/bash set -e set -x export PATH="/usr/bin:/bin:/usr/sbin:/sbin" cd /baserock/gits/morph filler=\$(mktemp) scripts/assemble-stratum --cachedir /baserock/cache \ "$LFS/baserock/cache/artifacts/"*.stratum.bootstrap-pass2 \ "\$filler" bootstrap-pass2 python ./morph --verbose build-morphology \ baserock:baserock/morphs master $PASS3_STRATUM \ --staging-chroot \ --staging-filler "\$filler" \ --no-git-update \ --cachedir=/baserock/cache \ --log=/baserock/morph.log \ --dump-memory-profile=none \ --keep-path \ --tarball-server="$GIT_TARBALLS" \ --target-cflags="$TARGET_CFLAGS" rm "\$filler" EOF $HOST_CHMOD +x "$LFS/baserock/build_pass3.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT >"$do_chroot" </dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /usr/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/build_pass3.sh } pass3_dump_build_times() { echo "Dumping pass 3 build times" cat < "$LFS/baserock/dump-pass3-build-times.sh" #!/bin/bash set -e set -x export PATH="/usr/bin:/bin" cd /baserock/gits/morph python ./dump-build-times /baserock/cache/artifacts EOF $HOST_CHMOD +x "$LFS/baserock/dump-pass3-build-times.sh" local do_chroot="$BASEDIR/do-chroot.bash" $HOST_CAT >"$do_chroot" </dev/null then mount -t proc proc "$LFS/proc" fi if ! mount | grep "$LFS/sys" >/dev/null then mount -t sysfs sysfs "$LFS/sys" fi $HOST_CP -f /etc/resolv.conf "$LFS/etc/resolv.conf" /usr/sbin/chroot "$LFS" \\ /usr/bin/env -i HOME=/baserock TERM=\$TERM \\ PATH="/bin:/usr/bin:/sbin:/usr/sbin" \\ "\${@-\$SHELL}" EOF $HOST_CHMOD +x "$do_chroot" "$do_chroot" /baserock/dump-pass3-build-times.sh } echo "Bootstrapping Baserock development environment" echo "LFS_TGT=$LFS_TGT" time pass1_directories case "$buildwhat" in pass1a) time pass1_get_sources_with_morph ;; pass1b) time pass1_build_with_morph time pass1_dump_build_times ;; pass2a) time pass2_get_morph time pass2_prepare_for_chroot time pass2_get_sources_with_morph_in_chroot time pass2a_cleanup_at_end ;; pass2b) time pass2_build_with_morph_in_chroot time pass2_dump_build_times time pass2b_cleanup_at_end ;; pass3a) time pass3_remove_tools time pass3_get_sources_with_morph_in_chroot ;; pass3b) time pass3_build_with_morph_in_chroot time pass3_dump_build_times ;; *) echo "Usage! (sorry, I'm unhelpful)" 1>&2 exit 1 ;; esac echo "$buildwhat finished OK"