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