binman: Tidy up _SetupDtb() to use its own temporary file

At present EnsureCompiled() uses an file from the 'output' directory (in
the tools module) when compiling the device tree. This is fine in most
cases, allowing useful inspection of the output files from binman.

However in functional tests, _SetupDtb() creates an output directory and
immediately removes it afterwards. This serves no benefit and just
confuses things, since the 'official' output directory is supposed to be
created and destroyed in control.Binman().

Add a new parameter for the optional temporary directory to use, and use a
separate temporary directory in _SetupDtb().

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2019-07-20 12:23:49 -06:00
parent 02fd463cfe
commit a004f29464
3 changed files with 28 additions and 7 deletions

View file

@ -287,12 +287,12 @@ class TestFunctional(unittest.TestCase):
Returns: Returns:
Contents of device-tree binary Contents of device-tree binary
""" """
tools.PrepareOutputDir(None) tmpdir = tempfile.mkdtemp(prefix='binmant.')
dtb = fdt_util.EnsureCompiled(self.TestFile(fname)) dtb = fdt_util.EnsureCompiled(self.TestFile(fname), tmpdir)
with open(dtb, 'rb') as fd: with open(dtb, 'rb') as fd:
data = fd.read() data = fd.read()
TestFunctional._MakeInputFile(outfile, data) TestFunctional._MakeInputFile(outfile, data)
tools.FinaliseOutputDir() shutil.rmtree(tmpdir)
return data return data
def _GetDtbContentsForSplTpl(self, dtb_data, name): def _GetDtbContentsForSplTpl(self, dtb_data, name):

View file

@ -43,12 +43,14 @@ def fdt_cells_to_cpu(val, cells):
out = out << 32 | fdt32_to_cpu(val[1]) out = out << 32 | fdt32_to_cpu(val[1])
return out return out
def EnsureCompiled(fname, capture_stderr=False): def EnsureCompiled(fname, tmpdir=None, capture_stderr=False):
"""Compile an fdt .dts source file into a .dtb binary blob if needed. """Compile an fdt .dts source file into a .dtb binary blob if needed.
Args: Args:
fname: Filename (if .dts it will be compiled). It not it will be fname: Filename (if .dts it will be compiled). It not it will be
left alone left alone
tmpdir: Temporary directory for output files, or None to use the
tools-module output directory
Returns: Returns:
Filename of resulting .dtb file Filename of resulting .dtb file
@ -57,8 +59,12 @@ def EnsureCompiled(fname, capture_stderr=False):
if ext != '.dts': if ext != '.dts':
return fname return fname
dts_input = tools.GetOutputFilename('source.dts') if tmpdir:
dtb_output = tools.GetOutputFilename('source.dtb') dts_input = os.path.join(tmpdir, 'source.dts')
dtb_output = os.path.join(tmpdir, 'source.dtb')
else:
dts_input = tools.GetOutputFilename('source.dts')
dtb_output = tools.GetOutputFilename('source.dtb')
search_paths = [os.path.join(os.getcwd(), 'include')] search_paths = [os.path.join(os.getcwd(), 'include')]
root, _ = os.path.splitext(fname) root, _ = os.path.splitext(fname)

View file

@ -9,7 +9,9 @@ from __future__ import print_function
from optparse import OptionParser from optparse import OptionParser
import glob import glob
import os import os
import shutil
import sys import sys
import tempfile
import unittest import unittest
# Bring in the patman libraries # Bring in the patman libraries
@ -540,10 +542,23 @@ class TestFdtUtil(unittest.TestCase):
self.assertEqual(0x12345678, fdt_util.fdt_cells_to_cpu(val, 1)) self.assertEqual(0x12345678, fdt_util.fdt_cells_to_cpu(val, 1))
def testEnsureCompiled(self): def testEnsureCompiled(self):
"""Test a degenerate case of this function""" """Test a degenerate case of this function (file already compiled)"""
dtb = fdt_util.EnsureCompiled('tools/dtoc/dtoc_test_simple.dts') dtb = fdt_util.EnsureCompiled('tools/dtoc/dtoc_test_simple.dts')
self.assertEqual(dtb, fdt_util.EnsureCompiled(dtb)) self.assertEqual(dtb, fdt_util.EnsureCompiled(dtb))
def testEnsureCompiledTmpdir(self):
"""Test providing a temporary directory"""
try:
old_outdir = tools.outdir
tools.outdir= None
tmpdir = tempfile.mkdtemp(prefix='test_fdt.')
dtb = fdt_util.EnsureCompiled('tools/dtoc/dtoc_test_simple.dts',
tmpdir)
self.assertEqual(tmpdir, os.path.dirname(dtb))
shutil.rmtree(tmpdir)
finally:
tools.outdir= old_outdir
def RunTestCoverage(): def RunTestCoverage():
"""Run the tests and check that we get 100% coverage""" """Run the tests and check that we get 100% coverage"""