import argparse
import sys
from itertools import chain
import tempita
import xml.dom.minidom
COMMON_HEADER = """
/* @LICENSE(NICTA) */
/* This header was generated by kernel/tools/invocation_header_gen.py.
*
* To add an invocation call number, edit libsel4/include/interfaces/sel4.xml.
*
*/"""
INVOCATION_TEMPLATE = COMMON_HEADER + """
#[repr(C)]
pub enum InvocationLabel {
InvalidInvocation = 0,
{{for loop, label in looper(invocations)}}
{{label}} = {{loop.index+1}},
{{endfor}}
}
"""
def parse_args():
parser = argparse.ArgumentParser(description='Generate seL4 invocation API \
constants and header files')
parser.add_argument('--dest', type=argparse.FileType('w'),
help='Name of file to create', required=True)
parser.add_argument('files', nargs='+', help='XML files to parse invocations from')
return parser.parse_args()
def parse_xml(xml_file):
try:
doc = xml.dom.minidom.parse(xml_file)
except:
print >> sys.stderr, "Error: invalid xml file"
sys.exit(-1)
invocation_labels = []
for method in doc.getElementsByTagName("method"):
invocation_labels.append(str(method.getAttribute("id")))
return invocation_labels
def generate(args, invocations):
header_title = "LIBRUSTSEL4"
template = tempita.Template(INVOCATION_TEMPLATE)
args.dest.write(template.substitute(header_title=header_title,
invocations=invocations))
args.dest.close()
if __name__ == "__main__":
args = parse_args()
invocations = chain.from_iterable(parse_xml(xml) for xml in args.files)
generate(args, invocations)