install-debian.wheezy.sysroot.py revision effb81e5f8246d0db0270817048dc992db66e9fb
13fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant#!/usr/bin/env python
23fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# Copyright (c) 2013 The Chromium Authors. All rights reserved.
33fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# Use of this source code is governed by a BSD-style license that can be
43fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# found in the LICENSE file.
53fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
63fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# Script to install a Debian Wheezy sysroot for making official Google Chrome
73fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# Linux builds.
83fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# The sysroot is needed to make Chrome work for Debian Wheezy.
93fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# This script can be run manually but is more often run as part of gclient
103fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# hooks. When run from hooks this script should be a no-op on non-linux
113fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# platforms.
123fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
133fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# The sysroot image could be constructed from scratch based on the current
143fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# state or Debian Wheezy but for consistency we currently use a pre-built root
153fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# image. The image will normally need to be rebuilt every time chrome's build
163fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant# dependancies are changed.
173fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
183fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport platform
193fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport optparse
203fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport os
213fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport re
223fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport shutil
233fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport subprocess
243fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantimport sys
253fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
263fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
273fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantSCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
283fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantURL_PREFIX = 'https://commondatastorage.googleapis.com'
293fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantURL_PATH = 'chrome-linux-sysroot/toolchain'
303fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantREVISION = 259398
313fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantTARBALL_AMD64 = 'debian_wheezy_amd64_sysroot.tgz'
323fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantTARBALL_I386 = 'debian_wheezy_i386_sysroot.tgz'
333fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantSYSROOT_DIR_AMD64 = 'debian_wheezy_amd64-sysroot'
343fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard HinnantSYSROOT_DIR_I386 = 'debian_wheezy_i386-sysroot'
353fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
363fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
373fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnantdef main(args):
383fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant  if options.arch not in ['amd64', 'i386']:
393fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    print 'Unknown architecture: %s' % options.arch
403fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    return 1
413fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
423fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant  if options.linux_only:
433fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # This argument is passed when run from the gclient hooks.
443fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # In this case we return early on non-linux platforms.
453fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    if not sys.platform.startswith('linux'):
463fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      return 0
473fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
483fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # Only install the sysroot for an Official Chrome Linux build.
493fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    defined = ['branding=Chrome', 'buildtype=Official']
503fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    undefined = ['chromeos=1']
513fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    gyp_defines = os.environ.get('GYP_DEFINES', '')
523fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    for option in defined:
533fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      if option not in gyp_defines:
543fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant        return 0
553fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    for option in undefined:
563fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      if option in gyp_defines:
573fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant        return 0
583fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant
593fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # Check for optional target_arch and only install for that architecture.
603fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # If target_arch is not specified, then only install for the host
613fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    # architecture.
623fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    host_arch = ''
633fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    if 'target_arch=x64' in gyp_defines:
643fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      host_arch = 'amd64'
653fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    elif 'target_arch=ia32' in gyp_defines:
663fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      host_arch = 'i386'
673fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant    else:
683fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      # Figure out host arch, like the host_arch variable in build/common.gypi.
693fadda314ad3b1fd0ba16db83476a9d5a7b58d78Howard Hinnant      machine_type = platform.machine()
70      if machine_type in ['amd64', 'x86_64']:
71        host_arch = 'amd64'
72      elif re.match('(i[3-6]86|i86pc)$', machine_type):
73        host_arch = 'i386'
74    if host_arch != options.arch:
75      return 0
76
77  # The sysroot directory should match the one specified in build/common.gypi.
78  # TODO(thestig) Consider putting this else where to avoid having to recreate
79  # it on every build.
80  linux_dir = os.path.dirname(SCRIPT_DIR)
81  if options.arch == 'amd64':
82    sysroot = os.path.join(linux_dir, SYSROOT_DIR_AMD64)
83    tarball_filename = TARBALL_AMD64
84  else:
85    sysroot = os.path.join(linux_dir, SYSROOT_DIR_I386)
86    tarball_filename = TARBALL_I386
87  url = '%s/%s/%s/%s' % (URL_PREFIX, URL_PATH, REVISION, tarball_filename)
88
89  stamp = os.path.join(sysroot, '.stamp')
90  if os.path.exists(stamp):
91    with open(stamp) as s:
92      if s.read() == url:
93        print 'Debian Wheezy %s root image already up-to-date: %s' % \
94            (options.arch, sysroot)
95        return 0
96
97  print 'Installing Debian Wheezy %s root image: %s' % (options.arch, sysroot)
98  if os.path.isdir(sysroot):
99    shutil.rmtree(sysroot)
100  os.mkdir(sysroot)
101  tarball = os.path.join(sysroot, tarball_filename)
102  subprocess.check_call(['curl', '-L', url, '-o', tarball])
103  subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot])
104  os.remove(tarball)
105
106  with open(stamp, 'w') as s:
107    s.write(url)
108  return 0
109
110
111if __name__ == '__main__':
112  parser = optparse.OptionParser('usage: %prog [OPTIONS]')
113  parser.add_option('', '--linux-only', dest='linux_only', action='store_true',
114                    default=False, help='Only install sysroot for official '
115                                        'Linux builds')
116  parser.add_option('', '--arch', dest='arch',
117                    help='Sysroot architecture, i386 or amd64')
118  options, args = parser.parse_args()
119  sys.exit(main(options))
120