mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
4b132aacb0
Add a Python-based tool for translating XDR specifications into XDR encoder and decoder functions written in the Linux kernel's C coding style. The generator attempts to match the usual C coding style of the Linux kernel's SunRPC consumers. This approach is similar to the netlink code generator in tools/net/ynl . The maintainability benefits of machine-generated XDR code include: - Stronger type checking - Reduces the number of bugs introduced by human error - Makes the XDR code easier to audit and analyze - Enables rapid prototyping of new RPC-based protocols - Hardens the layering between protocol logic and marshaling - Makes it easier to add observability on demand - Unit tests might be built for both the tool and (automatically) for the generated code In addition, converting the XDR layer to use memory-safe languages such as Rust will be easier if much of the code can be converted automatically. Tested-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
#!/usr/bin/env python3
|
|
# ex: set filetype=python:
|
|
|
|
"""Generate header top boilerplate"""
|
|
|
|
import os.path
|
|
import time
|
|
|
|
from generators import Boilerplate, header_guard_infix
|
|
from generators import create_jinja2_environment, get_jinja2_template
|
|
from xdr_ast import Specification
|
|
|
|
|
|
class XdrHeaderTopGenerator(Boilerplate):
|
|
"""Generate header boilerplate"""
|
|
|
|
def __init__(self, language: str, peer: str):
|
|
"""Initialize an instance of this class"""
|
|
self.environment = create_jinja2_environment(language, "header_top")
|
|
self.peer = peer
|
|
|
|
def emit_declaration(self, filename: str, root: Specification) -> None:
|
|
"""Emit the top header guard"""
|
|
template = get_jinja2_template(self.environment, "declaration", "header")
|
|
print(
|
|
template.render(
|
|
infix=header_guard_infix(filename),
|
|
filename=filename,
|
|
mtime=time.ctime(os.path.getmtime(filename)),
|
|
)
|
|
)
|
|
|
|
def emit_definition(self, filename: str, root: Specification) -> None:
|
|
"""Emit the top header guard"""
|
|
template = get_jinja2_template(self.environment, "definition", "header")
|
|
print(
|
|
template.render(
|
|
infix=header_guard_infix(filename),
|
|
filename=filename,
|
|
mtime=time.ctime(os.path.getmtime(filename)),
|
|
)
|
|
)
|
|
|
|
def emit_source(self, filename: str, root: Specification) -> None:
|
|
pass
|