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