Home | History | Annotate | Download | only in lib
      1 # Copyright (C) 2016 The Android Open-Source Project
      2 #
      3 # Licensed under the Apache License, Version 2.0 (the "License");
      4 # you may not use this file except in compliance with the License.
      5 # You may obtain a copy of the License at
      6 #
      7 #      http://www.apache.org/licenses/LICENSE-2.0
      8 #
      9 # Unless required by applicable law or agreed to in writing, software
     10 # distributed under the License is distributed on an "AS IS" BASIS,
     11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 # See the License for the specific language governing permissions and
     13 # limitations under the License.
     14 
     15 """Various utility functions"""
     16 
     17 import logging
     18 import os
     19 import shlex
     20 import subprocess
     21 
     22 
     23 # The default location in which symbols and minidumps will be saved.
     24 _DEFAULT_ARTIFACT_CACHE_ROOT = os.environ.get('ARC_ARTIFACT_CACHE_ROOT',
     25                                               '/tmp/arc-artifact-cache')
     26 
     27 
     28 def get_command_str(command):
     29   """Returns a quoted version of the command, friendly to copy/paste."""
     30   return ' '.join(shlex.quote(arg) for arg in command)
     31 
     32 
     33 def check_call(*subprocess_args, dryrun=False, **kwargs):
     34   """Runs a subprocess and returns its exit code."""
     35   if logging.getLogger().isEnabledFor(logging.DEBUG):
     36     logging.debug('Calling: %s', get_command_str(subprocess_args))
     37   if dryrun:
     38     return
     39   try:
     40     return subprocess.check_call(subprocess_args, **kwargs)
     41   except subprocess.CalledProcessError as e:
     42     logging.error('Error while executing %s', get_command_str(subprocess_args))
     43     logging.error(e.output)
     44     raise
     45 
     46 
     47 def check_output(*subprocess_args, dryrun=False, **kwargs):
     48   """Runs a subprocess and returns its output."""
     49   if logging.getLogger().isEnabledFor(logging.DEBUG):
     50     logging.debug('Calling: %s', get_command_str(subprocess_args))
     51   if dryrun:
     52     logging.info('Cannot return any output without running the command. '
     53                  'Returning an empty string instead.')
     54     return ''
     55   try:
     56     return subprocess.check_output(subprocess_args, universal_newlines=True,
     57                                    **kwargs)
     58   except subprocess.CalledProcessError as e:
     59     logging.error('Error while executing %s', get_command_str(subprocess_args))
     60     logging.error(e.output)
     61     raise
     62 
     63 
     64 def makedirs(path):
     65   """Makes directories if necessary, like 'mkdir -p'"""
     66   if not os.path.exists(path):
     67     os.makedirs(path)
     68 
     69 
     70 def get_prebuilt(tool):
     71   """Locates a prebuilt file to run."""
     72   return os.path.abspath(os.path.join(
     73       os.path.dirname(os.path.dirname(__file__)), 'prebuilt/x86-linux/', tool))
     74 
     75 
     76 def helper_temp_path(*path, artifact_cache_root=_DEFAULT_ARTIFACT_CACHE_ROOT):
     77   """Returns the path to use for temporary/cached files."""
     78   return os.path.join(artifact_cache_root, *path)
     79 
     80 
     81 def get_product_arch(product):
     82   """Returns the architecture of a given target |product|."""
     83   # The prefix can itself have other prefixes, like 'generic_' or 'aosp_'.
     84   product_prefix = 'cheets_'
     85 
     86   idx = product.index(product_prefix)
     87   assert idx >= 0, 'Unrecognized product name: %s' % product
     88   return product[idx + len(product_prefix):]
     89