xref: /aosp_15_r20/kernel/configs/tools/kconfig_xml_fixup.py (revision 1d3556b860e096874ddca674556f5d20fb3a73b0)
1*1d3556b8SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*1d3556b8SAndroid Build Coastguard Worker
3*1d3556b8SAndroid Build Coastguard Worker# The format of the kernel configs in the framework compatibility matrix
4*1d3556b8SAndroid Build Coastguard Worker# has a couple properties that would make it confusing or cumbersome to
5*1d3556b8SAndroid Build Coastguard Worker# maintain by hand:
6*1d3556b8SAndroid Build Coastguard Worker#
7*1d3556b8SAndroid Build Coastguard Worker#  - Conditions apply to all configs within the same <kernel> section.
8*1d3556b8SAndroid Build Coastguard Worker#    The <kernel> tag also specifies the LTS version. Since the entire
9*1d3556b8SAndroid Build Coastguard Worker#    file in the kernel/configs repo is for a single kernel version,
10*1d3556b8SAndroid Build Coastguard Worker#    the section is renamed as a "group", and the LTS version is
11*1d3556b8SAndroid Build Coastguard Worker#    specified once at the top of the file with a tag of the form
12*1d3556b8SAndroid Build Coastguard Worker#    <kernel minlts="x.y.z" />.
13*1d3556b8SAndroid Build Coastguard Worker#  - The compatibility matrix understands all kernel config options as
14*1d3556b8SAndroid Build Coastguard Worker#    tristate values. In reality however some kernel config options are
15*1d3556b8SAndroid Build Coastguard Worker#    boolean. This script simply converts booleans to tristates so we
16*1d3556b8SAndroid Build Coastguard Worker#    can avoid describing boolean values as tristates in hand-maintained
17*1d3556b8SAndroid Build Coastguard Worker#    files.
18*1d3556b8SAndroid Build Coastguard Worker#
19*1d3556b8SAndroid Build Coastguard Worker
20*1d3556b8SAndroid Build Coastguard Workerfrom __future__ import print_function
21*1d3556b8SAndroid Build Coastguard Workerimport argparse
22*1d3556b8SAndroid Build Coastguard Workerimport os
23*1d3556b8SAndroid Build Coastguard Workerimport re
24*1d3556b8SAndroid Build Coastguard Workerimport sys
25*1d3556b8SAndroid Build Coastguard Worker
26*1d3556b8SAndroid Build Coastguard Workerdef fixup(args):
27*1d3556b8SAndroid Build Coastguard Worker    with open(args.input) as source_f:
28*1d3556b8SAndroid Build Coastguard Worker        # The first line of the conditional xml has the tag containing
29*1d3556b8SAndroid Build Coastguard Worker        # the kernel min LTS version.
30*1d3556b8SAndroid Build Coastguard Worker        line = source_f.readline()
31*1d3556b8SAndroid Build Coastguard Worker        exp_re = re.compile(r"^<kernel minlts=\"(\d+).(\d+).(\d+)\"\s+/>")
32*1d3556b8SAndroid Build Coastguard Worker        exp_match = re.match(exp_re, line)
33*1d3556b8SAndroid Build Coastguard Worker        assert exp_match, "Malformatted kernel conditional config file.\n"
34*1d3556b8SAndroid Build Coastguard Worker
35*1d3556b8SAndroid Build Coastguard Worker        major = exp_match.group(1)
36*1d3556b8SAndroid Build Coastguard Worker        minor = exp_match.group(2)
37*1d3556b8SAndroid Build Coastguard Worker        tiny = exp_match.group(3)
38*1d3556b8SAndroid Build Coastguard Worker
39*1d3556b8SAndroid Build Coastguard Worker        if args.output_version:
40*1d3556b8SAndroid Build Coastguard Worker            with open(args.output_version, "w+") as version_f:
41*1d3556b8SAndroid Build Coastguard Worker                version_f.write("{}.{}.{}".format(major, minor, tiny))
42*1d3556b8SAndroid Build Coastguard Worker
43*1d3556b8SAndroid Build Coastguard Worker        if args.output_matrix:
44*1d3556b8SAndroid Build Coastguard Worker            with open(args.output_matrix, "w+") as dest_f:
45*1d3556b8SAndroid Build Coastguard Worker                dest_f.write("<compatibility-matrix version=\"1.0\" type=\"framework\">\n")
46*1d3556b8SAndroid Build Coastguard Worker
47*1d3556b8SAndroid Build Coastguard Worker                # First <kernel> must not have <condition> for libvintf backwards compatibility.
48*1d3556b8SAndroid Build Coastguard Worker                dest_f.write("<kernel version=\"{}.{}.{}\" />".format(major, minor, tiny))
49*1d3556b8SAndroid Build Coastguard Worker
50*1d3556b8SAndroid Build Coastguard Worker                line = source_f.readline()
51*1d3556b8SAndroid Build Coastguard Worker                while line:
52*1d3556b8SAndroid Build Coastguard Worker                    line = line.replace("<value type=\"bool\">",
53*1d3556b8SAndroid Build Coastguard Worker                            "<value type=\"tristate\">")
54*1d3556b8SAndroid Build Coastguard Worker                    line = line.replace("<group>",
55*1d3556b8SAndroid Build Coastguard Worker                            "<kernel version=\"{}.{}.{}\">".format(major, minor, tiny))
56*1d3556b8SAndroid Build Coastguard Worker                    line = line.replace("</group>", "</kernel>")
57*1d3556b8SAndroid Build Coastguard Worker                    dest_f.write(line)
58*1d3556b8SAndroid Build Coastguard Worker                    line = source_f.readline()
59*1d3556b8SAndroid Build Coastguard Worker
60*1d3556b8SAndroid Build Coastguard Worker                dest_f.write("</compatibility-matrix>")
61*1d3556b8SAndroid Build Coastguard Worker
62*1d3556b8SAndroid Build Coastguard Workerif __name__ == '__main__':
63*1d3556b8SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser(description=__doc__)
64*1d3556b8SAndroid Build Coastguard Worker    parser.add_argument('--input', help='Input file', required=True)
65*1d3556b8SAndroid Build Coastguard Worker    parser.add_argument('--output-matrix', help='Output compatibility matrix file')
66*1d3556b8SAndroid Build Coastguard Worker    parser.add_argument('--output-version', help='Output version file')
67*1d3556b8SAndroid Build Coastguard Worker
68*1d3556b8SAndroid Build Coastguard Worker    args = parser.parse_args()
69*1d3556b8SAndroid Build Coastguard Worker
70*1d3556b8SAndroid Build Coastguard Worker    fixup(args)
71*1d3556b8SAndroid Build Coastguard Worker
72*1d3556b8SAndroid Build Coastguard Worker    sys.exit(0)
73