install-build-deps.sh revision b2df76ea8fec9e32f6f3718986dba0d95315b29c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/bin/bash -e
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Script to install everything needed to build chromium (well, ideally, anyway)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)usage() {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Usage: $0 [--options]"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Options:"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "--[no-]syms: enable or disable installation of debugging symbols"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "--[no-]lib32: enable or disable installation of 32 bit libraries"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "--[no-]arm: enable or disable installation of arm cross toolchain"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       "fonts"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "--no-prompt: silently select standard options/defaults"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Script will prompt interactively if options not given."
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit 1
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)while test "$1" != ""
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)do
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case "$1" in
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --syms)                   do_inst_syms=1;;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --no-syms)                do_inst_syms=0;;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --lib32)                  do_inst_lib32=1;;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --no-lib32)               do_inst_lib32=0;;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --arm)                    do_inst_arm=1;;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --no-arm)                 do_inst_arm=0;;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --chromeos-fonts)         do_inst_chromeos_fonts=1;;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --no-chromeos-fonts)      do_inst_chromeos_fonts=0;;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  --no-prompt)              do_default=1
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            do_quietly="-qq --assume-yes"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ;;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  --unsupported)            do_unsupported=1;;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *) usage;;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  esac
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shift
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)done
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ubuntu_versions="10\.04|10\.10|11\.04|11\.10|12\.04|12\.10|13\.04"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ubuntu_codenames="lucid|maverick|natty|oneiric|precise|quantal"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ubuntu_issue="Ubuntu ($ubuntu_versions|$ubuntu_codenames)"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# GCEL is an Ubuntu-derived VM image used on Google Compute Engine; /etc/issue
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# doesn't contain a version number so just trust that the user knows what
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# they're doing.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gcel_issue="^GCEL"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if [ 0 -eq "${do_unsupported-0}" ] ; then
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ! egrep -q "($ubuntu_issue|$gcel_issue)" /etc/issue; then
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    echo "ERROR: Only Ubuntu 10.04 (lucid) through 12.10 (quantal) are"\
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "currently supported" >&2
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    exit 1
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fi
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ! uname -m | egrep -q "i686|x86_64"; then
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    echo "Only x86 architectures are currently supported" >&2
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    exit
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fi
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "x$(id -u)" != x0 ]; then
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Running as non-root user."
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "You might have to enter your password one or more times for 'sudo'."
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Packages needed for chromeos only
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)chromeos_dev_list="libbluetooth-dev"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Packages need for development
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)dev_list="apache2.2-bin bison curl elfutils fakeroot flex g++ gperf
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          language-pack-fr libapache2-mod-php5 libasound2-dev libbz2-dev
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libcairo2-dev libcups2-dev libcurl4-gnutls-dev libelf-dev
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libgconf2-dev libgl1-mesa-dev libglib2.0-dev libglu1-mesa-dev
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libgnome-keyring-dev libgtk2.0-dev libkrb5-dev libnspr4-dev
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libnss3-dev libpam0g-dev libpci-dev libpulse-dev libsctp-dev
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libspeechd-dev libsqlite3-dev libssl-dev libudev-dev libwww-perl
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libxslt1-dev libxss-dev libxt-dev libxtst-dev mesa-common-dev
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          metacity patch perl php5-cgi pkg-config python python-cherrypy3
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          python-dev python-psutil rpm ruby subversion ttf-dejavu-core
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho ttf-thai-tlwg
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          wdiff git-core
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          $chromeos_dev_list"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# NaCl binaries. These are always needed, regardless of whether or not we want
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# the full 32-bit "cross-compile" support (--lib32).
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$(uname -m)" = "x86_64" ]; then
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dev_list="${dev_list} libc6-i386 lib32gcc1 lib32stdc++6"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Run-time libraries required by chromeos only
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chromeos_lib_list="libpulse0 libbz2-1.0 libcurl4-gnutls-dev"
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Full list of required run-time libraries
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcups2 libexpat1
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libudev0 libx11-6
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libxtst6 zlib1g $chromeos_lib_list"
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Debugging symbols for all of the run-time libraries
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libfontconfig1-dbg
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libglib2.0-0-dbg libgtk2.0-0-dbg libpango1.0-0-dbg libpcre3-dbg
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libpixman-1-0-dbg libsqlite3-0-dbg libx11-6-dbg libxau6-dbg
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libxcb1-dbg libxcomposite1-dbg libxcursor1-dbg libxdamage1-dbg
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libxdmcp6-dbg libxext6-dbg libxfixes3-dbg libxi6-dbg libxinerama1-dbg
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          libxrandr2-dbg libxrender1-dbg libxtst6-dbg zlib1g-dbg"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# arm cross toolchain packages needed to build chrome on arm
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)arm_list="libc6-armel-cross libc6-dev-armel-cross libgcc1-armel-cross
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libgomp1-armel-cross linux-libc-dev-armel-cross
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libgcc1-dbg-armel-cross libgomp1-dbg-armel-cross
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          binutils-arm-linux-gnueabi cpp-arm-linux-gnueabi
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          libmudflap0-dbg-armel-cross"
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Some package names have changed over time
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if apt-cache show ttf-mscorefonts-installer >/dev/null 2>&1; then
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dev_list="${dev_list} ttf-mscorefonts-installer"
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dev_list="${dev_list} msttcorefonts"
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if apt-cache show libnspr4-dbg >/dev/null 2>&1; then
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbg_list="${dbg_list} libnspr4-dbg libnss3-dbg"
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lib_list="${lib_list} libnspr4 libnss3"
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbg_list="${dbg_list} libnspr4-0d-dbg libnss3-1d-dbg"
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lib_list="${lib_list} libnspr4-0d libnss3-1d"
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if apt-cache show libjpeg-dev >/dev/null 2>&1; then
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_list="${dev_list} libjpeg-dev"
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dev_list="${dev_list} libjpeg62-dev"
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Some packages are only needed, if the distribution actually supports
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# installing them.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if apt-cache show appmenu-gtk >/dev/null 2>&1; then
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lib_list="$lib_list appmenu-gtk"
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# been provided to yes_no(), the function also accepts RETURN as a user input.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The parameter specifies the exit code that should be returned in that case.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# The function will echo the user's selection followed by a newline character.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Users can abort the function by pressing CTRL-C. This will call "exit 1".
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)yes_no() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ 0 -ne "${do_default-0}" ] ; then
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return $1
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  local c
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while :; do
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         stty -echo iuclc -icanon 2>/dev/null
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         dd count=1 bs=1 2>/dev/null | od -An -tx1)"
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case "$c" in
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " 0a") if [ -n "$1" ]; then
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               [ $1 -eq 0 ] && echo "Y" || echo "N"
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               return $1
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             fi
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ;;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " 79") echo "Y"
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             return 0
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ;;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      " 6e") echo "N"
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             return 1
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ;;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "")    echo "Aborted" >&2
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             exit 1
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ;;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *)     # The user pressed an unrecognized key. As we are not echoing
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             # any incorrect user input, alert the user by ringing the bell.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             (tput bel) 2>/dev/null
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             ;;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    esac
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if test "$do_inst_syms" = ""
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)then
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "This script installs all tools and libraries needed to build Chromium."
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo ""
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "For most of the libraries, it can also install debugging symbols, which"
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "will allow you to debug code in the system libraries. Most developers"
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "won't need these symbols."
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo -n "Do you want me to install them for you (y/N) "
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if yes_no 1; then
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do_inst_syms=1
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if test "$do_inst_syms" = "1"; then
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Installing debugging symbols."
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Skipping installation of debugging symbols."
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dbg_list=
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Install the Chrome OS default fonts.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if test "$do_inst_chromeos_fonts" != "0"; then
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  echo
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "Installing Chrome OS fonts."
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  dir=`echo $0 | sed -r -e 's/\/[^/]+$//'`
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if ! sudo $dir/linux/install-chromeos-fonts.py; then
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    echo "ERROR: The installation of the Chrome OS default fonts failed."
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if [ `stat -f -c %T $dir` == "nfs" ]; then
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      echo "The reason is that your repo is installed on a remote file system."
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    else
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      echo "This is expected if your repo is installed on a remote file system."
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    fi
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    echo "It is recommended to install your repo on a local file system."
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    echo "You can skip the installation of the Chrome OS default founts with"
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    echo "the command line option: --no-chromeos-fonts."
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    exit 1
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  fi
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)else
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "Skipping installation of Chrome OS fonts."
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)fi
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# When cross building for arm on 64-bit systems the host binaries
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# that are part of v8 need to be compiled with -m32 which means
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# that basic multilib support is needed.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if [ "$(uname -m)" = "x86_64" ]; then
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  arm_list="$arm_list g++-multilib"
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)fi
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if test "$do_inst_arm" = "1"; then
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  . /etc/lsb-release
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if test "$DISTRIB_CODENAME" != "precise"; then
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    echo "ERROR: Installing the ARM cross toolchain is only available on" \
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         "Ubuntu precise." >&2
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    exit 1
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fi
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "Installing ARM cross toolchain."
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)else
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  echo "Skipping installation of ARM cross toolchain."
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  arm_list=
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)fi
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sudo apt-get update
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We initially run "apt-get" with the --reinstall option and parse its output.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# This way, we can find all the packages that need to be newly installed
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# without accidentally promoting any packages from "auto" to "manual".
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# We then re-run "apt-get" with just the list of missing packages.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "Finding missing packages..."
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)packages="${dev_list} ${lib_list} ${dbg_list} ${arm_list}"
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Intentionally leaving $packages unquoted so it's more readable.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo "Packages required: " $packages
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)echo
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)new_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)if new_list="$(yes n | LANGUAGE=en LANG=C $new_list_cmd)"; then
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We probably never hit this following line.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "No missing packages, and the packages are up-to-date."
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)elif [ $? -eq 1 ]; then
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # We expect apt-get to have exit status of 1.
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # This indicates that we cancelled the install with "yes n|".
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_list=$(echo "$new_list" |
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sed -e '1,/The following NEW packages will be installed:/d;s/^  //;t;d')
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_list=$(echo "$new_list" | sed 's/ *$//')
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ -z "$new_list" ] ; then
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "No missing packages, and the packages are up-to-date."
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "Installing missing packages: $new_list."
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sudo apt-get install ${do_quietly-} ${new_list}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)else
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # An apt-get exit status of 100 indicates that a real error has occurred.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # I am intentionally leaving out the '"'s around new_list_cmd,
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # as this makes it easier to cut and paste the output
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "The following command failed: " ${new_list_cmd}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "It produces the following output:"
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  yes n | $new_list_cmd || true
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "You will have to install the above packages yourself."
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  exit 100
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Install 32bit backwards compatibility support for 64bit systems
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if [ "$(uname -m)" = "x86_64" ]; then
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if test "$do_inst_lib32" != "1"
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  then
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "NOTE: If you were expecting the option to install 32bit libs,"
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "please run with the --lib32 flag."
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    echo "Installation complete."
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit 0
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # This conditional statement has been added to deprecate and eventually
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # remove support for 32bit libraries on 64bit systems. But for the time
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # being, we still have to support a few legacy systems (e.g. bots), where
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # this feature is needed.
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # We only even give the user the option to install these libraries, if
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # they explicitly requested doing so by setting the --lib32 command line
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # flag.
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # And even then, we interactively ask them one more time whether they are
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # absolutely sure.
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # In order for that to work, we must reset the ${do_inst_lib32} variable.
311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # There are other ways to achieve the same goal. But resetting the
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # variable is the best way to document the intended behavior -- and to
313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # allow us to gradually deprecate and then remove the obsolete code.
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    do_inst_lib32=
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "WARNING"
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "We no longer recommend that you use this script to install"
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "32bit libraries on a 64bit system. Instead, consider using the"
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "install-chroot.sh script to help you set up a 32bit environment"
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "for building and testing 32bit versions of Chrome."
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "The code for installing 32bit libraries on a 64bit system is"
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "unmaintained and might not work with modern versions of Ubuntu"
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "or Debian."
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo -n "Are you sure you want to proceed (y/N) "
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if yes_no 1; then
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    do_inst_lib32=1
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if test "$do_inst_lib32" != "1"
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  then
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    exit 0
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Standard 32bit compatibility libraries
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "First, installing the limited existing 32-bit support..."
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmp_list="ia32-libs lib32asound2-dev lib32stdc++6 lib32z1
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            lib32z1-dev libc6-dev-i386 libc6-i386 g++-multilib"
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if [ -n "`apt-cache search lib32readline-gplv2-dev 2>/dev/null`" ]; then
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmp_list="${cmp_list} lib32readline-gplv2-dev"
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmp_list="${cmp_list} lib32readline5-dev"
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fi
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sudo apt-get install ${do_quietly-} $cmp_list
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tmp=/tmp/install-32bit.$$
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trap 'rm -rf "${tmp}"' EXIT INT TERM QUIT
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mkdir -p "${tmp}/apt/lists/partial" "${tmp}/cache" "${tmp}/partial"
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch "${tmp}/status"
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  [ -r /etc/apt/apt.conf ] && cp /etc/apt/apt.conf "${tmp}/apt/"
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cat >>"${tmp}/apt/apt.conf" <<EOF
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Apt::Architecture "i386";
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Dir::Cache "${tmp}/cache";
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Dir::Cache::Archives "${tmp}/";
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Dir::State::Lists "${tmp}/apt/lists/";
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        Dir::State::status "${tmp}/status";
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EOF
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Download 32bit packages
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Computing list of available 32bit packages..."
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sudo apt-get -c="${tmp}/apt/apt.conf" update
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Downloading available 32bit packages..."
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sudo apt-get -c="${tmp}/apt/apt.conf" \
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          --yes --download-only --force-yes --reinstall install \
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ${lib_list} ${dbg_list}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Open packages, remove everything that is not a library, move the
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # library to a lib32 directory and package everything as a *.deb file.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Repackaging and installing 32bit packages for use on 64bit systems..."
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for i in ${lib_list} ${dbg_list}; do
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    orig="$(echo "${tmp}/${i}"_*_i386.deb)"
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compat="$(echo "${orig}" |
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              sed -e 's,\(_[^_/]*_\)i386\(.deb\),-ia32\1amd64\2,')"
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rm -rf "${tmp}/staging"
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg="$(fakeroot -u sh -exc '
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Unpack 32bit Debian archive
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      umask 022
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mkdir -p "'"${tmp}"'/staging/dpkg/DEBIAN"
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cd "'"${tmp}"'/staging"
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ar x "'${orig}'"
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tar Cfx dpkg data.tar*
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      tar zCfx dpkg/DEBIAN control.tar.gz
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Create a posix extended regular expression fragment that will
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # recognize the includes which have changed. Should be rare,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # will almost always be empty.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      includes=`sed -n -e "s/^[0-9a-z]*  //g" \
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       -e "\,usr/include/,p" dpkg/DEBIAN/md5sums |
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  xargs -n 1 -I FILE /bin/sh -c \
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    "cmp -s dpkg/FILE /FILE || echo FILE" |
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  tr "\n" "|" |
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  sed -e "s,|$,,"`
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # If empty, set it to not match anything.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      test -z "$includes" && includes="^//"
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Turn the conflicts into an extended RE for removal from the
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Provides line.
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      conflicts=`sed -n -e "/Conflicts/s/Conflicts: *//;T;s/, */|/g;p" \
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   dpkg/DEBIAN/control`
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Rename package, change architecture, remove conflicts and dependencies
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sed -r -i                              \
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Package/s/$/-ia32/"           \
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Architecture/s/:.*$/: amd64/" \
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Depends/s/:.*/: ia32-libs/"   \
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Provides/s/($conflicts)(, *)?//g;T1;s/, *$//;:1"   \
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Recommends/d"                 \
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/Conflicts/d"                  \
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dpkg/DEBIAN/control
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Only keep files that live in "lib" directories or the includes
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # that have changed.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sed -r -i                                                               \
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "/\/lib64\//d" -e "/\/.?bin\//d"                                 \
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "\,$includes,s,[ /]include/,&32/,g;s,include/32/,include32/,g"   \
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "s, lib/, lib32/,g"                                              \
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "s,/lib/,/lib32/,g"                                              \
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "t;d"                                                            \
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -e "\,^/usr/lib32/debug\(.*/lib32\),s,^/usr/lib32/debug,/usr/lib/debug," \
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dpkg/DEBIAN/md5sums
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Re-run ldconfig after installation/removal
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { echo "#!/bin/sh"; echo "[ \"x\$1\" = xconfigure ]&&ldconfig||:"; } \
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        >dpkg/DEBIAN/postinst
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      { echo "#!/bin/sh"; echo "[ \"x\$1\" = xremove ]&&ldconfig||:"; } \
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        >dpkg/DEBIAN/postrm
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chmod 755 dpkg/DEBIAN/postinst dpkg/DEBIAN/postrm
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Remove any other control files
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find dpkg/DEBIAN -mindepth 1 "(" -name control -o -name md5sums -o \
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       -name postinst -o -name postrm ")" -o -print |
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xargs -r rm -rf
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Remove any files/dirs that live outside of "lib" directories,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # or are not in our list of changed includes.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find dpkg -mindepth 1 -regextype posix-extended \
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "(" -name DEBIAN -o -name lib -o -regex "dpkg/($includes)" ")" \
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          -prune -o -print | tac |
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xargs -r -n 1 sh -c "rm \$0 2>/dev/null || rmdir \$0 2>/dev/null || : "
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find dpkg -name lib64 -o -name bin -o -name "?bin" |
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tac | xargs -r rm -rf
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Remove any symbolic links that were broken by the above steps.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find -L dpkg -type l -print | tac | xargs -r rm -rf
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Rename lib to lib32, but keep debug symbols in /usr/lib/debug/usr/lib32
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # That is where gdb looks for them.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find dpkg -type d -o -path "*/lib/*" -print |
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        xargs -r -n 1 sh -c "
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i=\$(echo \"\${0}\" |
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               sed -e s,/lib/,/lib32/,g \
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               -e s,/usr/lib32/debug\\\\\(.*/lib32\\\\\),/usr/lib/debug\\\\1,);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mkdir -p \"\${i%/*}\";
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mv \"\${0}\" \"\${i}\""
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Rename include to include32.
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      [ -d "dpkg/usr/include" ] && mv "dpkg/usr/include" "dpkg/usr/include32"
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Prune any empty directories
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      find dpkg -type d | tac | xargs -r -n 1 rmdir 2>/dev/null || :
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      # Create our own Debian package
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cd ..
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dpkg --build staging/dpkg .' 2>&1)"
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compat="$(eval echo $(echo "${compat}" |
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          sed -e 's,_[^_/]*_amd64.deb,_*_amd64.deb,'))"
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [ -r "${compat}" ] || {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      echo "${msg}" >&2
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      echo "Failed to build new Debian archive!" >&2
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      exit 1
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    msg="$(sudo dpkg -i "${compat}" 2>&1)" && {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        echo "Installed ${compat##*/}"
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } || {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        # echo "${msg}" >&2
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        echo "Skipped ${compat##*/}"
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Add symbolic links for developing 32bit code
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  echo "Adding missing symbolic links, enabling 32bit code development..."
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for i in $(find /lib32 /usr/lib32 -maxdepth 1 -name \*.so.\* |
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             sed -e 's/[.]so[.][0-9].*/.so/' |
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             sort -u); do
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [ "x${i##*/}" = "xld-linux.so" ] && continue
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [ -r "$i" ] && continue
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' |
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         sort -n | tail -n 1)"
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    [ -r "$i.$j" ] || continue
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sudo ln -s "${i##*/}.$j" "$i"
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  done
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)fi
499