xref: /linux/scripts/kernel-doc.py (revision 3e443d167327b10966166c1953631936547b03d0)
1094a4845SMauro Carvalho Chehab#!/usr/bin/env python3
2094a4845SMauro Carvalho Chehab# SPDX-License-Identifier: GPL-2.0
3094a4845SMauro Carvalho Chehab# Copyright(c) 2025: Mauro Carvalho Chehab <mchehab@kernel.org>.
4094a4845SMauro Carvalho Chehab#
5485f6f79SMauro Carvalho Chehab# pylint: disable=C0103,R0915
6094a4845SMauro Carvalho Chehab#
7094a4845SMauro Carvalho Chehab# Converted from the kernel-doc script originally written in Perl
8094a4845SMauro Carvalho Chehab# under GPLv2, copyrighted since 1998 by the following authors:
9094a4845SMauro Carvalho Chehab#
10094a4845SMauro Carvalho Chehab#    Aditya Srivastava <yashsri421@gmail.com>
11094a4845SMauro Carvalho Chehab#    Akira Yokosawa <akiyks@gmail.com>
12094a4845SMauro Carvalho Chehab#    Alexander A. Klimov <grandmaster@al2klimov.de>
13094a4845SMauro Carvalho Chehab#    Alexander Lobakin <aleksander.lobakin@intel.com>
14094a4845SMauro Carvalho Chehab#    André Almeida <andrealmeid@igalia.com>
15094a4845SMauro Carvalho Chehab#    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
16094a4845SMauro Carvalho Chehab#    Anna-Maria Behnsen <anna-maria@linutronix.de>
17094a4845SMauro Carvalho Chehab#    Armin Kuster <akuster@mvista.com>
18094a4845SMauro Carvalho Chehab#    Bart Van Assche <bart.vanassche@sandisk.com>
19094a4845SMauro Carvalho Chehab#    Ben Hutchings <ben@decadent.org.uk>
20094a4845SMauro Carvalho Chehab#    Borislav Petkov <bbpetkov@yahoo.de>
21094a4845SMauro Carvalho Chehab#    Chen-Yu Tsai <wenst@chromium.org>
22094a4845SMauro Carvalho Chehab#    Coco Li <lixiaoyan@google.com>
23094a4845SMauro Carvalho Chehab#    Conchúr Navid <conchur@web.de>
24094a4845SMauro Carvalho Chehab#    Daniel Santos <daniel.santos@pobox.com>
25094a4845SMauro Carvalho Chehab#    Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>
26094a4845SMauro Carvalho Chehab#    Dan Luedtke <mail@danrl.de>
27094a4845SMauro Carvalho Chehab#    Donald Hunter <donald.hunter@gmail.com>
28094a4845SMauro Carvalho Chehab#    Gabriel Krisman Bertazi <krisman@collabora.co.uk>
29094a4845SMauro Carvalho Chehab#    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
30094a4845SMauro Carvalho Chehab#    Harvey Harrison <harvey.harrison@gmail.com>
31094a4845SMauro Carvalho Chehab#    Horia Geanta <horia.geanta@freescale.com>
32094a4845SMauro Carvalho Chehab#    Ilya Dryomov <idryomov@gmail.com>
33094a4845SMauro Carvalho Chehab#    Jakub Kicinski <kuba@kernel.org>
34094a4845SMauro Carvalho Chehab#    Jani Nikula <jani.nikula@intel.com>
35094a4845SMauro Carvalho Chehab#    Jason Baron <jbaron@redhat.com>
36094a4845SMauro Carvalho Chehab#    Jason Gunthorpe <jgg@nvidia.com>
37094a4845SMauro Carvalho Chehab#    Jérémy Bobbio <lunar@debian.org>
38094a4845SMauro Carvalho Chehab#    Johannes Berg <johannes.berg@intel.com>
39094a4845SMauro Carvalho Chehab#    Johannes Weiner <hannes@cmpxchg.org>
40094a4845SMauro Carvalho Chehab#    Jonathan Cameron <Jonathan.Cameron@huawei.com>
41094a4845SMauro Carvalho Chehab#    Jonathan Corbet <corbet@lwn.net>
42094a4845SMauro Carvalho Chehab#    Jonathan Neuschäfer <j.neuschaefer@gmx.net>
43094a4845SMauro Carvalho Chehab#    Kamil Rytarowski <n54@gmx.com>
44094a4845SMauro Carvalho Chehab#    Kees Cook <kees@kernel.org>
45094a4845SMauro Carvalho Chehab#    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
46094a4845SMauro Carvalho Chehab#    Levin, Alexander (Sasha Levin) <alexander.levin@verizon.com>
47094a4845SMauro Carvalho Chehab#    Linus Torvalds <torvalds@linux-foundation.org>
48094a4845SMauro Carvalho Chehab#    Lucas De Marchi <lucas.demarchi@profusion.mobi>
49094a4845SMauro Carvalho Chehab#    Mark Rutland <mark.rutland@arm.com>
50094a4845SMauro Carvalho Chehab#    Markus Heiser <markus.heiser@darmarit.de>
51094a4845SMauro Carvalho Chehab#    Martin Waitz <tali@admingilde.org>
52094a4845SMauro Carvalho Chehab#    Masahiro Yamada <masahiroy@kernel.org>
53094a4845SMauro Carvalho Chehab#    Matthew Wilcox <willy@infradead.org>
54094a4845SMauro Carvalho Chehab#    Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
55094a4845SMauro Carvalho Chehab#    Michal Wajdeczko <michal.wajdeczko@intel.com>
56094a4845SMauro Carvalho Chehab#    Michael Zucchi
57094a4845SMauro Carvalho Chehab#    Mike Rapoport <rppt@linux.ibm.com>
58094a4845SMauro Carvalho Chehab#    Niklas Söderlund <niklas.soderlund@corigine.com>
59094a4845SMauro Carvalho Chehab#    Nishanth Menon <nm@ti.com>
60094a4845SMauro Carvalho Chehab#    Paolo Bonzini <pbonzini@redhat.com>
61094a4845SMauro Carvalho Chehab#    Pavan Kumar Linga <pavan.kumar.linga@intel.com>
62094a4845SMauro Carvalho Chehab#    Pavel Pisa <pisa@cmp.felk.cvut.cz>
63094a4845SMauro Carvalho Chehab#    Peter Maydell <peter.maydell@linaro.org>
64094a4845SMauro Carvalho Chehab#    Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
65094a4845SMauro Carvalho Chehab#    Randy Dunlap <rdunlap@infradead.org>
66094a4845SMauro Carvalho Chehab#    Richard Kennedy <richard@rsk.demon.co.uk>
67094a4845SMauro Carvalho Chehab#    Rich Walker <rw@shadow.org.uk>
68094a4845SMauro Carvalho Chehab#    Rolf Eike Beer <eike-kernel@sf-tec.de>
69094a4845SMauro Carvalho Chehab#    Sakari Ailus <sakari.ailus@linux.intel.com>
70094a4845SMauro Carvalho Chehab#    Silvio Fricke <silvio.fricke@gmail.com>
71094a4845SMauro Carvalho Chehab#    Simon Huggins
72094a4845SMauro Carvalho Chehab#    Tim Waugh <twaugh@redhat.com>
73094a4845SMauro Carvalho Chehab#    Tomasz Warniełło <tomasz.warniello@gmail.com>
74094a4845SMauro Carvalho Chehab#    Utkarsh Tripathi <utripathi2002@gmail.com>
75094a4845SMauro Carvalho Chehab#    valdis.kletnieks@vt.edu <valdis.kletnieks@vt.edu>
76094a4845SMauro Carvalho Chehab#    Vegard Nossum <vegard.nossum@oracle.com>
77094a4845SMauro Carvalho Chehab#    Will Deacon <will.deacon@arm.com>
78094a4845SMauro Carvalho Chehab#    Yacine Belkadi <yacine.belkadi.1@gmail.com>
79094a4845SMauro Carvalho Chehab#    Yujie Liu <yujie.liu@intel.com>
80094a4845SMauro Carvalho Chehab
81094a4845SMauro Carvalho Chehab"""
82094a4845SMauro Carvalho Chehabkernel_doc
83094a4845SMauro Carvalho Chehab==========
84094a4845SMauro Carvalho Chehab
85094a4845SMauro Carvalho ChehabPrint formatted kernel documentation to stdout
86094a4845SMauro Carvalho Chehab
87094a4845SMauro Carvalho ChehabRead C language source or header FILEs, extract embedded
88094a4845SMauro Carvalho Chehabdocumentation comments, and print formatted documentation
89094a4845SMauro Carvalho Chehabto standard output.
90094a4845SMauro Carvalho Chehab
91094a4845SMauro Carvalho ChehabThe documentation comments are identified by the "/**"
92094a4845SMauro Carvalho Chehabopening comment mark.
93094a4845SMauro Carvalho Chehab
94094a4845SMauro Carvalho ChehabSee Documentation/doc-guide/kernel-doc.rst for the
95094a4845SMauro Carvalho Chehabdocumentation comment syntax.
96094a4845SMauro Carvalho Chehab"""
97094a4845SMauro Carvalho Chehab
98094a4845SMauro Carvalho Chehabimport argparse
99094a4845SMauro Carvalho Chehabimport logging
100094a4845SMauro Carvalho Chehabimport os
101094a4845SMauro Carvalho Chehabimport sys
102094a4845SMauro Carvalho Chehab
103e31fd36dSMauro Carvalho Chehab# Import Python modules
104094a4845SMauro Carvalho Chehab
105e31fd36dSMauro Carvalho ChehabLIB_DIR = "lib/kdoc"
106e31fd36dSMauro Carvalho ChehabSRC_DIR = os.path.dirname(os.path.realpath(__file__))
107094a4845SMauro Carvalho Chehab
108e31fd36dSMauro Carvalho Chehabsys.path.insert(0, os.path.join(SRC_DIR, LIB_DIR))
109094a4845SMauro Carvalho Chehab
1101d6fea64SMauro Carvalho Chehabfrom kdoc_files import KernelFiles                      # pylint: disable=C0413
1111d6fea64SMauro Carvalho Chehabfrom kdoc_output import RestFormat, ManFormat           # pylint: disable=C0413
112094a4845SMauro Carvalho Chehab
113094a4845SMauro Carvalho ChehabDESC = """
114094a4845SMauro Carvalho ChehabRead C language source or header FILEs, extract embedded documentation comments,
115094a4845SMauro Carvalho Chehaband print formatted documentation to standard output.
116094a4845SMauro Carvalho Chehab
117094a4845SMauro Carvalho ChehabThe documentation comments are identified by the "/**" opening comment mark.
118094a4845SMauro Carvalho Chehab
119094a4845SMauro Carvalho ChehabSee Documentation/doc-guide/kernel-doc.rst for the documentation comment syntax.
120094a4845SMauro Carvalho Chehab"""
121094a4845SMauro Carvalho Chehab
122094a4845SMauro Carvalho ChehabEXPORT_FILE_DESC = """
123094a4845SMauro Carvalho ChehabSpecify an additional FILE in which to look for EXPORT_SYMBOL information.
124094a4845SMauro Carvalho Chehab
125094a4845SMauro Carvalho ChehabMay be used multiple times.
126094a4845SMauro Carvalho Chehab"""
127094a4845SMauro Carvalho Chehab
128094a4845SMauro Carvalho ChehabEXPORT_DESC = """
129094a4845SMauro Carvalho ChehabOnly output documentation for the symbols that have been
130094a4845SMauro Carvalho Chehabexported using EXPORT_SYMBOL() and related macros in any input
131094a4845SMauro Carvalho ChehabFILE or -export-file FILE.
132094a4845SMauro Carvalho Chehab"""
133094a4845SMauro Carvalho Chehab
134094a4845SMauro Carvalho ChehabINTERNAL_DESC = """
135094a4845SMauro Carvalho ChehabOnly output documentation for the symbols that have NOT been
136094a4845SMauro Carvalho Chehabexported using EXPORT_SYMBOL() and related macros in any input
137094a4845SMauro Carvalho ChehabFILE or -export-file FILE.
138094a4845SMauro Carvalho Chehab"""
139094a4845SMauro Carvalho Chehab
140094a4845SMauro Carvalho ChehabFUNCTION_DESC = """
141094a4845SMauro Carvalho ChehabOnly output documentation for the given function or DOC: section
142094a4845SMauro Carvalho Chehabtitle. All other functions and DOC: sections are ignored.
143094a4845SMauro Carvalho Chehab
144094a4845SMauro Carvalho ChehabMay be used multiple times.
145094a4845SMauro Carvalho Chehab"""
146094a4845SMauro Carvalho Chehab
147094a4845SMauro Carvalho ChehabNOSYMBOL_DESC = """
148094a4845SMauro Carvalho ChehabExclude the specified symbol from the output documentation.
149094a4845SMauro Carvalho Chehab
150094a4845SMauro Carvalho ChehabMay be used multiple times.
151094a4845SMauro Carvalho Chehab"""
152094a4845SMauro Carvalho Chehab
153094a4845SMauro Carvalho ChehabFILES_DESC = """
154094a4845SMauro Carvalho ChehabHeader and C source files to be parsed.
155094a4845SMauro Carvalho Chehab"""
156094a4845SMauro Carvalho Chehab
157094a4845SMauro Carvalho ChehabWARN_CONTENTS_BEFORE_SECTIONS_DESC = """
158094a4845SMauro Carvalho ChehabWarns if there are contents before sections (deprecated).
159094a4845SMauro Carvalho Chehab
160094a4845SMauro Carvalho ChehabThis option is kept just for backward-compatibility, but it does nothing,
161094a4845SMauro Carvalho Chehabneither here nor at the original Perl script.
162094a4845SMauro Carvalho Chehab"""
163094a4845SMauro Carvalho Chehab
164094a4845SMauro Carvalho Chehab
1650a4e2412SMauro Carvalho Chehabclass MsgFormatter(logging.Formatter):
166485f6f79SMauro Carvalho Chehab    """Helper class to format warnings on a similar way to kernel-doc.pl"""
167485f6f79SMauro Carvalho Chehab
1680a4e2412SMauro Carvalho Chehab    def format(self, record):
1690a4e2412SMauro Carvalho Chehab        record.levelname = record.levelname.capitalize()
1700a4e2412SMauro Carvalho Chehab        return logging.Formatter.format(self, record)
1710a4e2412SMauro Carvalho Chehab
172094a4845SMauro Carvalho Chehabdef main():
173094a4845SMauro Carvalho Chehab    """Main program"""
174094a4845SMauro Carvalho Chehab
175094a4845SMauro Carvalho Chehab    parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,
176094a4845SMauro Carvalho Chehab                                     description=DESC)
177094a4845SMauro Carvalho Chehab
178094a4845SMauro Carvalho Chehab    # Normal arguments
179094a4845SMauro Carvalho Chehab
180094a4845SMauro Carvalho Chehab    parser.add_argument("-v", "-verbose", "--verbose", action="store_true",
181094a4845SMauro Carvalho Chehab                        help="Verbose output, more warnings and other information.")
182094a4845SMauro Carvalho Chehab
183094a4845SMauro Carvalho Chehab    parser.add_argument("-d", "-debug", "--debug", action="store_true",
184094a4845SMauro Carvalho Chehab                        help="Enable debug messages")
185094a4845SMauro Carvalho Chehab
186094a4845SMauro Carvalho Chehab    parser.add_argument("-M", "-modulename", "--modulename",
1872ab867a4SMauro Carvalho Chehab                        default="Kernel API",
188094a4845SMauro Carvalho Chehab                        help="Allow setting a module name at the output.")
189094a4845SMauro Carvalho Chehab
190094a4845SMauro Carvalho Chehab    parser.add_argument("-l", "-enable-lineno", "--enable_lineno",
191094a4845SMauro Carvalho Chehab                        action="store_true",
192094a4845SMauro Carvalho Chehab                        help="Enable line number output (only in ReST mode)")
193094a4845SMauro Carvalho Chehab
194094a4845SMauro Carvalho Chehab    # Arguments to control the warning behavior
195094a4845SMauro Carvalho Chehab
196094a4845SMauro Carvalho Chehab    parser.add_argument("-Wreturn", "--wreturn", action="store_true",
197094a4845SMauro Carvalho Chehab                        help="Warns about the lack of a return markup on functions.")
198094a4845SMauro Carvalho Chehab
199094a4845SMauro Carvalho Chehab    parser.add_argument("-Wshort-desc", "-Wshort-description", "--wshort-desc",
200094a4845SMauro Carvalho Chehab                        action="store_true",
201094a4845SMauro Carvalho Chehab                        help="Warns if initial short description is missing")
202094a4845SMauro Carvalho Chehab
203094a4845SMauro Carvalho Chehab    parser.add_argument("-Wcontents-before-sections",
204094a4845SMauro Carvalho Chehab                        "--wcontents-before-sections", action="store_true",
205094a4845SMauro Carvalho Chehab                        help=WARN_CONTENTS_BEFORE_SECTIONS_DESC)
206094a4845SMauro Carvalho Chehab
207094a4845SMauro Carvalho Chehab    parser.add_argument("-Wall", "--wall", action="store_true",
208094a4845SMauro Carvalho Chehab                        help="Enable all types of warnings")
209094a4845SMauro Carvalho Chehab
210094a4845SMauro Carvalho Chehab    parser.add_argument("-Werror", "--werror", action="store_true",
211094a4845SMauro Carvalho Chehab                        help="Treat warnings as errors.")
212094a4845SMauro Carvalho Chehab
213094a4845SMauro Carvalho Chehab    parser.add_argument("-export-file", "--export-file", action='append',
214094a4845SMauro Carvalho Chehab                        help=EXPORT_FILE_DESC)
215094a4845SMauro Carvalho Chehab
216094a4845SMauro Carvalho Chehab    # Output format mutually-exclusive group
217094a4845SMauro Carvalho Chehab
218094a4845SMauro Carvalho Chehab    out_group = parser.add_argument_group("Output format selection (mutually exclusive)")
219094a4845SMauro Carvalho Chehab
220094a4845SMauro Carvalho Chehab    out_fmt = out_group.add_mutually_exclusive_group()
221094a4845SMauro Carvalho Chehab
222094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-m", "-man", "--man", action="store_true",
223094a4845SMauro Carvalho Chehab                         help="Output troff manual page format.")
224094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-r", "-rst", "--rst", action="store_true",
225094a4845SMauro Carvalho Chehab                         help="Output reStructuredText format (default).")
226094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-N", "-none", "--none", action="store_true",
227094a4845SMauro Carvalho Chehab                         help="Do not output documentation, only warnings.")
228094a4845SMauro Carvalho Chehab
229094a4845SMauro Carvalho Chehab    # Output selection mutually-exclusive group
230094a4845SMauro Carvalho Chehab
231094a4845SMauro Carvalho Chehab    sel_group = parser.add_argument_group("Output selection (mutually exclusive)")
232094a4845SMauro Carvalho Chehab    sel_mut = sel_group.add_mutually_exclusive_group()
233094a4845SMauro Carvalho Chehab
234094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-e", "-export", "--export", action='store_true',
235094a4845SMauro Carvalho Chehab                         help=EXPORT_DESC)
236094a4845SMauro Carvalho Chehab
237094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-i", "-internal", "--internal", action='store_true',
238094a4845SMauro Carvalho Chehab                         help=INTERNAL_DESC)
239094a4845SMauro Carvalho Chehab
240094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-s", "-function", "--symbol", action='append',
241094a4845SMauro Carvalho Chehab                         help=FUNCTION_DESC)
242094a4845SMauro Carvalho Chehab
2430873e554SMauro Carvalho Chehab    # Those are valid for all 3 types of filter
244094a4845SMauro Carvalho Chehab    parser.add_argument("-n", "-nosymbol", "--nosymbol", action='append',
245094a4845SMauro Carvalho Chehab                        help=NOSYMBOL_DESC)
246094a4845SMauro Carvalho Chehab
2470873e554SMauro Carvalho Chehab    parser.add_argument("-D", "-no-doc-sections", "--no-doc-sections",
2480873e554SMauro Carvalho Chehab                        action='store_true', help="Don't outputt DOC sections")
2490873e554SMauro Carvalho Chehab
250094a4845SMauro Carvalho Chehab    parser.add_argument("files", metavar="FILE",
251094a4845SMauro Carvalho Chehab                        nargs="+", help=FILES_DESC)
252094a4845SMauro Carvalho Chehab
253094a4845SMauro Carvalho Chehab    args = parser.parse_args()
254094a4845SMauro Carvalho Chehab
255094a4845SMauro Carvalho Chehab    if args.wall:
256094a4845SMauro Carvalho Chehab        args.wreturn = True
257094a4845SMauro Carvalho Chehab        args.wshort_desc = True
258094a4845SMauro Carvalho Chehab        args.wcontents_before_sections = True
259094a4845SMauro Carvalho Chehab
2600a4e2412SMauro Carvalho Chehab    logger = logging.getLogger()
2610a4e2412SMauro Carvalho Chehab
262094a4845SMauro Carvalho Chehab    if not args.debug:
2630a4e2412SMauro Carvalho Chehab        logger.setLevel(logging.INFO)
264094a4845SMauro Carvalho Chehab    else:
2650a4e2412SMauro Carvalho Chehab        logger.setLevel(logging.DEBUG)
2660a4e2412SMauro Carvalho Chehab
2670a4e2412SMauro Carvalho Chehab    formatter = MsgFormatter('%(levelname)s: %(message)s')
2680a4e2412SMauro Carvalho Chehab
2690a4e2412SMauro Carvalho Chehab    handler = logging.StreamHandler()
2700a4e2412SMauro Carvalho Chehab    handler.setFormatter(formatter)
2710a4e2412SMauro Carvalho Chehab
2720a4e2412SMauro Carvalho Chehab    logger.addHandler(handler)
273094a4845SMauro Carvalho Chehab
274094a4845SMauro Carvalho Chehab    if args.man:
2752ab867a4SMauro Carvalho Chehab        out_style = ManFormat(modulename=args.modulename)
276094a4845SMauro Carvalho Chehab    elif args.none:
277094a4845SMauro Carvalho Chehab        out_style = None
278094a4845SMauro Carvalho Chehab    else:
279094a4845SMauro Carvalho Chehab        out_style = RestFormat()
280094a4845SMauro Carvalho Chehab
281799b0d2aSMauro Carvalho Chehab    kfiles = KernelFiles(verbose=args.verbose,
282094a4845SMauro Carvalho Chehab                         out_style=out_style, werror=args.werror,
283094a4845SMauro Carvalho Chehab                         wreturn=args.wreturn, wshort_desc=args.wshort_desc,
2842ab867a4SMauro Carvalho Chehab                         wcontents_before_sections=args.wcontents_before_sections)
285094a4845SMauro Carvalho Chehab
286799b0d2aSMauro Carvalho Chehab    kfiles.parse(args.files, export_file=args.export_file)
287094a4845SMauro Carvalho Chehab
2884fa5e411SMauro Carvalho Chehab    for t in kfiles.msg(enable_lineno=args.enable_lineno, export=args.export,
289094a4845SMauro Carvalho Chehab                        internal=args.internal, symbol=args.symbol,
290*16740c29SMauro Carvalho Chehab                        nosymbol=args.nosymbol, export_file=args.export_file,
2910873e554SMauro Carvalho Chehab                        no_doc_sections=args.no_doc_sections):
2924fa5e411SMauro Carvalho Chehab        msg = t[1]
2934fa5e411SMauro Carvalho Chehab        if msg:
2944fa5e411SMauro Carvalho Chehab            print(msg)
295094a4845SMauro Carvalho Chehab
29611afeab6SMauro Carvalho Chehab    error_count = kfiles.errors
29711afeab6SMauro Carvalho Chehab    if not error_count:
29811afeab6SMauro Carvalho Chehab        sys.exit(0)
29911afeab6SMauro Carvalho Chehab
30011afeab6SMauro Carvalho Chehab    if args.werror:
30111afeab6SMauro Carvalho Chehab        print(f"{error_count} warnings as errors")
30211afeab6SMauro Carvalho Chehab        sys.exit(error_count)
30311afeab6SMauro Carvalho Chehab
30411afeab6SMauro Carvalho Chehab    if args.verbose:
30511afeab6SMauro Carvalho Chehab        print(f"{error_count} errors")
30611afeab6SMauro Carvalho Chehab
30711afeab6SMauro Carvalho Chehab    if args.none:
30811afeab6SMauro Carvalho Chehab        sys.exit(0)
30911afeab6SMauro Carvalho Chehab
31011afeab6SMauro Carvalho Chehab    sys.exit(error_count)
31111afeab6SMauro Carvalho Chehab
312094a4845SMauro Carvalho Chehab
313094a4845SMauro Carvalho Chehab# Call main method
314094a4845SMauro Carvalho Chehabif __name__ == "__main__":
315094a4845SMauro Carvalho Chehab    main()
316