blob: ab4a1a6c70297653008741a6c0c3b8041e695c0e [file] [log] [blame]
#!/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()