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