Home | History | Annotate | Download | only in binutils
      1 #!/bin/sh
      2 # Copyright 2014 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 # Script to build binutils for both i386 and AMD64 Linux architectures.
      7 # Must be run on an AMD64 supporting machine which has debootstrap and sudo
      8 # installed.
      9 # Uses Ubuntu Lucid chroots as build environment.
     10 
     11 set -e
     12 
     13 if [ x"$(whoami)" = x"root" ]; then
     14   echo "Script must not be run as root."
     15   exit 1
     16 fi
     17 sudo -v
     18 
     19 OUTPUTDIR="${1:-$PWD/output-$(date +%Y%m%d-%H%M%S)}"
     20 if [ ! -d "$OUTPUTDIR" ]; then
     21   mkdir -p "$OUTPUTDIR"
     22 fi
     23 
     24 # Download the source
     25 VERSION=2.24
     26 wget -c http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2
     27 
     28 # Verify the signature
     29 wget -c -q http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2.sig
     30 if ! gpg --verify binutils-$VERSION.tar.bz2.sig; then
     31   echo "GPG Signature failed to verify."
     32   echo ""
     33   echo "You may need to import the vendor GPG key with:"
     34   echo "# gpg --keyserver pgp.mit.edu --recv-key 4AE55E93"
     35   exit 1
     36 fi
     37 
     38 
     39 if [ ! -d binutils-$VERSION ]; then
     40   # Extract the source
     41   tar jxf binutils-$VERSION.tar.bz2
     42 
     43   # Patch the source
     44   (
     45     cd binutils-$VERSION
     46     patch -p1 < ../ehframe-race.patch
     47   )
     48 fi
     49 
     50 for ARCH in i386 amd64; do
     51   if [ ! -d lucid-chroot-$ARCH ]; then
     52     # Refresh sudo credentials
     53     sudo -v
     54 
     55     # Create the chroot
     56     echo ""
     57     echo "Building chroot for $ARCH"
     58     echo "============================="
     59     sudo debootstrap \
     60         --arch=$ARCH \
     61         --include=build-essential,flex,bison \
     62         lucid lucid-chroot-$ARCH
     63     echo "============================="
     64   fi
     65 
     66   BUILDDIR=lucid-chroot-$ARCH/build
     67 
     68   # Clean up any previous failed build attempts inside chroot
     69   if [ -d "$BUILDDIR" ]; then
     70     sudo rm -rf "$BUILDDIR"
     71   fi
     72 
     73   # Copy data into the chroot
     74   sudo mkdir -p "$BUILDDIR"
     75   sudo cp -a binutils-$VERSION "$BUILDDIR"
     76   sudo cp -a build-one.sh "$BUILDDIR"
     77 
     78   # Do the build
     79   PREFIX=
     80   case $ARCH in
     81    i386)
     82      PREFIX="setarch linux32"
     83      ARCHNAME=i686-pc-linux-gnu
     84    ;;
     85    amd64)
     86      PREFIX="setarch linux64"
     87      ARCHNAME=x86_64-unknown-linux-gnu
     88    ;;
     89   esac
     90   echo ""
     91   echo "Building binutils for $ARCH"
     92   LOGFILE="$OUTPUTDIR/build-$ARCH.log"
     93   if ! sudo $PREFIX chroot lucid-chroot-$ARCH /build/build-one.sh /build/binutils-$VERSION > $LOGFILE 2>&1; then
     94     echo "Build failed! See $LOGFILE for details."
     95     exit 1
     96   fi
     97 
     98   # Copy data out of the chroot
     99   sudo chown -R $(whoami) "$BUILDDIR/output/"
    100 
    101   # Strip the output binaries
    102   for i in "$BUILDDIR/output/$ARCHNAME/bin/*"; do
    103      strip $i
    104   done
    105 
    106   # Copy them out of the chroot
    107   cp -a "$BUILDDIR/output/$ARCHNAME" "$OUTPUTDIR"
    108 
    109   # Clean up chroot
    110   sudo rm -rf "$BUILDDIR"
    111 done
    112 
    113 echo "Check you are happy with the binaries in"
    114 echo "  $OUTPUTDIR"
    115 echo "Then"
    116 echo " * upload to Google Storage using the upload.sh script"
    117 echo " * roll dependencies"
    118