kernel-config project: add kcimport script

This is the script I used with [1] to generate the config diffs and
separate out the arch specific bits. Included mostly just so people can
play around with it if they want to generate their own diffs.

[1]: https://github.com/ulfalizer/Kconfiglib

Signed-off-by: Tycho Andersen <tycho@docker.com>
This commit is contained in:
Tycho Andersen 2017-05-12 15:28:11 -06:00
parent 8a140cefd8
commit d6269d8504

84
projects/kernel-config/kcimport Executable file
View File

@ -0,0 +1,84 @@
#!/usr/bin/env python3
import sys
import subprocess
import os.path
import kconfiglib
KERNEL_VERSION="4.11.x"
LINUXKIT_KERNEL=os.path.expanduser("~/packages/linuxkit/kernel")
def collect_config(f):
config = {}
for line in f:
line = line.strip()
if line.startswith("# CONFIG_"):
opt = line[len("# CONFIG_"):-len(" is not set")]
value = "n"
elif line.startswith("CONFIG_"):
[opt, value] = line.strip().split("=")
opt = opt[len("CONFIG_"):]
else:
continue
config[opt] = value
return config
with open(os.path.join(LINUXKIT_KERNEL, "kernel_config-%s" % KERNEL_VERSION)) as f:
config = collect_config(f)
opts = sorted(config.keys())
klib = kconfiglib.Config(sys.argv[1])
# this needs to be `make defconfig`
klib.load_config(".config")
ours = kconfiglib.Config(sys.argv[1])
ours.load_config(os.path.join(LINUXKIT_KERNEL, "kernel_config-%s" % KERNEL_VERSION))
arch = []
generic = []
for o in opts:
# our hyperv patch stuff
if o in ("AF_KCM", "HYPERV_SOCK", "VIRTIO_VSOCKETS", "VIRTIO_VSOCKETS_COMMON", "HYPERV_VSOCKETS"):
generic.append(o)
continue
sym = klib.get_symbol(o)
if sym is None:
print("symbol %s unknown" % o)
sys.exit(1)
oursym = ours.get_symbol(o)
if sym is None:
print("symbol %s unknown" % o)
sys.exit(1)
# don't render invisble symbols
if oursym.get_visibility() == 'n':
continue
# If defconfig of this symbol matches our value, we don't need to track it:
value = config[o]
if value == sym.get_value():
continue
if sym.get_def_locations()[0][0].startswith("arch"):
arch.append(o)
else:
generic.append(o)
def render_diff(diff):
for o in sorted(diff):
value = config[o]
if value == "n":
print("# CONFIG_%s is not set" % o)
else:
print("CONFIG_%s=%s" % (o, value))
print("ARCH\n\n")
render_diff(arch)
print("\n\nGENRIC\n\n")
render_diff(generic)