Home | History | Annotate | Download | only in sysroot_scripts
      1 #!/usr/bin/env python
      2 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 # Script to install a Debian Wheezy sysroot for making official Google Chrome
      7 # Linux builds.
      8 # The sysroot is needed to make Chrome work for Debian Wheezy.
      9 # This script can be run manually but is more often run as part of gclient
     10 # hooks. When run from hooks this script should be a no-op on non-linux
     11 # platforms.
     12 
     13 # The sysroot image could be constructed from scratch based on the current
     14 # state or Debian Wheezy but for consistency we currently use a pre-built root
     15 # image. The image will normally need to be rebuilt every time chrome's build
     16 # dependancies are changed.
     17 
     18 import hashlib
     19 import platform
     20 import optparse
     21 import os
     22 import re
     23 import shutil
     24 import subprocess
     25 import sys
     26 
     27 
     28 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
     29 URL_PREFIX = 'https://commondatastorage.googleapis.com'
     30 URL_PATH = 'chrome-linux-sysroot/toolchain'
     31 REVISION = 264817
     32 TARBALL_AMD64 = 'debian_wheezy_amd64_sysroot.tgz'
     33 TARBALL_I386 = 'debian_wheezy_i386_sysroot.tgz'
     34 TARBALL_AMD64_SHA1SUM = '74b7231e12aaf45c5c5489d9aebb56bd6abb3653'
     35 TARBALL_I386_SHA1SUM = 'fe3d284926839683b00641bc66c9023f872ea4b4'
     36 SYSROOT_DIR_AMD64 = 'debian_wheezy_amd64-sysroot'
     37 SYSROOT_DIR_I386 = 'debian_wheezy_i386-sysroot'
     38 
     39 
     40 def get_sha1(filename):
     41   sha1 = hashlib.sha1()
     42   with open(filename, 'rb') as f:
     43     while True:
     44       # Read in 1mb chunks, so it doesn't all have to be loaded into memory.
     45       chunk = f.read(1024*1024)
     46       if not chunk:
     47         break
     48       sha1.update(chunk)
     49   return sha1.hexdigest()
     50 
     51 
     52 def main(args):
     53   if options.arch not in ['amd64', 'i386']:
     54     print 'Unknown architecture: %s' % options.arch
     55     return 1
     56 
     57   if options.linux_only:
     58     # This argument is passed when run from the gclient hooks.
     59     # In this case we return early on non-linux platforms.
     60     if not sys.platform.startswith('linux'):
     61       return 0
     62 
     63     # Only install the sysroot for an Official Chrome Linux build.
     64     defined = ['branding=Chrome', 'buildtype=Official']
     65     undefined = ['chromeos=1']
     66     gyp_defines = os.environ.get('GYP_DEFINES', '')
     67     for option in defined:
     68       if option not in gyp_defines:
     69         return 0
     70     for option in undefined:
     71       if option in gyp_defines:
     72         return 0
     73 
     74     # Check for optional target_arch and only install for that architecture.
     75     # If target_arch is not specified, then only install for the host
     76     # architecture.
     77     host_arch = ''
     78     if 'target_arch=x64' in gyp_defines:
     79       host_arch = 'amd64'
     80     elif 'target_arch=ia32' in gyp_defines:
     81       host_arch = 'i386'
     82     else:
     83       # Figure out host arch, like the host_arch variable in build/common.gypi.
     84       machine_type = platform.machine()
     85       if machine_type in ['amd64', 'x86_64']:
     86         host_arch = 'amd64'
     87       elif re.match('(i[3-6]86|i86pc)$', machine_type):
     88         host_arch = 'i386'
     89     if host_arch != options.arch:
     90       return 0
     91 
     92   # The sysroot directory should match the one specified in build/common.gypi.
     93   # TODO(thestig) Consider putting this else where to avoid having to recreate
     94   # it on every build.
     95   linux_dir = os.path.dirname(SCRIPT_DIR)
     96   if options.arch == 'amd64':
     97     sysroot = os.path.join(linux_dir, SYSROOT_DIR_AMD64)
     98     tarball_filename = TARBALL_AMD64
     99     tarball_sha1sum = TARBALL_AMD64_SHA1SUM
    100   else:
    101     sysroot = os.path.join(linux_dir, SYSROOT_DIR_I386)
    102     tarball_filename = TARBALL_I386
    103     tarball_sha1sum = TARBALL_I386_SHA1SUM
    104   url = '%s/%s/%s/%s' % (URL_PREFIX, URL_PATH, REVISION, tarball_filename)
    105 
    106   stamp = os.path.join(sysroot, '.stamp')
    107   if os.path.exists(stamp):
    108     with open(stamp) as s:
    109       if s.read() == url:
    110         print 'Debian Wheezy %s root image already up-to-date: %s' % \
    111             (options.arch, sysroot)
    112         return 0
    113 
    114   print 'Installing Debian Wheezy %s root image: %s' % (options.arch, sysroot)
    115   if os.path.isdir(sysroot):
    116     shutil.rmtree(sysroot)
    117   os.mkdir(sysroot)
    118   tarball = os.path.join(sysroot, tarball_filename)
    119   subprocess.check_call(['curl', '-L', url, '-o', tarball])
    120   sha1sum = get_sha1(tarball)
    121   if sha1sum != tarball_sha1sum:
    122     print 'Tarball sha1sum is wrong.'
    123     print 'Expected %s, actual: %s' % (tarball_sha1sum, sha1sum)
    124     return 1
    125   subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot])
    126   os.remove(tarball)
    127 
    128   with open(stamp, 'w') as s:
    129     s.write(url)
    130   return 0
    131 
    132 
    133 if __name__ == '__main__':
    134   parser = optparse.OptionParser('usage: %prog [OPTIONS]')
    135   parser.add_option('', '--linux-only', dest='linux_only', action='store_true',
    136                     default=False, help='Only install sysroot for official '
    137                                         'Linux builds')
    138   parser.add_option('', '--arch', dest='arch',
    139                     help='Sysroot architecture, i386 or amd64')
    140   options, args = parser.parse_args()
    141   sys.exit(main(options))
    142