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