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