mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00

Instead of producing a big message with all ABI contents and then parse as a whole, simplify the code by handling each ABI symbol in separate. As an additional benefit, there's no need to place file/line nubers inlined at the data and use a regex to convert them. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Signed-off-by: Jonathan Corbet <corbet@lwn.net> Link: https://lore.kernel.org/r/15be22955e3c6df49d7256c8fd24f62b397ad0ff.1739182025.git.mchehab+huawei@kernel.org
147 lines
4.2 KiB
Python
Executable File
147 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# pylint: disable=R0903
|
|
# Copyright(c) 2025: Mauro Carvalho Chehab <mchehab@kernel.org>.
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
|
|
"""
|
|
Parse ABI documentation and produce results from it.
|
|
"""
|
|
|
|
import argparse
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
# Import Python modules
|
|
|
|
LIB_DIR = "lib/abi"
|
|
SRC_DIR = os.path.dirname(os.path.realpath(__file__))
|
|
|
|
sys.path.insert(0, os.path.join(SRC_DIR, LIB_DIR))
|
|
|
|
from abi_parser import AbiParser # pylint: disable=C0413
|
|
from helpers import ABI_DIR, DEBUG_HELP # pylint: disable=C0413
|
|
|
|
# Command line classes
|
|
|
|
|
|
REST_DESC = """
|
|
Produce output in ReST format.
|
|
|
|
The output is done on two sections:
|
|
|
|
- Symbols: show all parsed symbols in alphabetic order;
|
|
- Files: cross reference the content of each file with the symbols on it.
|
|
"""
|
|
|
|
class AbiRest:
|
|
"""Initialize an argparse subparser for rest output"""
|
|
|
|
def __init__(self, subparsers):
|
|
"""Initialize argparse subparsers"""
|
|
|
|
parser = subparsers.add_parser("rest",
|
|
formatter_class=argparse.RawTextHelpFormatter,
|
|
description=REST_DESC)
|
|
|
|
parser.add_argument("--enable-lineno", action="store_true",
|
|
help="enable lineno")
|
|
parser.add_argument("--raw", action="store_true",
|
|
help="output text as contained in the ABI files. "
|
|
"It not used, output will contain dynamically"
|
|
" generated cross references when possible.")
|
|
parser.add_argument("--no-file", action="store_true",
|
|
help="Don't the files section")
|
|
parser.add_argument("--show-hints", help="Show-hints")
|
|
|
|
parser.set_defaults(func=self.run)
|
|
|
|
def run(self, args):
|
|
"""Run subparser"""
|
|
|
|
parser = AbiParser(args.dir, debug=args.debug)
|
|
parser.parse_abi()
|
|
parser.check_issues()
|
|
|
|
for t in parser.doc(args.raw, not args.no_file):
|
|
if args.enable_lineno:
|
|
print (f".. LINENO {t[1]}#{t[2]}\n\n")
|
|
|
|
print(t[0])
|
|
|
|
class AbiValidate:
|
|
"""Initialize an argparse subparser for ABI validation"""
|
|
|
|
def __init__(self, subparsers):
|
|
"""Initialize argparse subparsers"""
|
|
|
|
parser = subparsers.add_parser("validate",
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
description="list events")
|
|
|
|
parser.set_defaults(func=self.run)
|
|
|
|
def run(self, args):
|
|
"""Run subparser"""
|
|
|
|
parser = AbiParser(args.dir, debug=args.debug)
|
|
parser.parse_abi()
|
|
parser.check_issues()
|
|
|
|
|
|
class AbiSearch:
|
|
"""Initialize an argparse subparser for ABI search"""
|
|
|
|
def __init__(self, subparsers):
|
|
"""Initialize argparse subparsers"""
|
|
|
|
parser = subparsers.add_parser("search",
|
|
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
|
|
description="Search ABI using a regular expression")
|
|
|
|
parser.add_argument("expression",
|
|
help="Case-insensitive search pattern for the ABI symbol")
|
|
|
|
parser.set_defaults(func=self.run)
|
|
|
|
def run(self, args):
|
|
"""Run subparser"""
|
|
|
|
parser = AbiParser(args.dir, debug=args.debug)
|
|
parser.parse_abi()
|
|
parser.search_symbols(args.expression)
|
|
|
|
|
|
def main():
|
|
"""Main program"""
|
|
|
|
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
|
|
|
|
parser.add_argument("-d", "--debug", type=int, default=0, help="debug level")
|
|
parser.add_argument("-D", "--dir", default=ABI_DIR, help=DEBUG_HELP)
|
|
|
|
subparsers = parser.add_subparsers()
|
|
|
|
AbiRest(subparsers)
|
|
AbiValidate(subparsers)
|
|
AbiSearch(subparsers)
|
|
|
|
args = parser.parse_args()
|
|
|
|
if args.debug:
|
|
level = logging.DEBUG
|
|
else:
|
|
level = logging.INFO
|
|
|
|
logging.basicConfig(level=level, format="[%(levelname)s] %(message)s")
|
|
|
|
if "func" in args:
|
|
args.func(args)
|
|
else:
|
|
sys.exit(f"Please specify a valid command for {sys.argv[0]}")
|
|
|
|
|
|
# Call main method
|
|
if __name__ == "__main__":
|
|
main()
|