from __future__ import print_function
import os
import sys
+import re
+import random
__all__ = [ 'KconfigDataError', 'KconfigParserError',
- 'KconfigData', 'KconfigParser' ]
+ 'KconfigData', 'KconfigParser' ,
+ 'defconfig', 'allyesconfig', 'allnoconfig', 'randconfig' ]
def debug_print(*args):
#print('# ' + (' '.join(str(x) for x in args)))
def __str__(self):
return self.msg
+allyesconfig = lambda x: True
+allnoconfig = lambda x: False
+defconfig = lambda x: x
+randconfig = lambda x: random.randint(0, 1) == 1
+
class KconfigData:
class Expr:
def __and__(self, rhs):
if self.cond.evaluate():
self.dest.set_value(True, self)
- def __init__(self):
+ def __init__(self, value_mangler=defconfig):
+ self.value_mangler = value_mangler
self.previously_included = []
self.incl_info = None
self.defined_vars = set()
self.clauses.append(KconfigData.AssignmentClause(var, val))
def do_default(self, var, val, cond=None):
+ val = self.value_mangler(val)
self.clauses.append(KconfigData.DefaultClause(var, val, cond))
def do_depends_on(self, var, expr):
return "%s: %s" % (self.loc, self.msg)
class KconfigParser:
+
@classmethod
- def parse(self, fp):
- data = KconfigData()
+ def parse(self, fp, mode=None):
+ data = KconfigData(mode or KconfigParser.defconfig)
parser = KconfigParser(data)
parser.parse_file(fp)
return data
self.get_token()
self.parse_config()
+ def do_assignment(self, var, val):
+ if not var.startswith("CONFIG_"):
+ raise Error('assigned variable should start with CONFIG_')
+ var = self.data.do_var(var[7:])
+ self.data.do_assignment(var, val)
+
# file management -----
def error_path(self):
if not self.src.startswith(rest, self.cursor):
return False
length = len(rest)
- if self.src[self.cursor + length].isalnum() or self.src[self.cursor + length] == '|':
+ if self.src[self.cursor + length].isalnum() or self.src[self.cursor + length] == '_':
return False
self.cursor += length
return True
return None
if __name__ == '__main__':
- fname = len(sys.argv) > 1 and sys.argv[1] or 'Kconfig.test'
- data = KconfigParser.parse(open(fname, 'r'))
- print data.compute_config()
+ argv = sys.argv
+ mode = defconfig
+ if len(sys.argv) > 1:
+ if argv[1] == '--defconfig':
+ del argv[1]
+ elif argv[1] == '--randconfig':
+ random.seed()
+ mode = randconfig
+ del argv[1]
+ elif argv[1] == '--allyesconfig':
+ mode = allyesconfig
+ del argv[1]
+ elif argv[1] == '--allnoconfig':
+ mode = allnoconfig
+ del argv[1]
+
+ if len(argv) == 1:
+ print ("%s: at least one argument is required" % argv[0], file=sys.stderr)
+ sys.exit(1)
+
+ if argv[1].startswith('-'):
+ print ("%s: invalid option %s" % (argv[0], argv[1]), file=sys.stderr)
+ sys.exit(1)
+
+ data = KconfigData(mode)
+ parser = KconfigParser(data)
+ for arg in argv[3:]:
+ m = re.match(r'^(CONFIG_[A-Z0-9_]+)=([yn]?)$', arg)
+ if m is not None:
+ name, value = m.groups()
+ parser.do_assignment(name, value == 'y')
+ else:
+ fp = open(arg, 'r')
+ parser.parse_file(fp)
+ fp.close()
+
+ config = data.compute_config()
+ for key in sorted(config.keys()):
+ print ('CONFIG_%s=%s' % (key, ('y' if config[key] else 'n')))
+
+ deps = open(argv[2], 'w')
+ for fname in data.previously_included:
+ print ('%s: %s' % (argv[1], fname), file=deps)
+ deps.close()