scripts: runner: add build-time .conf parser

This parses generated_dts_board.conf and auto.conf, given a build
directory.

Signed-off-by: Marti Bolivar <marti@opensourcefoundries.com>
diff --git a/scripts/support/runner/core.py b/scripts/support/runner/core.py
index fcc0d80..cfb4036 100644
--- a/scripts/support/runner/core.py
+++ b/scripts/support/runner/core.py
@@ -143,6 +143,52 @@
         return {int(b) for b in used_bytes}
 
 
+class BuildConfiguration:
+    '''This helper class provides access to build-time configuration.
+
+    Configuration options can be read as if the object were a dict,
+    either object['CONFIG_FOO'] or object.get('CONFIG_FOO').
+
+    Configuration values in .config and generated_dts_board.conf are
+    available.'''
+
+    def __init__(self, build_dir):
+        self.build_dir = build_dir
+        self.options = {}
+        self._init()
+
+    def __getitem__(self, item):
+        return self.options[item]
+
+    def get(self, option, *args):
+        return self.options.get(option, *args)
+
+    def _init(self):
+        build_z = os.path.join(self.build_dir, 'zephyr')
+        generated = os.path.join(build_z, 'include', 'generated')
+        files = [os.path.join(build_z, '.config'),
+                 os.path.join(generated, 'generated_dts_board.conf')]
+        for f in files:
+            self._parse(f)
+
+    def _parse(self, filename):
+        with open(filename, 'r') as f:
+            for line in f:
+                line = line.strip()
+                if not line or line.startswith('#'):
+                    continue
+                option, value = line.split('=', 1)
+                self.options[option] = self._parse_value(value)
+
+    def _parse_value(self, value):
+        if value.startswith('"') or value.startswith("'"):
+            return value.split()
+        try:
+            return int(value, 0)
+        except ValueError:
+            return value
+
+
 class RunnerCaps:
     '''This class represents a runner class's capabilities.