| #!/bin/sh |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| # Script to build binutils for both i386 and AMD64 Linux architectures. |
| # Must be run on an AMD64 supporting machine which has debootstrap and sudo |
| # installed. |
| # Uses Ubuntu Lucid chroots as build environment. |
| |
| set -e |
| |
| if [ x"$(whoami)" = x"root" ]; then |
| echo "Script must not be run as root." |
| exit 1 |
| fi |
| sudo -v |
| |
| OUTPUTDIR="${1:-$PWD/output-$(date +%Y%m%d-%H%M%S)}" |
| if [ ! -d "$OUTPUTDIR" ]; then |
| mkdir -p "$OUTPUTDIR" |
| fi |
| |
| # Download the source |
| VERSION=2.24 |
| wget -c http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2 |
| |
| # Verify the signature |
| wget -c -q http://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.bz2.sig |
| if ! gpg --verify binutils-$VERSION.tar.bz2.sig; then |
| echo "GPG Signature failed to verify." |
| echo "" |
| echo "You may need to import the vendor GPG key with:" |
| echo "# gpg --keyserver pgp.mit.edu --recv-key 4AE55E93" |
| exit 1 |
| fi |
| |
| |
| if [ ! -d binutils-$VERSION ]; then |
| # Extract the source |
| tar jxf binutils-$VERSION.tar.bz2 |
| |
| # Patch the source |
| ( |
| cd binutils-$VERSION |
| patch -p1 < ../ehframe-race.patch |
| patch -p1 < ../unlock-thin.patch |
| patch -p1 < ../plugin-dso-fix.patch |
| ) |
| fi |
| |
| for ARCH in i386 amd64; do |
| if [ ! -d lucid-chroot-$ARCH ]; then |
| # Refresh sudo credentials |
| sudo -v |
| |
| # Create the chroot |
| echo "" |
| echo "Building chroot for $ARCH" |
| echo "=============================" |
| sudo debootstrap \ |
| --arch=$ARCH \ |
| --include=build-essential,flex,bison \ |
| lucid lucid-chroot-$ARCH |
| echo "=============================" |
| fi |
| |
| BUILDDIR=lucid-chroot-$ARCH/build |
| |
| # Clean up any previous failed build attempts inside chroot |
| if [ -d "$BUILDDIR" ]; then |
| sudo rm -rf "$BUILDDIR" |
| fi |
| |
| # Copy data into the chroot |
| sudo mkdir -p "$BUILDDIR" |
| sudo cp -a binutils-$VERSION "$BUILDDIR" |
| sudo cp -a build-one.sh "$BUILDDIR" |
| |
| # Do the build |
| PREFIX= |
| case $ARCH in |
| i386) |
| PREFIX="setarch linux32" |
| ARCHNAME=i686-pc-linux-gnu |
| ;; |
| amd64) |
| PREFIX="setarch linux64" |
| ARCHNAME=x86_64-unknown-linux-gnu |
| ;; |
| esac |
| echo "" |
| echo "Building binutils for $ARCH" |
| LOGFILE="$OUTPUTDIR/build-$ARCH.log" |
| if ! sudo $PREFIX chroot lucid-chroot-$ARCH /build/build-one.sh /build/binutils-$VERSION > $LOGFILE 2>&1; then |
| echo "Build failed! See $LOGFILE for details." |
| exit 1 |
| fi |
| |
| # Copy data out of the chroot |
| sudo chown -R $(whoami) "$BUILDDIR/output/" |
| |
| # Strip the output binaries |
| for i in "$BUILDDIR/output/$ARCHNAME/bin/*"; do |
| strip $i |
| done |
| |
| # Copy them out of the chroot |
| cp -a "$BUILDDIR/output/$ARCHNAME" "$OUTPUTDIR" |
| |
| # Copy plugin header out of the chroot |
| mkdir "$OUTPUTDIR/$ARCHNAME/include" |
| cp "$BUILDDIR/binutils-$VERSION/include/plugin-api.h" "$OUTPUTDIR/$ARCHNAME/include/" |
| |
| # Clean up chroot |
| sudo rm -rf "$BUILDDIR" |
| done |
| |
| echo "Check you are happy with the binaries in" |
| echo " $OUTPUTDIR" |
| echo "Then" |
| echo " * upload to Google Storage using the upload.sh script" |
| echo " * roll dependencies" |