summaryrefslogtreecommitdiff
path: root/sys-kernel/debian-sources/files/config-extract
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/debian-sources/files/config-extract')
-rwxr-xr-xsys-kernel/debian-sources/files/config-extract219
1 files changed, 219 insertions, 0 deletions
diff --git a/sys-kernel/debian-sources/files/config-extract b/sys-kernel/debian-sources/files/config-extract
new file mode 100755
index 00000000..4860a645
--- /dev/null
+++ b/sys-kernel/debian-sources/files/config-extract
@@ -0,0 +1,219 @@
+#!/usr/bin/python2
+
+import os,sys,re
+import getopt
+
+re_head = re.compile('^binary-arch_(.*)_real::')
+re_flav = re.compile('binary-arch-flavour')
+re_item = re.compile("[A-Z_]*='[^']*'")
+
+try:
+ f=open("debian/rules.gen","r")
+except:
+ print "Unable to open debian/rules.gen; can't continue."
+ sys.exit(1)
+lines=f.readlines()
+f.close()
+
+line=0
+
+configlist = []
+configdict = {}
+
+# scan Debian rules.gen file and gather all variable data into a more useable format:
+
+while line < len(lines):
+ head_match = re_head.match(lines[line])
+ if not head_match:
+ line += 1
+ continue
+ config_name = head_match.group(1)
+ line += 1
+ if not re_flav.findall(lines[line]):
+ continue
+ lsplit = re_item.findall(lines[line])
+ groovydict = {}
+ for item in lsplit:
+ kv = item.split("=",1)
+ if len(kv) < 2:
+ continue
+ groovydict[kv[0]] = kv[1][1:-1]
+ configlist.append(config_name)
+ configdict[config_name] = groovydict
+ line += 1
+
+# We will organize the arch, featureset and flavors into cascading lists so
+# that we can present a nice clean chart of what's available to the user:
+
+archdict = {}
+
+for config in configlist:
+ cs = config.split("_")
+ if not cs[0] in archdict:
+ archdict[cs[0]] = { }
+ if cs[1] == "none":
+ cs[1] = None
+ if cs[1] not in archdict[cs[0]]:
+ archdict[cs[0]][cs[1]] = []
+ archdict[cs[0]][cs[1]].append(cs[2])
+
+arches = archdict.keys()
+arches.sort()
+
+features = [ None ]
+for arch in arches:
+ for flav in archdict[arch]:
+ if flav not in features:
+ features.append(flav)
+
+PROG="config-extract"
+def usage():
+ print """This work is free software.
+
+Copyright 2011 Funtoo Technologies. You can redistribute and/or modify it under
+the terms of the GNU General Public License version 3 as published by the Free
+Software Foundation. Alternatively you may (at your option) use any other
+license that has been publicly approved for use with this program by Funtoo
+Technologies (or its successors, if any.)
+
+usage: %s [options] arch [featureset] [subarch]
+
+ -h --help print this usage and exit
+ -l --list list all available kernel configurations
+ -o --outfile specify kernel config outfile --
+ defaults to .config in current directory
+ [featureset] defaults to "standard" if not specified
+ [subarch] defaults to the only one available; otherwise required
+
+This program was written by Daniel Robbins for Funtoo Linux, for the purpose of
+easily and conveniently extracting Debian kernel configurations. To see a nice
+list of all available kernel configurations, use the --list option.
+
+Debian's kernel configs are specified internally in arch_featureset_flavor
+format, such as: "amd64_openvz_amd64". The featureset typically describes an
+optional kernel configuration such as "xen" or "openvz", while the flavor in
+Debian terminology typically refers to the sub-architecture of the CPU.
+
+When using this command, you must specify an arch. A featureset of "standard" is
+assumed unless you specify one, and by default this program will pick the only
+available subarch if there is only one to choose from. If not, you will need to
+pick one (and the program will remind you to do this.)
+
+The kernel configuration will be written to ".config" in the current directory,
+or the location you specified using the -o/--outfile option.
+""" % PROG
+ sys.exit(2)
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "o:hl", ["help", "list","outfile="])
+except getopt.GetoptError, err:
+ print str(err)
+ usage()
+
+mode="run"
+outfile=None
+for o,a in opts:
+ if o in ("-h", "--help"):
+ usage()
+ elif o in ("-l", "--list"):
+ mode="list"
+ elif o in ("-o", "--outfile"):
+ outfile = a
+ else:
+ assert False, "Unhandled option"
+if mode == "run":
+ if len(args) < 1 or len(args) > 3:
+ if len(args) == 0:
+ print "Please specify an arch - one of: "+", ".join(arches)
+ sys.exit(2)
+ else:
+ print "Too many arguments."
+ usage()
+ arch = args[0]
+ if outfile == None:
+ outfile = os.path.join(os.getcwd(),".config")
+ featureset = None
+ subarch = None
+ if len(args) == 3:
+ featureset = args[1]
+ subarch = args[2]
+ elif len(args) == 2:
+ featureset = args[1]
+ if featureset == "standard":
+ featureset = None
+
+# print out optimized list of available kernel configurations:
+
+if mode=="list":
+ print
+ for flav in features:
+ label = flav
+ if label == None:
+ label = "standard"
+ print "====== %s featureset ======" % label
+ print
+ for arch in arches:
+ if flav in archdict[arch]:
+ if len(archdict[arch][flav]) == 1:
+ print arch.rjust(12)
+ else:
+ flavlist = archdict[arch][flav]
+ flavlist.sort()
+ variants = ", ".join(flavlist)
+ print arch.rjust(12) + ":", variants
+ print
+ sys.exit(0)
+
+# featureset defaults to None.
+
+if featureset not in archdict[arch]:
+ print "Error: There is no '%s' featureset kernel config for arch '%s'. Exiting." % ( featureset, arch )
+ print archdict[arch]
+ sys.exit(2)
+
+# If a subarch is not specified (None), then we will auto-pick the subarch if only one is available.
+# Debian often has an "amd64" subarch for the "amd64" arch, rather than "none" as I might expect:
+
+if subarch == None:
+ if len(archdict[arch][featureset]) == 1:
+ subarch = archdict[arch][featureset][0]
+ else:
+ print "Error: there is more than one 'sub-architecture' for this arch."
+ print "Please specify [arch] [featureset] [subarch], with one of these subarches:"
+ print ", ".join(archdict[arch][featureset])
+ sys.exit(2)
+else:
+ if subarch not in archdict[arch][featureset]:
+ print "Error: specified sub-architecture '%s' is not available for this arch. Exiting." % subarch
+ sys.exit(2)
+
+# We've done all our arg processing, now let's construct the master_key that we will use to look up the
+# proper settings to pass to Debian's debian/bin/kconfig.py command:
+
+master_key=arch
+if featureset == None:
+ master_key += "_none"
+else:
+ master_key += "_%s" % featureset
+if subarch == None:
+ master_key += "_none"
+else:
+ master_key += "_%s" % subarch
+if master_key not in configdict:
+ print "Master key lookup failed; can't continue. Please report this bug."
+ sys.exit(1)
+if "KCONFIG" not in configdict[master_key]:
+ print "Unable to find KCONFIG option; can't continue. Please report this bug."
+ sys.exit(1)
+cmd = "python2 debian/bin/kconfig.py '%s' %s" % ( outfile, configdict[master_key]["KCONFIG"] )
+if "KCONFIG_OPTIONS" in configdict[master_key]:
+ cmd += " %s" % configdict[master_key]["KCONFIG_OPTIONS"]
+os.environ["PYTHONPATH"] = "debian/lib/python"
+retval = os.system(cmd)
+if retval == 0:
+ print "Wrote %s kernel configuration to %s." % ( master_key, outfile )
+ sys.exit(0)
+else:
+ print "There was an error extracting the Debian kernel config."
+ sys.exit(1)
+