blob: 22268356d36e75a76d9aa893693312d064be9e40 [file] [log] [blame]
[email protected]e041ed12009-03-10 16:43:011#!/bin/bash -e
2
[email protected]aac39c92012-02-08 18:39:533# Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]e46cdae2009-08-25 20:59:274# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
[email protected]cf1df402008-10-31 21:45:307# Script to install everything needed to build chromium (well, ideally, anyway)
mostynbdf175a82016-02-08 23:27:208# See https://chromium.googlesource.com/chromium/src/+/master/docs/linux_build_instructions.md
[email protected]cf1df402008-10-31 21:45:309
[email protected]1eae2bfb2010-01-26 18:17:5310usage() {
11 echo "Usage: $0 [--options]"
12 echo "Options:"
13 echo "--[no-]syms: enable or disable installation of debugging symbols"
johnme49bb458a2014-11-27 15:45:3114 echo "--lib32: enable installation of 32-bit libraries, e.g. for V8 snapshot"
[email protected]f2826b6a2012-11-15 01:06:2615 echo "--[no-]arm: enable or disable installation of arm cross toolchain"
[email protected]bd29cdd2013-02-22 03:49:2016 echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\
17 "fonts"
[email protected]565416362014-01-16 21:26:4718 echo "--[no-]nacl: enable or disable installation of prerequisites for"\
19 "building standalone NaCl and all its toolchains"
[email protected]e2544ed42012-04-23 04:48:3120 echo "--no-prompt: silently select standard options/defaults"
[email protected]ba48c4ca2013-10-25 16:11:4621 echo "--quick-check: quickly try to determine if dependencies are installed"
22 echo " (this avoids interactive prompts and sudo commands,"
23 echo " so might not be 100% accurate)"
24 echo "--unsupported: attempt installation even on unsupported systems"
[email protected]1eae2bfb2010-01-26 18:17:5325 echo "Script will prompt interactively if options not given."
26 exit 1
27}
28
thomasanderson4e3d30fe2016-12-07 18:58:3429# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
30# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
31# been provided to yes_no(), the function also accepts RETURN as a user input.
32# The parameter specifies the exit code that should be returned in that case.
33# The function will echo the user's selection followed by a newline character.
34# Users can abort the function by pressing CTRL-C. This will call "exit 1".
35yes_no() {
36 if [ 0 -ne "${do_default-0}" ] ; then
37 [ $1 -eq 0 ] && echo "Y" || echo "N"
38 return $1
39 fi
40 local c
41 while :; do
42 c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
43 stty -echo iuclc -icanon 2>/dev/null
44 dd count=1 bs=1 2>/dev/null | od -An -tx1)"
45 case "$c" in
46 " 0a") if [ -n "$1" ]; then
47 [ $1 -eq 0 ] && echo "Y" || echo "N"
48 return $1
49 fi
50 ;;
51 " 79") echo "Y"
52 return 0
53 ;;
54 " 6e") echo "N"
55 return 1
56 ;;
57 "") echo "Aborted" >&2
58 exit 1
59 ;;
60 *) # The user pressed an unrecognized key. As we are not echoing
61 # any incorrect user input, alert the user by ringing the bell.
62 (tput bel) 2>/dev/null
63 ;;
64 esac
65 done
66}
67
[email protected]4fc00712013-05-29 23:11:2068# Checks whether a particular package is available in the repos.
69# USAGE: $ package_exists <package name>
70package_exists() {
thomasandersonb4a2bca2016-12-08 06:46:0571 [ ! -z "`apt-cache search --names-only "$1"`" ]
[email protected]4fc00712013-05-29 23:11:2072}
73
[email protected]fbeddf22014-01-17 23:59:0174# These default to on because (some) bots need them and it keeps things
75# simple for the bot setup if all bots just run the script in its default
76# mode. Developers who don't want stuff they don't need installed on their
77# own workstations can pass --no-arm --no-nacl when running the script.
78do_inst_arm=1
79do_inst_nacl=1
80
[email protected]1eae2bfb2010-01-26 18:17:5381while test "$1" != ""
82do
83 case "$1" in
[email protected]ce774642011-09-12 23:21:3984 --syms) do_inst_syms=1;;
85 --no-syms) do_inst_syms=0;;
[email protected]ce774642011-09-12 23:21:3986 --lib32) do_inst_lib32=1;;
[email protected]f2826b6a2012-11-15 01:06:2687 --arm) do_inst_arm=1;;
88 --no-arm) do_inst_arm=0;;
[email protected]bd29cdd2013-02-22 03:49:2089 --chromeos-fonts) do_inst_chromeos_fonts=1;;
90 --no-chromeos-fonts) do_inst_chromeos_fonts=0;;
[email protected]565416362014-01-16 21:26:4791 --nacl) do_inst_nacl=1;;
92 --no-nacl) do_inst_nacl=0;;
[email protected]e2544ed42012-04-23 04:48:3193 --no-prompt) do_default=1
94 do_quietly="-qq --assume-yes"
95 ;;
[email protected]ba48c4ca2013-10-25 16:11:4696 --quick-check) do_quick_check=1;;
[email protected]fe63a022013-01-15 22:11:4797 --unsupported) do_unsupported=1;;
[email protected]1eae2bfb2010-01-26 18:17:5398 *) usage;;
99 esac
100 shift
101done
102
johnme49bb458a2014-11-27 15:45:31103if test "$do_inst_arm" = "1"; then
104 do_inst_lib32=1
105fi
106
[email protected]0febc9b2014-05-22 20:07:19107# Check for lsb_release command in $PATH
108if ! which lsb_release > /dev/null; then
109 echo "ERROR: lsb_release not found in \$PATH" >&2
110 exit 1;
111fi
[email protected]f2826b6a2012-11-15 01:06:26112
[email protected]0febc9b2014-05-22 20:07:19113lsb_release=$(lsb_release --codename --short)
thomasanderson05c40292017-03-28 19:28:45114supported_releases="(trusty|xenial|yakkety|jessie)"
[email protected]ba48c4ca2013-10-25 16:11:46115if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then
thomasandersonb4a2bca2016-12-08 06:46:05116 if [[ ! $lsb_release =~ $supported_releases ]]; then
thomasanderson05c40292017-03-28 19:28:45117 echo -e "ERROR: The only supported distros are\n" \
118 "\tUbuntu 14.04 (trusty)\n" \
119 "\tUbuntu 16.04 (xenial)\n" \
120 "\tUbuntu 16.10 (yakkety)\n" \
121 "\tDebian 8 (jessie)" >&2
anthonyvd2ae919e52016-11-21 19:47:12122 exit 1
[email protected]fe63a022013-01-15 22:11:47123 fi
[email protected]cf1df402008-10-31 21:45:30124
[email protected]fe63a022013-01-15 22:11:47125 if ! uname -m | egrep -q "i686|x86_64"; then
anthonyvd2ae919e52016-11-21 19:47:12126 echo "Only x86 architectures are currently supported" >&2
[email protected]fe63a022013-01-15 22:11:47127 exit
128 fi
[email protected]e041ed12009-03-10 16:43:01129fi
130
[email protected]ba48c4ca2013-10-25 16:11:46131if [ "x$(id -u)" != x0 ] && [ 0 -eq "${do_quick_check-0}" ]; then
[email protected]e041ed12009-03-10 16:43:01132 echo "Running as non-root user."
133 echo "You might have to enter your password one or more times for 'sudo'."
[email protected]8ada8c52009-03-10 21:53:08134 echo
[email protected]e041ed12009-03-10 16:43:01135fi
136
[email protected]fdc6bf52010-06-07 22:01:57137# Packages needed for chromeos only
dnj6a8491d12015-05-26 21:08:12138chromeos_dev_list="libbluetooth-dev libxkbcommon-dev realpath"
[email protected]fdc6bf52010-06-07 22:01:57139
[email protected]b61f6882013-11-14 20:41:41140# Packages needed for development
thomasanderson20032a5c2017-03-02 00:28:20141dev_list="\
142 bison
143 cdbs
144 curl
145 dpkg-dev
146 elfutils
147 devscripts
148 fakeroot
149 flex
150 fonts-ipafont
151 fonts-thai-tlwg
152 g++
153 git-core
154 git-svn
155 gperf
156 libasound2-dev
157 libbrlapi-dev
158 libav-tools
159 libbz2-dev
160 libcairo2-dev
161 libcap-dev
162 libcups2-dev
163 libcurl4-gnutls-dev
164 libdrm-dev
165 libelf-dev
166 libffi-dev
167 libgconf2-dev
168 libglib2.0-dev
169 libglu1-mesa-dev
170 libgnome-keyring-dev
171 libgtk2.0-dev
172 libgtk-3-dev
173 libkrb5-dev
174 libnspr4-dev
175 libnss3-dev
176 libpam0g-dev
177 libpci-dev
178 libpulse-dev
179 libsctp-dev
180 libspeechd-dev
181 libsqlite3-dev
182 libssl-dev
183 libudev-dev
184 libwww-perl
185 libxslt1-dev
186 libxss-dev
187 libxt-dev
188 libxtst-dev
189 openbox
190 patch
191 perl
192 pkg-config
193 python
194 python-cherrypy3
195 python-crypto
196 python-dev
197 python-numpy
198 python-opencv
199 python-openssl
200 python-psutil
201 python-yaml
202 rpm
203 ruby
204 subversion
205 ttf-dejavu-core
206 wdiff
207 xcompmgr
208 zip
209 $chromeos_dev_list
210"
[email protected]fdc6bf52010-06-07 22:01:57211
[email protected]f16aabf2012-08-15 21:00:14212# 64-bit systems need a minimum set of 32-bit compat packages for the pre-built
[email protected]f8ceadb2014-08-18 12:30:23213# NaCl binaries.
ki.stfu0a79d6992015-09-17 07:27:12214if file -L /sbin/init | grep -q 'ELF 64-bit'; then
[email protected]d93d68b12012-10-15 06:39:53215 dev_list="${dev_list} libc6-i386 lib32gcc1 lib32stdc++6"
[email protected]f16aabf2012-08-15 21:00:14216fi
217
[email protected]fdc6bf52010-06-07 22:01:57218# Run-time libraries required by chromeos only
[email protected]ba48c4ca2013-10-25 16:11:46219chromeos_lib_list="libpulse0 libbz2-1.0"
[email protected]e041ed12009-03-10 16:43:01220
221# Full list of required run-time libraries
thomasanderson20032a5c2017-03-02 00:28:20222lib_list="\
223 libatk1.0-0
224 libc6
225 libasound2
226 libcairo2
227 libcap2
228 libcups2
229 libexpat1
230 libffi6
231 libfontconfig1
232 libfreetype6
233 libglib2.0-0
234 libgnome-keyring0
235 libgtk2.0-0
236 libgtk-3-0
237 libpam0g
238 libpango1.0-0
239 libpci3
240 libpcre3
241 libpixman-1-0
242 libspeechd2
243 libstdc++6
244 libsqlite3-0
245 libx11-6
246 libx11-xcb1
247 libxau6
248 libxcb1
249 libxcomposite1
250 libxcursor1
251 libxdamage1
252 libxdmcp6
253 libxext6
254 libxfixes3
255 libxi6
256 libxinerama1
257 libxrandr2
258 libxrender1
259 libxtst6
260 zlib1g
261 $chromeos_lib_list
262"
[email protected]e041ed12009-03-10 16:43:01263
264# Debugging symbols for all of the run-time libraries
thomasanderson20032a5c2017-03-02 00:28:20265dbg_list="\
266 libatk1.0-dbg
267 libc6-dbg
268 libcairo2-dbg
269 libffi6-dbg
270 libfontconfig1-dbg
271 libglib2.0-0-dbg
272 libgtk2.0-0-dbg
273 libgtk-3-0-dbg
274 libpango1.0-0-dbg
275 libpcre3-dbg
276 libpixman-1-0-dbg
277 libsqlite3-0-dbg
278 libx11-6-dbg
279 libx11-xcb1-dbg
280 libxau6-dbg
281 libxcb1-dbg
282 libxcomposite1-dbg
283 libxcursor1-dbg
284 libxdamage1-dbg
285 libxdmcp6-dbg
286 libxext6-dbg
thomasanderson20032a5c2017-03-02 00:28:20287 libxi6-dbg
288 libxinerama1-dbg
289 libxrandr2-dbg
290 libxrender1-dbg
291 libxtst6-dbg
292 zlib1g-dbg
293"
lfgad917d12015-03-17 23:28:00294
thomasanderson05c40292017-03-28 19:28:45295if [[ ! $lsb_release =~ "yakkety" ]]; then
296 dbg_list="${dbg_list} libxfixes3-dbg"
297fi
298
lfgad917d12015-03-17 23:28:00299# Find the proper version of libstdc++6-4.x-dbg.
thomasanderson05c40292017-03-28 19:28:45300if [ "x$lsb_release" = "xtrusty" ]; then
lfgad917d12015-03-17 23:28:00301 dbg_list="${dbg_list} libstdc++6-4.8-dbg"
302else
303 dbg_list="${dbg_list} libstdc++6-4.9-dbg"
304fi
[email protected]e041ed12009-03-10 16:43:01305
johnme49bb458a2014-11-27 15:45:31306# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
307lib32_list="linux-libc-dev:i386"
308
[email protected]3f85dac32013-10-29 02:38:46309# arm cross toolchain packages needed to build chrome on armhf
thomasanderson4e3d30fe2016-12-07 18:58:34310EM_REPO="deb http://emdebian.org/tools/debian/ jessie main"
311EM_SOURCE=$(cat <<EOF
312# Repo added by Chromium $0
313${EM_REPO}
314# deb-src http://emdebian.org/tools/debian/ jessie main
315EOF
316)
317EM_ARCHIVE_KEY_FINGER="084C6C6F39159EDB67969AA87DE089671804772E"
318GPP_ARM_PACKAGE="g++-arm-linux-gnueabihf"
319case $lsb_release in
320 "jessie")
321 eval $(apt-config shell APT_SOURCESDIR 'Dir::Etc::sourceparts/d')
322 CROSSTOOLS_LIST="${APT_SOURCESDIR}/crosstools.list"
323 arm_list="libc6-dev:armhf
324 linux-libc-dev:armhf"
325 if test "$do_inst_arm" = "1"; then
326 if $(dpkg-query -W ${GPP_ARM_PACKAGE} &>/dev/null); then
327 arm_list+=" ${GPP_ARM_PACKAGE}"
328 else
329 echo "The Debian Cross-toolchains repository is necessary to"
330 echo "cross-compile Chromium for arm."
331 echo -n "Do you want me to add it for you (y/N) "
332 if yes_no 1; then
333 gpg --keyserver pgp.mit.edu --recv-keys ${EM_ARCHIVE_KEY_FINGER}
334 gpg -a --export ${EM_ARCHIVE_KEY_FINGER} | sudo apt-key add -
335 if ! grep "^${EM_REPO}" "${CROSSTOOLS_LIST}" &>/dev/null; then
336 echo "${EM_SOURCE}" | sudo tee -a "${CROSSTOOLS_LIST}" >/dev/null
337 fi
338 arm_list+=" ${GPP_ARM_PACKAGE}"
339 fi
340 fi
341 fi
342 ;;
friedman0eef9e42017-02-22 22:21:22343 "*")
kjellander74c7e4b2017-01-27 13:15:44344 arm_list="binutils-aarch64-linux-gnu
345 libc6-dev-armhf-cross
thomasanderson4e3d30fe2016-12-07 18:58:34346 linux-libc-dev-armhf-cross
347 ${GPP_ARM_PACKAGE}"
348 ;;
349esac
[email protected]31a605532011-08-23 22:27:35350
sbcb5d4ded2015-04-01 17:49:03351# Work around for dependency issue Ubuntu/Trusty: http://crbug.com/435056
friedmanbf8b90a2016-04-21 01:15:48352case $lsb_release in
353 trusty)
354 arm_list+=" g++-4.8-multilib-arm-linux-gnueabihf
355 gcc-4.8-multilib-arm-linux-gnueabihf"
356 ;;
thomasanderson05c40292017-03-28 19:28:45357 xenial|yakkety)
krasineef3d4b2016-04-22 00:52:18358 arm_list+=" g++-5-multilib-arm-linux-gnueabihf
359 gcc-5-multilib-arm-linux-gnueabihf
360 gcc-arm-linux-gnueabihf"
361 ;;
friedmanbf8b90a2016-04-21 01:15:48362esac
sbcb5d4ded2015-04-01 17:49:03363
[email protected]713eac62014-06-02 23:10:03364# Packages to build NaCl, its toolchains, and its ports.
Brad Nelson5e59c2c2014-09-06 06:18:45365naclports_list="ant autoconf bison cmake gawk intltool xutils-dev xsltproc"
thomasanderson20032a5c2017-03-02 00:28:20366nacl_list="\
367 g++-mingw-w64-i686
368 lib32z1-dev
369 libasound2:i386
370 libcap2:i386
371 libelf-dev:i386
372 libfontconfig1:i386
373 libgconf-2-4:i386
374 libglib2.0-0:i386
375 libgpm2:i386
376 libgtk2.0-0:i386
377 libgtk-3-0:i386
378 libncurses5:i386
379 lib32ncurses5-dev
380 libnss3:i386
381 libpango1.0-0:i386
382 libssl1.0.0:i386
383 libtinfo-dev
384 libtinfo-dev:i386
385 libtool
386 libxcomposite1:i386
387 libxcursor1:i386
388 libxdamage1:i386
389 libxi6:i386
390 libxrandr2:i386
391 libxss1:i386
392 libxtst6:i386
393 texinfo
394 xvfb
395 ${naclports_list}
396"
[email protected]419a9a62014-06-19 18:26:18397
torne8a6eb692015-11-05 12:43:08398# Find the proper version of packages that depend on mesa. Only one -lts variant
399# of mesa can be installed and everything that depends on it must match.
400
401# Query for the name and status of all mesa LTS variants, filter for only
402# installed packages, extract just the name, and eliminate duplicates (there can
403# be more than one with the same name in the case of multiarch). Expand into an
404# array.
405mesa_packages=($(dpkg-query -Wf'${package} ${status}\n' \
torne12cd9f6c2016-02-24 18:52:23406 libgl1-mesa-glx-lts-\* 2>/dev/null | \
torne8a6eb692015-11-05 12:43:08407 grep " ok installed" | cut -d " " -f 1 | sort -u))
408if [ "${#mesa_packages[@]}" -eq 0 ]; then
409 mesa_variant=""
410elif [ "${#mesa_packages[@]}" -eq 1 ]; then
411 # Strip the base package name and leave just "-lts-whatever"
412 mesa_variant="${mesa_packages[0]#libgl1-mesa-glx}"
413else
414 echo "ERROR: unable to determine which libgl1-mesa-glx variant is installed."
415 exit 1
416fi
[email protected]3a4bd5d2014-06-25 23:55:04417dev_list="${dev_list} libgbm-dev${mesa_variant}
vabrf1e8b17f2015-03-17 10:56:37418 libgles2-mesa-dev${mesa_variant} libgl1-mesa-dev${mesa_variant}
419 mesa-common-dev${mesa_variant}"
[email protected]419a9a62014-06-19 18:26:18420nacl_list="${nacl_list} libgl1-mesa-glx${mesa_variant}:i386"
[email protected]565416362014-01-16 21:26:47421
[email protected]757c2962012-03-15 19:05:18422# Some package names have changed over time
marcin73929a72017-01-04 22:04:58423if package_exists libpng12-0; then
424 lib_list="${lib_list} libpng12-0"
425else
426 lib_list="${lib_list} libpng16-16"
427fi
[email protected]4fc00712013-05-29 23:11:20428if package_exists libnspr4-dbg; then
[email protected]1a0f64a2011-05-20 17:53:55429 dbg_list="${dbg_list} libnspr4-dbg libnss3-dbg"
430 lib_list="${lib_list} libnspr4 libnss3"
[email protected]757c2962012-03-15 19:05:18431else
432 dbg_list="${dbg_list} libnspr4-0d-dbg libnss3-1d-dbg"
433 lib_list="${lib_list} libnspr4-0d libnss3-1d"
434fi
[email protected]4fc00712013-05-29 23:11:20435if package_exists libjpeg-dev; then
[email protected]9e895962013-05-21 08:26:42436 dev_list="${dev_list} libjpeg-dev"
[email protected]b11411c2012-03-21 22:09:41437else
[email protected]9e895962013-05-21 08:26:42438 dev_list="${dev_list} libjpeg62-dev"
[email protected]b11411c2012-03-21 22:09:41439fi
[email protected]4fc00712013-05-29 23:11:20440if package_exists libudev1; then
[email protected]9e895962013-05-21 08:26:42441 dev_list="${dev_list} libudev1"
[email protected]ab9e69082014-06-05 15:28:52442 nacl_list="${nacl_list} libudev1:i386"
[email protected]9e895962013-05-21 08:26:42443else
444 dev_list="${dev_list} libudev0"
[email protected]ab9e69082014-06-05 15:28:52445 nacl_list="${nacl_list} libudev0:i386"
[email protected]9e895962013-05-21 08:26:42446fi
[email protected]3ea42912013-09-06 06:23:57447if package_exists libbrlapi0.6; then
448 dev_list="${dev_list} libbrlapi0.6"
449else
450 dev_list="${dev_list} libbrlapi0.5"
451fi
halton.huo3e728c42016-01-20 05:12:23452if package_exists apache2-bin; then
453 dev_list="${dev_list} apache2-bin"
454else
455 dev_list="${dev_list} apache2.2-bin"
456fi
vadimsh278ff0662016-05-19 00:06:28457if package_exists xfonts-mathml; then
halton.huo3e728c42016-01-20 05:12:23458 dev_list="${dev_list} xfonts-mathml"
459fi
krasineef3d4b2016-04-22 00:52:18460if package_exists fonts-indic; then
vadimsh278ff0662016-05-19 00:06:28461 dev_list="${dev_list} fonts-indic"
krasineef3d4b2016-04-22 00:52:18462else
vadimsh278ff0662016-05-19 00:06:28463 dev_list="${dev_list} ttf-indic-fonts"
krasineef3d4b2016-04-22 00:52:18464fi
465if package_exists php7.0-cgi; then
vadimsh278ff0662016-05-19 00:06:28466 dev_list="${dev_list} php7.0-cgi libapache2-mod-php7.0"
krasineef3d4b2016-04-22 00:52:18467else
vadimsh278ff0662016-05-19 00:06:28468 dev_list="${dev_list} php5-cgi libapache2-mod-php5"
krasineef3d4b2016-04-22 00:52:18469fi
thomasandersonb4a2bca2016-12-08 06:46:05470# ttf-mscorefonts-installer is in the Debian contrib repo, which has
471# dependencies on non-free software. Install it only if the user has already
472# enabled contrib.
473if package_exists ttf-mscorefonts-installer; then
474 dev_list="${dev_list} ttf-mscorefonts-installer"
475elif package_exists msttcorefonts; then
476 dev_list="${dev_list} msttcorefonts"
477fi
horo233d31c2016-11-16 03:43:00478# Ubuntu 16.04 has this package deleted.
479if package_exists ttf-kochi-gothic; then
480 dev_list="${dev_list} ttf-kochi-gothic"
481fi
482# Ubuntu 16.04 has this package deleted.
483if package_exists ttf-kochi-mincho; then
484 dev_list="${dev_list} ttf-kochi-mincho"
485fi
[email protected]757c2962012-03-15 19:05:18486
[email protected]dc099772013-09-30 22:06:58487# Some packages are only needed if the distribution actually supports
[email protected]757c2962012-03-15 19:05:18488# installing them.
[email protected]4fc00712013-05-29 23:11:20489if package_exists appmenu-gtk; then
[email protected]757c2962012-03-15 19:05:18490 lib_list="$lib_list appmenu-gtk"
[email protected]4da8fad2011-04-11 18:42:42491fi
492
johnme49bb458a2014-11-27 15:45:31493# When cross building for arm/Android on 64-bit systems the host binaries
494# that are part of v8 need to be compiled with -m32 which means
495# that basic multilib support is needed.
ki.stfu0a79d6992015-09-17 07:27:12496if file -L /sbin/init | grep -q 'ELF 64-bit'; then
johnme49bb458a2014-11-27 15:45:31497 # gcc-multilib conflicts with the arm cross compiler (at least in trusty) but
498 # g++-X.Y-multilib gives us the 32-bit support that we need. Find out the
499 # appropriate value of X and Y by seeing what version the current
500 # distribution's g++-multilib package depends on.
501 multilib_package=$(apt-cache depends g++-multilib --important | \
502 grep -E --color=never --only-matching '\bg\+\+-[0-9.]+-multilib\b')
503 lib32_list="$lib32_list $multilib_package"
504fi
505
[email protected]ba48c4ca2013-10-25 16:11:46506if test "$do_inst_syms" = "" && test 0 -eq ${do_quick_check-0}
[email protected]1eae2bfb2010-01-26 18:17:53507then
508 echo "This script installs all tools and libraries needed to build Chromium."
509 echo ""
510 echo "For most of the libraries, it can also install debugging symbols, which"
511 echo "will allow you to debug code in the system libraries. Most developers"
512 echo "won't need these symbols."
513 echo -n "Do you want me to install them for you (y/N) "
514 if yes_no 1; then
515 do_inst_syms=1
516 fi
517fi
518if test "$do_inst_syms" = "1"; then
[email protected]ba48c4ca2013-10-25 16:11:46519 echo "Including debugging symbols."
[email protected]8ada8c52009-03-10 21:53:08520else
[email protected]ba48c4ca2013-10-25 16:11:46521 echo "Skipping debugging symbols."
[email protected]8ada8c52009-03-10 21:53:08522 dbg_list=
523fi
524
johnme49bb458a2014-11-27 15:45:31525if test "$do_inst_lib32" = "1" ; then
526 echo "Including 32-bit libraries for ARM/Android."
527else
528 echo "Skipping 32-bit libraries for ARM/Android."
529 lib32_list=
[email protected]9f28a9cf2012-12-17 23:31:40530fi
531
[email protected]ba48c4ca2013-10-25 16:11:46532if test "$do_inst_arm" = "1" ; then
[email protected]ba48c4ca2013-10-25 16:11:46533 echo "Including ARM cross toolchain."
[email protected]f2826b6a2012-11-15 01:06:26534else
[email protected]ba48c4ca2013-10-25 16:11:46535 echo "Skipping ARM cross toolchain."
[email protected]f2826b6a2012-11-15 01:06:26536 arm_list=
537fi
538
[email protected]565416362014-01-16 21:26:47539if test "$do_inst_nacl" = "1"; then
[email protected]713eac62014-06-02 23:10:03540 echo "Including NaCl, NaCl toolchain, NaCl ports dependencies."
[email protected]565416362014-01-16 21:26:47541else
[email protected]713eac62014-06-02 23:10:03542 echo "Skipping NaCl, NaCl toolchain, NaCl ports dependencies."
[email protected]565416362014-01-16 21:26:47543 nacl_list=
544fi
545
johnme4bd10302015-01-06 11:25:52546# The `sort -r -s -t: -k2` sorts all the :i386 packages to the front, to avoid
547# confusing dpkg-query (crbug.com/446172).
[email protected]565416362014-01-16 21:26:47548packages="$(
johnme49bb458a2014-11-27 15:45:31549 echo "${dev_list} ${lib_list} ${dbg_list} ${lib32_list} ${arm_list}"\
johnme4bd10302015-01-06 11:25:52550 "${nacl_list}" | tr " " "\n" | sort -u | sort -r -s -t: -k2 | tr "\n" " "
[email protected]565416362014-01-16 21:26:47551)"
[email protected]ba48c4ca2013-10-25 16:11:46552
553if [ 1 -eq "${do_quick_check-0}" ] ; then
thomasanderson73b3a4412016-11-18 23:16:07554 if ! missing_packages="$(dpkg-query -W -f ' ' ${packages} 2>&1)"; then
555 # Distinguish between packages that actually aren't available to the
556 # system (i.e. not in any repo) and packages that just aren't known to
557 # dpkg (i.e. managed by apt).
558 missing_packages="$(echo "${missing_packages}" | awk '{print $NF}')"
559 not_installed=""
560 unknown=""
561 for p in ${missing_packages}; do
562 if apt-cache show ${p} > /dev/null 2>&1; then
563 not_installed="${p}\n${not_installed}"
564 else
565 unknown="${p}\n${unknown}"
[email protected]ba48c4ca2013-10-25 16:11:46566 fi
thomasanderson73b3a4412016-11-18 23:16:07567 done
568 if [ -n "${not_installed}" ]; then
[email protected]ba48c4ca2013-10-25 16:11:46569 echo "WARNING: The following packages are not installed:"
thomasanderson73b3a4412016-11-18 23:16:07570 echo -e "${not_installed}" | sed -e "s/^/ /"
571 fi
572 if [ -n "${unknown}" ]; then
573 echo "WARNING: The following packages are unknown to your system"
574 echo "(maybe missing a repo or need to 'sudo apt-get update'):"
575 echo -e "${unknown}" | sed -e "s/^/ /"
[email protected]ba48c4ca2013-10-25 16:11:46576 fi
577 exit 1
578 fi
579 exit 0
580fi
581
johnme49bb458a2014-11-27 15:45:31582if test "$do_inst_lib32" = "1" || test "$do_inst_nacl" = "1"; then
thomasanderson05c40292017-03-28 19:28:45583 sudo dpkg --add-architecture i386
thomasanderson4e3d30fe2016-12-07 18:58:34584 if [[ $lsb_release = "jessie" ]]; then
585 sudo dpkg --add-architecture armhf
586 fi
johnme49bb458a2014-11-27 15:45:31587fi
sbc42564092015-04-01 01:01:28588sudo apt-get update
[email protected]e041ed12009-03-10 16:43:01589
590# We initially run "apt-get" with the --reinstall option and parse its output.
591# This way, we can find all the packages that need to be newly installed
592# without accidentally promoting any packages from "auto" to "manual".
593# We then re-run "apt-get" with just the list of missing packages.
594echo "Finding missing packages..."
[email protected]757c2962012-03-15 19:05:18595# Intentionally leaving $packages unquoted so it's more readable.
[email protected]b6e064522009-08-10 18:47:51596echo "Packages required: " $packages
597echo
[email protected]79a9d2962009-08-06 21:10:58598new_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
[email protected]c3d8b152013-05-10 10:10:03599if new_list="$(yes n | LANGUAGE=en LANG=C $new_list_cmd)"; then
[email protected]b6e064522009-08-10 18:47:51600 # We probably never hit this following line.
thakis3e861de2016-06-14 14:24:01601 echo "No missing packages, and the packages are up to date."
[email protected]b62f11e72010-05-03 17:20:45602elif [ $? -eq 1 ]; then
[email protected]79a9d2962009-08-06 21:10:58603 # We expect apt-get to have exit status of 1.
[email protected]757c2962012-03-15 19:05:18604 # This indicates that we cancelled the install with "yes n|".
[email protected]b6e064522009-08-10 18:47:51605 new_list=$(echo "$new_list" |
[email protected]79a9d2962009-08-06 21:10:58606 sed -e '1,/The following NEW packages will be installed:/d;s/^ //;t;d')
[email protected]b6e064522009-08-10 18:47:51607 new_list=$(echo "$new_list" | sed 's/ *$//')
608 if [ -z "$new_list" ] ; then
thakis3e861de2016-06-14 14:24:01609 echo "No missing packages, and the packages are up to date."
[email protected]b6e064522009-08-10 18:47:51610 else
611 echo "Installing missing packages: $new_list."
[email protected]e2544ed42012-04-23 04:48:31612 sudo apt-get install ${do_quietly-} ${new_list}
[email protected]b6e064522009-08-10 18:47:51613 fi
614 echo
[email protected]79a9d2962009-08-06 21:10:58615else
616 # An apt-get exit status of 100 indicates that a real error has occurred.
[email protected]e041ed12009-03-10 16:43:01617
[email protected]79a9d2962009-08-06 21:10:58618 # I am intentionally leaving out the '"'s around new_list_cmd,
619 # as this makes it easier to cut and paste the output
[email protected]79a9d2962009-08-06 21:10:58620 echo "The following command failed: " ${new_list_cmd}
621 echo
622 echo "It produces the following output:"
623 yes n | $new_list_cmd || true
624 echo
625 echo "You will have to install the above packages yourself."
626 echo
627 exit 100
628fi
[email protected]e041ed12009-03-10 16:43:01629
[email protected]d96cc3472013-09-19 00:53:30630# Install the Chrome OS default fonts. This must go after running
631# apt-get, since install-chromeos-fonts depends on curl.
632if test "$do_inst_chromeos_fonts" != "0"; then
633 echo
634 echo "Installing Chrome OS fonts."
635 dir=`echo $0 | sed -r -e 's/\/[^/]+$//'`
636 if ! sudo $dir/linux/install-chromeos-fonts.py; then
637 echo "ERROR: The installation of the Chrome OS default fonts failed."
638 if [ `stat -f -c %T $dir` == "nfs" ]; then
639 echo "The reason is that your repo is installed on a remote file system."
640 else
641 echo "This is expected if your repo is installed on a remote file system."
642 fi
643 echo "It is recommended to install your repo on a local file system."
644 echo "You can skip the installation of the Chrome OS default founts with"
645 echo "the command line option: --no-chromeos-fonts."
646 exit 1
647 fi
648else
649 echo "Skipping installation of Chrome OS fonts."
650fi
651
sbc6ab44c32015-02-13 23:19:17652# $1 - target name
653# $2 - link name
654create_library_symlink() {
655 target=$1
656 linkname=$2
657 if [ -L $linkname ]; then
658 if [ "$(basename $(readlink $linkname))" != "$(basename $target)" ]; then
659 sudo rm $linkname
660 fi
661 fi
662 if [ ! -r $linkname ]; then
663 echo "Creating link: $linkname"
664 sudo ln -fs $target $linkname
665 fi
666}
667
[email protected]713eac62014-06-02 23:10:03668if test "$do_inst_nacl" = "1"; then
669 echo "Installing symbolic links for NaCl."
sbc6ab44c32015-02-13 23:19:17670 # naclports needs to cross build python for i386, but libssl1.0.0:i386
671 # only contains libcrypto.so.1.0.0 and not the symlink needed for
672 # linking (libcrypto.so).
673 create_library_symlink /lib/i386-linux-gnu/libcrypto.so.1.0.0 \
674 /usr/lib/i386-linux-gnu/libcrypto.so
675
676 create_library_symlink /lib/i386-linux-gnu/libssl.so.1.0.0 \
677 /usr/lib/i386-linux-gnu/libssl.so
[email protected]713eac62014-06-02 23:10:03678else
679 echo "Skipping symbolic links for NaCl."
680fi
thomasanderson5ef5c3d2016-12-08 01:59:19681
682echo "Installing locales."
683CHROMIUM_LOCALES="da_DK.UTF-8 fr_FR.UTF-8 he_IL.UTF-8 zh_TW.UTF-8"
684LOCALE_GEN=/etc/locale.gen
685if [ -e ${LOCALE_GEN} ]; then
686 OLD_LOCALE_GEN="$(cat /etc/locale.gen)"
687 for CHROMIUM_LOCALE in ${CHROMIUM_LOCALES}; do
688 sudo sed -i "s/^# ${CHROMIUM_LOCALE}/${CHROMIUM_LOCALE}/" ${LOCALE_GEN}
689 done
690 # Regenerating locales can take a while, so only do it if we need to.
691 if (echo "${OLD_LOCALE_GEN}" | cmp -s ${LOCALE_GEN}); then
692 echo "Locales already up-to-date."
693 else
694 sudo locale-gen
695 fi
696else
697 for CHROMIUM_LOCALE in ${CHROMIUM_LOCALES}; do
698 sudo locale-gen ${CHROMIUM_LOCALE}
699 done
700fi