xref: /aosp_15_r20/external/angle/build/install-build-deps.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8975f5c5SAndroid Build Coastguard Worker
3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker# Script to install everything needed to build chromium
8*8975f5c5SAndroid Build Coastguard Worker# including items requiring sudo privileges.
9*8975f5c5SAndroid Build Coastguard Worker# See https://chromium.googlesource.com/chromium/src/+/main/docs/linux/build_instructions.md
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Workerimport argparse
12*8975f5c5SAndroid Build Coastguard Workerimport functools
13*8975f5c5SAndroid Build Coastguard Workerimport os
14*8975f5c5SAndroid Build Coastguard Workerimport re
15*8975f5c5SAndroid Build Coastguard Workerimport shutil
16*8975f5c5SAndroid Build Coastguard Workerimport subprocess
17*8975f5c5SAndroid Build Coastguard Workerimport sys
18*8975f5c5SAndroid Build Coastguard Worker
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker@functools.lru_cache(maxsize=1)
21*8975f5c5SAndroid Build Coastguard Workerdef build_apt_package_list():
22*8975f5c5SAndroid Build Coastguard Worker  print("Building apt package list.", file=sys.stderr)
23*8975f5c5SAndroid Build Coastguard Worker  output = subprocess.check_output(["apt-cache", "dumpavail"]).decode()
24*8975f5c5SAndroid Build Coastguard Worker  arch_map = {"i386": ":i386"}
25*8975f5c5SAndroid Build Coastguard Worker  package_regex = re.compile(r"^Package: (.+?)$.+?^Architecture: (.+?)$",
26*8975f5c5SAndroid Build Coastguard Worker                             re.M | re.S)
27*8975f5c5SAndroid Build Coastguard Worker  return set(package + arch_map.get(arch, "")
28*8975f5c5SAndroid Build Coastguard Worker             for package, arch in re.findall(package_regex, output))
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker
31*8975f5c5SAndroid Build Coastguard Workerdef package_exists(package_name: str) -> bool:
32*8975f5c5SAndroid Build Coastguard Worker  return package_name in build_apt_package_list()
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker
35*8975f5c5SAndroid Build Coastguard Workerdef parse_args(argv):
36*8975f5c5SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(
37*8975f5c5SAndroid Build Coastguard Worker      description="Install Chromium build dependencies.")
38*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument("--syms",
39*8975f5c5SAndroid Build Coastguard Worker                      action="store_true",
40*8975f5c5SAndroid Build Coastguard Worker                      help="Enable installation of debugging symbols")
41*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
42*8975f5c5SAndroid Build Coastguard Worker      "--no-syms",
43*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
44*8975f5c5SAndroid Build Coastguard Worker      dest="syms",
45*8975f5c5SAndroid Build Coastguard Worker      help="Disable installation of debugging symbols",
46*8975f5c5SAndroid Build Coastguard Worker  )
47*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
48*8975f5c5SAndroid Build Coastguard Worker      "--lib32",
49*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
50*8975f5c5SAndroid Build Coastguard Worker      help="Enable installation of 32-bit libraries, e.g. for V8 snapshot",
51*8975f5c5SAndroid Build Coastguard Worker  )
52*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
53*8975f5c5SAndroid Build Coastguard Worker      "--android",
54*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
55*8975f5c5SAndroid Build Coastguard Worker      # Deprecated flag retained as functional for backward compatibility:
56*8975f5c5SAndroid Build Coastguard Worker      # Enable installation of android dependencies
57*8975f5c5SAndroid Build Coastguard Worker      help=argparse.SUPPRESS)
58*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
59*8975f5c5SAndroid Build Coastguard Worker      "--no-android",
60*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
61*8975f5c5SAndroid Build Coastguard Worker      dest="android",
62*8975f5c5SAndroid Build Coastguard Worker      # Deprecated flag retained as functional for backward compatibility:
63*8975f5c5SAndroid Build Coastguard Worker      # Enable installation of android dependencies
64*8975f5c5SAndroid Build Coastguard Worker      help=argparse.SUPPRESS)
65*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument("--arm",
66*8975f5c5SAndroid Build Coastguard Worker                      action="store_true",
67*8975f5c5SAndroid Build Coastguard Worker                      help="Enable installation of arm cross toolchain")
68*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
69*8975f5c5SAndroid Build Coastguard Worker      "--no-arm",
70*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
71*8975f5c5SAndroid Build Coastguard Worker      dest="arm",
72*8975f5c5SAndroid Build Coastguard Worker      help="Disable installation of arm cross toolchain",
73*8975f5c5SAndroid Build Coastguard Worker  )
74*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
75*8975f5c5SAndroid Build Coastguard Worker      "--chromeos-fonts",
76*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
77*8975f5c5SAndroid Build Coastguard Worker      help="Enable installation of Chrome OS fonts",
78*8975f5c5SAndroid Build Coastguard Worker  )
79*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
80*8975f5c5SAndroid Build Coastguard Worker      "--no-chromeos-fonts",
81*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
82*8975f5c5SAndroid Build Coastguard Worker      dest="chromeos_fonts",
83*8975f5c5SAndroid Build Coastguard Worker      help="Disable installation of Chrome OS fonts",
84*8975f5c5SAndroid Build Coastguard Worker  )
85*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
86*8975f5c5SAndroid Build Coastguard Worker      "--nacl",
87*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
88*8975f5c5SAndroid Build Coastguard Worker      help="Enable installation of prerequisites for building NaCl",
89*8975f5c5SAndroid Build Coastguard Worker  )
90*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
91*8975f5c5SAndroid Build Coastguard Worker      "--no-nacl",
92*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
93*8975f5c5SAndroid Build Coastguard Worker      dest="nacl",
94*8975f5c5SAndroid Build Coastguard Worker      help="Disable installation of prerequisites for building NaCl",
95*8975f5c5SAndroid Build Coastguard Worker  )
96*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
97*8975f5c5SAndroid Build Coastguard Worker      "--backwards-compatible",
98*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
99*8975f5c5SAndroid Build Coastguard Worker      help=
100*8975f5c5SAndroid Build Coastguard Worker      "Enable installation of packages that are no longer currently needed and"
101*8975f5c5SAndroid Build Coastguard Worker      + "have been removed from this script. Useful for bisection.",
102*8975f5c5SAndroid Build Coastguard Worker  )
103*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
104*8975f5c5SAndroid Build Coastguard Worker      "--no-backwards-compatible",
105*8975f5c5SAndroid Build Coastguard Worker      action="store_false",
106*8975f5c5SAndroid Build Coastguard Worker      dest="backwards_compatible",
107*8975f5c5SAndroid Build Coastguard Worker      help=
108*8975f5c5SAndroid Build Coastguard Worker      "Disable installation of packages that are no longer currently needed and"
109*8975f5c5SAndroid Build Coastguard Worker      + "have been removed from this script.",
110*8975f5c5SAndroid Build Coastguard Worker  )
111*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument("--no-prompt",
112*8975f5c5SAndroid Build Coastguard Worker                      action="store_true",
113*8975f5c5SAndroid Build Coastguard Worker                      help="Automatic yes to prompts")
114*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
115*8975f5c5SAndroid Build Coastguard Worker      "--quick-check",
116*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
117*8975f5c5SAndroid Build Coastguard Worker      help="Quickly try to determine if dependencies are installed",
118*8975f5c5SAndroid Build Coastguard Worker  )
119*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
120*8975f5c5SAndroid Build Coastguard Worker      "--unsupported",
121*8975f5c5SAndroid Build Coastguard Worker      action="store_true",
122*8975f5c5SAndroid Build Coastguard Worker      help="Attempt installation even on unsupported systems",
123*8975f5c5SAndroid Build Coastguard Worker  )
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker  options = parser.parse_args(argv)
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker  if options.arm or options.android:
128*8975f5c5SAndroid Build Coastguard Worker    options.lib32 = True
129*8975f5c5SAndroid Build Coastguard Worker
130*8975f5c5SAndroid Build Coastguard Worker  return options
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Workerdef check_lsb_release():
134*8975f5c5SAndroid Build Coastguard Worker  if not shutil.which("lsb_release"):
135*8975f5c5SAndroid Build Coastguard Worker    print("ERROR: lsb_release not found in $PATH", file=sys.stderr)
136*8975f5c5SAndroid Build Coastguard Worker    print("try: sudo apt-get install lsb-release", file=sys.stderr)
137*8975f5c5SAndroid Build Coastguard Worker    sys.exit(1)
138*8975f5c5SAndroid Build Coastguard Worker
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker@functools.lru_cache(maxsize=1)
141*8975f5c5SAndroid Build Coastguard Workerdef distro_codename():
142*8975f5c5SAndroid Build Coastguard Worker  return subprocess.check_output(["lsb_release", "--codename",
143*8975f5c5SAndroid Build Coastguard Worker                                  "--short"]).decode().strip()
144*8975f5c5SAndroid Build Coastguard Worker
145*8975f5c5SAndroid Build Coastguard Worker
146*8975f5c5SAndroid Build Coastguard Workerdef check_distro(options):
147*8975f5c5SAndroid Build Coastguard Worker  if options.unsupported or options.quick_check:
148*8975f5c5SAndroid Build Coastguard Worker    return
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker  distro_id = subprocess.check_output(["lsb_release", "--id",
151*8975f5c5SAndroid Build Coastguard Worker                                       "--short"]).decode().strip()
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker  supported_codenames = ["focal", "jammy", "noble"]
154*8975f5c5SAndroid Build Coastguard Worker  supported_ids = ["Debian"]
155*8975f5c5SAndroid Build Coastguard Worker
156*8975f5c5SAndroid Build Coastguard Worker  if (distro_codename() not in supported_codenames
157*8975f5c5SAndroid Build Coastguard Worker      and distro_id not in supported_ids):
158*8975f5c5SAndroid Build Coastguard Worker    print(
159*8975f5c5SAndroid Build Coastguard Worker        "WARNING: The following distributions are supported,",
160*8975f5c5SAndroid Build Coastguard Worker        "but distributions not in the list below can also try to install",
161*8975f5c5SAndroid Build Coastguard Worker        "dependencies by passing the `--unsupported` parameter.",
162*8975f5c5SAndroid Build Coastguard Worker        "EoS refers to end of standard support and does not include",
163*8975f5c5SAndroid Build Coastguard Worker        "extended security support.",
164*8975f5c5SAndroid Build Coastguard Worker        "\tUbuntu 20.04 LTS (focal with EoS April 2025)",
165*8975f5c5SAndroid Build Coastguard Worker        "\tUbuntu 22.04 LTS (jammy with EoS June 2027)",
166*8975f5c5SAndroid Build Coastguard Worker        "\tUbuntu 24.04 LTS (noble with EoS June 2029)",
167*8975f5c5SAndroid Build Coastguard Worker        "\tDebian 11 (bullseye) or later",
168*8975f5c5SAndroid Build Coastguard Worker        sep="\n",
169*8975f5c5SAndroid Build Coastguard Worker        file=sys.stderr,
170*8975f5c5SAndroid Build Coastguard Worker    )
171*8975f5c5SAndroid Build Coastguard Worker    sys.exit(1)
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Workerdef check_architecture():
175*8975f5c5SAndroid Build Coastguard Worker  architecture = subprocess.check_output(["uname", "-m"]).decode().strip()
176*8975f5c5SAndroid Build Coastguard Worker  if architecture not in ["i686", "x86_64", 'aarch64']:
177*8975f5c5SAndroid Build Coastguard Worker    print("Only x86 and ARM64 architectures are currently supported",
178*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
179*8975f5c5SAndroid Build Coastguard Worker    sys.exit(1)
180*8975f5c5SAndroid Build Coastguard Worker
181*8975f5c5SAndroid Build Coastguard Worker
182*8975f5c5SAndroid Build Coastguard Workerdef check_root():
183*8975f5c5SAndroid Build Coastguard Worker  if os.geteuid() != 0:
184*8975f5c5SAndroid Build Coastguard Worker    print("Running as non-root user.", file=sys.stderr)
185*8975f5c5SAndroid Build Coastguard Worker    print("You might have to enter your password one or more times for 'sudo'.",
186*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
187*8975f5c5SAndroid Build Coastguard Worker    print(file=sys.stderr)
188*8975f5c5SAndroid Build Coastguard Worker
189*8975f5c5SAndroid Build Coastguard Worker
190*8975f5c5SAndroid Build Coastguard Workerdef apt_update(options):
191*8975f5c5SAndroid Build Coastguard Worker  if options.lib32 or options.nacl:
192*8975f5c5SAndroid Build Coastguard Worker    subprocess.check_call(["sudo", "dpkg", "--add-architecture", "i386"])
193*8975f5c5SAndroid Build Coastguard Worker  subprocess.check_call(["sudo", "apt-get", "update"])
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker
196*8975f5c5SAndroid Build Coastguard Worker# Packages needed for development
197*8975f5c5SAndroid Build Coastguard Workerdef dev_list():
198*8975f5c5SAndroid Build Coastguard Worker  packages = [
199*8975f5c5SAndroid Build Coastguard Worker      "binutils",
200*8975f5c5SAndroid Build Coastguard Worker      "bison",
201*8975f5c5SAndroid Build Coastguard Worker      "bzip2",
202*8975f5c5SAndroid Build Coastguard Worker      "cdbs",
203*8975f5c5SAndroid Build Coastguard Worker      "curl",
204*8975f5c5SAndroid Build Coastguard Worker      "dbus-x11",
205*8975f5c5SAndroid Build Coastguard Worker      "devscripts",
206*8975f5c5SAndroid Build Coastguard Worker      "dpkg-dev",
207*8975f5c5SAndroid Build Coastguard Worker      "elfutils",
208*8975f5c5SAndroid Build Coastguard Worker      "fakeroot",
209*8975f5c5SAndroid Build Coastguard Worker      "flex",
210*8975f5c5SAndroid Build Coastguard Worker      "git-core",
211*8975f5c5SAndroid Build Coastguard Worker      "gperf",
212*8975f5c5SAndroid Build Coastguard Worker      "libasound2-dev",
213*8975f5c5SAndroid Build Coastguard Worker      "libatspi2.0-dev",
214*8975f5c5SAndroid Build Coastguard Worker      "libbrlapi-dev",
215*8975f5c5SAndroid Build Coastguard Worker      "libbz2-dev",
216*8975f5c5SAndroid Build Coastguard Worker      "libc6-dev",
217*8975f5c5SAndroid Build Coastguard Worker      "libcairo2-dev",
218*8975f5c5SAndroid Build Coastguard Worker      "libcap-dev",
219*8975f5c5SAndroid Build Coastguard Worker      "libcups2-dev",
220*8975f5c5SAndroid Build Coastguard Worker      "libcurl4-gnutls-dev",
221*8975f5c5SAndroid Build Coastguard Worker      "libdrm-dev",
222*8975f5c5SAndroid Build Coastguard Worker      "libelf-dev",
223*8975f5c5SAndroid Build Coastguard Worker      "libevdev-dev",
224*8975f5c5SAndroid Build Coastguard Worker      "libffi-dev",
225*8975f5c5SAndroid Build Coastguard Worker      "libfuse2",
226*8975f5c5SAndroid Build Coastguard Worker      "libgbm-dev",
227*8975f5c5SAndroid Build Coastguard Worker      "libglib2.0-dev",
228*8975f5c5SAndroid Build Coastguard Worker      "libglu1-mesa-dev",
229*8975f5c5SAndroid Build Coastguard Worker      "libgtk-3-dev",
230*8975f5c5SAndroid Build Coastguard Worker      "libkrb5-dev",
231*8975f5c5SAndroid Build Coastguard Worker      "libnspr4-dev",
232*8975f5c5SAndroid Build Coastguard Worker      "libnss3-dev",
233*8975f5c5SAndroid Build Coastguard Worker      "libpam0g-dev",
234*8975f5c5SAndroid Build Coastguard Worker      "libpci-dev",
235*8975f5c5SAndroid Build Coastguard Worker      "libpulse-dev",
236*8975f5c5SAndroid Build Coastguard Worker      "libsctp-dev",
237*8975f5c5SAndroid Build Coastguard Worker      "libspeechd-dev",
238*8975f5c5SAndroid Build Coastguard Worker      "libsqlite3-dev",
239*8975f5c5SAndroid Build Coastguard Worker      "libssl-dev",
240*8975f5c5SAndroid Build Coastguard Worker      "libsystemd-dev",
241*8975f5c5SAndroid Build Coastguard Worker      "libudev-dev",
242*8975f5c5SAndroid Build Coastguard Worker      "libudev1",
243*8975f5c5SAndroid Build Coastguard Worker      "libva-dev",
244*8975f5c5SAndroid Build Coastguard Worker      "libwww-perl",
245*8975f5c5SAndroid Build Coastguard Worker      "libxshmfence-dev",
246*8975f5c5SAndroid Build Coastguard Worker      "libxslt1-dev",
247*8975f5c5SAndroid Build Coastguard Worker      "libxss-dev",
248*8975f5c5SAndroid Build Coastguard Worker      "libxt-dev",
249*8975f5c5SAndroid Build Coastguard Worker      "libxtst-dev",
250*8975f5c5SAndroid Build Coastguard Worker      "lighttpd",
251*8975f5c5SAndroid Build Coastguard Worker      "locales",
252*8975f5c5SAndroid Build Coastguard Worker      "openbox",
253*8975f5c5SAndroid Build Coastguard Worker      "p7zip",
254*8975f5c5SAndroid Build Coastguard Worker      "patch",
255*8975f5c5SAndroid Build Coastguard Worker      "perl",
256*8975f5c5SAndroid Build Coastguard Worker      "pkgconf",
257*8975f5c5SAndroid Build Coastguard Worker      "rpm",
258*8975f5c5SAndroid Build Coastguard Worker      "ruby",
259*8975f5c5SAndroid Build Coastguard Worker      "uuid-dev",
260*8975f5c5SAndroid Build Coastguard Worker      "wdiff",
261*8975f5c5SAndroid Build Coastguard Worker      "x11-utils",
262*8975f5c5SAndroid Build Coastguard Worker      "xcompmgr",
263*8975f5c5SAndroid Build Coastguard Worker      "xz-utils",
264*8975f5c5SAndroid Build Coastguard Worker      "zip",
265*8975f5c5SAndroid Build Coastguard Worker  ]
266*8975f5c5SAndroid Build Coastguard Worker
267*8975f5c5SAndroid Build Coastguard Worker  # Packages needed for chromeos only
268*8975f5c5SAndroid Build Coastguard Worker  packages += [
269*8975f5c5SAndroid Build Coastguard Worker      "libbluetooth-dev",
270*8975f5c5SAndroid Build Coastguard Worker      "libxkbcommon-dev",
271*8975f5c5SAndroid Build Coastguard Worker      "mesa-common-dev",
272*8975f5c5SAndroid Build Coastguard Worker      "zstd",
273*8975f5c5SAndroid Build Coastguard Worker  ]
274*8975f5c5SAndroid Build Coastguard Worker
275*8975f5c5SAndroid Build Coastguard Worker  if package_exists("realpath"):
276*8975f5c5SAndroid Build Coastguard Worker    packages.append("realpath")
277*8975f5c5SAndroid Build Coastguard Worker
278*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libjpeg-dev"):
279*8975f5c5SAndroid Build Coastguard Worker    packages.append("libjpeg-dev")
280*8975f5c5SAndroid Build Coastguard Worker  else:
281*8975f5c5SAndroid Build Coastguard Worker    packages.append("libjpeg62-dev")
282*8975f5c5SAndroid Build Coastguard Worker
283*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libbrlapi0.8"):
284*8975f5c5SAndroid Build Coastguard Worker    packages.append("libbrlapi0.8")
285*8975f5c5SAndroid Build Coastguard Worker  elif package_exists("libbrlapi0.7"):
286*8975f5c5SAndroid Build Coastguard Worker    packages.append("libbrlapi0.7")
287*8975f5c5SAndroid Build Coastguard Worker  elif package_exists("libbrlapi0.6"):
288*8975f5c5SAndroid Build Coastguard Worker    packages.append("libbrlapi0.6")
289*8975f5c5SAndroid Build Coastguard Worker  else:
290*8975f5c5SAndroid Build Coastguard Worker    packages.append("libbrlapi0.5")
291*8975f5c5SAndroid Build Coastguard Worker
292*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libav-tools"):
293*8975f5c5SAndroid Build Coastguard Worker    packages.append("libav-tools")
294*8975f5c5SAndroid Build Coastguard Worker
295*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libvulkan-dev"):
296*8975f5c5SAndroid Build Coastguard Worker    packages.append("libvulkan-dev")
297*8975f5c5SAndroid Build Coastguard Worker
298*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libinput-dev"):
299*8975f5c5SAndroid Build Coastguard Worker    packages.append("libinput-dev")
300*8975f5c5SAndroid Build Coastguard Worker
301*8975f5c5SAndroid Build Coastguard Worker  # So accessibility APIs work, needed for AX fuzzer
302*8975f5c5SAndroid Build Coastguard Worker  if package_exists("at-spi2-core"):
303*8975f5c5SAndroid Build Coastguard Worker    packages.append("at-spi2-core")
304*8975f5c5SAndroid Build Coastguard Worker
305*8975f5c5SAndroid Build Coastguard Worker  # Cross-toolchain strip is needed for building the sysroots.
306*8975f5c5SAndroid Build Coastguard Worker  if package_exists("binutils-arm-linux-gnueabihf"):
307*8975f5c5SAndroid Build Coastguard Worker    packages.append("binutils-arm-linux-gnueabihf")
308*8975f5c5SAndroid Build Coastguard Worker  if package_exists("binutils-aarch64-linux-gnu"):
309*8975f5c5SAndroid Build Coastguard Worker    packages.append("binutils-aarch64-linux-gnu")
310*8975f5c5SAndroid Build Coastguard Worker  if package_exists("binutils-mipsel-linux-gnu"):
311*8975f5c5SAndroid Build Coastguard Worker    packages.append("binutils-mipsel-linux-gnu")
312*8975f5c5SAndroid Build Coastguard Worker  if package_exists("binutils-mips64el-linux-gnuabi64"):
313*8975f5c5SAndroid Build Coastguard Worker    packages.append("binutils-mips64el-linux-gnuabi64")
314*8975f5c5SAndroid Build Coastguard Worker
315*8975f5c5SAndroid Build Coastguard Worker  # 64-bit systems need a minimum set of 32-bit compat packages for the
316*8975f5c5SAndroid Build Coastguard Worker  # pre-built NaCl binaries.
317*8975f5c5SAndroid Build Coastguard Worker  if "ELF 64-bit" in subprocess.check_output(["file", "-L",
318*8975f5c5SAndroid Build Coastguard Worker                                              "/sbin/init"]).decode():
319*8975f5c5SAndroid Build Coastguard Worker    # ARM64 may not support these.
320*8975f5c5SAndroid Build Coastguard Worker    if package_exists("libc6-i386"):
321*8975f5c5SAndroid Build Coastguard Worker      packages.append("libc6-i386")
322*8975f5c5SAndroid Build Coastguard Worker    if package_exists("lib32stdc++6"):
323*8975f5c5SAndroid Build Coastguard Worker      packages.append("lib32stdc++6")
324*8975f5c5SAndroid Build Coastguard Worker
325*8975f5c5SAndroid Build Coastguard Worker    # lib32gcc-s1 used to be called lib32gcc1 in older distros.
326*8975f5c5SAndroid Build Coastguard Worker    if package_exists("lib32gcc-s1"):
327*8975f5c5SAndroid Build Coastguard Worker      packages.append("lib32gcc-s1")
328*8975f5c5SAndroid Build Coastguard Worker    elif package_exists("lib32gcc1"):
329*8975f5c5SAndroid Build Coastguard Worker      packages.append("lib32gcc1")
330*8975f5c5SAndroid Build Coastguard Worker
331*8975f5c5SAndroid Build Coastguard Worker  return packages
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Worker
334*8975f5c5SAndroid Build Coastguard Worker# List of required run-time libraries
335*8975f5c5SAndroid Build Coastguard Workerdef lib_list():
336*8975f5c5SAndroid Build Coastguard Worker  packages = [
337*8975f5c5SAndroid Build Coastguard Worker      "libatk1.0-0",
338*8975f5c5SAndroid Build Coastguard Worker      "libatspi2.0-0",
339*8975f5c5SAndroid Build Coastguard Worker      "libc6",
340*8975f5c5SAndroid Build Coastguard Worker      "libcairo2",
341*8975f5c5SAndroid Build Coastguard Worker      "libcap2",
342*8975f5c5SAndroid Build Coastguard Worker      "libcgi-session-perl",
343*8975f5c5SAndroid Build Coastguard Worker      "libcups2",
344*8975f5c5SAndroid Build Coastguard Worker      "libdrm2",
345*8975f5c5SAndroid Build Coastguard Worker      "libegl1",
346*8975f5c5SAndroid Build Coastguard Worker      "libevdev2",
347*8975f5c5SAndroid Build Coastguard Worker      "libexpat1",
348*8975f5c5SAndroid Build Coastguard Worker      "libfontconfig1",
349*8975f5c5SAndroid Build Coastguard Worker      "libfreetype6",
350*8975f5c5SAndroid Build Coastguard Worker      "libgbm1",
351*8975f5c5SAndroid Build Coastguard Worker      "libglib2.0-0",
352*8975f5c5SAndroid Build Coastguard Worker      "libgl1",
353*8975f5c5SAndroid Build Coastguard Worker      "libgtk-3-0",
354*8975f5c5SAndroid Build Coastguard Worker      "libpam0g",
355*8975f5c5SAndroid Build Coastguard Worker      "libpango-1.0-0",
356*8975f5c5SAndroid Build Coastguard Worker      "libpangocairo-1.0-0",
357*8975f5c5SAndroid Build Coastguard Worker      "libpci3",
358*8975f5c5SAndroid Build Coastguard Worker      "libpcre3",
359*8975f5c5SAndroid Build Coastguard Worker      "libpixman-1-0",
360*8975f5c5SAndroid Build Coastguard Worker      "libspeechd2",
361*8975f5c5SAndroid Build Coastguard Worker      "libstdc++6",
362*8975f5c5SAndroid Build Coastguard Worker      "libsqlite3-0",
363*8975f5c5SAndroid Build Coastguard Worker      "libuuid1",
364*8975f5c5SAndroid Build Coastguard Worker      "libwayland-egl1",
365*8975f5c5SAndroid Build Coastguard Worker      "libwayland-egl1-mesa",
366*8975f5c5SAndroid Build Coastguard Worker      "libx11-6",
367*8975f5c5SAndroid Build Coastguard Worker      "libx11-xcb1",
368*8975f5c5SAndroid Build Coastguard Worker      "libxau6",
369*8975f5c5SAndroid Build Coastguard Worker      "libxcb1",
370*8975f5c5SAndroid Build Coastguard Worker      "libxcomposite1",
371*8975f5c5SAndroid Build Coastguard Worker      "libxcursor1",
372*8975f5c5SAndroid Build Coastguard Worker      "libxdamage1",
373*8975f5c5SAndroid Build Coastguard Worker      "libxdmcp6",
374*8975f5c5SAndroid Build Coastguard Worker      "libxext6",
375*8975f5c5SAndroid Build Coastguard Worker      "libxfixes3",
376*8975f5c5SAndroid Build Coastguard Worker      "libxi6",
377*8975f5c5SAndroid Build Coastguard Worker      "libxinerama1",
378*8975f5c5SAndroid Build Coastguard Worker      "libxrandr2",
379*8975f5c5SAndroid Build Coastguard Worker      "libxrender1",
380*8975f5c5SAndroid Build Coastguard Worker      "libxtst6",
381*8975f5c5SAndroid Build Coastguard Worker      "x11-utils",
382*8975f5c5SAndroid Build Coastguard Worker      "x11-xserver-utils",
383*8975f5c5SAndroid Build Coastguard Worker      "xserver-xorg-core",
384*8975f5c5SAndroid Build Coastguard Worker      "xserver-xorg-video-dummy",
385*8975f5c5SAndroid Build Coastguard Worker      "xvfb",
386*8975f5c5SAndroid Build Coastguard Worker      "zlib1g",
387*8975f5c5SAndroid Build Coastguard Worker  ]
388*8975f5c5SAndroid Build Coastguard Worker
389*8975f5c5SAndroid Build Coastguard Worker  # Run-time libraries required by chromeos only
390*8975f5c5SAndroid Build Coastguard Worker  packages += [
391*8975f5c5SAndroid Build Coastguard Worker      "libpulse0",
392*8975f5c5SAndroid Build Coastguard Worker      "libbz2-1.0",
393*8975f5c5SAndroid Build Coastguard Worker  ]
394*8975f5c5SAndroid Build Coastguard Worker
395*8975f5c5SAndroid Build Coastguard Worker  # May not exist (e.g. ARM64)
396*8975f5c5SAndroid Build Coastguard Worker  if package_exists("lib32z1"):
397*8975f5c5SAndroid Build Coastguard Worker    packages.append("lib32z1")
398*8975f5c5SAndroid Build Coastguard Worker
399*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libffi8"):
400*8975f5c5SAndroid Build Coastguard Worker    packages.append("libffi8")
401*8975f5c5SAndroid Build Coastguard Worker  elif package_exists("libffi7"):
402*8975f5c5SAndroid Build Coastguard Worker    packages.append("libffi7")
403*8975f5c5SAndroid Build Coastguard Worker  elif package_exists("libffi6"):
404*8975f5c5SAndroid Build Coastguard Worker    packages.append("libffi6")
405*8975f5c5SAndroid Build Coastguard Worker
406*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libpng16-16t64"):
407*8975f5c5SAndroid Build Coastguard Worker    packages.append("libpng16-16t64")
408*8975f5c5SAndroid Build Coastguard Worker  elif package_exists("libpng16-16"):
409*8975f5c5SAndroid Build Coastguard Worker    packages.append("libpng16-16")
410*8975f5c5SAndroid Build Coastguard Worker  else:
411*8975f5c5SAndroid Build Coastguard Worker    packages.append("libpng12-0")
412*8975f5c5SAndroid Build Coastguard Worker
413*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libnspr4"):
414*8975f5c5SAndroid Build Coastguard Worker    packages.extend(["libnspr4", "libnss3"])
415*8975f5c5SAndroid Build Coastguard Worker  else:
416*8975f5c5SAndroid Build Coastguard Worker    packages.extend(["libnspr4-0d", "libnss3-1d"])
417*8975f5c5SAndroid Build Coastguard Worker
418*8975f5c5SAndroid Build Coastguard Worker  if package_exists("appmenu-gtk"):
419*8975f5c5SAndroid Build Coastguard Worker    packages.append("appmenu-gtk")
420*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libgnome-keyring0"):
421*8975f5c5SAndroid Build Coastguard Worker    packages.append("libgnome-keyring0")
422*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libgnome-keyring-dev"):
423*8975f5c5SAndroid Build Coastguard Worker    packages.append("libgnome-keyring-dev")
424*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libvulkan1"):
425*8975f5c5SAndroid Build Coastguard Worker    packages.append("libvulkan1")
426*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libinput10"):
427*8975f5c5SAndroid Build Coastguard Worker    packages.append("libinput10")
428*8975f5c5SAndroid Build Coastguard Worker
429*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libncurses6"):
430*8975f5c5SAndroid Build Coastguard Worker    packages.append("libncurses6")
431*8975f5c5SAndroid Build Coastguard Worker  else:
432*8975f5c5SAndroid Build Coastguard Worker    packages.append("libncurses5")
433*8975f5c5SAndroid Build Coastguard Worker
434*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libasound2t64"):
435*8975f5c5SAndroid Build Coastguard Worker    packages.append("libasound2t64")
436*8975f5c5SAndroid Build Coastguard Worker  else:
437*8975f5c5SAndroid Build Coastguard Worker    packages.append("libasound2")
438*8975f5c5SAndroid Build Coastguard Worker
439*8975f5c5SAndroid Build Coastguard Worker  return packages
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker
442*8975f5c5SAndroid Build Coastguard Workerdef lib32_list(options):
443*8975f5c5SAndroid Build Coastguard Worker  if not options.lib32:
444*8975f5c5SAndroid Build Coastguard Worker    print("Skipping 32-bit libraries.", file=sys.stderr)
445*8975f5c5SAndroid Build Coastguard Worker    return []
446*8975f5c5SAndroid Build Coastguard Worker  print("Including 32-bit libraries.", file=sys.stderr)
447*8975f5c5SAndroid Build Coastguard Worker
448*8975f5c5SAndroid Build Coastguard Worker  packages = [
449*8975f5c5SAndroid Build Coastguard Worker      # 32-bit libraries needed for a 32-bit build
450*8975f5c5SAndroid Build Coastguard Worker      # includes some 32-bit libraries required by the Android SDK
451*8975f5c5SAndroid Build Coastguard Worker      # See https://developer.android.com/sdk/installing/index.html?pkg=tools
452*8975f5c5SAndroid Build Coastguard Worker      "libasound2:i386",
453*8975f5c5SAndroid Build Coastguard Worker      "libatk-bridge2.0-0:i386",
454*8975f5c5SAndroid Build Coastguard Worker      "libatk1.0-0:i386",
455*8975f5c5SAndroid Build Coastguard Worker      "libatspi2.0-0:i386",
456*8975f5c5SAndroid Build Coastguard Worker      "libdbus-1-3:i386",
457*8975f5c5SAndroid Build Coastguard Worker      "libegl1:i386",
458*8975f5c5SAndroid Build Coastguard Worker      "libgl1:i386",
459*8975f5c5SAndroid Build Coastguard Worker      "libglib2.0-0:i386",
460*8975f5c5SAndroid Build Coastguard Worker      "libnss3:i386",
461*8975f5c5SAndroid Build Coastguard Worker      "libpango-1.0-0:i386",
462*8975f5c5SAndroid Build Coastguard Worker      "libpangocairo-1.0-0:i386",
463*8975f5c5SAndroid Build Coastguard Worker      "libstdc++6:i386",
464*8975f5c5SAndroid Build Coastguard Worker      "libwayland-egl1:i386",
465*8975f5c5SAndroid Build Coastguard Worker      "libx11-xcb1:i386",
466*8975f5c5SAndroid Build Coastguard Worker      "libxcomposite1:i386",
467*8975f5c5SAndroid Build Coastguard Worker      "libxdamage1:i386",
468*8975f5c5SAndroid Build Coastguard Worker      "libxkbcommon0:i386",
469*8975f5c5SAndroid Build Coastguard Worker      "libxrandr2:i386",
470*8975f5c5SAndroid Build Coastguard Worker      "libxtst6:i386",
471*8975f5c5SAndroid Build Coastguard Worker      "zlib1g:i386",
472*8975f5c5SAndroid Build Coastguard Worker      # 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf
473*8975f5c5SAndroid Build Coastguard Worker      "linux-libc-dev:i386",
474*8975f5c5SAndroid Build Coastguard Worker      "libexpat1:i386",
475*8975f5c5SAndroid Build Coastguard Worker      "libpci3:i386",
476*8975f5c5SAndroid Build Coastguard Worker  ]
477*8975f5c5SAndroid Build Coastguard Worker
478*8975f5c5SAndroid Build Coastguard Worker  # When cross building for arm/Android on 64-bit systems the host binaries
479*8975f5c5SAndroid Build Coastguard Worker  # that are part of v8 need to be compiled with -m32 which means
480*8975f5c5SAndroid Build Coastguard Worker  # that basic multilib support is needed.
481*8975f5c5SAndroid Build Coastguard Worker  if "ELF 64-bit" in subprocess.check_output(["file", "-L",
482*8975f5c5SAndroid Build Coastguard Worker                                              "/sbin/init"]).decode():
483*8975f5c5SAndroid Build Coastguard Worker    # gcc-multilib conflicts with the arm cross compiler but
484*8975f5c5SAndroid Build Coastguard Worker    # g++-X.Y-multilib gives us the 32-bit support that we need. Find out the
485*8975f5c5SAndroid Build Coastguard Worker    # appropriate value of X and Y by seeing what version the current
486*8975f5c5SAndroid Build Coastguard Worker    # distribution's g++-multilib package depends on.
487*8975f5c5SAndroid Build Coastguard Worker    lines = subprocess.check_output(
488*8975f5c5SAndroid Build Coastguard Worker        ["apt-cache", "depends", "g++-multilib", "--important"]).decode()
489*8975f5c5SAndroid Build Coastguard Worker    pattern = re.compile(r"g\+\+-[0-9.]+-multilib")
490*8975f5c5SAndroid Build Coastguard Worker    packages += re.findall(pattern, lines)
491*8975f5c5SAndroid Build Coastguard Worker
492*8975f5c5SAndroid Build Coastguard Worker  if package_exists("libncurses6:i386"):
493*8975f5c5SAndroid Build Coastguard Worker    packages.append("libncurses6:i386")
494*8975f5c5SAndroid Build Coastguard Worker  else:
495*8975f5c5SAndroid Build Coastguard Worker    packages.append("libncurses5:i386")
496*8975f5c5SAndroid Build Coastguard Worker
497*8975f5c5SAndroid Build Coastguard Worker  return packages
498*8975f5c5SAndroid Build Coastguard Worker
499*8975f5c5SAndroid Build Coastguard Worker
500*8975f5c5SAndroid Build Coastguard Worker# Packages that have been removed from this script. Regardless of configuration
501*8975f5c5SAndroid Build Coastguard Worker# or options passed to this script, whenever a package is removed, it should be
502*8975f5c5SAndroid Build Coastguard Worker# added here.
503*8975f5c5SAndroid Build Coastguard Workerdef backwards_compatible_list(options):
504*8975f5c5SAndroid Build Coastguard Worker  if not options.backwards_compatible:
505*8975f5c5SAndroid Build Coastguard Worker    print("Skipping backwards compatible packages.", file=sys.stderr)
506*8975f5c5SAndroid Build Coastguard Worker    return []
507*8975f5c5SAndroid Build Coastguard Worker  print("Including backwards compatible packages.", file=sys.stderr)
508*8975f5c5SAndroid Build Coastguard Worker
509*8975f5c5SAndroid Build Coastguard Worker  packages = [
510*8975f5c5SAndroid Build Coastguard Worker      "7za",
511*8975f5c5SAndroid Build Coastguard Worker      "fonts-indic",
512*8975f5c5SAndroid Build Coastguard Worker      "fonts-ipafont",
513*8975f5c5SAndroid Build Coastguard Worker      "fonts-stix",
514*8975f5c5SAndroid Build Coastguard Worker      "fonts-thai-tlwg",
515*8975f5c5SAndroid Build Coastguard Worker      "fonts-tlwg-garuda",
516*8975f5c5SAndroid Build Coastguard Worker      "g++",
517*8975f5c5SAndroid Build Coastguard Worker      "g++-4.8-multilib-arm-linux-gnueabihf",
518*8975f5c5SAndroid Build Coastguard Worker      "gcc-4.8-multilib-arm-linux-gnueabihf",
519*8975f5c5SAndroid Build Coastguard Worker      "g++-9-multilib-arm-linux-gnueabihf",
520*8975f5c5SAndroid Build Coastguard Worker      "gcc-9-multilib-arm-linux-gnueabihf",
521*8975f5c5SAndroid Build Coastguard Worker      "gcc-arm-linux-gnueabihf",
522*8975f5c5SAndroid Build Coastguard Worker      "g++-10-multilib-arm-linux-gnueabihf",
523*8975f5c5SAndroid Build Coastguard Worker      "gcc-10-multilib-arm-linux-gnueabihf",
524*8975f5c5SAndroid Build Coastguard Worker      "g++-10-arm-linux-gnueabihf",
525*8975f5c5SAndroid Build Coastguard Worker      "gcc-10-arm-linux-gnueabihf",
526*8975f5c5SAndroid Build Coastguard Worker      "git-svn",
527*8975f5c5SAndroid Build Coastguard Worker      "language-pack-da",
528*8975f5c5SAndroid Build Coastguard Worker      "language-pack-fr",
529*8975f5c5SAndroid Build Coastguard Worker      "language-pack-he",
530*8975f5c5SAndroid Build Coastguard Worker      "language-pack-zh-hant",
531*8975f5c5SAndroid Build Coastguard Worker      "libappindicator-dev",
532*8975f5c5SAndroid Build Coastguard Worker      "libappindicator1",
533*8975f5c5SAndroid Build Coastguard Worker      "libappindicator3-1",
534*8975f5c5SAndroid Build Coastguard Worker      "libappindicator3-dev",
535*8975f5c5SAndroid Build Coastguard Worker      "libdconf-dev",
536*8975f5c5SAndroid Build Coastguard Worker      "libdconf1",
537*8975f5c5SAndroid Build Coastguard Worker      "libdconf1:i386",
538*8975f5c5SAndroid Build Coastguard Worker      "libexif-dev",
539*8975f5c5SAndroid Build Coastguard Worker      "libexif12",
540*8975f5c5SAndroid Build Coastguard Worker      "libexif12:i386",
541*8975f5c5SAndroid Build Coastguard Worker      "libgbm-dev",
542*8975f5c5SAndroid Build Coastguard Worker      "libgbm-dev-lts-trusty",
543*8975f5c5SAndroid Build Coastguard Worker      "libgbm-dev-lts-xenial",
544*8975f5c5SAndroid Build Coastguard Worker      "libgconf-2-4:i386",
545*8975f5c5SAndroid Build Coastguard Worker      "libgconf2-dev",
546*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-dev",
547*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-dev-lts-trusty",
548*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-dev-lts-xenial",
549*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-glx:i386",
550*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-glx-lts-trusty:i386",
551*8975f5c5SAndroid Build Coastguard Worker      "libgl1-mesa-glx-lts-xenial:i386",
552*8975f5c5SAndroid Build Coastguard Worker      "libgles2-mesa-dev",
553*8975f5c5SAndroid Build Coastguard Worker      "libgles2-mesa-dev-lts-trusty",
554*8975f5c5SAndroid Build Coastguard Worker      "libgles2-mesa-dev-lts-xenial",
555*8975f5c5SAndroid Build Coastguard Worker      "libgtk-3-0:i386",
556*8975f5c5SAndroid Build Coastguard Worker      "libgtk2.0-0",
557*8975f5c5SAndroid Build Coastguard Worker      "libgtk2.0-0:i386",
558*8975f5c5SAndroid Build Coastguard Worker      "libgtk2.0-dev",
559*8975f5c5SAndroid Build Coastguard Worker      "mesa-common-dev",
560*8975f5c5SAndroid Build Coastguard Worker      "mesa-common-dev-lts-trusty",
561*8975f5c5SAndroid Build Coastguard Worker      "mesa-common-dev-lts-xenial",
562*8975f5c5SAndroid Build Coastguard Worker      "msttcorefonts",
563*8975f5c5SAndroid Build Coastguard Worker      "python-dev",
564*8975f5c5SAndroid Build Coastguard Worker      "python-setuptools",
565*8975f5c5SAndroid Build Coastguard Worker      "snapcraft",
566*8975f5c5SAndroid Build Coastguard Worker      "ttf-dejavu-core",
567*8975f5c5SAndroid Build Coastguard Worker      "ttf-indic-fonts",
568*8975f5c5SAndroid Build Coastguard Worker      "ttf-kochi-gothic",
569*8975f5c5SAndroid Build Coastguard Worker      "ttf-kochi-mincho",
570*8975f5c5SAndroid Build Coastguard Worker      "ttf-mscorefonts-installer",
571*8975f5c5SAndroid Build Coastguard Worker      "xfonts-mathml",
572*8975f5c5SAndroid Build Coastguard Worker  ]
573*8975f5c5SAndroid Build Coastguard Worker
574*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-is-python2"):
575*8975f5c5SAndroid Build Coastguard Worker    packages.extend(["python-is-python2", "python2-dev"])
576*8975f5c5SAndroid Build Coastguard Worker  else:
577*8975f5c5SAndroid Build Coastguard Worker    packages.append("python")
578*8975f5c5SAndroid Build Coastguard Worker
579*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-crypto"):
580*8975f5c5SAndroid Build Coastguard Worker    packages.append("python-crypto")
581*8975f5c5SAndroid Build Coastguard Worker
582*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-numpy"):
583*8975f5c5SAndroid Build Coastguard Worker    packages.append("python-numpy")
584*8975f5c5SAndroid Build Coastguard Worker
585*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-openssl"):
586*8975f5c5SAndroid Build Coastguard Worker    packages.append("python-openssl")
587*8975f5c5SAndroid Build Coastguard Worker
588*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-psutil"):
589*8975f5c5SAndroid Build Coastguard Worker    packages.append("python-psutil")
590*8975f5c5SAndroid Build Coastguard Worker
591*8975f5c5SAndroid Build Coastguard Worker  if package_exists("python-yaml"):
592*8975f5c5SAndroid Build Coastguard Worker    packages.append("python-yaml")
593*8975f5c5SAndroid Build Coastguard Worker
594*8975f5c5SAndroid Build Coastguard Worker  if package_exists("apache2.2-bin"):
595*8975f5c5SAndroid Build Coastguard Worker    packages.append("apache2.2-bin")
596*8975f5c5SAndroid Build Coastguard Worker  else:
597*8975f5c5SAndroid Build Coastguard Worker    packages.append("apache2-bin")
598*8975f5c5SAndroid Build Coastguard Worker
599*8975f5c5SAndroid Build Coastguard Worker  php_versions = [
600*8975f5c5SAndroid Build Coastguard Worker      ("php8.1-cgi", "libapache2-mod-php8.1"),
601*8975f5c5SAndroid Build Coastguard Worker      ("php8.0-cgi", "libapache2-mod-php8.0"),
602*8975f5c5SAndroid Build Coastguard Worker      ("php7.4-cgi", "libapache2-mod-php7.4"),
603*8975f5c5SAndroid Build Coastguard Worker      ("php7.3-cgi", "libapache2-mod-php7.3"),
604*8975f5c5SAndroid Build Coastguard Worker      ("php7.2-cgi", "libapache2-mod-php7.2"),
605*8975f5c5SAndroid Build Coastguard Worker      ("php7.1-cgi", "libapache2-mod-php7.1"),
606*8975f5c5SAndroid Build Coastguard Worker      ("php7.0-cgi", "libapache2-mod-php7.0"),
607*8975f5c5SAndroid Build Coastguard Worker      ("php5-cgi", "libapache2-mod-php5"),
608*8975f5c5SAndroid Build Coastguard Worker  ]
609*8975f5c5SAndroid Build Coastguard Worker
610*8975f5c5SAndroid Build Coastguard Worker  for php_cgi, mod_php in php_versions:
611*8975f5c5SAndroid Build Coastguard Worker    if package_exists(php_cgi):
612*8975f5c5SAndroid Build Coastguard Worker      packages.extend([php_cgi, mod_php])
613*8975f5c5SAndroid Build Coastguard Worker      break
614*8975f5c5SAndroid Build Coastguard Worker
615*8975f5c5SAndroid Build Coastguard Worker  return [package for package in packages if package_exists(package)]
616*8975f5c5SAndroid Build Coastguard Worker
617*8975f5c5SAndroid Build Coastguard Worker
618*8975f5c5SAndroid Build Coastguard Workerdef arm_list(options):
619*8975f5c5SAndroid Build Coastguard Worker  if not options.arm:
620*8975f5c5SAndroid Build Coastguard Worker    print("Skipping ARM cross toolchain.", file=sys.stderr)
621*8975f5c5SAndroid Build Coastguard Worker    return []
622*8975f5c5SAndroid Build Coastguard Worker  print("Including ARM cross toolchain.", file=sys.stderr)
623*8975f5c5SAndroid Build Coastguard Worker
624*8975f5c5SAndroid Build Coastguard Worker  # arm cross toolchain packages needed to build chrome on armhf
625*8975f5c5SAndroid Build Coastguard Worker  packages = [
626*8975f5c5SAndroid Build Coastguard Worker      "g++-arm-linux-gnueabihf",
627*8975f5c5SAndroid Build Coastguard Worker      "gcc-arm-linux-gnueabihf",
628*8975f5c5SAndroid Build Coastguard Worker      "libc6-dev-armhf-cross",
629*8975f5c5SAndroid Build Coastguard Worker      "linux-libc-dev-armhf-cross",
630*8975f5c5SAndroid Build Coastguard Worker  ]
631*8975f5c5SAndroid Build Coastguard Worker
632*8975f5c5SAndroid Build Coastguard Worker  # Work around an Ubuntu dependency issue.
633*8975f5c5SAndroid Build Coastguard Worker  # TODO(https://crbug.com/40549424): Remove this when support for Focal
634*8975f5c5SAndroid Build Coastguard Worker  # and Jammy are dropped.
635*8975f5c5SAndroid Build Coastguard Worker  if distro_codename() == "focal":
636*8975f5c5SAndroid Build Coastguard Worker    packages.extend([
637*8975f5c5SAndroid Build Coastguard Worker        "g++-10-multilib-arm-linux-gnueabihf",
638*8975f5c5SAndroid Build Coastguard Worker        "gcc-10-multilib-arm-linux-gnueabihf",
639*8975f5c5SAndroid Build Coastguard Worker    ])
640*8975f5c5SAndroid Build Coastguard Worker  elif distro_codename() == "jammy":
641*8975f5c5SAndroid Build Coastguard Worker    packages.extend([
642*8975f5c5SAndroid Build Coastguard Worker        "g++-11-arm-linux-gnueabihf",
643*8975f5c5SAndroid Build Coastguard Worker        "gcc-11-arm-linux-gnueabihf",
644*8975f5c5SAndroid Build Coastguard Worker    ])
645*8975f5c5SAndroid Build Coastguard Worker
646*8975f5c5SAndroid Build Coastguard Worker  return packages
647*8975f5c5SAndroid Build Coastguard Worker
648*8975f5c5SAndroid Build Coastguard Worker
649*8975f5c5SAndroid Build Coastguard Workerdef nacl_list(options):
650*8975f5c5SAndroid Build Coastguard Worker  if not options.nacl:
651*8975f5c5SAndroid Build Coastguard Worker    print("Skipping NaCl, NaCl toolchain, NaCl ports dependencies.",
652*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
653*8975f5c5SAndroid Build Coastguard Worker    return []
654*8975f5c5SAndroid Build Coastguard Worker
655*8975f5c5SAndroid Build Coastguard Worker  packages = [
656*8975f5c5SAndroid Build Coastguard Worker      "g++-mingw-w64-i686",
657*8975f5c5SAndroid Build Coastguard Worker      "lib32z1-dev",
658*8975f5c5SAndroid Build Coastguard Worker      "libasound2:i386",
659*8975f5c5SAndroid Build Coastguard Worker      "libcap2:i386",
660*8975f5c5SAndroid Build Coastguard Worker      "libelf-dev:i386",
661*8975f5c5SAndroid Build Coastguard Worker      "libfontconfig1:i386",
662*8975f5c5SAndroid Build Coastguard Worker      "libglib2.0-0:i386",
663*8975f5c5SAndroid Build Coastguard Worker      "libgpm2:i386",
664*8975f5c5SAndroid Build Coastguard Worker      "libncurses5:i386",
665*8975f5c5SAndroid Build Coastguard Worker      "libnss3:i386",
666*8975f5c5SAndroid Build Coastguard Worker      "libpango-1.0-0:i386",
667*8975f5c5SAndroid Build Coastguard Worker      "libssl-dev:i386",
668*8975f5c5SAndroid Build Coastguard Worker      "libtinfo-dev",
669*8975f5c5SAndroid Build Coastguard Worker      "libtinfo-dev:i386",
670*8975f5c5SAndroid Build Coastguard Worker      "libtool",
671*8975f5c5SAndroid Build Coastguard Worker      "libudev1:i386",
672*8975f5c5SAndroid Build Coastguard Worker      "libuuid1:i386",
673*8975f5c5SAndroid Build Coastguard Worker      "libxcomposite1:i386",
674*8975f5c5SAndroid Build Coastguard Worker      "libxcursor1:i386",
675*8975f5c5SAndroid Build Coastguard Worker      "libxdamage1:i386",
676*8975f5c5SAndroid Build Coastguard Worker      "libxi6:i386",
677*8975f5c5SAndroid Build Coastguard Worker      "libxrandr2:i386",
678*8975f5c5SAndroid Build Coastguard Worker      "libxss1:i386",
679*8975f5c5SAndroid Build Coastguard Worker      "libxtst6:i386",
680*8975f5c5SAndroid Build Coastguard Worker      "texinfo",
681*8975f5c5SAndroid Build Coastguard Worker      "xvfb",
682*8975f5c5SAndroid Build Coastguard Worker      # Packages to build NaCl, its toolchains, and its ports.
683*8975f5c5SAndroid Build Coastguard Worker      "ant",
684*8975f5c5SAndroid Build Coastguard Worker      "autoconf",
685*8975f5c5SAndroid Build Coastguard Worker      "bison",
686*8975f5c5SAndroid Build Coastguard Worker      "cmake",
687*8975f5c5SAndroid Build Coastguard Worker      "gawk",
688*8975f5c5SAndroid Build Coastguard Worker      "intltool",
689*8975f5c5SAndroid Build Coastguard Worker      "libtinfo5",
690*8975f5c5SAndroid Build Coastguard Worker      "xutils-dev",
691*8975f5c5SAndroid Build Coastguard Worker      "xsltproc",
692*8975f5c5SAndroid Build Coastguard Worker  ]
693*8975f5c5SAndroid Build Coastguard Worker
694*8975f5c5SAndroid Build Coastguard Worker  for package in packages:
695*8975f5c5SAndroid Build Coastguard Worker    if not package_exists(package):
696*8975f5c5SAndroid Build Coastguard Worker      print("Skipping NaCl, NaCl toolchain, NaCl ports dependencies because %s "
697*8975f5c5SAndroid Build Coastguard Worker            "is not available" % package,
698*8975f5c5SAndroid Build Coastguard Worker            file=sys.stderr)
699*8975f5c5SAndroid Build Coastguard Worker      return []
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker  print("Including NaCl, NaCl toolchain, NaCl ports dependencies.",
702*8975f5c5SAndroid Build Coastguard Worker        file=sys.stderr)
703*8975f5c5SAndroid Build Coastguard Worker
704*8975f5c5SAndroid Build Coastguard Worker  # Prefer lib32ncurses5-dev to match libncurses5:i386 if it exists.
705*8975f5c5SAndroid Build Coastguard Worker  # In some Ubuntu releases, lib32ncurses5-dev is a transition package to
706*8975f5c5SAndroid Build Coastguard Worker  # lib32ncurses-dev, so use that as a fallback.
707*8975f5c5SAndroid Build Coastguard Worker  if package_exists("lib32ncurses5-dev"):
708*8975f5c5SAndroid Build Coastguard Worker    packages.append("lib32ncurses5-dev")
709*8975f5c5SAndroid Build Coastguard Worker  else:
710*8975f5c5SAndroid Build Coastguard Worker    packages.append("lib32ncurses-dev")
711*8975f5c5SAndroid Build Coastguard Worker
712*8975f5c5SAndroid Build Coastguard Worker  return packages
713*8975f5c5SAndroid Build Coastguard Worker
714*8975f5c5SAndroid Build Coastguard Worker
715*8975f5c5SAndroid Build Coastguard Worker# Packages suffixed with t64 are "transition packages" and should be preferred.
716*8975f5c5SAndroid Build Coastguard Workerdef maybe_append_t64(package):
717*8975f5c5SAndroid Build Coastguard Worker  name = package.split(":")
718*8975f5c5SAndroid Build Coastguard Worker  name[0] += "t64"
719*8975f5c5SAndroid Build Coastguard Worker  renamed = ":".join(name)
720*8975f5c5SAndroid Build Coastguard Worker  return renamed if package_exists(renamed) else package
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker
723*8975f5c5SAndroid Build Coastguard Worker# Debian is in the process of transitioning to automatic debug packages, which
724*8975f5c5SAndroid Build Coastguard Worker# have the -dbgsym suffix (https://wiki.debian.org/AutomaticDebugPackages).
725*8975f5c5SAndroid Build Coastguard Worker# Untransitioned packages have the -dbg suffix.  And on some systems, neither
726*8975f5c5SAndroid Build Coastguard Worker# will be available, so exclude the ones that are missing.
727*8975f5c5SAndroid Build Coastguard Workerdef dbg_package_name(package):
728*8975f5c5SAndroid Build Coastguard Worker  package = maybe_append_t64(package)
729*8975f5c5SAndroid Build Coastguard Worker  if package_exists(package + "-dbgsym"):
730*8975f5c5SAndroid Build Coastguard Worker    return [package + "-dbgsym"]
731*8975f5c5SAndroid Build Coastguard Worker  if package_exists(package + "-dbg"):
732*8975f5c5SAndroid Build Coastguard Worker    return [package + "-dbg"]
733*8975f5c5SAndroid Build Coastguard Worker  return []
734*8975f5c5SAndroid Build Coastguard Worker
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Workerdef dbg_list(options):
737*8975f5c5SAndroid Build Coastguard Worker  if not options.syms:
738*8975f5c5SAndroid Build Coastguard Worker    print("Skipping debugging symbols.", file=sys.stderr)
739*8975f5c5SAndroid Build Coastguard Worker    return []
740*8975f5c5SAndroid Build Coastguard Worker  print("Including debugging symbols.", file=sys.stderr)
741*8975f5c5SAndroid Build Coastguard Worker
742*8975f5c5SAndroid Build Coastguard Worker  packages = [
743*8975f5c5SAndroid Build Coastguard Worker      dbg_package for package in lib_list()
744*8975f5c5SAndroid Build Coastguard Worker      for dbg_package in dbg_package_name(package)
745*8975f5c5SAndroid Build Coastguard Worker  ]
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Worker  # Debugging symbols packages not following common naming scheme
748*8975f5c5SAndroid Build Coastguard Worker  if not dbg_package_name("libstdc++6"):
749*8975f5c5SAndroid Build Coastguard Worker    for version in ["8", "7", "6", "5", "4.9", "4.8", "4.7", "4.6"]:
750*8975f5c5SAndroid Build Coastguard Worker      if package_exists("libstdc++6-%s-dbg" % version):
751*8975f5c5SAndroid Build Coastguard Worker        packages.append("libstdc++6-%s-dbg" % version)
752*8975f5c5SAndroid Build Coastguard Worker        break
753*8975f5c5SAndroid Build Coastguard Worker
754*8975f5c5SAndroid Build Coastguard Worker  if not dbg_package_name("libatk1.0-0"):
755*8975f5c5SAndroid Build Coastguard Worker    packages.extend(dbg_package_name("libatk1.0"))
756*8975f5c5SAndroid Build Coastguard Worker
757*8975f5c5SAndroid Build Coastguard Worker  if not dbg_package_name("libpango-1.0-0"):
758*8975f5c5SAndroid Build Coastguard Worker    packages.extend(dbg_package_name("libpango1.0-dev"))
759*8975f5c5SAndroid Build Coastguard Worker
760*8975f5c5SAndroid Build Coastguard Worker  return packages
761*8975f5c5SAndroid Build Coastguard Worker
762*8975f5c5SAndroid Build Coastguard Worker
763*8975f5c5SAndroid Build Coastguard Workerdef package_list(options):
764*8975f5c5SAndroid Build Coastguard Worker  packages = (dev_list() + lib_list() + dbg_list(options) +
765*8975f5c5SAndroid Build Coastguard Worker              lib32_list(options) + arm_list(options) + nacl_list(options) +
766*8975f5c5SAndroid Build Coastguard Worker              backwards_compatible_list(options))
767*8975f5c5SAndroid Build Coastguard Worker  packages = [maybe_append_t64(package) for package in set(packages)]
768*8975f5c5SAndroid Build Coastguard Worker
769*8975f5c5SAndroid Build Coastguard Worker  # Sort all the :i386 packages to the front, to avoid confusing dpkg-query
770*8975f5c5SAndroid Build Coastguard Worker  # (https://crbug.com/446172).
771*8975f5c5SAndroid Build Coastguard Worker  return sorted(packages, key=lambda x: (not x.endswith(":i386"), x))
772*8975f5c5SAndroid Build Coastguard Worker
773*8975f5c5SAndroid Build Coastguard Worker
774*8975f5c5SAndroid Build Coastguard Workerdef missing_packages(packages):
775*8975f5c5SAndroid Build Coastguard Worker  try:
776*8975f5c5SAndroid Build Coastguard Worker    subprocess.run(
777*8975f5c5SAndroid Build Coastguard Worker        ["dpkg-query", "-W", "-f", " "] + packages,
778*8975f5c5SAndroid Build Coastguard Worker        check=True,
779*8975f5c5SAndroid Build Coastguard Worker        capture_output=True,
780*8975f5c5SAndroid Build Coastguard Worker    )
781*8975f5c5SAndroid Build Coastguard Worker    return []
782*8975f5c5SAndroid Build Coastguard Worker  except subprocess.CalledProcessError as e:
783*8975f5c5SAndroid Build Coastguard Worker    return [
784*8975f5c5SAndroid Build Coastguard Worker        line.split(" ")[-1] for line in e.stderr.decode().strip().splitlines()
785*8975f5c5SAndroid Build Coastguard Worker    ]
786*8975f5c5SAndroid Build Coastguard Worker
787*8975f5c5SAndroid Build Coastguard Worker
788*8975f5c5SAndroid Build Coastguard Workerdef package_is_installable(package):
789*8975f5c5SAndroid Build Coastguard Worker  result = subprocess.run(["apt-cache", "show", package], capture_output=True)
790*8975f5c5SAndroid Build Coastguard Worker  return result.returncode == 0
791*8975f5c5SAndroid Build Coastguard Worker
792*8975f5c5SAndroid Build Coastguard Worker
793*8975f5c5SAndroid Build Coastguard Workerdef quick_check(options):
794*8975f5c5SAndroid Build Coastguard Worker  if not options.quick_check:
795*8975f5c5SAndroid Build Coastguard Worker    return
796*8975f5c5SAndroid Build Coastguard Worker
797*8975f5c5SAndroid Build Coastguard Worker  missing = missing_packages(package_list(options))
798*8975f5c5SAndroid Build Coastguard Worker  if not missing:
799*8975f5c5SAndroid Build Coastguard Worker    sys.exit(0)
800*8975f5c5SAndroid Build Coastguard Worker
801*8975f5c5SAndroid Build Coastguard Worker  not_installed = []
802*8975f5c5SAndroid Build Coastguard Worker  unknown = []
803*8975f5c5SAndroid Build Coastguard Worker  for p in missing:
804*8975f5c5SAndroid Build Coastguard Worker    if package_is_installable(p):
805*8975f5c5SAndroid Build Coastguard Worker      not_installed.append(p)
806*8975f5c5SAndroid Build Coastguard Worker    else:
807*8975f5c5SAndroid Build Coastguard Worker      unknown.append(p)
808*8975f5c5SAndroid Build Coastguard Worker
809*8975f5c5SAndroid Build Coastguard Worker  if not_installed:
810*8975f5c5SAndroid Build Coastguard Worker    print("WARNING: The following packages are not installed:", file=sys.stderr)
811*8975f5c5SAndroid Build Coastguard Worker    print(" ".join(not_installed), file=sys.stderr)
812*8975f5c5SAndroid Build Coastguard Worker
813*8975f5c5SAndroid Build Coastguard Worker  if unknown:
814*8975f5c5SAndroid Build Coastguard Worker    print("WARNING: The following packages are unknown to your system",
815*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
816*8975f5c5SAndroid Build Coastguard Worker    print("(maybe missing a repo or need to 'sudo apt-get update'):",
817*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
818*8975f5c5SAndroid Build Coastguard Worker    print(" ".join(unknown), file=sys.stderr)
819*8975f5c5SAndroid Build Coastguard Worker
820*8975f5c5SAndroid Build Coastguard Worker  sys.exit(1)
821*8975f5c5SAndroid Build Coastguard Worker
822*8975f5c5SAndroid Build Coastguard Worker
823*8975f5c5SAndroid Build Coastguard Workerdef find_missing_packages(options):
824*8975f5c5SAndroid Build Coastguard Worker  print("Finding missing packages...", file=sys.stderr)
825*8975f5c5SAndroid Build Coastguard Worker
826*8975f5c5SAndroid Build Coastguard Worker  packages = package_list(options)
827*8975f5c5SAndroid Build Coastguard Worker  packages_str = " ".join(packages)
828*8975f5c5SAndroid Build Coastguard Worker  print("Packages required: " + packages_str, file=sys.stderr)
829*8975f5c5SAndroid Build Coastguard Worker
830*8975f5c5SAndroid Build Coastguard Worker  query_cmd = ["apt-get", "--just-print", "install"] + packages
831*8975f5c5SAndroid Build Coastguard Worker  env = os.environ.copy()
832*8975f5c5SAndroid Build Coastguard Worker  env["LANGUAGE"] = "en"
833*8975f5c5SAndroid Build Coastguard Worker  env["LANG"] = "C"
834*8975f5c5SAndroid Build Coastguard Worker  cmd_output = subprocess.check_output(query_cmd, env=env).decode()
835*8975f5c5SAndroid Build Coastguard Worker  lines = cmd_output.splitlines()
836*8975f5c5SAndroid Build Coastguard Worker
837*8975f5c5SAndroid Build Coastguard Worker  install = []
838*8975f5c5SAndroid Build Coastguard Worker  for pattern in (
839*8975f5c5SAndroid Build Coastguard Worker      "The following NEW packages will be installed:",
840*8975f5c5SAndroid Build Coastguard Worker      "The following packages will be upgraded:",
841*8975f5c5SAndroid Build Coastguard Worker  ):
842*8975f5c5SAndroid Build Coastguard Worker    if pattern in lines:
843*8975f5c5SAndroid Build Coastguard Worker      for line in lines[lines.index(pattern) + 1:]:
844*8975f5c5SAndroid Build Coastguard Worker        if not line.startswith("  "):
845*8975f5c5SAndroid Build Coastguard Worker          break
846*8975f5c5SAndroid Build Coastguard Worker        install += line.strip().split(" ")
847*8975f5c5SAndroid Build Coastguard Worker  return install
848*8975f5c5SAndroid Build Coastguard Worker
849*8975f5c5SAndroid Build Coastguard Worker
850*8975f5c5SAndroid Build Coastguard Workerdef install_packages(options):
851*8975f5c5SAndroid Build Coastguard Worker  try:
852*8975f5c5SAndroid Build Coastguard Worker    packages = find_missing_packages(options)
853*8975f5c5SAndroid Build Coastguard Worker    if packages:
854*8975f5c5SAndroid Build Coastguard Worker      quiet = ["-qq", "--assume-yes"] if options.no_prompt else []
855*8975f5c5SAndroid Build Coastguard Worker      subprocess.check_call(["sudo", "apt-get", "install"] + quiet + packages)
856*8975f5c5SAndroid Build Coastguard Worker      print(file=sys.stderr)
857*8975f5c5SAndroid Build Coastguard Worker    else:
858*8975f5c5SAndroid Build Coastguard Worker      print("No missing packages, and the packages are up to date.",
859*8975f5c5SAndroid Build Coastguard Worker            file=sys.stderr)
860*8975f5c5SAndroid Build Coastguard Worker
861*8975f5c5SAndroid Build Coastguard Worker  except subprocess.CalledProcessError as e:
862*8975f5c5SAndroid Build Coastguard Worker    # An apt-get exit status of 100 indicates that a real error has occurred.
863*8975f5c5SAndroid Build Coastguard Worker    print("`apt-get --just-print install ...` failed", file=sys.stderr)
864*8975f5c5SAndroid Build Coastguard Worker    print("It produced the following output:", file=sys.stderr)
865*8975f5c5SAndroid Build Coastguard Worker    print(file=sys.stderr)
866*8975f5c5SAndroid Build Coastguard Worker    print("You will have to install the above packages yourself.",
867*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
868*8975f5c5SAndroid Build Coastguard Worker    print(file=sys.stderr)
869*8975f5c5SAndroid Build Coastguard Worker    sys.exit(100)
870*8975f5c5SAndroid Build Coastguard Worker
871*8975f5c5SAndroid Build Coastguard Worker
872*8975f5c5SAndroid Build Coastguard Worker# Install the Chrome OS default fonts. This must go after running
873*8975f5c5SAndroid Build Coastguard Worker# apt-get, since install-chromeos-fonts depends on curl.
874*8975f5c5SAndroid Build Coastguard Workerdef install_chromeos_fonts(options):
875*8975f5c5SAndroid Build Coastguard Worker  if not options.chromeos_fonts:
876*8975f5c5SAndroid Build Coastguard Worker    print("Skipping installation of Chrome OS fonts.", file=sys.stderr)
877*8975f5c5SAndroid Build Coastguard Worker    return
878*8975f5c5SAndroid Build Coastguard Worker  print("Installing Chrome OS fonts.", file=sys.stderr)
879*8975f5c5SAndroid Build Coastguard Worker
880*8975f5c5SAndroid Build Coastguard Worker  dir = os.path.abspath(os.path.dirname(__file__))
881*8975f5c5SAndroid Build Coastguard Worker
882*8975f5c5SAndroid Build Coastguard Worker  try:
883*8975f5c5SAndroid Build Coastguard Worker    subprocess.check_call(
884*8975f5c5SAndroid Build Coastguard Worker        ["sudo",
885*8975f5c5SAndroid Build Coastguard Worker         os.path.join(dir, "linux", "install-chromeos-fonts.py")])
886*8975f5c5SAndroid Build Coastguard Worker  except subprocess.CalledProcessError:
887*8975f5c5SAndroid Build Coastguard Worker    print("ERROR: The installation of the Chrome OS default fonts failed.",
888*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
889*8975f5c5SAndroid Build Coastguard Worker    if (subprocess.check_output(
890*8975f5c5SAndroid Build Coastguard Worker        ["stat", "-f", "-c", "%T", dir], ).decode().startswith("nfs")):
891*8975f5c5SAndroid Build Coastguard Worker      print(
892*8975f5c5SAndroid Build Coastguard Worker          "The reason is that your repo is installed on a remote file system.",
893*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
894*8975f5c5SAndroid Build Coastguard Worker    else:
895*8975f5c5SAndroid Build Coastguard Worker      print(
896*8975f5c5SAndroid Build Coastguard Worker          "This is expected if your repo is installed on a remote file system.",
897*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
898*8975f5c5SAndroid Build Coastguard Worker
899*8975f5c5SAndroid Build Coastguard Worker    print("It is recommended to install your repo on a local file system.",
900*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
901*8975f5c5SAndroid Build Coastguard Worker    print("You can skip the installation of the Chrome OS default fonts with",
902*8975f5c5SAndroid Build Coastguard Worker          file=sys.stderr)
903*8975f5c5SAndroid Build Coastguard Worker    print("the command line option: --no-chromeos-fonts.", file=sys.stderr)
904*8975f5c5SAndroid Build Coastguard Worker    sys.exit(1)
905*8975f5c5SAndroid Build Coastguard Worker
906*8975f5c5SAndroid Build Coastguard Worker
907*8975f5c5SAndroid Build Coastguard Workerdef install_locales():
908*8975f5c5SAndroid Build Coastguard Worker  print("Installing locales.", file=sys.stderr)
909*8975f5c5SAndroid Build Coastguard Worker  CHROMIUM_LOCALES = [
910*8975f5c5SAndroid Build Coastguard Worker      "da_DK.UTF-8", "en_US.UTF-8", "fr_FR.UTF-8", "he_IL.UTF-8", "zh_TW.UTF-8"
911*8975f5c5SAndroid Build Coastguard Worker  ]
912*8975f5c5SAndroid Build Coastguard Worker  LOCALE_GEN = "/etc/locale.gen"
913*8975f5c5SAndroid Build Coastguard Worker  if os.path.exists(LOCALE_GEN):
914*8975f5c5SAndroid Build Coastguard Worker    old_locale_gen = open(LOCALE_GEN).read()
915*8975f5c5SAndroid Build Coastguard Worker    for locale in CHROMIUM_LOCALES:
916*8975f5c5SAndroid Build Coastguard Worker      subprocess.check_call(
917*8975f5c5SAndroid Build Coastguard Worker          ["sudo", "sed", "-i",
918*8975f5c5SAndroid Build Coastguard Worker           "s/^# %s/%s/" % (locale, locale), LOCALE_GEN])
919*8975f5c5SAndroid Build Coastguard Worker
920*8975f5c5SAndroid Build Coastguard Worker    # Regenerating locales can take a while, so only do it if we need to.
921*8975f5c5SAndroid Build Coastguard Worker    locale_gen = open(LOCALE_GEN).read()
922*8975f5c5SAndroid Build Coastguard Worker    if locale_gen != old_locale_gen:
923*8975f5c5SAndroid Build Coastguard Worker      subprocess.check_call(["sudo", "locale-gen"])
924*8975f5c5SAndroid Build Coastguard Worker    else:
925*8975f5c5SAndroid Build Coastguard Worker      print("Locales already up-to-date.", file=sys.stderr)
926*8975f5c5SAndroid Build Coastguard Worker  else:
927*8975f5c5SAndroid Build Coastguard Worker    for locale in CHROMIUM_LOCALES:
928*8975f5c5SAndroid Build Coastguard Worker      subprocess.check_call(["sudo", "locale-gen", locale])
929*8975f5c5SAndroid Build Coastguard Worker
930*8975f5c5SAndroid Build Coastguard Worker
931*8975f5c5SAndroid Build Coastguard Workerdef main():
932*8975f5c5SAndroid Build Coastguard Worker  options = parse_args(sys.argv[1:])
933*8975f5c5SAndroid Build Coastguard Worker  check_lsb_release()
934*8975f5c5SAndroid Build Coastguard Worker  check_distro(options)
935*8975f5c5SAndroid Build Coastguard Worker  check_architecture()
936*8975f5c5SAndroid Build Coastguard Worker  quick_check(options)
937*8975f5c5SAndroid Build Coastguard Worker  check_root()
938*8975f5c5SAndroid Build Coastguard Worker  apt_update(options)
939*8975f5c5SAndroid Build Coastguard Worker  install_packages(options)
940*8975f5c5SAndroid Build Coastguard Worker  install_chromeos_fonts(options)
941*8975f5c5SAndroid Build Coastguard Worker  install_locales()
942*8975f5c5SAndroid Build Coastguard Worker  return 0
943*8975f5c5SAndroid Build Coastguard Worker
944*8975f5c5SAndroid Build Coastguard Worker
945*8975f5c5SAndroid Build Coastguard Workerif __name__ == "__main__":
946*8975f5c5SAndroid Build Coastguard Worker  sys.exit(main())
947