Add a script for doing my kconfig walk builds

Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
Anna Schumaker 2021-11-29 12:07:47 -05:00
parent f3f1ed1709
commit 27245b3c70
2 changed files with 120 additions and 0 deletions

View File

@ -0,0 +1,11 @@
#compdef makekconfig.py
function _makekconfig.py() {
_arguments \
{-h,--help}'[print help text]' \
{-q,--quick}'[only compile the subdirectory containing the Kconfig file]' \
'1:Kconfig:_files -g "**/Kconfig"' \
'*:Make Options:_make'
}
_makekconfig.py "$@"

109
makekconfig.py Executable file
View File

@ -0,0 +1,109 @@
#!/usr/bin/python
import argparse
import pathlib
import re
import subprocess
import sys
import termcolor
parser = argparse.ArgumentParser()
parser.add_argument("-q", "--quick", action="store_true", dest="quick",
help="Only compile the subdirectory containing the Kconfig file")
parser.add_argument("kconfig", metavar="Kconfig", nargs=1, help="Path to Kconfig file")
parser.add_argument("makeargs", metavar="Make Arguments", nargs="*", help="Options to pass to make")
Args = parser.parse_args()
Kconfig = pathlib.Path(Args.kconfig[0])
Config = pathlib.Path("scripts/config").absolute()
Make = pathlib.Path("~/bin/makelinux.zsh").expanduser()
MakeArg = Args.makeargs + ([ f"{str(Kconfig.parent)}/" ] if Args.quick else [ ])
Options = dict()
Colors = { "n" : "grey", "y" : "green", "m" : "cyan" }
Attrs = { "y" : [ "bold" ], "m" : [ "bold" ] }
NameLen = 0
if Kconfig.is_dir():
Kconfig = Kconfig / "Kconfig"
def assert_exists(path):
if not path.exists():
print(f"Error: {path} does not exist!")
sys.exit(1)
assert_exists(Kconfig)
assert_exists(Make)
assert_exists(Config)
class Option:
def __init__(self, opt):
lines = opt.splitlines()
self.name = lines[0].strip()
self.type = lines[1].strip().split()[0]
self.state = "y"
self.res = None
depends = re.search("\sdepends on (.*?)\n", opt).group(1).strip()
depends = [ d.strip() for d in re.split("[&&|=m|=y|=n]", depends) ]
self.depends = set([ d for d in depends if len(d) > 0 ])
def __repr__(self):
return f"{self.name}:{self.type}"
def __lt__(self, rhs):
if self.name.endswith("DEBUG"): return False
if rhs.name.endswith("DEBUG"): return True
return self.name in rhs.dependencies()
def dependencies(self):
ret = self.depends.copy()
for dep in self.depends:
if (opt := Options.get(dep)) is not None:
ret.update(opt.dependencies())
return ret
def disable(self):
subprocess.run([ Config ] + [ "--disable", self.name ]).check_returncode()
self.state = "n"
def enable(self):
how = "--module" if self.type == "tristate" else "--enable"
subprocess.run([ Config ] + [ how, self.name ]).check_returncode()
self.state = "m" if self.type == "tristate" else "y"
def print(self):
print(" ", end="")
termcolor.cprint(self.name, Colors.get(self.state), attrs=["bold", "dark"], end="")
termcolor.cprint("=", "white", attrs=["bold"], end="")
termcolor.cprint(self.state, Colors.get(self.state), attrs=["bold", "dark"])
def print_result(self):
result = ("Success", "green") if self.res == True else ("Failed", "red")
termcolor.cprint(" " + self.name + " ", Colors.get(self.state), attrs=["bold", "dark"], end="")
termcolor.cprint(" " * (NameLen - len(self.name)), "grey", attrs=["underline"], end="")
termcolor.cprint(" " + result[0], result[1], attrs=["bold", "dark"])
with open(Kconfig) as f:
regex = re.compile("\nconfig")
opts = [ Option(opt) for opt in regex.split(f.read()) if opt[0] != "#" ]
Options = { opt.name:opt for opt in opts if opt.type in [ "bool", "tristate" ]}
options = list(Options.values())
options.sort()
def make_opt(option):
option.enable()
print()
for o in options: o.print()
subprocess.run([ Make ] + [ "olddefconfig" ]).check_returncode()
subprocess.run([ Make ] + MakeArg).check_returncode()
option.res = True
try:
for opt in options: NameLen = max(NameLen, len(opt.name) + 2)
for opt in options: opt.disable()
for opt in options: make_opt(opt)
except Exception as e:
print(str(e))
finally:
termcolor.cprint(f"\nKconfig Results:", "yellow", attrs=["bold", "underline"])
for opt in options: opt.print_result()