summaryrefslogtreecommitdiffstats
path: root/build/experimental/install-build-deps.py
diff options
context:
space:
mode:
authorPaweł Hajdan, Jr <phajdan.jr@chromium.org>2016-01-11 13:11:33 +0100
committerPaweł Hajdan, Jr <phajdan.jr@chromium.org>2016-01-11 12:13:43 +0000
commitfae7d207adeb06056656b24e451e0dad8e0de309 (patch)
tree0adfa3f8b1746b2e82eef259eac717c4e242b418 /build/experimental/install-build-deps.py
parent0c5897d173c1f7ec83db12bd212a672080758a8c (diff)
downloadchromium_src-fae7d207adeb06056656b24e451e0dad8e0de309.zip
chromium_src-fae7d207adeb06056656b24e451e0dad8e0de309.tar.gz
chromium_src-fae7d207adeb06056656b24e451e0dad8e0de309.tar.bz2
Move install-build-deps.py to build/experimental
It's not ready yet, and I'd like to develop it incrementally. BUG=508895 R=jochen@chromium.org Review URL: https://codereview.chromium.org/1576883002 . Cr-Commit-Position: refs/heads/master@{#368568}
Diffstat (limited to 'build/experimental/install-build-deps.py')
-rwxr-xr-xbuild/experimental/install-build-deps.py430
1 files changed, 430 insertions, 0 deletions
diff --git a/build/experimental/install-build-deps.py b/build/experimental/install-build-deps.py
new file mode 100755
index 0000000..7cc3760
--- /dev/null
+++ b/build/experimental/install-build-deps.py
@@ -0,0 +1,430 @@
+#!/usr/bin/env python
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import operator
+import os
+import platform
+import re
+import subprocess
+import sys
+
+
+SUPPORTED_UBUNTU_VERSIONS = (
+ {'number': '12.04', 'codename': 'precise'},
+ {'number': '14.04', 'codename': 'trusty'},
+ {'number': '14.10', 'codename': 'utopic'},
+ {'number': '15.04', 'codename': 'vivid'},
+)
+
+
+# Packages needed for chromeos only.
+_packages_chromeos_dev = (
+ 'libbluetooth-dev',
+ 'libxkbcommon-dev',
+ 'realpath',
+)
+
+
+# Packages needed for development.
+_packages_dev = (
+ 'apache2.2-bin',
+ 'bison',
+ 'cdbs',
+ 'curl',
+ 'devscripts',
+ 'dpkg-dev',
+ 'elfutils',
+ 'fakeroot',
+ 'flex',
+ 'fonts-thai-tlwg',
+ 'g++',
+ 'git-core',
+ 'git-svn',
+ 'gperf',
+ 'language-pack-da',
+ 'language-pack-fr',
+ 'language-pack-he',
+ 'language-pack-zh-hant',
+ 'libapache2-mod-php5',
+ 'libasound2-dev',
+ 'libav-tools',
+ 'libbrlapi-dev',
+ 'libbz2-dev',
+ 'libcairo2-dev',
+ 'libcap-dev',
+ 'libcups2-dev',
+ 'libcurl4-gnutls-dev',
+ 'libdrm-dev',
+ 'libelf-dev',
+ 'libexif-dev',
+ 'libgconf2-dev',
+ 'libglib2.0-dev',
+ 'libglu1-mesa-dev',
+ 'libgnome-keyring-dev',
+ 'libgtk2.0-dev',
+ 'libkrb5-dev',
+ 'libnspr4-dev',
+ 'libnss3-dev',
+ 'libpam0g-dev',
+ 'libpci-dev',
+ 'libpulse-dev',
+ 'libsctp-dev',
+ 'libspeechd-dev',
+ 'libsqlite3-dev',
+ 'libssl-dev',
+ 'libudev-dev',
+ 'libwww-perl',
+ 'libxslt1-dev',
+ 'libxss-dev',
+ 'libxt-dev',
+ 'libxtst-dev',
+ 'openbox',
+ 'patch',
+ 'perl',
+ 'php5-cgi',
+ 'pkg-config',
+ 'python',
+ 'python-cherrypy3',
+ 'python-crypto',
+ 'python-dev',
+ 'python-numpy',
+ 'python-opencv',
+ 'python-openssl',
+ 'python-psutil',
+ 'python-yaml',
+ 'rpm',
+ 'ruby',
+ 'subversion',
+ 'ttf-dejavu-core',
+ 'ttf-indic-fonts',
+ 'ttf-kochi-gothic',
+ 'ttf-kochi-mincho',
+ 'wdiff',
+ 'xfonts-mathml',
+ 'zip',
+)
+
+
+# Run-time libraries required by chromeos only.
+_packages_chromeos_lib = (
+ 'libbz2-1.0',
+ 'libpulse0',
+)
+
+
+# Full list of required run-time libraries.
+_packages_lib = (
+ 'libasound2',
+ 'libatk1.0-0',
+ 'libc6',
+ 'libcairo2',
+ 'libcap2',
+ 'libcups2',
+ 'libexif12',
+ 'libexpat1',
+ 'libfontconfig1',
+ 'libfreetype6',
+ 'libglib2.0-0',
+ 'libgnome-keyring0',
+ 'libgtk2.0-0',
+ 'libpam0g',
+ 'libpango1.0-0',
+ 'libpci3',
+ 'libpcre3',
+ 'libpixman-1-0',
+ 'libpng12-0',
+ 'libspeechd2',
+ 'libsqlite3-0',
+ 'libstdc++6',
+ 'libx11-6',
+ 'libxau6',
+ 'libxcb1',
+ 'libxcomposite1',
+ 'libxcursor1',
+ 'libxdamage1',
+ 'libxdmcp6',
+ 'libxext6',
+ 'libxfixes3',
+ 'libxi6',
+ 'libxinerama1',
+ 'libxrandr2',
+ 'libxrender1',
+ 'libxtst6',
+ 'zlib1g',
+)
+
+
+# Debugging symbols for all of the run-time libraries.
+_packages_dbg = (
+ 'libatk1.0-dbg',
+ 'libc6-dbg',
+ 'libcairo2-dbg',
+ 'libfontconfig1-dbg',
+ 'libglib2.0-0-dbg',
+ 'libgtk2.0-0-dbg',
+ 'libpango1.0-0-dbg',
+ 'libpcre3-dbg',
+ 'libpixman-1-0-dbg',
+ 'libsqlite3-0-dbg',
+ 'libx11-6-dbg',
+ 'libxau6-dbg',
+ 'libxcb1-dbg',
+ 'libxcomposite1-dbg',
+ 'libxcursor1-dbg',
+ 'libxdamage1-dbg',
+ 'libxdmcp6-dbg',
+ 'libxext6-dbg',
+ 'libxfixes3-dbg',
+ 'libxi6-dbg',
+ 'libxinerama1-dbg',
+ 'libxrandr2-dbg',
+ 'libxrender1-dbg',
+ 'libxtst6-dbg',
+ 'zlib1g-dbg',
+)
+
+
+# 32-bit libraries needed e.g. to compile V8 snapshot for Android or armhf.
+_packages_lib32 = (
+ 'linux-libc-dev:i386',
+)
+
+
+# arm cross toolchain packages needed to build chrome on armhf.
+_packages_arm = (
+ 'g++-arm-linux-gnueabihf',
+ 'libc6-dev-armhf-cross',
+ 'linux-libc-dev-armhf-cross',
+)
+
+
+# Packages to build NaCl, its toolchains, and its ports.
+_packages_naclports = (
+ 'ant',
+ 'autoconf',
+ 'bison',
+ 'cmake',
+ 'gawk',
+ 'intltool',
+ 'xsltproc',
+ 'xutils-dev',
+)
+_packages_nacl = (
+ 'g++-mingw-w64-i686',
+ 'lib32ncurses5-dev',
+ 'lib32z1-dev',
+ 'libasound2:i386',
+ 'libcap2:i386',
+ 'libelf-dev:i386',
+ 'libexif12:i386',
+ 'libfontconfig1:i386',
+ 'libgconf-2-4:i386',
+ 'libglib2.0-0:i386',
+ 'libgpm2:i386',
+ 'libgtk2.0-0:i386',
+ 'libncurses5:i386',
+ 'libnss3:i386',
+ 'libpango1.0-0:i386',
+ 'libssl1.0.0:i386',
+ 'libtinfo-dev',
+ 'libtinfo-dev:i386',
+ 'libtool',
+ 'libxcomposite1:i386',
+ 'libxcursor1:i386',
+ 'libxdamage1:i386',
+ 'libxi6:i386',
+ 'libxrandr2:i386',
+ 'libxss1:i386',
+ 'libxtst6:i386',
+ 'texinfo',
+ 'xvfb',
+)
+
+
+def is_userland_64_bit():
+ return platform.architecture()[0] == '64bit'
+
+
+def package_exists(pkg):
+ return pkg in subprocess.check_output(['apt-cache', 'pkgnames']).splitlines()
+
+
+def lsb_release_short_codename():
+ return subprocess.check_output(
+ ['lsb_release', '--codename', '--short']).strip()
+
+
+def write_error(message):
+ sys.stderr.write('ERROR: %s\n' % message)
+ sys.stderr.flush()
+
+
+def nonfatal_get_output(*popenargs, **kwargs):
+ process = subprocess.Popen(
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE, *popenargs, **kwargs)
+ stdout, stderr = process.communicate()
+ retcode = process.poll()
+ return retcode, stdout, stderr
+
+
+def compute_dynamic_package_lists():
+ global _packages_arm
+ global _packages_dbg
+ global _packages_dev
+ global _packages_lib
+ global _packages_lib32
+ global _packages_nacl
+
+ if is_userland_64_bit():
+ # 64-bit systems need a minimum set of 32-bit compat packages
+ # for the pre-built NaCl binaries.
+ _packages_dev += (
+ 'lib32gcc1',
+ 'lib32stdc++6',
+ 'libc6-i386',
+ )
+
+ # When cross building for arm/Android on 64-bit systems the host binaries
+ # that are part of v8 need to be compiled with -m32 which means
+ # that basic multilib support is needed.
+ # gcc-multilib conflicts with the arm cross compiler (at least in trusty)
+ # but g++-X.Y-multilib gives us the 32-bit support that we need. Find out
+ # the appropriate value of X and Y by seeing what version the current
+ # distribution's g++-multilib package depends on.
+ output = subprocess.check_output(['apt-cache', 'depends', 'g++-multilib'])
+ multilib_package = re.search(r'g\+\+-[0-9.]+-multilib', output).group()
+ _packages_lib32 += (multilib_package,)
+
+ lsb_codename = lsb_release_short_codename()
+
+ # Find the proper version of libstdc++6-4.x-dbg.
+ if lsb_codename == 'precise':
+ _packages_dbg += ('libstdc++6-4.6-dbg',)
+ elif lsb_codename == 'trusty':
+ _packages_dbg += ('libstdc++6-4.8-dbg',)
+ else:
+ _packages_dbg += ('libstdc++6-4.9-dbg',)
+
+ # Work around for dependency issue Ubuntu/Trusty: http://crbug.com/435056 .
+ if lsb_codename == 'trusty':
+ _packages_arm += (
+ 'g++-4.8-multilib-arm-linux-gnueabihf',
+ 'gcc-4.8-multilib-arm-linux-gnueabihf',
+ )
+
+ # Find the proper version of libgbm-dev. We can't just install libgbm-dev as
+ # it depends on mesa, and only one version of mesa can exists on the system.
+ # Hence we must match the same version or this entire script will fail.
+ mesa_variant = ''
+ for variant in ('-lts-trusty', '-lts-utopic'):
+ rc, stdout, stderr = nonfatal_get_output(
+ ['dpkg-query', '-Wf\'{Status}\'', 'libgl1-mesa-glx' + variant])
+ if 'ok installed' in output:
+ mesa_variant = variant
+ _packages_dev += (
+ 'libgbm-dev' + mesa_variant,
+ 'libgl1-mesa-dev' + mesa_variant,
+ 'libgles2-mesa-dev' + mesa_variant,
+ 'mesa-common-dev' + mesa_variant,
+ )
+
+ if package_exists('ttf-mscorefonts-installer'):
+ _packages_dev += ('ttf-mscorefonts-installer',)
+ else:
+ _packages_dev += ('msttcorefonts',)
+
+ if package_exists('libnspr4-dbg'):
+ _packages_dbg += ('libnspr4-dbg', 'libnss3-dbg')
+ _packages_lib += ('libnspr4', 'libnss3')
+ else:
+ _packages_dbg += ('libnspr4-0d-dbg', 'libnss3-1d-dbg')
+ _packages_lib += ('libnspr4-0d', 'libnss3-1d')
+
+ if package_exists('libjpeg-dev'):
+ _packages_dev += ('libjpeg-dev',)
+ else:
+ _packages_dev += ('libjpeg62-dev',)
+
+ if package_exists('libudev1'):
+ _packages_dev += ('libudev1',)
+ _packages_nacl += ('libudev1:i386',)
+ else:
+ _packages_dev += ('libudev0',)
+ _packages_nacl += ('libudev0:i386',)
+
+ if package_exists('libbrlapi0.6'):
+ _packages_dev += ('libbrlapi0.6',)
+ else:
+ _packages_dev += ('libbrlapi0.5',)
+
+ # Some packages are only needed if the distribution actually supports
+ # installing them.
+ if package_exists('appmenu-gtk'):
+ _packages_lib += ('appmenu-gtk',)
+
+ _packages_dev += _packages_chromeos_dev
+ _packages_lib += _packages_chromeos_lib
+ _packages_nacl += _packages_naclports
+
+
+def quick_check(packages):
+ rc, stdout, stderr = nonfatal_get_output([
+ 'dpkg-query', '-W', '-f', '${PackageSpec}:${Status}\n'] + list(packages))
+ if rc == 0 and not stderr:
+ return 0
+ print stderr
+ return 1
+
+
+def main(argv):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--quick-check', action='store_true',
+ help='quickly try to determine if dependencies are '
+ 'installed (this avoids interactive prompts and '
+ 'sudo commands so might not be 100% accurate)')
+ parser.add_argument('--unsupported', action='store_true',
+ help='attempt installation even on unsupported systems')
+ args = parser.parse_args(argv)
+
+ lsb_codename = lsb_release_short_codename()
+ if not args.unsupported and not args.quick_check:
+ if lsb_codename not in map(
+ operator.itemgetter('codename'), SUPPORTED_UBUNTU_VERSIONS):
+ supported_ubuntus = ['%(number)s (%(codename)s)' % v
+ for v in SUPPORTED_UBUNTU_VERSIONS]
+ write_error('Only Ubuntu %s are currently supported.' %
+ ', '.join(supported_ubuntus))
+ return 1
+
+ if platform.machine() not in ('i686', 'x86_64'):
+ write_error('Only x86 architectures are currently supported.')
+ return 1
+
+ if os.geteuid() != 0 and not args.quick_check:
+ print 'Running as non-root user.'
+ print 'You might have to enter your password one or more times'
+ print 'for \'sudo\'.'
+ print
+
+ compute_dynamic_package_lists()
+
+ packages = (_packages_dev + _packages_lib + _packages_dbg + _packages_lib32 +
+ _packages_arm + _packages_nacl)
+ def packages_key(pkg):
+ s = pkg.rsplit(':', 1)
+ if len(s) == 1:
+ return (s, '')
+ return s
+ packages = sorted(set(packages), key=packages_key)
+
+ if args.quick_check:
+ return quick_check(packages)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))