|  | #!/usr/bin/env python3 | 
|  | # Copyright 2017 The Dart project authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | """Pulls down tools required to build Dart.""" | 
|  |  | 
|  | import errno | 
|  | import os | 
|  | import platform | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  | THIS_DIR = os.path.abspath(os.path.dirname(__file__)) | 
|  | DART_ROOT = os.path.abspath(os.path.join(THIS_DIR, '..', '..')) | 
|  | BUILDTOOLS = os.path.join(DART_ROOT, 'buildtools') | 
|  | TOOLS_BUILDTOOLS = os.path.join(DART_ROOT, 'tools', 'buildtools') | 
|  |  | 
|  | sys.path.insert(0, os.path.join(DART_ROOT, 'tools')) | 
|  | import find_depot_tools | 
|  |  | 
|  | DEPOT_PATH = find_depot_tools.add_depot_tools_to_path() | 
|  |  | 
|  |  | 
|  | def UpdateClangFormatOnWindows(): | 
|  | sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'clang-format.exe.sha1') | 
|  | output_dir = os.path.join(BUILDTOOLS, 'win', 'clang-format.exe') | 
|  | downloader_script = os.path.join(DEPOT_PATH, | 
|  | 'download_from_google_storage.py') | 
|  | download_cmd = [ | 
|  | sys.executable, downloader_script, '--no_auth', '--no_resume', | 
|  | '--quiet', '--platform=win', '--bucket', 'chromium-clang-format', '-s', | 
|  | sha1_file, '-o', output_dir | 
|  | ] | 
|  | return subprocess.call(download_cmd) | 
|  |  | 
|  |  | 
|  | def CreateSymlink(symlink, link_name): | 
|  | try: | 
|  | os.symlink(symlink, link_name) | 
|  | except OSError as e: | 
|  | if e.errno == errno.EEXIST: | 
|  | os.remove(link_name) | 
|  | os.symlink(symlink, link_name) | 
|  | else: | 
|  | raise e | 
|  |  | 
|  |  | 
|  | # On Mac and Linux we symlink clang-format and gn to the place where | 
|  | # 'git cl format' expects them to be. | 
|  | def LinksForGitCLFormat(): | 
|  | if sys.platform == 'darwin': | 
|  | platform = 'darwin' | 
|  | tools = 'mac' | 
|  | toolchain = 'mac-x64' | 
|  | elif sys.platform.startswith('linux'): | 
|  | platform = 'linux' | 
|  | tools = 'linux64' | 
|  | toolchain = 'linux-x64' | 
|  | else: | 
|  | print('Unknown platform: ' + sys.platform) | 
|  | return 1 | 
|  |  | 
|  | clang_format = os.path.join(BUILDTOOLS, toolchain, 'clang', 'bin', | 
|  | 'clang-format') | 
|  | gn = os.path.join(BUILDTOOLS, 'gn') | 
|  | dest_dir = os.path.join(BUILDTOOLS, tools) | 
|  | if not os.path.exists(dest_dir): | 
|  | os.makedirs(dest_dir) | 
|  | clang_format_dest = os.path.join(dest_dir, 'clang-format') | 
|  | gn_dest = os.path.join(dest_dir, 'gn') | 
|  | CreateSymlink(clang_format, clang_format_dest) | 
|  | CreateSymlink(gn, gn_dest) | 
|  | return 0 | 
|  |  | 
|  |  | 
|  | def main(argv): | 
|  | arch_id = platform.machine() | 
|  | # Don't try to download binaries if we're on an arm machine unless it is a | 
|  | # Mac arm machine because the x64 binaries work using rosetta translation. | 
|  | if ((arch_id.startswith('arm') and sys.platform != 'darwin') or | 
|  | arch_id.startswith('aarch64')): | 
|  | print('Not downloading buildtools binaries for ' + arch_id) | 
|  | return 0 | 
|  | if sys.platform.startswith('win'): | 
|  | return UpdateClangFormatOnWindows() | 
|  | return LinksForGitCLFormat() | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main(sys.argv)) |