blob: a39984ca2b304ade9dee49438fce7996b98170d5 [file] [log] [blame]
#!/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"