1e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# Copyright (c) 2015, Google Inc. 2e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# 3e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# Permission to use, copy, modify, and/or distribute this software for any 4e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# purpose with or without fee is hereby granted, provided that the above 5e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# copyright notice and this permission notice appear in all copies. 6e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# 7e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 15e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport os.path 16e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport shutil 17e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport sys 18e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport tarfile 19e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport tempfile 20e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyimport urllib 21e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 22e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# CLANG_REVISION and CLANG_SUB_REVISION determine the build of clang 23e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# to use. These should be synced with tools/clang/scripts/update.sh in 24e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley# Chromium. 25e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyCLANG_REVISION = "233105" 26e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyCLANG_SUB_REVISION = "1" 27e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 28e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyPACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION) 29e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyLLVM_BUILD_DIR = os.path.join(os.path.dirname(__file__), "llvm-build") 30e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleySTAMP_FILE = os.path.join(LLVM_BUILD_DIR, "cr_build_revision") 31e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 32e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam LangleyCDS_URL = "https://commondatastorage.googleapis.com/chromium-browser-clang" 33e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 34e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleydef DownloadFile(url, path): 35e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley """DownloadFile fetches |url| to |path|.""" 36e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley last_progress = [0] 37e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley def report(a, b, c): 38e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley progress = int(a * b * 100.0 / c) 39e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if progress != last_progress[0]: 40e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley print >> sys.stderr, "Downloading... %d%%" % progress 41e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley last_progress[0] = progress 42e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley urllib.urlretrieve(url, path, reporthook=report) 43e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 44e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleydef main(args): 45e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley # For now, only download clang on Linux. 46e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if not sys.platform.startswith("linux"): 47e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return 0 48e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 49e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if os.path.exists(STAMP_FILE): 50e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley with open(STAMP_FILE) as f: 51e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if f.read().strip() == PACKAGE_VERSION: 52e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley print >> sys.stderr, "Clang already at %s" % (PACKAGE_VERSION,) 53e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return 0 54e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 55e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley if os.path.exists(LLVM_BUILD_DIR): 56e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley shutil.rmtree(LLVM_BUILD_DIR) 57e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 58e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley print >> sys.stderr, "Downloading Clang %s" % (PACKAGE_VERSION,) 59e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley cds_full_url = "%s/Linux_x64/clang-%s.tgz" % (CDS_URL, PACKAGE_VERSION) 60e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley with tempfile.NamedTemporaryFile() as temp: 61e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley DownloadFile(cds_full_url, temp.name) 62e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley with tarfile.open(temp.name, "r:gz") as tar_file: 63e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley tar_file.extractall(LLVM_BUILD_DIR) 64e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 65e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley with open(STAMP_FILE, "wb") as stamp_file: 66e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley stamp_file.write(PACKAGE_VERSION) 67e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 68e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley return 0 69e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley 70e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langleyif __name__ == "__main__": 71e9ada863a7b3e81f5d2b1e3bdd2305da902a87f5Adam Langley sys.exit(main(sys.argv[1:])) 72