forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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
- Loading branch information
tony@chromium.org
committed
Aug 23, 2011
1 parent
5d5cc65
commit c532ba7
Showing
5 changed files
with
256 additions
and
249 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() |
Oops, something went wrong.