mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 05:35:25 +00:00
rpcgen: define entrypoint for running new rpcgen impl
The new program takes the form rpcgen [--mode source|header|repr] \ [--header include] \ xdr-file output-file If '--mode' is not given it parses the XDR file but does not generate anything, which is useful as a syntax check. The 'source' mode gives the '.c' file content, while 'header' gives the '.h' file content. 'repr' gives a representation of the abstract syntax tree, mostly useful for debugging the parser. If '--header' is given, it is added as a local #include ".." statement in the output and is valid for either 'header' or 'source' modes. Either 'xdr-file' or 'output-file' can be omitted in which case they default to stdin/stdout respectively. This rpcgen program will directly include the 'config.h' header in its output. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
40cbaa8fbe
commit
ac9e6ff649
84
scripts/rpcgen/main.py
Executable file
84
scripts/rpcgen/main.py
Executable file
@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
|
||||
import argparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
from rpcgen.parser import XDRParser
|
||||
from rpcgen.generator import (
|
||||
XDRTypeDeclarationGenerator,
|
||||
XDRMarshallDeclarationGenerator,
|
||||
XDRMarshallImplementationGenerator,
|
||||
)
|
||||
|
||||
|
||||
def parse_cli():
|
||||
parser = argparse.ArgumentParser("RPC code generator")
|
||||
parser.add_argument(
|
||||
"-m",
|
||||
"--mode",
|
||||
choices=["header", "source", "repr"],
|
||||
help="Output generation mode",
|
||||
)
|
||||
parser.add_argument(
|
||||
"-r", "--header", default=[], action="append", help="Extra headers to include"
|
||||
)
|
||||
parser.add_argument("input", default="-", nargs="?", help="XDR input protocol file")
|
||||
parser.add_argument("output", default="-", nargs="?", help="Generated output file")
|
||||
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_cli()
|
||||
|
||||
infp = sys.stdin
|
||||
outfp = sys.stdout
|
||||
if args.input != "-":
|
||||
infp = open(args.input, "r")
|
||||
if args.output != "-":
|
||||
# the old genprotocol.pl wrapper would make the
|
||||
# output files mode 0444, which will prevent us
|
||||
# from writing directly do them. Explicitly
|
||||
# unlinking first gets rid of any old possibly
|
||||
# read-only copy
|
||||
#
|
||||
# We can delete this in a few years, once we
|
||||
# know users won't have a previously generated
|
||||
# readonly copy lieing around.
|
||||
try:
|
||||
os.unlink(args.output)
|
||||
except Exception:
|
||||
pass
|
||||
outfp = open(args.output, "w")
|
||||
|
||||
parser = XDRParser(infp)
|
||||
spec = parser.parse()
|
||||
|
||||
if args.mode == "header":
|
||||
print("/* This file is auto-generated from %s */\n" % args.input, file=outfp)
|
||||
print("#include <rpc/rpc.h>", file=outfp)
|
||||
for h in args.header:
|
||||
print('#include "%s"' % h, file=outfp)
|
||||
print("", file=outfp)
|
||||
print("#pragma once\n", file=outfp)
|
||||
generator = XDRTypeDeclarationGenerator(spec)
|
||||
print(generator.visit(), file=outfp)
|
||||
generator = XDRMarshallDeclarationGenerator(spec)
|
||||
print(generator.visit(), file=outfp)
|
||||
elif args.mode == "source":
|
||||
print("/* This file is auto-generated from %s */\n" % args.input, file=outfp)
|
||||
print("#include <config.h>", file=outfp)
|
||||
for h in args.header:
|
||||
print('#include "%s"' % h, file=outfp)
|
||||
print("", file=outfp)
|
||||
generator = XDRMarshallImplementationGenerator(spec)
|
||||
print(generator.visit(), file=outfp)
|
||||
elif args.mode == "repr":
|
||||
print(spec, file=outfp)
|
||||
else:
|
||||
pass # Just validates XDR input syntax
|
||||
|
||||
|
||||
main()
|
Loading…
Reference in New Issue
Block a user