blob: cf01ff7b00c9dcef1f1b2845ee6f1ca44c4e49ea [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)
[email protected]592ea8ca2008-11-03 19:47:368# See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions
9# and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit
[email protected]cf1df402008-10-31 21:45:3010
[email protected]1eae2bfb2010-01-26 18:17:5311usage() {
12 echo "Usage: $0 [--options]"
13 echo "Options:"
14 echo "--[no-]syms: enable or disable installation of debugging symbols"
[email protected]1eae2bfb2010-01-26 18:17:5315 echo "--[no-]lib32: enable or disable installation of 32 bit libraries"
16 echo "Script will prompt interactively if options not given."
17 exit 1
18}
19
20while test "$1" != ""
21do
22 case "$1" in
[email protected]ce774642011-09-12 23:21:3923 --syms) do_inst_syms=1;;
24 --no-syms) do_inst_syms=0;;
[email protected]ce774642011-09-12 23:21:3925 --lib32) do_inst_lib32=1;;
26 --no-lib32) do_inst_lib32=0;;
[email protected]1eae2bfb2010-01-26 18:17:5327 *) usage;;
28 esac
29 shift
30done
31
[email protected]a51551d2010-07-15 22:59:4832if ! egrep -q \
[email protected]757c2962012-03-15 19:05:1833 'Ubuntu (10\.04|10\.10|11\.04|11\.10|12\.04|lucid|maverick|natty|oneiric|precise)' \
[email protected]a51551d2010-07-15 22:59:4834 /etc/issue; then
[email protected]757c2962012-03-15 19:05:1835 echo "Only Ubuntu 10.04 (lucid) through 12.04 (precise) are currently" \
[email protected]a51551d2010-07-15 22:59:4836 "supported" >&2
[email protected]cf1df402008-10-31 21:45:3037 exit 1
38fi
[email protected]cf1df402008-10-31 21:45:3039
[email protected]e041ed12009-03-10 16:43:0140if ! uname -m | egrep -q "i686|x86_64"; then
41 echo "Only x86 architectures are currently supported" >&2
42 exit
43fi
44
45if [ "x$(id -u)" != x0 ]; then
46 echo "Running as non-root user."
47 echo "You might have to enter your password one or more times for 'sudo'."
[email protected]8ada8c52009-03-10 21:53:0848 echo
[email protected]e041ed12009-03-10 16:43:0149fi
50
[email protected]fdc6bf52010-06-07 22:01:5751# Packages needed for chromeos only
52chromeos_dev_list="libpulse-dev"
53
[email protected]e041ed12009-03-10 16:43:0154# Packages need for development
[email protected]041d14a2011-12-13 01:42:4855dev_list="apache2.2-bin bison curl elfutils fakeroot flex g++ gperf
56 language-pack-fr libapache2-mod-php5 libasound2-dev libbz2-dev
57 libcairo2-dev libcups2-dev libcurl4-gnutls-dev libdbus-glib-1-dev
58 libelf-dev libgconf2-dev libgl1-mesa-dev libglib2.0-dev
59 libglu1-mesa-dev libgnome-keyring-dev libgtk2.0-dev libjpeg62-dev
60 libkrb5-dev libnspr4-dev libnss3-dev libpam0g-dev libsctp-dev
[email protected]6de217b72011-12-17 03:36:3261 libsqlite3-dev libssl-dev libudev-dev libwww-perl libxslt1-dev
[email protected]757c2962012-03-15 19:05:1862 libxss-dev libxt-dev libxtst-dev mesa-common-dev patch
[email protected]6de217b72011-12-17 03:36:3263 perl php5-cgi pkg-config python python-cherrypy3 python-dev
64 python-psutil rpm ruby subversion ttf-dejavu-core ttf-indic-fonts
[email protected]52de18db2012-02-15 23:38:0765 ttf-kochi-gothic ttf-kochi-mincho ttf-thai-tlwg wdiff git-core
[email protected]9dc4bed2010-11-04 19:23:3066 $chromeos_dev_list"
[email protected]fdc6bf52010-06-07 22:01:5767
68# Run-time libraries required by chromeos only
[email protected]34799f9d2010-07-08 17:51:3369chromeos_lib_list="libpulse0 libbz2-1.0 libcurl4-gnutls-dev"
[email protected]e041ed12009-03-10 16:43:0170
71# Full list of required run-time libraries
[email protected]a9259a52011-05-21 01:05:2272lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcups2 libdbus-glib-1-2
73 libexpat1 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0
74 libgtk2.0-0 libpam0g libpango1.0-0 libpcre3 libpixman-1-0
[email protected]6de217b72011-12-17 03:36:3275 libpng12-0 libstdc++6 libsqlite3-0 libudev0 libx11-6 libxau6 libxcb1
[email protected]fd11101b2011-02-16 04:46:4676 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3
77 libxi6 libxinerama1 libxrandr2 libxrender1 libxtst6 zlib1g
[email protected]9dc4bed2010-11-04 19:23:3078 $chromeos_lib_list"
[email protected]e041ed12009-03-10 16:43:0179
80# Debugging symbols for all of the run-time libraries
[email protected]f3307aa2011-10-21 22:52:3881dbg_list="libatk1.0-dbg libc6-dbg libcairo2-dbg libdbus-glib-1-2-dbg
[email protected]1a0f64a2011-05-20 17:53:5582 libfontconfig1-dbg libglib2.0-0-dbg libgtk2.0-0-dbg
83 libpango1.0-0-dbg libpcre3-dbg libpixman-1-0-dbg
[email protected]b944e322011-05-18 20:01:3584 libsqlite3-0-dbg
[email protected]e759c4b2010-03-10 19:04:5885 libx11-6-dbg libxau6-dbg libxcb1-dbg libxcomposite1-dbg
[email protected]e041ed12009-03-10 16:43:0186 libxcursor1-dbg libxdamage1-dbg libxdmcp6-dbg libxext6-dbg
87 libxfixes3-dbg libxi6-dbg libxinerama1-dbg libxrandr2-dbg
[email protected]9dc4bed2010-11-04 19:23:3088 libxrender1-dbg libxtst6-dbg zlib1g-dbg"
[email protected]e041ed12009-03-10 16:43:0189
[email protected]31a605532011-08-23 22:27:3590# Plugin lists needed for tests.
91plugin_list="flashplugin-installer"
92
[email protected]757c2962012-03-15 19:05:1893# Some package names have changed over time
94if dpkg --print-avail msttcorefonts >/dev/null 2>&1; then
95 dev_list="${dev_list} msttcorefonts"
[email protected]cd03d822010-05-13 21:11:2096else
[email protected]757c2962012-03-15 19:05:1897 dev_list="${dev_list} ttf-mscorefonts-installer"
98fi
99if dpkg --print-avail libnspr4 >/dev/null 2>&1; then
[email protected]1a0f64a2011-05-20 17:53:55100 dbg_list="${dbg_list} libnspr4-dbg libnss3-dbg"
101 lib_list="${lib_list} libnspr4 libnss3"
[email protected]757c2962012-03-15 19:05:18102else
103 dbg_list="${dbg_list} libnspr4-0d-dbg libnss3-1d-dbg"
104 lib_list="${lib_list} libnspr4-0d libnss3-1d"
105fi
106
107# Some packages are only needed, if the distribution actually supports
108# installing them.
109if dpkg --print-avail appmenu-gtk >/dev/null 2>&1; then
110 lib_list="$lib_list appmenu-gtk"
[email protected]4da8fad2011-04-11 18:42:42111fi
112
[email protected]8ada8c52009-03-10 21:53:08113# Waits for the user to press 'Y' or 'N'. Either uppercase of lowercase is
114# accepted. Returns 0 for 'Y' and 1 for 'N'. If an optional parameter has
115# been provided to yes_no(), the function also accepts RETURN as a user input.
116# The parameter specifies the exit code that should be returned in that case.
117# The function will echo the user's selection followed by a newline character.
118# Users can abort the function by pressing CTRL-C. This will call "exit 1".
119yes_no() {
120 local c
121 while :; do
122 c="$(trap 'stty echo -iuclc icanon 2>/dev/null' EXIT INT TERM QUIT
123 stty -echo iuclc -icanon 2>/dev/null
124 dd count=1 bs=1 2>/dev/null | od -An -tx1)"
125 case "$c" in
126 " 0a") if [ -n "$1" ]; then
127 [ $1 -eq 0 ] && echo "Y" || echo "N"
128 return $1
129 fi
130 ;;
131 " 79") echo "Y"
132 return 0
133 ;;
134 " 6e") echo "N"
135 return 1
136 ;;
137 "") echo "Aborted" >&2
138 exit 1
139 ;;
140 *) # The user pressed an unrecognized key. As we are not echoing
141 # any incorrect user input, alert the user by ringing the bell.
142 (tput bel) 2>/dev/null
143 ;;
144 esac
145 done
146}
147
[email protected]1eae2bfb2010-01-26 18:17:53148if test "$do_inst_syms" = ""
149then
150 echo "This script installs all tools and libraries needed to build Chromium."
151 echo ""
152 echo "For most of the libraries, it can also install debugging symbols, which"
153 echo "will allow you to debug code in the system libraries. Most developers"
154 echo "won't need these symbols."
155 echo -n "Do you want me to install them for you (y/N) "
156 if yes_no 1; then
157 do_inst_syms=1
158 fi
159fi
160if test "$do_inst_syms" = "1"; then
[email protected]8ada8c52009-03-10 21:53:08161 echo "Installing debugging symbols."
162else
163 echo "Skipping installation of debugging symbols."
164 dbg_list=
165fi
166
[email protected]e041ed12009-03-10 16:43:01167sudo apt-get update
168
169# We initially run "apt-get" with the --reinstall option and parse its output.
170# This way, we can find all the packages that need to be newly installed
171# without accidentally promoting any packages from "auto" to "manual".
172# We then re-run "apt-get" with just the list of missing packages.
173echo "Finding missing packages..."
[email protected]31a605532011-08-23 22:27:35174packages="${dev_list} ${lib_list} ${dbg_list} ${plugin_list}"
[email protected]757c2962012-03-15 19:05:18175# Intentionally leaving $packages unquoted so it's more readable.
[email protected]b6e064522009-08-10 18:47:51176echo "Packages required: " $packages
177echo
[email protected]79a9d2962009-08-06 21:10:58178new_list_cmd="sudo apt-get install --reinstall $(echo $packages)"
[email protected]b62f11e72010-05-03 17:20:45179if new_list="$(yes n | LANG=C $new_list_cmd)"; then
[email protected]b6e064522009-08-10 18:47:51180 # We probably never hit this following line.
[email protected]79a9d2962009-08-06 21:10:58181 echo "No missing packages, and the packages are up-to-date."
[email protected]b62f11e72010-05-03 17:20:45182elif [ $? -eq 1 ]; then
[email protected]79a9d2962009-08-06 21:10:58183 # We expect apt-get to have exit status of 1.
[email protected]757c2962012-03-15 19:05:18184 # This indicates that we cancelled the install with "yes n|".
[email protected]b6e064522009-08-10 18:47:51185 new_list=$(echo "$new_list" |
[email protected]79a9d2962009-08-06 21:10:58186 sed -e '1,/The following NEW packages will be installed:/d;s/^ //;t;d')
[email protected]b6e064522009-08-10 18:47:51187 new_list=$(echo "$new_list" | sed 's/ *$//')
188 if [ -z "$new_list" ] ; then
189 echo "No missing packages, and the packages are up-to-date."
190 else
191 echo "Installing missing packages: $new_list."
192 sudo apt-get install ${new_list}
193 fi
194 echo
[email protected]79a9d2962009-08-06 21:10:58195else
196 # An apt-get exit status of 100 indicates that a real error has occurred.
[email protected]e041ed12009-03-10 16:43:01197
[email protected]79a9d2962009-08-06 21:10:58198 # I am intentionally leaving out the '"'s around new_list_cmd,
199 # as this makes it easier to cut and paste the output
[email protected]79a9d2962009-08-06 21:10:58200 echo "The following command failed: " ${new_list_cmd}
201 echo
202 echo "It produces the following output:"
203 yes n | $new_list_cmd || true
204 echo
205 echo "You will have to install the above packages yourself."
206 echo
207 exit 100
208fi
[email protected]e041ed12009-03-10 16:43:01209
210# Install 32bit backwards compatibility support for 64bit systems
[email protected]b6e064522009-08-10 18:47:51211if [ "$(uname -m)" = "x86_64" ]; then
[email protected]1eae2bfb2010-01-26 18:17:53212 if test "$do_inst_lib32" = ""
213 then
[email protected]e76a3632012-03-15 20:56:27214 echo "We no longer recommend that you use this script to install"
215 echo "32bit libraries on a 64bit system. Instead, consider using"
216 echo "the install-chroot.sh script to help you set up a 32bit"
217 echo "environment for building and testing 32bit versions of Chrome."
[email protected]1eae2bfb2010-01-26 18:17:53218 echo
[email protected]e76a3632012-03-15 20:56:27219 echo "If you nonetheless want to try installing 32bit libraries"
220 echo "directly, you can do so by explicitly passing the --lib32"
[email protected]472f5e192012-03-16 00:02:20221 echo "option to install-build-deps.sh."
[email protected]1eae2bfb2010-01-26 18:17:53222 fi
223 if test "$do_inst_lib32" != "1"
224 then
[email protected]8ada8c52009-03-10 21:53:08225 echo "Exiting without installing any 32bit libraries."
226 exit 0
227 fi
[email protected]b62f11e72010-05-03 17:20:45228
[email protected]e76a3632012-03-15 20:56:27229 echo "N.B. the code for installing 32bit libraries on a 64bit"
230 echo " system is no longer actively maintained and might"
231 echo " not work with modern versions of Ubuntu or Debian."
232 echo
233
[email protected]b62f11e72010-05-03 17:20:45234 # Standard 32bit compatibility libraries
235 echo "First, installing the limited existing 32-bit support..."
[email protected]7cf14b372011-12-08 18:32:52236 cmp_list="ia32-libs lib32asound2-dev lib32stdc++6 lib32z1
[email protected]b62f11e72010-05-03 17:20:45237 lib32z1-dev libc6-dev-i386 libc6-i386 g++-multilib"
[email protected]7cf14b372011-12-08 18:32:52238 if [ -n "`apt-cache search lib32readline-gplv2-dev 2>/dev/null`" ]; then
239 cmp_list="${cmp_list} lib32readline-gplv2-dev"
240 else
241 cmp_list="${cmp_list} lib32readline5-dev"
242 fi
[email protected]a81e44e12010-05-17 21:16:53243 sudo apt-get install $cmp_list
[email protected]b62f11e72010-05-03 17:20:45244
[email protected]e041ed12009-03-10 16:43:01245 tmp=/tmp/install-32bit.$$
246 trap 'rm -rf "${tmp}"' EXIT INT TERM QUIT
247 mkdir -p "${tmp}/apt/lists/partial" "${tmp}/cache" "${tmp}/partial"
248 touch "${tmp}/status"
249
250 [ -r /etc/apt/apt.conf ] && cp /etc/apt/apt.conf "${tmp}/apt/"
[email protected]b6e064522009-08-10 18:47:51251 cat >>"${tmp}/apt/apt.conf" <<EOF
[email protected]79a9d2962009-08-06 21:10:58252 Apt::Architecture "i386";
253 Dir::Cache "${tmp}/cache";
254 Dir::Cache::Archives "${tmp}/";
255 Dir::State::Lists "${tmp}/apt/lists/";
256 Dir::State::status "${tmp}/status";
[email protected]b6e064522009-08-10 18:47:51257EOF
[email protected]1bf2ac972009-06-30 23:57:48258
[email protected]e041ed12009-03-10 16:43:01259 # Download 32bit packages
260 echo "Computing list of available 32bit packages..."
[email protected]a81e44e12010-05-17 21:16:53261 sudo apt-get -c="${tmp}/apt/apt.conf" update
[email protected]e041ed12009-03-10 16:43:01262
263 echo "Downloading available 32bit packages..."
[email protected]a81e44e12010-05-17 21:16:53264 sudo apt-get -c="${tmp}/apt/apt.conf" \
265 --yes --download-only --force-yes --reinstall install \
[email protected]e041ed12009-03-10 16:43:01266 ${lib_list} ${dbg_list}
267
268 # Open packages, remove everything that is not a library, move the
269 # library to a lib32 directory and package everything as a *.deb file.
270 echo "Repackaging and installing 32bit packages for use on 64bit systems..."
271 for i in ${lib_list} ${dbg_list}; do
272 orig="$(echo "${tmp}/${i}"_*_i386.deb)"
273 compat="$(echo "${orig}" |
274 sed -e 's,\(_[^_/]*_\)i386\(.deb\),-ia32\1amd64\2,')"
275 rm -rf "${tmp}/staging"
276 msg="$(fakeroot -u sh -exc '
277 # Unpack 32bit Debian archive
278 umask 022
279 mkdir -p "'"${tmp}"'/staging/dpkg/DEBIAN"
280 cd "'"${tmp}"'/staging"
281 ar x "'${orig}'"
282 tar zCfx dpkg data.tar.gz
283 tar zCfx dpkg/DEBIAN control.tar.gz
284
[email protected]34799f9d2010-07-08 17:51:33285 # Create a posix extended regular expression fragment that will
286 # recognize the includes which have changed. Should be rare,
287 # will almost always be empty.
288 includes=`sed -n -e "s/^[0-9a-z]* //g" \
289 -e "\,usr/include/,p" dpkg/DEBIAN/md5sums |
290 xargs -n 1 -I FILE /bin/sh -c \
291 "cmp -s dpkg/FILE /FILE || echo FILE" |
292 tr "\n" "|" |
293 sed -e "s,|$,,"`
[email protected]e041ed12009-03-10 16:43:01294
[email protected]34799f9d2010-07-08 17:51:33295 # If empty, set it to not match anything.
296 test -z "$includes" && includes="^//"
297
298 # Turn the conflicts into an extended RE for removal from the
299 # Provides line.
300 conflicts=`sed -n -e "/Conflicts/s/Conflicts: *//;T;s/, */|/g;p" \
301 dpkg/DEBIAN/control`
302
303 # Rename package, change architecture, remove conflicts and dependencies
304 sed -r -i \
305 -e "/Package/s/$/-ia32/" \
306 -e "/Architecture/s/:.*$/: amd64/" \
307 -e "/Depends/s/:.*/: ia32-libs/" \
308 -e "/Provides/s/($conflicts)(, *)?//g;T1;s/, *$//;:1" \
309 -e "/Recommends/d" \
310 -e "/Conflicts/d" \
311 dpkg/DEBIAN/control
312
313 # Only keep files that live in "lib" directories or the includes
314 # that have changed.
315 sed -r -i \
316 -e "/\/lib64\//d" -e "/\/.?bin\//d" \
317 -e "\,$includes,s,[ /]include/,&32/,g;s,include/32/,include32/,g" \
318 -e "s, lib/, lib32/,g" \
319 -e "s,/lib/,/lib32/,g" \
320 -e "t;d" \
321 -e "\,^/usr/lib32/debug\(.*/lib32\),s,^/usr/lib32/debug,/usr/lib/debug," \
322 dpkg/DEBIAN/md5sums
[email protected]e041ed12009-03-10 16:43:01323
324 # Re-run ldconfig after installation/removal
325 { echo "#!/bin/sh"; echo "[ \"x\$1\" = xconfigure ]&&ldconfig||:"; } \
326 >dpkg/DEBIAN/postinst
327 { echo "#!/bin/sh"; echo "[ \"x\$1\" = xremove ]&&ldconfig||:"; } \
328 >dpkg/DEBIAN/postrm
329 chmod 755 dpkg/DEBIAN/postinst dpkg/DEBIAN/postrm
330
331 # Remove any other control files
332 find dpkg/DEBIAN -mindepth 1 "(" -name control -o -name md5sums -o \
333 -name postinst -o -name postrm ")" -o -print |
334 xargs -r rm -rf
335
[email protected]34799f9d2010-07-08 17:51:33336 # Remove any files/dirs that live outside of "lib" directories,
337 # or are not in our list of changed includes.
338 find dpkg -mindepth 1 -regextype posix-extended \
339 "(" -name DEBIAN -o -name lib -o -regex "dpkg/($includes)" ")" \
340 -prune -o -print | tac |
341 xargs -r -n 1 sh -c "rm \$0 2>/dev/null || rmdir \$0 2>/dev/null || : "
[email protected]e041ed12009-03-10 16:43:01342 find dpkg -name lib64 -o -name bin -o -name "?bin" |
343 tac | xargs -r rm -rf
344
[email protected]34799f9d2010-07-08 17:51:33345 # Remove any symbolic links that were broken by the above steps.
346 find -L dpkg -type l -print | tac | xargs -r rm -rf
347
[email protected]e041ed12009-03-10 16:43:01348 # Rename lib to lib32, but keep debug symbols in /usr/lib/debug/usr/lib32
349 # That is where gdb looks for them.
350 find dpkg -type d -o -path "*/lib/*" -print |
351 xargs -r -n 1 sh -c "
352 i=\$(echo \"\${0}\" |
353 sed -e s,/lib/,/lib32/,g \
354 -e s,/usr/lib32/debug\\\\\(.*/lib32\\\\\),/usr/lib/debug\\\\1,);
355 mkdir -p \"\${i%/*}\";
356 mv \"\${0}\" \"\${i}\""
357
[email protected]34799f9d2010-07-08 17:51:33358 # Rename include to include32.
359 [ -d "dpkg/usr/include" ] && mv "dpkg/usr/include" "dpkg/usr/include32"
360
[email protected]e041ed12009-03-10 16:43:01361 # Prune any empty directories
362 find dpkg -type d | tac | xargs -r -n 1 rmdir 2>/dev/null || :
363
364 # Create our own Debian package
365 cd ..
366 dpkg --build staging/dpkg .' 2>&1)"
367 compat="$(eval echo $(echo "${compat}" |
368 sed -e 's,_[^_/]*_amd64.deb,_*_amd64.deb,'))"
369 [ -r "${compat}" ] || {
370 echo "${msg}" >&2
371 echo "Failed to build new Debian archive!" >&2
372 exit 1
373 }
374
375 msg="$(sudo dpkg -i "${compat}" 2>&1)" && {
376 echo "Installed ${compat##*/}"
377 } || {
378 # echo "${msg}" >&2
379 echo "Skipped ${compat##*/}"
380 }
381 done
382
383 # Add symbolic links for developing 32bit code
384 echo "Adding missing symbolic links, enabling 32bit code development..."
385 for i in $(find /lib32 /usr/lib32 -maxdepth 1 -name \*.so.\* |
386 sed -e 's/[.]so[.][0-9].*/.so/' |
387 sort -u); do
388 [ "x${i##*/}" = "xld-linux.so" ] && continue
389 [ -r "$i" ] && continue
390 j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' |
391 sort -n | tail -n 1)"
392 [ -r "$i.$j" ] || continue
393 sudo ln -s "${i##*/}.$j" "$i"
394 done
395fi