| #!/usr/bin/env python |
| |
| # The format of the kernel configs in the framework compatibility matrix |
| # has a couple properties that would make it confusing or cumbersome to |
| # maintain by hand: |
| # |
| # - Conditions apply to all configs within the same <kernel> section. |
| # The <kernel> tag also specifies the LTS version. Since the entire |
| # file in the kernel/configs repo is for a single kernel version, |
| # the section is renamed as a "group", and the LTS version is |
| # specified once at the top of the file with a tag of the form |
| # <kernel minlts="x.y.z" />. |
| # - The compatibility matrix understands all kernel config options as |
| # tristate values. In reality however some kernel config options are |
| # boolean. This script simply converts booleans to tristates so we |
| # can avoid describing boolean values as tristates in hand-maintained |
| # files. |
| # |
| |
| from __future__ import print_function |
| import argparse |
| import os |
| import re |
| import sys |
| |
| def fixup(args): |
| source_f = open(args.input) or die ("Could not open %s" % args.input) |
| |
| # The first line of the conditional xml has the tag containing |
| # the kernel min LTS version. |
| line = source_f.readline() |
| exp_re = re.compile(r"^<kernel minlts=\"(\d+).(\d+).(\d+)\"\s+/>") |
| exp_match = re.match(exp_re, line) |
| assert exp_match, "Malformatted kernel conditional config file.\n" |
| |
| major = exp_match.group(1) |
| minor = exp_match.group(2) |
| tiny = exp_match.group(3) |
| |
| if args.output_version: |
| version_f = (open(args.output_version, "w+") or |
| die("Could not open version file")) |
| version_f.write("{}.{}.{}".format(major, minor, tiny)) |
| version_f.close() |
| |
| if args.output_matrix: |
| dest_f = (open(args.output_matrix, "w+") or |
| die("Could not open destination file")) |
| dest_f.write("<compatibility-matrix version=\"1.0\" type=\"framework\">\n") |
| |
| # First <kernel> must not have <condition> for libvintf backwards compatibility. |
| dest_f.write("<kernel version=\"{}.{}.{}\" />".format(major, minor, tiny)) |
| |
| line = source_f.readline() |
| while line: |
| line = line.replace("<value type=\"bool\">", |
| "<value type=\"tristate\">") |
| line = line.replace("<group>", |
| "<kernel version=\"{}.{}.{}\">".format(major, minor, tiny)) |
| line = line.replace("</group>", "</kernel>") |
| dest_f.write(line) |
| line = source_f.readline() |
| |
| dest_f.write("</compatibility-matrix>") |
| dest_f.close() |
| |
| source_f.close() |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('--input', help='Input file', required=True) |
| parser.add_argument('--output-matrix', help='Output compatibility matrix file') |
| parser.add_argument('--output-version', help='Output version file') |
| |
| args = parser.parse_args() |
| |
| fixup(args) |
| |
| sys.exit(0) |