1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95

build / android / pylib / constants / host_paths.py [blame]

# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import contextlib
import os
import sys

from pylib import constants

DIR_SOURCE_ROOT = os.environ.get(
    'CHECKOUT_SOURCE_ROOT',
    os.path.abspath(os.path.join(os.path.dirname(__file__),
                                 os.pardir, os.pardir, os.pardir, os.pardir)))

# third-party libraries
ANDROID_PLATFORM_DEVELOPMENT_SCRIPTS_PATH = os.path.join(
    DIR_SOURCE_ROOT, 'third_party', 'android_platform', 'development',
    'scripts')
BUILD_PATH = os.path.join(DIR_SOURCE_ROOT, 'build')
BUILD_UTIL_PATH = os.path.join(DIR_SOURCE_ROOT, 'build', 'util')

DEVIL_PATH = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'catapult', 'devil')
JAVA_PATH = os.path.join(DIR_SOURCE_ROOT, 'third_party', 'jdk', 'current',
                         'bin')
TRACING_PATH = os.path.join(
    DIR_SOURCE_ROOT, 'third_party', 'catapult', 'tracing')

@contextlib.contextmanager
def SysPath(path, position=None):
  if position is None:
    sys.path.append(path)
  else:
    sys.path.insert(position, path)
  try:
    yield
  finally:
    if sys.path[-1] == path:
      sys.path.pop()
    else:
      sys.path.remove(path)


# Map of CPU architecture name to (toolchain_name, binprefix) pairs.
# TODO(digit): Use the build_vars.json file generated by gn.
_TOOL_ARCH_MAP = {
  'arm': ('arm-linux-androideabi-4.9', 'arm-linux-androideabi'),
  'arm64': ('aarch64-linux-android-4.9', 'aarch64-linux-android'),
  'x86': ('x86-4.9', 'i686-linux-android'),
  'x86_64': ('x86_64-4.9', 'x86_64-linux-android'),
  'x64': ('x86_64-4.9', 'x86_64-linux-android'),
  'mips': ('mipsel-linux-android-4.9', 'mipsel-linux-android'),
}

# Cache used to speed up the results of ToolPath()
# Maps (arch, tool_name) pairs to fully qualified program paths.
# Useful because ToolPath() is called repeatedly for demangling C++ symbols.
_cached_tool_paths = {}


def ToolPath(tool, cpu_arch):
  """Return a fully qualifed path to an arch-specific toolchain program.

  Args:
    tool: Unprefixed toolchain program name (e.g. 'objdump')
    cpu_arch: Target CPU architecture (e.g. 'arm64')
  Returns:
    Fully qualified path (e.g. ..../aarch64-linux-android-objdump')
  Raises:
    Exception if the toolchain could not be found.
  """
  tool_path = _cached_tool_paths.get((tool, cpu_arch))
  if tool_path:
    return tool_path

  toolchain_source, toolchain_prefix = _TOOL_ARCH_MAP.get(
      cpu_arch, (None, None))
  if not toolchain_source:
    raise Exception('Could not find tool chain for ' + cpu_arch)

  toolchain_subdir = (
      'toolchains/%s/prebuilt/linux-x86_64/bin' % toolchain_source)

  tool_path = os.path.join(constants.ANDROID_NDK_ROOT,
                           toolchain_subdir,
                           toolchain_prefix + '-' + tool)

  _cached_tool_paths[(tool, cpu_arch)] = tool_path
  return tool_path


def GetAaptPath():
  """Returns the path to the 'aapt' executable."""
  return os.path.join(constants.ANDROID_SDK_TOOLS, 'aapt')