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