13dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen#!/bin/bash -e
23dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
33dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Copyright (c) 2011 The Chromium Authors. All rights reserved.
43dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Use of this source code is governed by a BSD-style license that can be
53dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# found in the LICENSE file.
63dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
73dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Script to install everything needed to build chromium (well, ideally, anyway)
83dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions
93dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit
103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenusage() {
123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Usage: $0 [--options]"
133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Options:"
143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "--[no-]syms: enable or disable installation of debugging symbols"
153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "--[no-]gold: enable or disable installation of gold linker"
163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "--[no-]lib32: enable or disable installation of 32 bit libraries"
173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Script will prompt interactively if options not given."
183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  exit 1
193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
203dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
213dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenwhile test "$1" != ""
223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendo
233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  case "$1" in
243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --syms)     do_inst_syms=1;;
253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --no-syms)  do_inst_syms=0;;
263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --gold)     do_inst_gold=1;;
273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --no-gold)  do_inst_gold=0;;
283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --lib32)    do_inst_lib32=1;;
293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  --no-lib32) do_inst_lib32=0;;
303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  *) usage;;
313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  esac
323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  shift
333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendone
343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monseninstall_gold() {
363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # Gold is optional; it's a faster replacement for ld,
373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # and makes life on 2GB machines much more pleasant.
383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # First make sure root can access this directory, as that's tripped
403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # up some folks.
413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if sudo touch xyz.$$
423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo rm xyz.$$
443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  else
453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo root cannot write to the current directory, not installing gold
463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    return
473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  BINUTILS=binutils-2.21
503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/$BINUTILS.tar.bz2
513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  BINUTILS_SHA1=ef93235588eb443e4c4a77f229a8d131bccaecc6
523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  test -f $BINUTILS.tar.bz2 || wget $BINUTILS_URL
543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if test "`sha1sum $BINUTILS.tar.bz2|cut -d' ' -f1`" != "$BINUTILS_SHA1"
553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo Bad sha1sum for $BINUTILS.tar.bz2
573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    exit 1
583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  tar -xjvf $BINUTILS.tar.bz2
613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  cd $BINUTILS
623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  patch -p1 <<EOF
633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendiff -u -r1.103 -r1.103.2.1
643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen--- src/gold/object.h	2010/09/08 23:54:51	1.103
653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen+++ src/gold/object.h	2011/02/10 01:15:28	1.103.2.1
663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen@@ -1,6 +1,6 @@
673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // object.h -- support for an object file for linking in gold  -*- C++ -*-
683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // Written by Ian Lance Taylor <iant@google.com>.
723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // This file is part of gold.
743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen@@ -2165,15 +2165,6 @@
753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 		      Output_symtab_xindex*,
763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 		      Output_symtab_xindex*);
773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  // Clear the local symbol information.
793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  void
803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  clear_local_symbols()
813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  {
823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-    this->local_values_.clear();
833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-    this->local_got_offsets_.clear();
843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-    this->local_plt_offsets_.clear();
853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  }
863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-
873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen   // Record a mapping from discarded section SHNDX to the corresponding
883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen   // kept section.
893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen   void
903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendiff -u -r1.60 -r1.60.2.1
913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen--- src/gold/reloc.cc	2010/10/14 22:10:22	1.60
923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen+++ src/gold/reloc.cc	2011/02/10 01:15:28	1.60.2.1
933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen@@ -1,6 +1,6 @@
943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // reloc.cc -- relocate input files for gold.
953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // Written by Ian Lance Taylor <iant@google.com>.
993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
1003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // This file is part of gold.
1013dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen@@ -685,9 +685,6 @@
1023dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen   // Write out the local symbols.
1033dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen   this->write_local_symbols(of, layout->sympool(), layout->dynpool(),
1043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 			    layout->symtab_xindex(), layout->dynsym_xindex());
1053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-
1063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  // We should no longer need the local symbol values.
1073dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen-  this->clear_local_symbols();
1083dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen }
1093dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen 
1103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen // Sort a Read_multiple vector by file offset.
1113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian MonsenEOF
1123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  ./configure --prefix=/usr/local/gold --enable-gold --enable-threads
1133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  make maybe-all-binutils maybe-all-gold -j4
1143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if sudo make maybe-install-binutils maybe-install-gold
1153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
1163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    # Still need to figure out graceful way of pointing gyp to use
1173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    # /usr/local/gold/bin/ld without requiring him to set environment
1183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    # variables.  That will go into bootstrap-linux.sh when it's ready.
1193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Installing gold as /usr/bin/ld."
1203dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "To uninstall, do 'cd /usr/bin; sudo rm ld; sudo mv ld.orig ld'"
1213dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    test -f /usr/bin/ld && test ! -f /usr/bin/ld.orig && \
1223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        sudo mv /usr/bin/ld /usr/bin/ld.orig
1233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo strip /usr/local/gold/bin/ld
1243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo ln -fs /usr/local/gold/bin/ld /usr/bin/ld.gold
1253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo ln -fs /usr/bin/ld.gold /usr/bin/ld
1263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  else
1273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "make install failed, not installing gold"
1283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
1293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
1303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif ! egrep -q \
1323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    'Ubuntu (8\.04|8\.10|9\.04|9\.10|10\.04|10\.10|karmic|lucid|maverick)' \
1333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    /etc/issue; then
1343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Only Ubuntu 8.04 (hardy) through 10.10 (maverick) are currently" \
1353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      "supported" >&2
1363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  exit 1
1373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
1383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif ! uname -m | egrep -q "i686|x86_64"; then
1403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Only x86 architectures are currently supported" >&2
1413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  exit
1423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
1433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif [ "x$(id -u)" != x0 ]; then
1453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Running as non-root user."
1463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "You might have to enter your password one or more times for 'sudo'."
1473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo
1483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
1493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Packages needed for chromeos only
1513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenchromeos_dev_list="libpulse-dev"
1523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Packages need for development
1543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendev_list="bison fakeroot flex g++ gperf libapache2-mod-php5 libasound2-dev
1553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libbz2-dev libcairo2-dev libdbus-glib-1-dev libgconf2-dev
1563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libgl1-mesa-dev libglu1-mesa-dev libglib2.0-dev libgnome-keyring-dev
1573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libgtk2.0-dev libjpeg62-dev libnspr4-dev libnss3-dev libpam0g-dev
1583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libsctp-dev libsqlite3-dev libxslt1-dev libxss-dev libxtst-dev
1593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          mesa-common-dev msttcorefonts patch perl php5-cgi pkg-config python
1603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          python-dev rpm subversion ttf-dejavu-core ttf-kochi-gothic
1613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          ttf-kochi-mincho wdiff libcurl4-gnutls-dev
1623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          $chromeos_dev_list"
1633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Run-time libraries required by chromeos only
1653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenchromeos_lib_list="libpulse0 libbz2-1.0 libcurl4-gnutls-dev"
1663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Full list of required run-time libraries
1683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenlib_list="libatk1.0-0 libc6 libasound2 libcairo2 libdbus-glib-1-2 libexpat1
1693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0 libgtk2.0-0
1703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libnspr4-0d libnss3-1d libpam0g libpango1.0-0 libpcre3 libpixman-1-0
1713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libpng12-0 libstdc++6 libsqlite3-0 libx11-6 libxau6 libxcb1
1723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3
1733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 zlib1g
1743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          $chromeos_lib_list"
1753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Debugging symbols for all of the run-time libraries
1773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsendbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg
1783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libfontconfig1-dbg libglib2.0-0-dbg libgtk2.0-0-dbg libnspr4-0d-dbg
1793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libnss3-1d-dbg libpango1.0-0-dbg libpcre3-dbg libpixman-1-0-dbg
1803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libx11-6-dbg libxau6-dbg libxcb1-dbg libxcomposite1-dbg
1813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libxcursor1-dbg libxdamage1-dbg libxdmcp6-dbg libxext6-dbg
1823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libxfixes3-dbg libxi6-dbg libxinerama1-dbg libxrandr2-dbg
1833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          libxrender1-dbg libxtst6-dbg zlib1g-dbg"
1843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# CUPS package changed its name from hardy to the next version. Include
1863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# proper package here depending on the system.
1873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif egrep -q 'Ubuntu (8\.04|8\.10)' /etc/issue; then
1883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  dev_list="${dev_list} libcupsys2-dev"
1893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenelse
1903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  dev_list="${dev_list} libcups2-dev"
1913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
1923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
1933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# apache2.2-bin package was introduced in karmic.
1943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif egrep -q 'Ubuntu (8\.04|8\.10|9\.04)' /etc/issue; then
1953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  dev_list="${dev_list} apache2"
1963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenelse
1973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  dev_list="${dev_list} apache2.2-bin"
1983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
1993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
2013dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
2023dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# been provided to yes_no(), the function also accepts RETURN as a user input.
2033dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# The parameter specifies the exit code that should be returned in that case.
2043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# The function will echo the user's selection followed by a newline character.
2053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Users can abort the function by pressing CTRL-C. This will call "exit 1".
2063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenyes_no() {
2073dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  local c
2083dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  while :; do
2093dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
2103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen         stty -echo iuclc -icanon 2>/dev/null
2113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen         dd count=1 bs=1 2>/dev/null | od -An -tx1)"
2123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    case "$c" in
2133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      " 0a") if [ -n "$1" ]; then
2143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen               [ $1 -eq 0 ] && echo "Y" || echo "N"
2153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen               return $1
2163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             fi
2173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             ;;
2183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      " 79") echo "Y"
2193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             return 0
2203dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             ;;
2213dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      " 6e") echo "N"
2223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             return 1
2233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             ;;
2243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      "")    echo "Aborted" >&2
2253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             exit 1
2263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             ;;
2273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      *)     # The user pressed an unrecognized key. As we are not echoing
2283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             # any incorrect user input, alert the user by ringing the bell.
2293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             (tput bel) 2>/dev/null
2303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             ;;
2313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    esac
2323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  done
2333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen}
2343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif test "$do_inst_syms" = ""
2363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenthen
2373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "This script installs all tools and libraries needed to build Chromium."
2383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo ""
2393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "For most of the libraries, it can also install debugging symbols, which"
2403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "will allow you to debug code in the system libraries. Most developers"
2413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "won't need these symbols."
2423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo -n "Do you want me to install them for you (y/N) "
2433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if yes_no 1; then
2443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    do_inst_syms=1
2453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
2463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
2473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif test "$do_inst_syms" = "1"; then
2483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Installing debugging symbols."
2493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenelse
2503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Skipping installation of debugging symbols."
2513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  dbg_list=
2523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
2533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsensudo apt-get update
2553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# We initially run "apt-get" with the --reinstall option and parse its output.
2573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# This way, we can find all the packages that need to be newly installed
2583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# without accidentally promoting any packages from "auto" to "manual".
2593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# We then re-run "apt-get" with just the list of missing packages.
2603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenecho "Finding missing packages..."
2613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenpackages="${dev_list} ${lib_list} ${dbg_list}"
2623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Intentially leaving $packages unquoted so it's more readable.
2633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenecho "Packages required: " $packages
2643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenecho
2653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsennew_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
2663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif new_list="$(yes n | LANG=C $new_list_cmd)"; then
2673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # We probably never hit this following line.
2683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "No missing packages, and the packages are up-to-date."
2693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenelif [ $? -eq 1 ]; then
2703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # We expect apt-get to have exit status of 1.
2713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # This indicates that we canceled the install with "yes n|".
2723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  new_list=$(echo "$new_list" |
2733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sed -e '1,/The following NEW packages will be installed:/d;s/^  //;t;d')
2743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  new_list=$(echo "$new_list" | sed 's/ *$//')
2753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if [ -z "$new_list" ] ; then
2763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "No missing packages, and the packages are up-to-date."
2773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  else
2783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Installing missing packages: $new_list."
2793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo apt-get install ${new_list}
2803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
2813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo
2823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenelse
2833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # An apt-get exit status of 100 indicates that a real error has occurred.
2843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # I am intentionally leaving out the '"'s around new_list_cmd,
2863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # as this makes it easier to cut and paste the output
2873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "The following command failed: " ${new_list_cmd}
2883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo
2893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "It produces the following output:"
2903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  yes n | $new_list_cmd || true
2913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo
2923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "You will have to install the above packages yourself."
2933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo
2943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  exit 100
2953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
2963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
2973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Some operating systems already ship gold (on recent Debian and
2983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Ubuntu you can do "apt-get install binutils-gold" to get it), but
2993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# older releases didn't.  Additionally, gold 2.20 (included in Ubuntu
3003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Lucid) makes binaries that just segfault, and 2.20.1 does not support
3013dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# --map-whole-files.
3023dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# So install from source if we don't have a good version.
3033dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsencase `ld --version` in
3053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen*gold*2.2[1-9].*) ;;
3063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen* )
3073dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if test "$do_inst_gold" = ""
3083dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
3093dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Gold is a new linker that links Chrome 5x faster than ld."
3103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Don't use it if you need to link other apps (e.g. valgrind, wine)"
3113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo -n "REPLACE SYSTEM LINKER ld with gold and back up ld? (y/N) "
3123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    if yes_no 1; then
3133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      do_inst_gold=1
3143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    fi
3153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
3163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if test "$do_inst_gold" = "1"
3173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
3183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    # If the system provides a good version of gold, just install it.
3193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    if apt-cache show binutils-gold | grep -Eq 'Version: 2.2[1-9].*'; then
3203dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      echo "Installing binutils-gold. Backing up ld as ld.single."
3213dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      sudo apt-get install binutils-gold
3223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    else
3233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # FIXME: avoid installing as /usr/bin/ld
3243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      echo "Building binutils. Backing up ld as ld.orig."
3253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      install_gold || exit 99
3263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    fi
3273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  else
3283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Not installing gold."
3293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
3303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenesac
3313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen# Install 32bit backwards compatibility support for 64bit systems
3333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenif [ "$(uname -m)" = "x86_64" ]; then
3343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if test "$do_inst_lib32" = ""
3353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
3363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Installing 32bit libraries not already provided by the system"
3373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo
3383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "This is only needed to build a 32-bit Chrome on your 64-bit system."
3393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo
3403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "While we only need to install a relatively small number of library"
3413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "files, we temporarily need to download a lot of large *.deb packages"
3423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "that contain these files. We will create new *.deb packages that"
3433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "include just the 32bit libraries. These files will then be found on"
3443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "your system in places like /lib32, /usr/lib32, /usr/lib/debug/lib32,"
3453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "/usr/lib/debug/usr/lib32. If you ever need to uninstall these files,"
3463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "look for packages named *-ia32.deb."
3473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Do you want me to download all packages needed to build new 32bit"
3483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo -n "package files (Y/n) "
3493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    if yes_no 0; then
3503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      do_inst_lib32=1
3513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    fi
3523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
3533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  if test "$do_inst_lib32" != "1"
3543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  then
3553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    echo "Exiting without installing any 32bit libraries."
3563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    exit 0
3573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  fi
3583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # Standard 32bit compatibility libraries
3603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "First, installing the limited existing 32-bit support..."
3613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  cmp_list="ia32-libs lib32asound2-dev lib32readline5-dev lib32stdc++6 lib32z1
3623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen            lib32z1-dev libc6-dev-i386 libc6-i386 g++-multilib"
3633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  sudo apt-get install $cmp_list
3643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  tmp=/tmp/install-32bit.$$
3663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  trap 'rm -rf "${tmp}"' EXIT INT TERM QUIT
3673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  mkdir -p "${tmp}/apt/lists/partial" "${tmp}/cache" "${tmp}/partial"
3683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  touch "${tmp}/status"
3693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  [ -r /etc/apt/apt.conf ] && cp /etc/apt/apt.conf "${tmp}/apt/"
3713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  cat >>"${tmp}/apt/apt.conf" <<EOF
3723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        Apt::Architecture "i386";
3733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        Dir::Cache "${tmp}/cache";
3743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        Dir::Cache::Archives "${tmp}/";
3753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        Dir::State::Lists "${tmp}/apt/lists/";
3763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        Dir::State::status "${tmp}/status";
3773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian MonsenEOF
3783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # Download 32bit packages
3803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Computing list of available 32bit packages..."
3813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  sudo apt-get -c="${tmp}/apt/apt.conf" update
3823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Downloading available 32bit packages..."
3843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  sudo apt-get -c="${tmp}/apt/apt.conf" \
3853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          --yes --download-only --force-yes --reinstall install \
3863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          ${lib_list} ${dbg_list}
3873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
3883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # Open packages, remove everything that is not a library, move the
3893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # library to a lib32 directory and package everything as a *.deb file.
3903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Repackaging and installing 32bit packages for use on 64bit systems..."
3913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  for i in ${lib_list} ${dbg_list}; do
3923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    orig="$(echo "${tmp}/${i}"_*_i386.deb)"
3933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    compat="$(echo "${orig}" |
3943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen              sed -e 's,\(_[^_/]*_\)i386\(.deb\),-ia32\1amd64\2,')"
3953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    rm -rf "${tmp}/staging"
3963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    msg="$(fakeroot -u sh -exc '
3973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Unpack 32bit Debian archive
3983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      umask 022
3993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      mkdir -p "'"${tmp}"'/staging/dpkg/DEBIAN"
4003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      cd "'"${tmp}"'/staging"
4013dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      ar x "'${orig}'"
4023dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      tar zCfx dpkg data.tar.gz
4033dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      tar zCfx dpkg/DEBIAN control.tar.gz
4043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Create a posix extended regular expression fragment that will
4063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # recognize the includes which have changed. Should be rare,
4073dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # will almost always be empty.
4083dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      includes=`sed -n -e "s/^[0-9a-z]*  //g" \
4093dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                       -e "\,usr/include/,p" dpkg/DEBIAN/md5sums |
4103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                  xargs -n 1 -I FILE /bin/sh -c \
4113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                    "cmp -s dpkg/FILE /FILE || echo FILE" |
4123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                  tr "\n" "|" |
4133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                  sed -e "s,|$,,"`
4143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # If empty, set it to not match anything.
4163dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      test -z "$includes" && includes="^//"
4173dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4183dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Turn the conflicts into an extended RE for removal from the
4193dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Provides line.
4203dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      conflicts=`sed -n -e "/Conflicts/s/Conflicts: *//;T;s/, */|/g;p" \
4213dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                   dpkg/DEBIAN/control`
4223dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4233dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Rename package, change architecture, remove conflicts and dependencies
4243dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      sed -r -i                              \
4253dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Package/s/$/-ia32/"           \
4263dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Architecture/s/:.*$/: amd64/" \
4273dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Depends/s/:.*/: ia32-libs/"   \
4283dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Provides/s/($conflicts)(, *)?//g;T1;s/, *$//;:1"   \
4293dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Recommends/d"                 \
4303dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/Conflicts/d"                  \
4313dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        dpkg/DEBIAN/control
4323dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4333dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Only keep files that live in "lib" directories or the includes
4343dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # that have changed.
4353dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      sed -r -i                                                               \
4363dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "/\/lib64\//d" -e "/\/.?bin\//d"                                 \
4373dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "\,$includes,s,[ /]include/,&32/,g;s,include/32/,include32/,g"   \
4383dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "s, lib/, lib32/,g"                                              \
4393dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "s,/lib/,/lib32/,g"                                              \
4403dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "t;d"                                                            \
4413dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -e "\,^/usr/lib32/debug\(.*/lib32\),s,^/usr/lib32/debug,/usr/lib/debug," \
4423dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        dpkg/DEBIAN/md5sums
4433dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4443dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Re-run ldconfig after installation/removal
4453dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      { echo "#!/bin/sh"; echo "[ \"x\$1\" = xconfigure ]&&ldconfig||:"; } \
4463dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        >dpkg/DEBIAN/postinst
4473dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      { echo "#!/bin/sh"; echo "[ \"x\$1\" = xremove ]&&ldconfig||:"; } \
4483dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        >dpkg/DEBIAN/postrm
4493dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      chmod 755 dpkg/DEBIAN/postinst dpkg/DEBIAN/postrm
4503dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4513dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Remove any other control files
4523dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find dpkg/DEBIAN -mindepth 1 "(" -name control -o -name md5sums -o \
4533dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                       -name postinst -o -name postrm ")" -o -print |
4543dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        xargs -r rm -rf
4553dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4563dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Remove any files/dirs that live outside of "lib" directories,
4573dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # or are not in our list of changed includes.
4583dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find dpkg -mindepth 1 -regextype posix-extended \
4593dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          "(" -name DEBIAN -o -name lib -o -regex "dpkg/($includes)" ")" \
4603dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          -prune -o -print | tac |
4613dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        xargs -r -n 1 sh -c "rm \$0 2>/dev/null || rmdir \$0 2>/dev/null || : "
4623dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find dpkg -name lib64 -o -name bin -o -name "?bin" |
4633dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        tac | xargs -r rm -rf
4643dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4653dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Remove any symbolic links that were broken by the above steps.
4663dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find -L dpkg -type l -print | tac | xargs -r rm -rf
4673dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4683dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Rename lib to lib32, but keep debug symbols in /usr/lib/debug/usr/lib32
4693dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # That is where gdb looks for them.
4703dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find dpkg -type d -o -path "*/lib/*" -print |
4713dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        xargs -r -n 1 sh -c "
4723dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          i=\$(echo \"\${0}\" |
4733dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen               sed -e s,/lib/,/lib32/,g \
4743dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen               -e s,/usr/lib32/debug\\\\\(.*/lib32\\\\\),/usr/lib/debug\\\\1,);
4753dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          mkdir -p \"\${i%/*}\";
4763dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen          mv \"\${0}\" \"\${i}\""
4773dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4783dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Rename include to include32.
4793dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      [ -d "dpkg/usr/include" ] && mv "dpkg/usr/include" "dpkg/usr/include32"
4803dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4813dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Prune any empty directories
4823dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      find dpkg -type d | tac | xargs -r -n 1 rmdir 2>/dev/null || :
4833dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4843dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      # Create our own Debian package
4853dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      cd ..
4863dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      dpkg --build staging/dpkg .' 2>&1)"
4873dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    compat="$(eval echo $(echo "${compat}" |
4883dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen                          sed -e 's,_[^_/]*_amd64.deb,_*_amd64.deb,'))"
4893dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    [ -r "${compat}" ] || {
4903dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      echo "${msg}" >&2
4913dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      echo "Failed to build new Debian archive!" >&2
4923dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      exit 1
4933dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    }
4943dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
4953dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    msg="$(sudo dpkg -i "${compat}" 2>&1)" && {
4963dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        echo "Installed ${compat##*/}"
4973dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      } || {
4983dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        # echo "${msg}" >&2
4993dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen        echo "Skipped ${compat##*/}"
5003dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen      }
5013dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  done
5023dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen
5033dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  # Add symbolic links for developing 32bit code
5043dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  echo "Adding missing symbolic links, enabling 32bit code development..."
5053dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  for i in $(find /lib32 /usr/lib32 -maxdepth 1 -name \*.so.\* |
5063dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             sed -e 's/[.]so[.][0-9].*/.so/' |
5073dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen             sort -u); do
5083dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    [ "x${i##*/}" = "xld-linux.so" ] && continue
5093dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    [ -r "$i" ] && continue
5103dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' |
5113dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen         sort -n | tail -n 1)"
5123dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    [ -r "$i.$j" ] || continue
5133dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen    sudo ln -s "${i##*/}.$j" "$i"
5143dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsen  done
5153dff810fe0cc4962a5fa554318e9bf8bc45f5274Kristian Monsenfi
516