diff options
author | tony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-23 23:51:25 +0000 |
---|---|---|
committer | tony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-23 23:51:25 +0000 |
commit | c532ba7b52bed035470d1e9eb1ec17861b887d68 (patch) | |
tree | 2c33844fb4025c60a8e25eedb03312868da962a0 /build | |
parent | 5d5cc65756ad8f193205a8a03ae1e8225733a8ce (diff) | |
download | chromium_src-c532ba7b52bed035470d1e9eb1ec17861b887d68.zip chromium_src-c532ba7b52bed035470d1e9eb1ec17861b887d68.tar.gz chromium_src-c532ba7b52bed035470d1e9eb1ec17861b887d68.tar.bz2 |
Revert 97943 - Switching NaCl IRT to be built inside the chrome build.
Third attempt:
Switching IRT to be built inside the chrome build. Dropping the IRT download
step from the DEPS. Step3 of a many step plan to switch where ppapi + irt
are built.
Dropping download_nacl_irt because we no longer rely on a prebuilt copy.
Dropping irt download drop source tarball (assume people using it will have
to download / build their own nacl toolchain).
Old Review URL: http://codereview.chromium.org/7669058
R=noelallen@google.com
BUG=http://code.google.com/p/chromium/issues/detail?id=93520
TEST=None
Review URL: http://codereview.chromium.org/7685042
TBR=bradnelson@google.com
Review URL: http://codereview.chromium.org/7718016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97949 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'build')
-rw-r--r-- | build/download_nacl_irt.py | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/build/download_nacl_irt.py b/build/download_nacl_irt.py new file mode 100644 index 0000000..f36d5b2 --- /dev/null +++ b/build/download_nacl_irt.py @@ -0,0 +1,205 @@ +#!/usr/bin/env python +# Copyright (c) 2011 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 hashlib +import optparse +import os +import urllib2 +import sys +import time + + +# Print a dot every time this number of bytes is read. +PROGRESS_SPACING = 128 * 1024 + + +def ReadFile(filename): + fh = open(filename, 'r') + try: + return fh.read() + finally: + fh.close() + + +def WriteFile(filename, data): + fh = open(filename, 'w') + try: + fh.write(data) + finally: + fh.close() + + +def HashFile(filename): + hasher = hashlib.sha1() + fh = open(filename, 'rb') + try: + while True: + data = fh.read(4096) + if len(data) == 0: + break + hasher.update(data) + finally: + fh.close() + return hasher.hexdigest() + + +def CopyStream(input_stream, output_stream): + """Copies the contents of input_stream to output_stream. Prints + dots to indicate progress. + """ + bytes_read = 0 + dots_printed = 0 + while True: + data = input_stream.read(4096) + if len(data) == 0: + break + output_stream.write(data) + bytes_read += len(data) + if bytes_read / PROGRESS_SPACING > dots_printed: + sys.stdout.write('.') + sys.stdout.flush() + dots_printed += 1 + + +def RenameWithRetry(old_path, new_path): + # Renames of files that have recently been closed are known to be + # unreliable on Windows, because virus checkers like to keep the + # file open for a little while longer. This tends to happen more + # for files that look like Windows executables, which does not apply + # to our files, but we retry the rename here just in case. + if sys.platform in ('win32', 'cygwin'): + for i in range(5): + try: + if os.path.exists(new_path): + os.remove(new_path) + os.rename(old_path, new_path) + return + except Exception, exn: + sys.stdout.write('Rename failed with %r. Retrying...\n' % str(exn)) + sys.stdout.flush() + time.sleep(1) + raise Exception('Unabled to rename irt file') + else: + os.rename(old_path, new_path) + + +def DownloadFile(dest_path, url): + url_path = '%s.url' % dest_path + temp_path = '%s.temp' % dest_path + if os.path.exists(url_path) and ReadFile(url_path).strip() == url: + # The URL matches that of the file we previously downloaded, so + # there should be nothing to do. + return + sys.stdout.write('Downloading %r to %r\n' % (url, dest_path)) + output_fh = open(temp_path, 'wb') + stream = urllib2.urlopen(url) + CopyStream(stream, output_fh) + output_fh.close() + sys.stdout.write(' done\n') + if os.path.exists(url_path): + os.unlink(url_path) + RenameWithRetry(temp_path, dest_path) + WriteFile(url_path, url + '\n') + stream.close() + + +def DownloadFileWithRetry(dest_path, url): + for i in range(5): + try: + DownloadFile(dest_path, url) + break + except urllib2.HTTPError, exn: + if exn.getcode() == 404: + raise + sys.stdout.write('Download failed with error %r. Retrying...\n' + % str(exn)) + sys.stdout.flush() + time.sleep(1) + + +def EvalDepsFile(path): + scope = {'Var': lambda name: scope['vars'][name]} + execfile(path, {}, scope) + return scope + + +def Main(): + parser = optparse.OptionParser() + parser.add_option( + '--base_url', dest='base_url', + # For a view of this site that includes directory listings, see: + # http://gsdview.appspot.com/nativeclient-archive2/ + # (The trailing slash is required.) + default=('http://commondatastorage.googleapis.com/' + 'nativeclient-archive2/irt'), + help='Base URL from which to download.') + parser.add_option( + '--nacl_revision', dest='nacl_revision', + help='Download an IRT binary that was built from this ' + 'SVN revision of Native Client.') + parser.add_option( + '--file_hash', dest='file_hashes', action='append', nargs=2, default=[], + metavar='ARCH HASH', + help='ARCH gives the name of the architecture (e.g. "x86_32") for ' + 'which to download an IRT binary. ' + 'HASH gives the expected SHA1 hash of the file.') + options, args = parser.parse_args() + if len(args) != 0: + parser.error('Unexpected arguments: %r' % args) + + if options.nacl_revision is None and len(options.file_hashes) == 0: + # The script must have been invoked directly with no arguments, + # rather than being invoked by gclient. In this case, read the + # DEPS file ourselves rather than having gclient pass us values + # from DEPS. + deps_data = EvalDepsFile(os.path.join('src', 'DEPS')) + options.nacl_revision = deps_data['vars']['nacl_revision'] + options.file_hashes = [ + ('x86_32', deps_data['vars']['nacl_irt_hash_x86_32']), + ('x86_64', deps_data['vars']['nacl_irt_hash_x86_64']), + ] + + nacl_dir = os.path.join('src', 'native_client') + if not os.path.exists(nacl_dir): + # If "native_client" is not present, this might be because the + # developer has put '"src/native_client": None' in their + # '.gclient' file, because they don't want to build Chromium with + # Native Client support. So don't create 'src/native_client', + # because that would interfere with checking it out from SVN + # later. + sys.stdout.write( + 'The directory %r does not exist: skipping downloading binaries ' + 'for Native Client\'s IRT library\n' % nacl_dir) + return + if len(options.file_hashes) == 0: + sys.stdout.write('No --file_hash arguments given: nothing to update\n') + + new_deps = [] + for arch, expected_hash in options.file_hashes: + url = '%s/r%s/irt_%s.nexe' % (options.base_url, + options.nacl_revision, + arch) + dest_dir = os.path.join(nacl_dir, 'irt_binaries') + if not os.path.exists(dest_dir): + os.makedirs(dest_dir) + dest_path = os.path.join(dest_dir, 'nacl_irt_%s.nexe' % arch) + DownloadFileWithRetry(dest_path, url) + downloaded_hash = HashFile(dest_path) + if downloaded_hash != expected_hash: + sys.stdout.write( + 'Hash mismatch: the file downloaded from URL %r had hash %r, ' + 'but we expected %r\n' % (url, downloaded_hash, expected_hash)) + new_deps.append(' "nacl_irt_hash_%s": "%s",\n' + % (arch, downloaded_hash)) + + if len(new_deps) > 0: + sys.stdout.write('\nIf you have changed nacl_revision, the DEPS file ' + 'probably needs to be updated with the following:\n%s\n' + % ''.join(new_deps)) + sys.exit(1) + + +if __name__ == '__main__': + Main() |