#!/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: 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)