|  | #!/usr/bin/env python2.7 | 
|  | # vim: set expandtab:ts=2:sw=2 | 
|  | # Copyright 2016 The Fuchsia Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | from __future__ import absolute_import | 
|  | from __future__ import division | 
|  | from __future__ import print_function | 
|  |  | 
|  | import os | 
|  | import platform | 
|  | import re | 
|  | import sys | 
|  |  | 
|  | SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) | 
|  | FUCHSIA_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) | 
|  | MKBOOTFS_PATH = os.path.join(FUCHSIA_ROOT, 'out', 'build-zircon', 'tools', 'mkbootfs') | 
|  | DEBUG_OUT_DIR = os.path.join(FUCHSIA_ROOT, 'out', 'debug-x64') | 
|  | RELEASE_OUT_DIR = os.path.join(FUCHSIA_ROOT, 'out', 'release-x64') | 
|  | PREBUILT_PATH = os.path.join(FUCHSIA_ROOT, 'prebuilt') | 
|  |  | 
|  | def get_os(): | 
|  | return platform.system().lower().replace('darwin', 'mac') | 
|  |  | 
|  | def get_arch(): | 
|  | return { | 
|  | 'x86_64': 'x64', | 
|  | 'aarch64': 'arm64', | 
|  | }[platform.machine()] | 
|  |  | 
|  | # Returns a string with format "<OS>-<ARCH>" (eg. linux-x64). | 
|  | def get_platform(): | 
|  | return '%s-%s' % (get_os(), get_arch()) | 
|  |  | 
|  | def recursive_search(root, pattern): | 
|  | """Looks for a particular directory pattern within a directory tree. | 
|  |  | 
|  | Ignores files and git directories. | 
|  |  | 
|  | Returns: | 
|  | the containing directory of the match or None if not found. | 
|  | """ | 
|  |  | 
|  | search_queue = [root] | 
|  | while search_queue: | 
|  | # List the children. | 
|  | current_path = search_queue.pop(0) | 
|  | for child in os.listdir(current_path): | 
|  | full_path = os.path.join(current_path, child) | 
|  | # Ignore files. | 
|  | if not os.path.isdir(full_path): | 
|  | continue | 
|  | # Ignore git. | 
|  | if child == '.git': | 
|  | continue | 
|  | # See if we found it. | 
|  | if pattern in full_path: | 
|  | return full_path | 
|  | # Otherwise, enqueue the path for searching. | 
|  | search_queue.append(full_path) | 
|  | return None | 
|  |  | 
|  | # Returns the base clang path. Note that this is not the clang/lib/clang but rather the base | 
|  | # directory in out prebuilt directories. | 
|  | def search_clang_path(root): | 
|  | """clang can change location, so we search where it landed. | 
|  |  | 
|  | For now there is only one clang integration, so this should always find the | 
|  | correct one. | 
|  | This could potentially look over a number of directories, but this will only | 
|  | be run once at YCM server startup, so it should not affect overall | 
|  | performance. | 
|  |  | 
|  | Returns: | 
|  | clang path or None. | 
|  | """ | 
|  |  | 
|  | # This is the root where we should search for the clang installation. | 
|  | clang_path = recursive_search(root, 'clang/%s' % get_platform()) | 
|  | if not clang_path: | 
|  | print('Could not find clang installation') | 
|  | return None | 
|  |  | 
|  | return clang_path | 
|  |  | 
|  | def search_gn_path(root): | 
|  | gn_dir = recursive_search(PREBUILT_PATH, 'gn/%s' % get_platform()) | 
|  | if not gn_dir: | 
|  | return gn_dir | 
|  | return os.path.join(gn_dir, 'gn') | 
|  |  | 
|  | def search_ninja_path(root): | 
|  | ninja_dir = recursive_search(PREBUILT_PATH, 'ninja/%s' % get_platform()) | 
|  | if not ninja_dir: | 
|  | return ninja_dir | 
|  | return os.path.join(ninja_dir, 'ninja') | 
|  |  | 
|  | def get_rust_toolchain_path(root): | 
|  | return '%s/third_party/rust_tools/%s' % (root, get_platform()) | 
|  |  | 
|  | # We start seaching from the correct buildtools. | 
|  | CLANG_PATH = search_clang_path(PREBUILT_PATH) | 
|  | GN_PATH = search_gn_path(PREBUILT_PATH) | 
|  | NINJA_PATH = search_ninja_path(PREBUILT_PATH) | 
|  | VSCODE_RUST_TOOLCHAIN = get_rust_toolchain_path(PREBUILT_PATH) | 
|  |  | 
|  | def main(): | 
|  | variable_re = re.compile('^[A-Z][A-Z_]*$') | 
|  | def usage(): | 
|  | print('Usage: path.py VARIABLE') | 
|  | print('Available variables:') | 
|  | print('\n'.join(filter(variable_re.match, globals().keys()))) | 
|  | if len(sys.argv) != 2: | 
|  | usage() | 
|  | return | 
|  | variable = sys.argv[1] | 
|  | if not variable_re.match(variable) or variable not in globals().keys(): | 
|  | usage() | 
|  | return | 
|  | print(globals()[variable]) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |