1 # SPDX-License-Identifier: GPL-2.0
3 # Builds a .config from a kunitconfig.
5 # Copyright (C) 2019, Google LLC.
6 # Author: Felix Guo <felixguoxiuping@gmail.com>
7 # Author: Brendan Higgins <brendanhiggins@google.com>
12 CONFIG_IS_NOT_SET_PATTERN
= r
'^# CONFIG_(\w+) is not set$'
13 CONFIG_PATTERN
= r
'^CONFIG_(\w+)=(\S+|".*")$'
15 KconfigEntryBase
= collections
.namedtuple('KconfigEntry', ['name', 'value'])
17 class KconfigEntry(KconfigEntryBase
):
19 def __str__(self
) -> str:
21 return r
'# CONFIG_%s is not set' % (self
.name
)
23 return r
'CONFIG_%s=%s' % (self
.name
, self
.value
)
26 class KconfigParseError(Exception):
27 """Error parsing Kconfig defconfig or .config."""
30 class Kconfig(object):
31 """Represents defconfig or .config specified using the Kconfig language."""
37 return set(self
._entries
)
39 def add_entry(self
, entry
: KconfigEntry
) -> None:
40 self
._entries
.append(entry
)
42 def is_subset_of(self
, other
: 'Kconfig') -> bool:
43 for a
in self
.entries():
45 for b
in other
.entries():
48 if a
.value
!= b
.value
:
51 if a
.value
!= 'n' and found
== False:
55 def write_to_file(self
, path
: str) -> None:
56 with
open(path
, 'w') as f
:
57 for entry
in self
.entries():
58 f
.write(str(entry
) + '\n')
60 def parse_from_string(self
, blob
: str) -> None:
61 """Parses a string containing KconfigEntrys and populates this Kconfig."""
63 is_not_set_matcher
= re
.compile(CONFIG_IS_NOT_SET_PATTERN
)
64 config_matcher
= re
.compile(CONFIG_PATTERN
)
65 for line
in blob
.split('\n'):
70 match
= config_matcher
.match(line
)
72 entry
= KconfigEntry(match
.group(1), match
.group(2))
76 empty_match
= is_not_set_matcher
.match(line
)
78 entry
= KconfigEntry(empty_match
.group(1), 'n')
85 raise KconfigParseError('Failed to parse: ' + line
)
87 def read_from_file(self
, path
: str) -> None:
88 with
open(path
, 'r') as f
:
89 self
.parse_from_string(f
.read())