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