|
|
|
@ -3,16 +3,26 @@ |
|
|
|
|
# Copyright (c) 2016 Google, Inc |
|
|
|
|
# |
|
|
|
|
|
|
|
|
|
import command |
|
|
|
|
import os |
|
|
|
|
import shutil |
|
|
|
|
import tempfile |
|
|
|
|
|
|
|
|
|
import tout |
|
|
|
|
|
|
|
|
|
# Output directly (generally this is temporary) |
|
|
|
|
outdir = None |
|
|
|
|
indirs = None |
|
|
|
|
|
|
|
|
|
# True to keep the output directory around after exiting |
|
|
|
|
preserve_outdir = False |
|
|
|
|
|
|
|
|
|
# Path to the Chrome OS chroot, if we know it |
|
|
|
|
chroot_path = None |
|
|
|
|
|
|
|
|
|
# Search paths to use for Filename(), used to find files |
|
|
|
|
search_paths = [] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def PrepareOutputDir(dirname, preserve=False): |
|
|
|
|
"""Select an output directory, ensuring it exists. |
|
|
|
|
|
|
|
|
@ -117,3 +127,67 @@ def Align(pos, align): |
|
|
|
|
|
|
|
|
|
def NotPowerOfTwo(num): |
|
|
|
|
return num and (num & (num - 1)) |
|
|
|
|
|
|
|
|
|
def Run(name, *args): |
|
|
|
|
command.Run(name, *args, cwd=outdir) |
|
|
|
|
|
|
|
|
|
def Filename(fname): |
|
|
|
|
"""Resolve a file path to an absolute path. |
|
|
|
|
|
|
|
|
|
If fname starts with ##/ and chroot is available, ##/ gets replaced with |
|
|
|
|
the chroot path. If chroot is not available, this file name can not be |
|
|
|
|
resolved, `None' is returned. |
|
|
|
|
|
|
|
|
|
If fname is not prepended with the above prefix, and is not an existing |
|
|
|
|
file, the actual file name is retrieved from the passed in string and the |
|
|
|
|
search_paths directories (if any) are searched to for the file. If found - |
|
|
|
|
the path to the found file is returned, `None' is returned otherwise. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
fname: a string, the path to resolve. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
Absolute path to the file or None if not found. |
|
|
|
|
""" |
|
|
|
|
if fname.startswith('##/'): |
|
|
|
|
if chroot_path: |
|
|
|
|
fname = os.path.join(chroot_path, fname[3:]) |
|
|
|
|
else: |
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
# Search for a pathname that exists, and return it if found |
|
|
|
|
if fname and not os.path.exists(fname): |
|
|
|
|
for path in search_paths: |
|
|
|
|
pathname = os.path.join(path, os.path.basename(fname)) |
|
|
|
|
if os.path.exists(pathname): |
|
|
|
|
return pathname |
|
|
|
|
|
|
|
|
|
# If not found, just return the standard, unchanged path |
|
|
|
|
return fname |
|
|
|
|
|
|
|
|
|
def ReadFile(fname): |
|
|
|
|
"""Read and return the contents of a file. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
fname: path to filename to read, where ## signifiies the chroot. |
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
data read from file, as a string. |
|
|
|
|
""" |
|
|
|
|
with open(Filename(fname), 'rb') as fd: |
|
|
|
|
data = fd.read() |
|
|
|
|
#self._out.Info("Read file '%s' size %d (%#0x)" % |
|
|
|
|
#(fname, len(data), len(data))) |
|
|
|
|
return data |
|
|
|
|
|
|
|
|
|
def WriteFile(fname, data): |
|
|
|
|
"""Write data into a file. |
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
fname: path to filename to write |
|
|
|
|
data: data to write to file, as a string |
|
|
|
|
""" |
|
|
|
|
#self._out.Info("Write file '%s' size %d (%#0x)" % |
|
|
|
|
#(fname, len(data), len(data))) |
|
|
|
|
with open(Filename(fname), 'wb') as fd: |
|
|
|
|
fd.write(data) |
|
|
|
|