123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- #
- # 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))
|