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