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