mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-05 12:45:42 +00:00
121 lines
3.2 KiB
Python
121 lines
3.2 KiB
Python
|
#
|
||
|
# Copyright (c) 2016 Google, Inc
|
||
|
#
|
||
|
# SPDX-License-Identifier: GPL-2.0+
|
||
|
#
|
||
|
|
||
|
import os
|
||
|
import shutil
|
||
|
import tempfile
|
||
|
|
||
|
import tout
|
||
|
|
||
|
outdir = None
|
||
|
indirs = None
|
||
|
preserve_outdir = False
|
||
|
|
||
|
def PrepareOutputDir(dirname, preserve=False):
|
||
|
"""Select an output directory, ensuring it exists.
|
||
|
|
||
|
This either creates a temporary directory or checks that the one supplied
|
||
|
by the user is valid. For a temporary directory, it makes a note to
|
||
|
remove it later if required.
|
||
|
|
||
|
Args:
|
||
|
dirname: a string, name of the output directory to use to store
|
||
|
intermediate and output files. If is None - create a temporary
|
||
|
directory.
|
||
|
preserve: a Boolean. If outdir above is None and preserve is False, the
|
||
|
created temporary directory will be destroyed on exit.
|
||
|
|
||
|
Raises:
|
||
|
OSError: If it cannot create the output directory.
|
||
|
"""
|
||
|
global outdir, preserve_outdir
|
||
|
|
||
|
preserve_outdir = dirname or preserve
|
||
|
if dirname:
|
||
|
outdir = dirname
|
||
|
if not os.path.isdir(outdir):
|
||
|
try:
|
||
|
os.makedirs(outdir)
|
||
|
except OSError as err:
|
||
|
raise CmdError("Cannot make output directory '%s': '%s'" %
|
||
|
(outdir, err.strerror))
|
||
|
tout.Debug("Using output directory '%s'" % outdir)
|
||
|
else:
|
||
|
outdir = tempfile.mkdtemp(prefix='binman.')
|
||
|
tout.Debug("Using temporary directory '%s'" % outdir)
|
||
|
|
||
|
def _RemoveOutputDir():
|
||
|
global outdir
|
||
|
|
||
|
shutil.rmtree(outdir)
|
||
|
tout.Debug("Deleted temporary directory '%s'" % outdir)
|
||
|
outdir = None
|
||
|
|
||
|
def FinaliseOutputDir():
|
||
|
global outdir, preserve_outdir
|
||
|
|
||
|
"""Tidy up: delete output directory if temporary and not preserved."""
|
||
|
if outdir and not preserve_outdir:
|
||
|
_RemoveOutputDir()
|
||
|
|
||
|
def GetOutputFilename(fname):
|
||
|
"""Return a filename within the output directory.
|
||
|
|
||
|
Args:
|
||
|
fname: Filename to use for new file
|
||
|
|
||
|
Returns:
|
||
|
The full path of the filename, within the output directory
|
||
|
"""
|
||
|
return os.path.join(outdir, fname)
|
||
|
|
||
|
def _FinaliseForTest():
|
||
|
"""Remove the output directory (for use by tests)"""
|
||
|
global outdir
|
||
|
|
||
|
if outdir:
|
||
|
_RemoveOutputDir()
|
||
|
|
||
|
def SetInputDirs(dirname):
|
||
|
"""Add a list of input directories, where input files are kept.
|
||
|
|
||
|
Args:
|
||
|
dirname: a list of paths to input directories to use for obtaining
|
||
|
files needed by binman to place in the image.
|
||
|
"""
|
||
|
global indir
|
||
|
|
||
|
indir = dirname
|
||
|
tout.Debug("Using input directories %s" % indir)
|
||
|
|
||
|
def GetInputFilename(fname):
|
||
|
"""Return a filename for use as input.
|
||
|
|
||
|
Args:
|
||
|
fname: Filename to use for new file
|
||
|
|
||
|
Returns:
|
||
|
The full path of the filename, within the input directory
|
||
|
"""
|
||
|
if not indir:
|
||
|
return fname
|
||
|
for dirname in indir:
|
||
|
pathname = os.path.join(dirname, fname)
|
||
|
if os.path.exists(pathname):
|
||
|
return pathname
|
||
|
|
||
|
raise ValueError("Filename '%s' not found in input path (%s)" %
|
||
|
(fname, ','.join(indir)))
|
||
|
|
||
|
def Align(pos, align):
|
||
|
if align:
|
||
|
mask = align - 1
|
||
|
pos = (pos + mask) & ~mask
|
||
|
return pos
|
||
|
|
||
|
def NotPowerOfTwo(num):
|
||
|
return num and (num & (num - 1))
|