summaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authortony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-23 23:51:25 +0000
committertony@chromium.org <tony@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-08-23 23:51:25 +0000
commitc532ba7b52bed035470d1e9eb1ec17861b887d68 (patch)
tree2c33844fb4025c60a8e25eedb03312868da962a0 /build
parent5d5cc65756ad8f193205a8a03ae1e8225733a8ce (diff)
downloadchromium_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.py205
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()