| #!/usr/bin/env python |
| # |
| # Copyright (C) 2016 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| """Update symlinks to our prebuilt clang. |
| |
| While GCC is actually installed here because we need a different set of GCCs |
| than the platform (a superset because the NDK doesn't know how to deal with |
| multilib toolchains), we can just symlink clang. |
| """ |
| from __future__ import print_function |
| |
| import argparse |
| import os |
| import site |
| import subprocess |
| |
| site.addsitedir(os.path.join(os.path.dirname(__file__), '../../ndk/build/lib')) |
| |
| import build_support # pylint: disable=import-error |
| |
| |
| def get_latest_build(): |
| dirs = os.listdir(build_support.android_path( |
| 'prebuilts/clang/host/linux-x86')) |
| |
| clangs = [] |
| for dir_name in dirs: |
| if not dir_name.startswith('clang-'): |
| continue |
| version_str = dir_name.partition('-')[2] |
| try: |
| clangs.append(int(version_str)) |
| except ValueError: |
| pass |
| return str(sorted(clangs)[-1]) |
| |
| |
| def get_prebuilt_host(host): |
| """Maps from an NDK host tag to a platform host tag.""" |
| return { |
| 'darwin-x86_64': 'darwin-x86', |
| 'linux-x86_64': 'linux-x86', |
| 'windows': 'windows-x86_32', |
| 'windows-x86_64': 'windows-x86', |
| }[host] |
| |
| |
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| |
| parser.add_argument( |
| 'build', metavar='BUILD', nargs='?', |
| help='Build number to symlink. Defaults to the latest available.') |
| |
| parser.add_argument( |
| '--use-current-branch', action='store_true', |
| help='Do not repo start a new branch for the update.') |
| |
| return parser.parse_args() |
| |
| |
| def main(): |
| args = parse_args() |
| |
| os.chdir(os.path.realpath(os.path.dirname(__file__))) |
| |
| build = args.build |
| if build is None: |
| build = get_latest_build() |
| |
| if not args.use_current_branch: |
| subprocess.check_call( |
| ['repo', 'start', 'update-clang-{}'.format(build), '.']) |
| |
| hosts = ('darwin-x86_64', 'linux-x86_64', 'windows', 'windows-x86_64') |
| for host in hosts: |
| install_path = build_support.android_path( |
| 'prebuilts/ndk/current/toolchains', host, 'llvm') |
| if os.path.lexists(install_path): |
| print('Removing old Clang link for {}...'.format(host)) |
| subprocess.check_call(['git', 'rm', install_path]) |
| |
| prebuilt_host = get_prebuilt_host(host) |
| prebuilt_path = build_support.android_path( |
| 'prebuilts/clang/host', prebuilt_host, 'clang-{}'.format(build)) |
| |
| install_dir = os.path.dirname(install_path) |
| relative_path = os.path.relpath(prebuilt_path, install_dir) |
| |
| print(relative_path, install_path) |
| print('Linking {} clang-{}...'.format(host, build)) |
| os.symlink(relative_path, install_path) |
| |
| print('Adding {} link to index...'.format(host)) |
| subprocess.check_call(['git', 'add', install_path]) |
| |
| print('Committing update...') |
| message = 'Update prebuilt Clang to build {}.'.format(build) |
| subprocess.check_call(['git', 'commit', '-m', message]) |
| |
| |
| if __name__ == '__main__': |
| main() |