view sources/build-all-targets.sh @ 493:5cce2f8b6ec9

Build all targets and actually build them static.
author Rob Landley <rob@landley.net>
date Fri, 21 Nov 2008 23:32:03 -0600
parents 1e52d09f49d6
children a32c75dcf508
line wrap: on
line source

#!/bin/bash

# Nightly snapshot build script.

# Wrapper can set:
# USE_UNSTABLE=busybox,toybox,uClibc
# USE_STATIC_HOST=i686

[ -z "$NICE" ] && NICE="nice -n 20"

source sources/functions.sh

# Parse command line arguments

FORKCOUNT=1
while [ ! -z "$1" ]
do
  if [ "$1" == "--fork" ]
  then
    shift
    FORKCOUNT="$(echo $1 | sed -n '/^[0-9]/{;s/[^0-9]//g;p;}')"
    [ ! -z "$FORKCOUNT" ] && shift || FORKCOUNT=0
  else
    echo "Unknown argument $1"
    dienow
  fi
done

# Define functions

function build_this_target()
{
  if [ ! -e build/cross-compiler-$1/bin/$1-gcc ]
  then
    $NICE ./cross-compiler.sh $1 &&
    ln build/cross-compiler-$1.tar.bz2 buildall || return 1
  fi

  $NICE ./mini-native.sh $1 &&
  ln build/mini-native-$1.tar.bz2 buildall || return 1

  $NICE ./package-mini-native.sh $1 &&
  ln build/system-image-$1.tar.bz2 buildall || return 1
}

function build_and_log()
{
  { build_this_target $ARCH 2>&1 || return 1
  } | tee >(bzip2 > buildall/logs/$1-$ARCH.txt.bz2)
}

# Iterate through architectures, either sequentially or in parallel.
# Run "$1 $ARCH", in parallel if necessary.

function for_each_arch()
{
  for ARCH in $(cd sources/targets; ls);
  do
    echo Launching $ARCH
    if [ "$FORKCOUNT" -eq 1 ]
    then
      "$@" "$ARCH" || dienow
    else
      ("$@" $ARCH 2>&1 </dev/null |
       grep "^==="; echo Completed $i ) &
      [ "$FORKCOUNT" -gt 0 ] && wait4background $[${FORKCOUNT}-1] "ssh "
    fi
  done

  wait4background 0
}

# Clean up old builds, fetch fresh packages.

rm -rf build/host
(hg pull -u; ./download.sh || dienow) &
rm -rf build buildall &
wait4background 0

mkdir -p buildall/logs || dienow

# Build host tools, extract packages (not asynchronous).

($NICE ./host-tools.sh && $NICE ./download.sh --extract || dienow) |
  tee >(bzip2 > buildall/logs/host-tools.txt.bz2)

# Create and upload readme (requires build/sources to be extracted)

do_readme | tee buildall/README.txt &

# If we need to create static cross compilers, build a version of mini-native
# to act as the host system.  (That way they're statically linked against
# uClibc, not whatever the host's library is.)

if [ ! -z "$USE_STATIC_HOST" ]
then
  ($NICE ./build.sh "$USE_STATIC_HOST" || dienow) |
    tee >(bzip2 > buildall/logs/static-host-$USE_STATIC_HOST.txt.bz2)

# Feed a script into qemu.  Pass data back and forth via netcat.
# This intentionally _doesn't_ use $NICE, so the distcc master node is higher
# priority than the distccd slave nodes.

./emulator-build.sh "$USE_STATIC_HOST" << EOF
          #
export USE_UNSTABLE=$USE_UNSTABLE
export CROSS_BUILD_STATIC=1
cd /home &&
netcat 10.0.2.2 $(build/host/netcat -s 127.0.0.1 -l hg archive -t tgz -) | tar xvz &&
cd firmware-* &&
netcat 10.0.2.2 $(build/host/netcat -s 127.0.0.1 -l tar c sources/packages) | tar xv &&
./download.sh --extract &&
mkdir -p build/logs || exit 1

for i in \$(cd sources/targets; ls)
do
  ./cross-compiler.sh \$i | tee build/logs/cross-static-\$i.txt
  bzip2 build/logs/cross-static-\$i.txt
done
cd build
tar c logs/* cross-compiler-*.tar.bz2 | netcat 10.0.2.2 \
  $(cd buildall; ../build/host/netcat -s 127.0.0.1 -l tar xv)
sync
exit
EOF

  # Extract the cross compilers

  for i in buildall/cross-compiler-*.tar.bz2
  do
    echo Extracting $i
    tar -xj -f $i -C build || dienow
  done
fi

# Build each architecture

for_each_arch build_and_log native