OLD | NEW |
---|---|
1 #!/bin/bash -e | 1 #!/bin/bash -e |
2 | 2 |
3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # Script to install everything needed to build chromium (well, ideally, anyway) | 7 # Script to install everything needed to build chromium (well, ideally, anyway) |
8 # See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions | 8 # See http://code.google.com/p/chromium/wiki/LinuxBuildInstructions |
9 # and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit | 9 # and http://code.google.com/p/chromium/wiki/LinuxBuild64Bit |
10 | 10 |
11 usage() { | 11 usage() { |
12 echo "Usage: $0 [--options]" | 12 echo "Usage: $0 [--options]" |
13 echo "Options:" | 13 echo "Options:" |
14 echo "--[no-]syms: enable or disable installation of debugging symbols" | 14 echo "--[no-]syms: enable or disable installation of debugging symbols" |
15 echo "--[no-]lib32: enable or disable installation of 32 bit libraries" | 15 echo "--[no-]lib32: enable or disable installation of 32 bit libraries" |
16 echo "--[no-]arm: enable or disable installation of arm cross toolchain" | 16 echo "--[no-]arm: enable or disable installation of arm cross toolchain" |
17 echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\ | 17 echo "--[no-]chromeos-fonts: enable or disable installation of Chrome OS"\ |
18 "fonts" | 18 "fonts" |
19 echo "--no-prompt: silently select standard options/defaults" | 19 echo "--no-prompt: silently select standard options/defaults" |
20 echo "--quick-check: quickly try to determine if dependencies are installed" | |
21 echo " (this avoids interactive prompts and sudo commands," | |
22 echo " so might not be 100% accurate)" | |
23 echo "--unsupported: attempt installation even on unsupported systems" | |
20 echo "Script will prompt interactively if options not given." | 24 echo "Script will prompt interactively if options not given." |
21 exit 1 | 25 exit 1 |
22 } | 26 } |
23 | 27 |
24 # Checks whether a particular package is available in the repos. | 28 # Checks whether a particular package is available in the repos. |
25 # USAGE: $ package_exists <package name> | 29 # USAGE: $ package_exists <package name> |
26 package_exists() { | 30 package_exists() { |
27 apt-cache pkgnames | grep -x "$1" > /dev/null 2>&1 | 31 apt-cache pkgnames | grep -x "$1" > /dev/null 2>&1 |
28 } | 32 } |
29 | 33 |
30 while test "$1" != "" | 34 while test "$1" != "" |
31 do | 35 do |
32 case "$1" in | 36 case "$1" in |
33 --syms) do_inst_syms=1;; | 37 --syms) do_inst_syms=1;; |
34 --no-syms) do_inst_syms=0;; | 38 --no-syms) do_inst_syms=0;; |
35 --lib32) do_inst_lib32=1;; | 39 --lib32) do_inst_lib32=1;; |
36 --no-lib32) do_inst_lib32=0;; | 40 --no-lib32) do_inst_lib32=0;; |
37 --arm) do_inst_arm=1;; | 41 --arm) do_inst_arm=1;; |
38 --no-arm) do_inst_arm=0;; | 42 --no-arm) do_inst_arm=0;; |
39 --chromeos-fonts) do_inst_chromeos_fonts=1;; | 43 --chromeos-fonts) do_inst_chromeos_fonts=1;; |
40 --no-chromeos-fonts) do_inst_chromeos_fonts=0;; | 44 --no-chromeos-fonts) do_inst_chromeos_fonts=0;; |
41 --no-prompt) do_default=1 | 45 --no-prompt) do_default=1 |
42 do_quietly="-qq --assume-yes" | 46 do_quietly="-qq --assume-yes" |
43 ;; | 47 ;; |
48 --quick-check) do_quick_check=1;; | |
44 --unsupported) do_unsupported=1;; | 49 --unsupported) do_unsupported=1;; |
45 *) usage;; | 50 *) usage;; |
46 esac | 51 esac |
47 shift | 52 shift |
48 done | 53 done |
49 | 54 |
50 ubuntu_versions="12\.04|12\.10|13\.04" | 55 ubuntu_versions="12\.04|12\.10|13\.04" |
51 ubuntu_codenames="precise|quantal|raring" | 56 ubuntu_codenames="precise|quantal|raring" |
52 ubuntu_issue="Ubuntu ($ubuntu_versions|$ubuntu_codenames)" | 57 ubuntu_issue="Ubuntu ($ubuntu_versions|$ubuntu_codenames)" |
53 # GCEL is an Ubuntu-derived VM image used on Google Compute Engine; /etc/issue | 58 # GCEL is an Ubuntu-derived VM image used on Google Compute Engine; /etc/issue |
54 # doesn't contain a version number so just trust that the user knows what | 59 # doesn't contain a version number so just trust that the user knows what |
55 # they're doing. | 60 # they're doing. |
56 gcel_issue="^GCEL" | 61 gcel_issue="^GCEL" |
57 | 62 |
58 if [ 0 -eq "${do_unsupported-0}" ] ; then | 63 if [ 0 -eq "${do_unsupported-0}" ] && [ 0 -eq "${do_quick_check-0}" ] ; then |
Markus (顧孟勤)
2013/10/25 00:40:50
I generally prefer "${...:-...}" over "${...-...}"
Michael Moss
2013/10/25 02:45:31
Yeah, I was just staying consistent with other use
| |
59 if ! egrep -q "($ubuntu_issue|$gcel_issue)" /etc/issue; then | 64 if ! egrep -q "($ubuntu_issue|$gcel_issue)" /etc/issue; then |
60 echo "ERROR: Only Ubuntu 12.04 (precise) through 13.04 (raring) are"\ | 65 echo "ERROR: Only Ubuntu 12.04 (precise) through 13.04 (raring) are"\ |
61 "currently supported" >&2 | 66 "currently supported" >&2 |
62 exit 1 | 67 exit 1 |
63 fi | 68 fi |
64 | 69 |
65 if ! uname -m | egrep -q "i686|x86_64"; then | 70 if ! uname -m | egrep -q "i686|x86_64"; then |
66 echo "Only x86 architectures are currently supported" >&2 | 71 echo "Only x86 architectures are currently supported" >&2 |
67 exit | 72 exit |
68 fi | 73 fi |
69 fi | 74 fi |
70 | 75 |
71 if [ "x$(id -u)" != x0 ]; then | 76 if [ "x$(id -u)" != x0 ] && [ 0 -eq "${do_quick_check-0}" ]; then |
72 echo "Running as non-root user." | 77 echo "Running as non-root user." |
73 echo "You might have to enter your password one or more times for 'sudo'." | 78 echo "You might have to enter your password one or more times for 'sudo'." |
74 echo | 79 echo |
75 fi | 80 fi |
76 | 81 |
77 # Packages needed for chromeos only | 82 # Packages needed for chromeos only |
78 chromeos_dev_list="libbluetooth-dev libbrlapi-dev" | 83 chromeos_dev_list="libbluetooth-dev" |
Markus (顧孟勤)
2013/10/25 00:40:50
This sounds as if it should be in an unrelated CL.
Michael Moss
2013/10/25 02:45:31
I was just cleaning up dupes (that package is also
| |
79 | 84 |
80 # Packages need for development | 85 # Packages need for development |
81 dev_list="apache2.2-bin bison curl elfutils fakeroot flex g++ gperf | 86 dev_list="apache2.2-bin bison curl elfutils fakeroot flex g++ gperf |
82 language-pack-fr libapache2-mod-php5 libasound2-dev libbrlapi-dev | 87 language-pack-fr libapache2-mod-php5 libasound2-dev libbrlapi-dev |
83 libbz2-dev libcairo2-dev libcups2-dev libcurl4-gnutls-dev libelf-dev | 88 libbz2-dev libcairo2-dev libcups2-dev libcurl4-gnutls-dev libelf-dev |
84 libgconf2-dev libgl1-mesa-dev libglib2.0-dev libglu1-mesa-dev | 89 libgconf2-dev libgl1-mesa-dev libglib2.0-dev libglu1-mesa-dev |
85 libgnome-keyring-dev libgtk2.0-dev libkrb5-dev libnspr4-dev | 90 libgnome-keyring-dev libgtk2.0-dev libkrb5-dev libnspr4-dev |
86 libnss3-dev libpam0g-dev libpci-dev libpulse-dev libsctp-dev | 91 libnss3-dev libpam0g-dev libpci-dev libpulse-dev libsctp-dev |
87 libspeechd-dev libsqlite3-dev libssl-dev libudev-dev libwww-perl | 92 libspeechd-dev libsqlite3-dev libssl-dev libudev-dev libwww-perl |
88 libxslt1-dev libxss-dev libxt-dev libxtst-dev mesa-common-dev | 93 libxslt1-dev libxss-dev libxt-dev libxtst-dev mesa-common-dev |
89 openbox patch perl php5-cgi pkg-config python python-cherrypy3 | 94 openbox patch perl php5-cgi pkg-config python python-cherrypy3 |
90 python-dev python-psutil rpm ruby subversion ttf-dejavu-core | 95 python-dev python-psutil rpm ruby subversion ttf-dejavu-core |
91 ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho ttf-thai-tlwg | 96 ttf-indic-fonts ttf-kochi-gothic ttf-kochi-mincho ttf-thai-tlwg |
92 wdiff git-core libdrm-dev | 97 wdiff git-core libdrm-dev |
93 $chromeos_dev_list" | 98 $chromeos_dev_list" |
94 | 99 |
95 # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built | 100 # 64-bit systems need a minimum set of 32-bit compat packages for the pre-built |
96 # NaCl binaries. These are always needed, regardless of whether or not we want | 101 # NaCl binaries. These are always needed, regardless of whether or not we want |
97 # the full 32-bit "cross-compile" support (--lib32). | 102 # the full 32-bit "cross-compile" support (--lib32). |
98 if [ "$(uname -m)" = "x86_64" ]; then | 103 if [ "$(uname -m)" = "x86_64" ]; then |
99 dev_list="${dev_list} libc6-i386 lib32gcc1 lib32stdc++6" | 104 dev_list="${dev_list} libc6-i386 lib32gcc1 lib32stdc++6" |
100 fi | 105 fi |
101 | 106 |
102 # Run-time libraries required by chromeos only | 107 # Run-time libraries required by chromeos only |
103 chromeos_lib_list="libpulse0 libbz2-1.0 libcurl4-gnutls-dev" | 108 chromeos_lib_list="libpulse0 libbz2-1.0" |
Markus (顧孟勤)
2013/10/25 00:40:50
Same here
Michael Moss
2013/10/25 02:45:31
Another dev_list dupe.
| |
104 | 109 |
105 # Full list of required run-time libraries | 110 # Full list of required run-time libraries |
106 lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcups2 libexpat1 | 111 lib_list="libatk1.0-0 libc6 libasound2 libcairo2 libcups2 libexpat1 |
107 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0 | 112 libfontconfig1 libfreetype6 libglib2.0-0 libgnome-keyring0 |
108 libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0 | 113 libgtk2.0-0 libpam0g libpango1.0-0 libpci3 libpcre3 libpixman-1-0 |
109 libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6 | 114 libpng12-0 libspeechd2 libstdc++6 libsqlite3-0 libx11-6 |
110 libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 | 115 libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 |
111 libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1 | 116 libxext6 libxfixes3 libxi6 libxinerama1 libxrandr2 libxrender1 |
112 libxtst6 zlib1g $chromeos_lib_list" | 117 libxtst6 zlib1g $chromeos_lib_list" |
113 | 118 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
196 exit 1 | 201 exit 1 |
197 ;; | 202 ;; |
198 *) # The user pressed an unrecognized key. As we are not echoing | 203 *) # The user pressed an unrecognized key. As we are not echoing |
199 # any incorrect user input, alert the user by ringing the bell. | 204 # any incorrect user input, alert the user by ringing the bell. |
200 (tput bel) 2>/dev/null | 205 (tput bel) 2>/dev/null |
201 ;; | 206 ;; |
202 esac | 207 esac |
203 done | 208 done |
204 } | 209 } |
205 | 210 |
206 if test "$do_inst_syms" = "" | 211 if test "$do_inst_syms" = "" && test 0 -eq ${do_quick_check-0} |
Markus (顧孟勤)
2013/10/25 00:40:50
We should really clean up the code and either use
Michael Moss
2013/10/25 02:45:31
Agreed, but probably better as a dedicated clean u
| |
207 then | 212 then |
208 echo "This script installs all tools and libraries needed to build Chromium." | 213 echo "This script installs all tools and libraries needed to build Chromium." |
209 echo "" | 214 echo "" |
210 echo "For most of the libraries, it can also install debugging symbols, which" | 215 echo "For most of the libraries, it can also install debugging symbols, which" |
211 echo "will allow you to debug code in the system libraries. Most developers" | 216 echo "will allow you to debug code in the system libraries. Most developers" |
212 echo "won't need these symbols." | 217 echo "won't need these symbols." |
213 echo -n "Do you want me to install them for you (y/N) " | 218 echo -n "Do you want me to install them for you (y/N) " |
214 if yes_no 1; then | 219 if yes_no 1; then |
215 do_inst_syms=1 | 220 do_inst_syms=1 |
216 fi | 221 fi |
217 fi | 222 fi |
218 if test "$do_inst_syms" = "1"; then | 223 if test "$do_inst_syms" = "1"; then |
219 echo "Installing debugging symbols." | 224 echo "Including debugging symbols." |
220 else | 225 else |
221 echo "Skipping installation of debugging symbols." | 226 echo "Skipping debugging symbols." |
222 dbg_list= | 227 dbg_list= |
223 fi | 228 fi |
224 | 229 |
225 # When cross building for arm on 64-bit systems the host binaries | 230 # When cross building for arm on 64-bit systems the host binaries |
226 # that are part of v8 need to be compiled with -m32 which means | 231 # that are part of v8 need to be compiled with -m32 which means |
227 # that basic multilib support is needed. | 232 # that basic multilib support is needed. |
228 if [ "$(uname -m)" = "x86_64" ]; then | 233 if [ "$(uname -m)" = "x86_64" ]; then |
229 arm_list="$arm_list g++-multilib" | 234 arm_list="$arm_list g++-multilib" |
230 fi | 235 fi |
231 | 236 |
232 if test "$do_inst_arm" = "1"; then | 237 if test "$do_inst_arm" = "1" ; then |
233 . /etc/lsb-release | 238 . /etc/lsb-release |
234 if test "$DISTRIB_CODENAME" != "precise"; then | 239 if test "$DISTRIB_CODENAME" != "precise" && \ |
240 test 0 -eq "${do_unsupported-0}"; then | |
Markus (顧孟勤)
2013/10/25 00:40:50
You do realize that you can write "-o" and "-a", d
Michael Moss
2013/10/25 02:45:31
Done.
| |
235 echo "ERROR: Installing the ARM cross toolchain is only available on" \ | 241 echo "ERROR: Installing the ARM cross toolchain is only available on" \ |
236 "Ubuntu precise." >&2 | 242 "Ubuntu precise." >&2 |
237 exit 1 | 243 exit 1 |
238 fi | 244 fi |
239 echo "Installing ARM cross toolchain." | 245 echo "Including ARM cross toolchain." |
240 else | 246 else |
241 echo "Skipping installation of ARM cross toolchain." | 247 echo "Skipping ARM cross toolchain." |
242 arm_list= | 248 arm_list= |
243 fi | 249 fi |
244 | 250 |
251 packages="$(echo "${dev_list} ${lib_list} ${dbg_list} ${arm_list}" | \ | |
252 tr " " "\n" | sort -u | tr "\n" " ")" | |
Markus (顧孟勤)
2013/10/25 00:40:50
Minor nit-pick. You can avoid using "tr", if you u
Michael Moss
2013/10/25 02:45:31
Yeah, since I still have to spawn for sort, I thin
| |
253 | |
254 if [ 1 -eq "${do_quick_check-0}" ] ; then | |
255 failed_check="$(dpkg-query -W -f '${PackageSpec}:${Status}\n' \ | |
256 ${packages} 2>&1 | grep -v "ok installed" || /bin/true)" | |
Markus (顧孟勤)
2013/10/25 00:40:50
You should use ":" instead of "/bin/true". That's
Michael Moss
2013/10/25 02:45:31
'pass' is exactly what I was looking for :)
Done.
| |
257 if [ "$failed_check" ]; then | |
Markus (顧孟勤)
2013/10/25 00:40:50
Shouldn't that read "[ -n "${failed_check}" ]". Yo
Michael Moss
2013/10/25 02:45:31
Done.
| |
258 nomatch="$(echo "$failed_check" | \ | |
259 grep "No packages found matching" | sed -e "s/^.* \(.*\).$/\1/")" | |
Markus (顧孟勤)
2013/10/25 00:40:50
You can probably combine "grep" and "sed" into a s
Michael Moss
2013/10/25 02:45:31
Ugh, yeah. I actually had these in different areas
| |
260 missing="$(echo "$failed_check" | \ | |
261 grep -v "No packages found matching" | sed -e "s/^\(.*\):.*$/\1/")" | |
262 if [ "$nomatch" ]; then | |
263 # Distinguish between packages that actually aren't available to the | |
264 # system (i.e. not in any repo) and packages that just aren't known to | |
265 # dpkg (i.e. managed by apt). | |
266 unknown="" | |
267 for p in $nomatch; do | |
268 if apt-cache show ${p} > /dev/null 2>&1; then | |
Markus (顧孟勤)
2013/10/25 00:40:50
This is a bash script, so you could write ">&/dev/
Michael Moss
2013/10/25 02:45:31
2>&1 is used elsewhere, so I'll leave it consisten
| |
269 missing="${p}\n${missing}" | |
270 else | |
271 unknown="${p}\n${unknown}" | |
272 fi | |
273 done | |
274 if [ "$unknown" ]; then | |
275 echo | |
276 echo "WARNING: The following packages are unknown to your system" | |
277 echo "(maybe missing a repo or need to 'sudo apt-get update'):" | |
278 echo -e "$unknown" | sed -e "s/^\(.*\)$/ \1/" | |
279 fi | |
280 fi | |
281 if [ "$missing" ]; then | |
282 echo | |
283 echo "WARNING: The following packages are not installed:" | |
284 echo -e "$missing" | sed -e "s/^\(.*\)$/ \1/" | |
285 fi | |
286 exit 1 | |
287 fi | |
288 exit 0 | |
289 fi | |
290 | |
245 sudo apt-get update | 291 sudo apt-get update |
246 | 292 |
247 # We initially run "apt-get" with the --reinstall option and parse its output. | 293 # We initially run "apt-get" with the --reinstall option and parse its output. |
248 # This way, we can find all the packages that need to be newly installed | 294 # This way, we can find all the packages that need to be newly installed |
249 # without accidentally promoting any packages from "auto" to "manual". | 295 # without accidentally promoting any packages from "auto" to "manual". |
250 # We then re-run "apt-get" with just the list of missing packages. | 296 # We then re-run "apt-get" with just the list of missing packages. |
251 echo "Finding missing packages..." | 297 echo "Finding missing packages..." |
252 packages="${dev_list} ${lib_list} ${dbg_list} ${arm_list}" | |
253 # Intentionally leaving $packages unquoted so it's more readable. | 298 # Intentionally leaving $packages unquoted so it's more readable. |
254 echo "Packages required: " $packages | 299 echo "Packages required: " $packages |
255 echo | 300 echo |
256 new_list_cmd="sudo apt-get install --reinstall $(echo $packages)" | 301 new_list_cmd="sudo apt-get install --reinstall $(echo $packages)" |
257 if new_list="$(yes n | LANGUAGE=en LANG=C $new_list_cmd)"; then | 302 if new_list="$(yes n | LANGUAGE=en LANG=C $new_list_cmd)"; then |
258 # We probably never hit this following line. | 303 # We probably never hit this following line. |
259 echo "No missing packages, and the packages are up-to-date." | 304 echo "No missing packages, and the packages are up-to-date." |
260 elif [ $? -eq 1 ]; then | 305 elif [ $? -eq 1 ]; then |
261 # We expect apt-get to have exit status of 1. | 306 # We expect apt-get to have exit status of 1. |
262 # This indicates that we cancelled the install with "yes n|". | 307 # This indicates that we cancelled the install with "yes n|". |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 sed -e 's/[.]so[.][0-9].*/.so/' | | 557 sed -e 's/[.]so[.][0-9].*/.so/' | |
513 sort -u); do | 558 sort -u); do |
514 [ "x${i##*/}" = "xld-linux.so" ] && continue | 559 [ "x${i##*/}" = "xld-linux.so" ] && continue |
515 [ -r "$i" ] && continue | 560 [ -r "$i" ] && continue |
516 j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' | | 561 j="$(ls "$i."* | sed -e 's/.*[.]so[.]\([^.]*\)$/\1/;t;d' | |
517 sort -n | tail -n 1)" | 562 sort -n | tail -n 1)" |
518 [ -r "$i.$j" ] || continue | 563 [ -r "$i.$j" ] || continue |
519 sudo ln -s "${i##*/}.$j" "$i" | 564 sudo ln -s "${i##*/}.$j" "$i" |
520 done | 565 done |
521 fi | 566 fi |
OLD | NEW |