1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#!/usr/bin/env python
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# Copyright 2015 the V8 project authors. All rights reserved.
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# Copyright 2015 The Chromium Authors. All rights reserved.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# found in the LICENSE file.
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch"""Script to download LLVM gold plugin from google storage."""
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport json
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport os
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport re
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport platform
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport shutil
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport subprocess
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport sys
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport zipfile
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch# Bail out on windows and cygwin.
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochif "win" in platform.system().lower():
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # Python 2.7.6 hangs at the second path.insert command on windows. Works
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # with python 2.7.8.
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  print "Gold plugin download not supported on windows."
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  sys.exit(0)
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochSCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCHROME_SRC = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsys.path.insert(0, os.path.join(CHROME_SRC, 'tools'))
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport find_depot_tools
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochGSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochLLVM_BUILD_PATH = os.path.join(CHROME_SRC, 'third_party', 'llvm-build',
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               'Release+Asserts')
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCLANG_UPDATE_PY = os.path.join(CHROME_SRC, 'tools', 'clang', 'scripts',
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               'update.py')
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCLANG_REVISION = os.popen(CLANG_UPDATE_PY + ' --print-revision').read().rstrip()
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochCLANG_BUCKET = 'gs://chromium-browser-clang/Linux_x64'
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochGOLD_PLUGIN_PATH = os.path.join(LLVM_BUILD_PATH, 'lib', 'LLVMgold.so')
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsys.path.insert(0, os.path.join(CHROME_SRC, 'tools', 'clang', 'scripts'))
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochimport update
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdef main():
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if not re.search(r'cfi_vptr=1', os.environ.get('GYP_DEFINES', '')):
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # Bailout if this is not a cfi build.
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    print 'Skipping gold plugin download for non-cfi build.'
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return 0
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (os.path.exists(GOLD_PLUGIN_PATH) and
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      update.ReadStampFile().strip() == update.PACKAGE_VERSION):
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # Bailout if clang is up-to-date. This requires the script to be run before
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    # the clang update step! I.e. afterwards clang would always be up-to-date.
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    print 'Skipping gold plugin download. File present and clang up to date.'
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return 0
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # Make sure this works on empty checkouts (i.e. clang not downloaded yet).
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if not os.path.exists(LLVM_BUILD_PATH):
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    os.makedirs(LLVM_BUILD_PATH)
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  targz_name = 'llvmgold-%s.tgz' % CLANG_REVISION
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  remote_path = '%s/%s' % (CLANG_BUCKET, targz_name)
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os.chdir(LLVM_BUILD_PATH)
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # TODO(pcc): Fix gsutil.py cp url file < /dev/null 2>&0
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # (currently aborts with exit code 1,
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # https://github.com/GoogleCloudPlatform/gsutil/issues/289) or change the
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  # stdin->stderr redirect in update.py to do something else (crbug.com/494442).
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  subprocess.check_call(['python', GSUTIL_PATH,
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                         'cp', remote_path, targz_name],
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                        stderr=open('/dev/null', 'w'))
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  subprocess.check_call(['tar', 'xzf', targz_name])
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  os.remove(targz_name)
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return 0
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochif __name__ == '__main__':
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  sys.exit(main())
82