value: dict containing structure fields:
key (str): Field name
value: Prop object with field information
+ _basedir (str): Base directory of source tree
"""
def __init__(self, dtb_fname, include_disabled, warning_disabled,
drivers_additional=None):
self._drivers_additional = drivers_additional or []
self._dirnames = [None] * len(Ftype)
self._struct_data = collections.OrderedDict()
+ self._basedir = None
def get_normalized_compat_name(self, node):
"""Get a node's normalized compat name
continue
self._driver_aliases[alias[1]] = alias[0]
- def scan_drivers(self):
+ def scan_drivers(self, basedir=None):
"""Scan the driver folders to build a list of driver names and aliases
This procedure will populate self._drivers and self._driver_aliases
"""
- basedir = sys.argv[0].replace('tools/dtoc/dtoc', '')
- if basedir == '':
- basedir = './'
+ if not basedir:
+ basedir = sys.argv[0].replace('tools/dtoc/dtoc', '')
+ if basedir == '':
+ basedir = './'
+ self._basedir = basedir
for (dirpath, _, filenames) in os.walk(basedir):
for fname in filenames:
if not fname.endswith('.c'):
def run_steps(args, dtb_file, include_disabled, output, output_dirs,
- warning_disabled=False, drivers_additional=None):
+ warning_disabled=False, drivers_additional=None, basedir=None):
"""Run all the steps of the dtoc tool
Args:
drivers
drivers_additional (list): List of additional drivers to use during
scanning
+ basedir (str): Base directory of U-Boot source code. Defaults to the
+ grandparent of this file's directory
Raises:
ValueError: if args has no command, or an unknown command
"""
plat = DtbPlatdata(dtb_file, include_disabled, warning_disabled,
drivers_additional)
- plat.scan_drivers()
+ plat.scan_drivers(basedir)
plat.scan_dtb()
plat.scan_tree()
plat.scan_reg_sizes()
import collections
import glob
import os
+import shutil
import struct
import tempfile
import unittest
+from unittest import mock
from dtb_platdata import conv_name_to_c
from dtb_platdata import get_compat_name
self.assertEqual(
{'dt-structs-gen.h', 'source.dts', 'dt-plat.c', 'source.dtb'},
leafs)
+
+ def test_scan_dirs(self):
+ """Test scanning of source directories"""
+ def add_file(fname):
+ pathname = os.path.join(indir, fname)
+ dirname = os.path.dirname(pathname)
+ os.makedirs(dirname, exist_ok=True)
+ tools.WriteFile(pathname, '', binary=False)
+ fname_list.append(pathname)
+
+ try:
+ outdir = tools.GetOutputDir()
+ indir = tempfile.mkdtemp(prefix='dtoc.')
+ dtb_file = get_dtb_file('dtoc_test_simple.dts')
+
+ fname_list = []
+ add_file('fname.c')
+ add_file('dir/fname2.c')
+
+ # Mock out scan_driver and check that it is called with the
+ # expected files
+ with mock.patch.object(dtb_platdata.DtbPlatdata, "scan_driver") \
+ as mocked:
+ dtb_platdata.run_steps(['all'], dtb_file, False, None, [outdir],
+ True, basedir=indir)
+ self.assertEqual(2, len(mocked.mock_calls))
+ self.assertEqual(mock.call(fname_list[0]),
+ mocked.mock_calls[0])
+ self.assertEqual(mock.call(fname_list[1]),
+ mocked.mock_calls[1])
+ finally:
+ shutil.rmtree(indir)