minikconfig: implement allnoconfig and defconfig modes

Apart from defconfig (which is a no-op),
allyesconfig/allnoconfig/randcondfig can be implemented simply by ignoring
the RHS of assignments and "default" statements.  The RHS is replaced
respectively by "true", "false" or a random value.

However, allyesconfig and randconfig do not quite work, because all the
files for hw/ARCH/Kconfig are sourced and therefore you could end up
enabling some ARM boards in x86 or things like that.  This is left for
future work, but I am leaving it in to help debugging minikconf itself.

allnoconfig mode is tied to a new configure option, --without-default-devices.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2019-01-23 14:56:17 +08:00
parent e0e312f352
commit f349474920
3 changed files with 46 additions and 6 deletions

View File

@ -345,6 +345,7 @@ endif
# This has to be kept in sync with Kconfig.host.
MINIKCONF_ARGS = \
$(CONFIG_MINIKCONF_MODE) \
$@ $*-config.devices.mak.d $< $(MINIKCONF_INPUTS) \
CONFIG_KVM=$(CONFIG_KVM) \
CONFIG_SPICE=$(CONFIG_SPICE) \

12
configure vendored
View File

@ -487,7 +487,7 @@ libxml2=""
docker="no"
debug_mutex="no"
libpmem=""
libudev="no"
default_devices="yes"
# cross compilers defaults, can be overridden with --cross-cc-ARCH
cross_cc_aarch64="aarch64-linux-gnu-gcc"
@ -996,6 +996,10 @@ for opt do
;;
--with-trace-file=*) trace_file="$optarg"
;;
--with-default-devices) default_devices="yes"
;;
--without-default-devices) default_devices="no"
;;
--enable-gprof) gprof="yes"
;;
--enable-gcov) gcov="yes"
@ -6261,6 +6265,7 @@ echo "capstone $capstone"
echo "docker $docker"
echo "libpmem support $libpmem"
echo "libudev $libudev"
echo "default devices $default_devices"
if test "$supported_cpu" = "no"; then
echo
@ -6322,6 +6327,11 @@ echo "GIT_UPDATE=$git_update" >> $config_host_mak
echo "ARCH=$ARCH" >> $config_host_mak
if test "$default_devices" = "yes" ; then
echo "CONFIG_MINIKCONF_MODE=--defconfig" >> $config_host_mak
else
echo "CONFIG_MINIKCONF_MODE=--allnoconfig" >> $config_host_mak
fi
if test "$debug_tcg" = "yes" ; then
echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
fi

View File

@ -14,9 +14,11 @@ 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)))
@ -39,6 +41,11 @@ class KconfigDataError(Exception):
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):
@ -192,7 +199,8 @@ class KconfigData:
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()
@ -272,6 +280,7 @@ class KconfigData:
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):
@ -328,9 +337,10 @@ class KconfigParserError(Exception):
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
@ -653,11 +663,30 @@ class KconfigParser:
if __name__ == '__main__':
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)
data = KconfigData()
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)