#!/usr/bin/env python3
# ex: set filetype=python:
"""Translate an XDR specification into executable code that
can be compiled
for the Linux kernel.
"""
__author__ =
"Chuck Lever"
__copyright__ =
"Copyright (c) 2024 Oracle and/or its affiliates."
__license__ =
"GPL-2.0 only"
__version__ =
"0.2"
import sys
import argparse
from subcmds
import definitions
from subcmds
import declarations
from subcmds
import lint
from subcmds
import source
sys.path.insert(
1,
"@pythondir@")
def main() -> int:
"""Parse command-line options"""
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description=
"Convert an XDR specification to Linux kernel source code",
epilog=
"""\
Copyright (c)
2024 Oracle and/or its affiliates.
License GPLv2: <
http://www.gnu.org/licenses/old-licenses/gpl-2.
0.txt>
This is free software. You are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
""",
)
parser.add_argument(
"--version",
help=
"Display the version of this tool",
action=
"version",
version=__version__,
)
subcommands = parser.add_subparsers(title=
"Subcommands", required=True)
definitions_parser = subcommands.add_parser(
"definitions", help=
"Generate XDR definitions"
)
definitions_parser.add_argument(
"--annotate",
action=
"store_true",
default=False,
help=
"Add annotation comments",
)
definitions_parser.add_argument(
"--language",
action=
"store_true",
default=
"C",
help=
"Output language",
)
definitions_parser.add_argument(
"--peer",
choices=[
"server",
"client",],
default=
"server",
help=
"Generate header code for client or server side",
type=str,
)
definitions_parser.add_argument(
"filename", help=
"File containing an XDR specification")
definitions_parser.set_defaults(func=definitions.subcmd)
declarations_parser = subcommands.add_parser(
"declarations", help=
"Generate function declarations"
)
declarations_parser.add_argument(
"--annotate",
action=
"store_true",
default=False,
help=
"Add annotation comments",
)
declarations_parser.add_argument(
"--language",
action=
"store_true",
default=
"C",
help=
"Output language",
)
declarations_parser.add_argument(
"--peer",
choices=[
"server",
"client",],
default=
"server",
help=
"Generate code for client or server side",
type=str,
)
declarations_parser.add_argument(
"filename", help=
"File containing an XDR specification")
declarations_parser.set_defaults(func=declarations.subcmd)
linter_parser = subcommands.add_parser(
"lint", help=
"Check an XDR specification")
linter_parser.add_argument(
"filename", help=
"File containing an XDR specification")
linter_parser.set_defaults(func=lint.subcmd)
source_parser = subcommands.add_parser(
"source", help=
"Generate XDR encoder and decoder source code"
)
source_parser.add_argument(
"--annotate",
action=
"store_true",
default=False,
help=
"Add annotation comments",
)
source_parser.add_argument(
"--language",
action=
"store_true",
default=
"C",
help=
"Output language",
)
source_parser.add_argument(
"--peer",
choices=[
"server",
"client",],
default=
"server",
help=
"Generate code for client or server side",
type=str,
)
source_parser.add_argument(
"filename", help=
"File containing an XDR specification")
source_parser.set_defaults(func=source.subcmd)
args = parser.parse_args()
return args.func(args)
try:
if __name__ ==
"__main__":
sys.exit(main())
except SystemExit:
sys.exit(
0)
except (KeyboardInterrupt, BrokenPipeError):
sys.exit(
1)