xref: /linux/tools/docs/kernel-doc (revision 35c0f975ef4a96cb488bcb5fca6e852fc347bc49)
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#
5fc973dcdSMauro Carvalho Chehab# pylint: disable=C0103,R0912,R0914,R0915
6bd28e997SMauro Carvalho Chehab#
7fc973dcdSMauro Carvalho Chehab# NOTE: While kernel-doc requires at least version 3.6 to run, the
8fc973dcdSMauro Carvalho Chehab#       command line should work with Python 3.2+ (tested with 3.4).
9fc973dcdSMauro Carvalho Chehab#       The rationale is that it shall fail gracefully during Kernel
10fc973dcdSMauro Carvalho Chehab#       compilation with older Kernel versions. Due to that:
11fc973dcdSMauro Carvalho Chehab#       - encoding line is needed here;
126cc45ee5SMauro Carvalho Chehab#       - f-strings cannot be used in this file.
136cc45ee5SMauro Carvalho Chehab#       - libraries that require newer versions can only be included
146cc45ee5SMauro Carvalho Chehab#         after the Python version has been checked.
15bd28e997SMauro Carvalho Chehab#
16094a4845SMauro Carvalho Chehab# Converted from the kernel-doc script originally written in Perl
17094a4845SMauro Carvalho Chehab# under GPLv2, copyrighted since 1998 by the following authors:
18094a4845SMauro Carvalho Chehab#
19094a4845SMauro Carvalho Chehab#    Aditya Srivastava <yashsri421@gmail.com>
20094a4845SMauro Carvalho Chehab#    Akira Yokosawa <akiyks@gmail.com>
21094a4845SMauro Carvalho Chehab#    Alexander A. Klimov <grandmaster@al2klimov.de>
22094a4845SMauro Carvalho Chehab#    Alexander Lobakin <aleksander.lobakin@intel.com>
23094a4845SMauro Carvalho Chehab#    André Almeida <andrealmeid@igalia.com>
24094a4845SMauro Carvalho Chehab#    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
25094a4845SMauro Carvalho Chehab#    Anna-Maria Behnsen <anna-maria@linutronix.de>
26094a4845SMauro Carvalho Chehab#    Armin Kuster <akuster@mvista.com>
27094a4845SMauro Carvalho Chehab#    Bart Van Assche <bart.vanassche@sandisk.com>
28094a4845SMauro Carvalho Chehab#    Ben Hutchings <ben@decadent.org.uk>
29094a4845SMauro Carvalho Chehab#    Borislav Petkov <bbpetkov@yahoo.de>
30094a4845SMauro Carvalho Chehab#    Chen-Yu Tsai <wenst@chromium.org>
31094a4845SMauro Carvalho Chehab#    Coco Li <lixiaoyan@google.com>
32094a4845SMauro Carvalho Chehab#    Conchúr Navid <conchur@web.de>
33094a4845SMauro Carvalho Chehab#    Daniel Santos <daniel.santos@pobox.com>
34094a4845SMauro Carvalho Chehab#    Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk>
35094a4845SMauro Carvalho Chehab#    Dan Luedtke <mail@danrl.de>
36094a4845SMauro Carvalho Chehab#    Donald Hunter <donald.hunter@gmail.com>
37094a4845SMauro Carvalho Chehab#    Gabriel Krisman Bertazi <krisman@collabora.co.uk>
38094a4845SMauro Carvalho Chehab#    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
39094a4845SMauro Carvalho Chehab#    Harvey Harrison <harvey.harrison@gmail.com>
40094a4845SMauro Carvalho Chehab#    Horia Geanta <horia.geanta@freescale.com>
41094a4845SMauro Carvalho Chehab#    Ilya Dryomov <idryomov@gmail.com>
42094a4845SMauro Carvalho Chehab#    Jakub Kicinski <kuba@kernel.org>
43094a4845SMauro Carvalho Chehab#    Jani Nikula <jani.nikula@intel.com>
44094a4845SMauro Carvalho Chehab#    Jason Baron <jbaron@redhat.com>
45094a4845SMauro Carvalho Chehab#    Jason Gunthorpe <jgg@nvidia.com>
46094a4845SMauro Carvalho Chehab#    Jérémy Bobbio <lunar@debian.org>
47094a4845SMauro Carvalho Chehab#    Johannes Berg <johannes.berg@intel.com>
48094a4845SMauro Carvalho Chehab#    Johannes Weiner <hannes@cmpxchg.org>
49094a4845SMauro Carvalho Chehab#    Jonathan Cameron <Jonathan.Cameron@huawei.com>
50094a4845SMauro Carvalho Chehab#    Jonathan Corbet <corbet@lwn.net>
51094a4845SMauro Carvalho Chehab#    Jonathan Neuschäfer <j.neuschaefer@gmx.net>
52094a4845SMauro Carvalho Chehab#    Kamil Rytarowski <n54@gmx.com>
53094a4845SMauro Carvalho Chehab#    Kees Cook <kees@kernel.org>
54094a4845SMauro Carvalho Chehab#    Laurent Pinchart <laurent.pinchart@ideasonboard.com>
55094a4845SMauro Carvalho Chehab#    Levin, Alexander (Sasha Levin) <alexander.levin@verizon.com>
56094a4845SMauro Carvalho Chehab#    Linus Torvalds <torvalds@linux-foundation.org>
57094a4845SMauro Carvalho Chehab#    Lucas De Marchi <lucas.demarchi@profusion.mobi>
58094a4845SMauro Carvalho Chehab#    Mark Rutland <mark.rutland@arm.com>
59094a4845SMauro Carvalho Chehab#    Markus Heiser <markus.heiser@darmarit.de>
60094a4845SMauro Carvalho Chehab#    Martin Waitz <tali@admingilde.org>
61094a4845SMauro Carvalho Chehab#    Masahiro Yamada <masahiroy@kernel.org>
62094a4845SMauro Carvalho Chehab#    Matthew Wilcox <willy@infradead.org>
63094a4845SMauro Carvalho Chehab#    Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
64094a4845SMauro Carvalho Chehab#    Michal Wajdeczko <michal.wajdeczko@intel.com>
65094a4845SMauro Carvalho Chehab#    Michael Zucchi
66094a4845SMauro Carvalho Chehab#    Mike Rapoport <rppt@linux.ibm.com>
67094a4845SMauro Carvalho Chehab#    Niklas Söderlund <niklas.soderlund@corigine.com>
68094a4845SMauro Carvalho Chehab#    Nishanth Menon <nm@ti.com>
69094a4845SMauro Carvalho Chehab#    Paolo Bonzini <pbonzini@redhat.com>
70094a4845SMauro Carvalho Chehab#    Pavan Kumar Linga <pavan.kumar.linga@intel.com>
71094a4845SMauro Carvalho Chehab#    Pavel Pisa <pisa@cmp.felk.cvut.cz>
72094a4845SMauro Carvalho Chehab#    Peter Maydell <peter.maydell@linaro.org>
73094a4845SMauro Carvalho Chehab#    Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
74094a4845SMauro Carvalho Chehab#    Randy Dunlap <rdunlap@infradead.org>
75094a4845SMauro Carvalho Chehab#    Richard Kennedy <richard@rsk.demon.co.uk>
76094a4845SMauro Carvalho Chehab#    Rich Walker <rw@shadow.org.uk>
77094a4845SMauro Carvalho Chehab#    Rolf Eike Beer <eike-kernel@sf-tec.de>
78094a4845SMauro Carvalho Chehab#    Sakari Ailus <sakari.ailus@linux.intel.com>
79094a4845SMauro Carvalho Chehab#    Silvio Fricke <silvio.fricke@gmail.com>
80094a4845SMauro Carvalho Chehab#    Simon Huggins
81094a4845SMauro Carvalho Chehab#    Tim Waugh <twaugh@redhat.com>
82094a4845SMauro Carvalho Chehab#    Tomasz Warniełło <tomasz.warniello@gmail.com>
83094a4845SMauro Carvalho Chehab#    Utkarsh Tripathi <utripathi2002@gmail.com>
84094a4845SMauro Carvalho Chehab#    valdis.kletnieks@vt.edu <valdis.kletnieks@vt.edu>
85094a4845SMauro Carvalho Chehab#    Vegard Nossum <vegard.nossum@oracle.com>
86094a4845SMauro Carvalho Chehab#    Will Deacon <will.deacon@arm.com>
87094a4845SMauro Carvalho Chehab#    Yacine Belkadi <yacine.belkadi.1@gmail.com>
88094a4845SMauro Carvalho Chehab#    Yujie Liu <yujie.liu@intel.com>
89094a4845SMauro Carvalho Chehab
90094a4845SMauro Carvalho Chehab"""
916cc45ee5SMauro Carvalho ChehabPrint formatted kernel documentation to stdout.
92094a4845SMauro Carvalho Chehab
93094a4845SMauro Carvalho ChehabRead C language source or header FILEs, extract embedded
94094a4845SMauro Carvalho Chehabdocumentation comments, and print formatted documentation
95094a4845SMauro Carvalho Chehabto standard output.
96094a4845SMauro Carvalho Chehab
976cc45ee5SMauro Carvalho ChehabThe documentation comments are identified by the ``/**``
98094a4845SMauro Carvalho Chehabopening comment mark.
99094a4845SMauro Carvalho Chehab
100094a4845SMauro Carvalho ChehabSee Documentation/doc-guide/kernel-doc.rst for the
101094a4845SMauro Carvalho Chehabdocumentation comment syntax.
102094a4845SMauro Carvalho Chehab"""
103094a4845SMauro Carvalho Chehab
104094a4845SMauro Carvalho Chehabimport argparse
105094a4845SMauro Carvalho Chehabimport logging
106094a4845SMauro Carvalho Chehabimport os
107094a4845SMauro Carvalho Chehabimport sys
108094a4845SMauro Carvalho Chehab
109e31fd36dSMauro Carvalho Chehab# Import Python modules
110094a4845SMauro Carvalho Chehab
111eba6ffd1SJonathan CorbetLIB_DIR = "../lib/python"
112e31fd36dSMauro Carvalho ChehabSRC_DIR = os.path.dirname(os.path.realpath(__file__))
113094a4845SMauro Carvalho Chehab
114e31fd36dSMauro Carvalho Chehabsys.path.insert(0, os.path.join(SRC_DIR, LIB_DIR))
115094a4845SMauro Carvalho Chehab
116802774d8SMauro Carvalho ChehabWERROR_RETURN_CODE = 3
117802774d8SMauro Carvalho Chehab
118094a4845SMauro Carvalho ChehabDESC = """
119094a4845SMauro Carvalho ChehabRead C language source or header FILEs, extract embedded documentation comments,
120094a4845SMauro Carvalho Chehaband print formatted documentation to standard output.
121094a4845SMauro Carvalho Chehab
122094a4845SMauro Carvalho ChehabThe documentation comments are identified by the "/**" opening comment mark.
123094a4845SMauro Carvalho Chehab
124094a4845SMauro Carvalho ChehabSee Documentation/doc-guide/kernel-doc.rst for the documentation comment syntax.
125094a4845SMauro Carvalho Chehab"""
126094a4845SMauro Carvalho Chehab
127094a4845SMauro Carvalho ChehabEXPORT_FILE_DESC = """
128094a4845SMauro Carvalho ChehabSpecify an additional FILE in which to look for EXPORT_SYMBOL information.
129094a4845SMauro Carvalho Chehab
130094a4845SMauro Carvalho ChehabMay be used multiple times.
131094a4845SMauro Carvalho Chehab"""
132094a4845SMauro Carvalho Chehab
133094a4845SMauro Carvalho ChehabEXPORT_DESC = """
1346cc45ee5SMauro Carvalho ChehabOnly output documentation for symbols that have been
135094a4845SMauro Carvalho Chehabexported using EXPORT_SYMBOL() and related macros in any input
136094a4845SMauro Carvalho ChehabFILE or -export-file FILE.
137094a4845SMauro Carvalho Chehab"""
138094a4845SMauro Carvalho Chehab
139094a4845SMauro Carvalho ChehabINTERNAL_DESC = """
1406cc45ee5SMauro Carvalho ChehabOnly output documentation for symbols that have NOT been
141094a4845SMauro Carvalho Chehabexported using EXPORT_SYMBOL() and related macros in any input
142094a4845SMauro Carvalho ChehabFILE or -export-file FILE.
143094a4845SMauro Carvalho Chehab"""
144094a4845SMauro Carvalho Chehab
145094a4845SMauro Carvalho ChehabFUNCTION_DESC = """
146094a4845SMauro Carvalho ChehabOnly output documentation for the given function or DOC: section
147094a4845SMauro Carvalho Chehabtitle. All other functions and DOC: sections are ignored.
148094a4845SMauro Carvalho Chehab
149094a4845SMauro Carvalho ChehabMay be used multiple times.
150094a4845SMauro Carvalho Chehab"""
151094a4845SMauro Carvalho Chehab
152094a4845SMauro Carvalho ChehabNOSYMBOL_DESC = """
153094a4845SMauro Carvalho ChehabExclude the specified symbol from the output documentation.
154094a4845SMauro Carvalho Chehab
155094a4845SMauro Carvalho ChehabMay be used multiple times.
156094a4845SMauro Carvalho Chehab"""
157094a4845SMauro Carvalho Chehab
158094a4845SMauro Carvalho ChehabFILES_DESC = """
159094a4845SMauro Carvalho ChehabHeader and C source files to be parsed.
160094a4845SMauro Carvalho Chehab"""
161094a4845SMauro Carvalho Chehab
162094a4845SMauro Carvalho ChehabWARN_CONTENTS_BEFORE_SECTIONS_DESC = """
1636cc45ee5SMauro Carvalho ChehabWarn if there are contents before sections (deprecated).
164094a4845SMauro Carvalho Chehab
165094a4845SMauro Carvalho ChehabThis option is kept just for backward-compatibility, but it does nothing,
166094a4845SMauro Carvalho Chehabneither here nor at the original Perl script.
167094a4845SMauro Carvalho Chehab"""
168094a4845SMauro Carvalho Chehab
16932e9a424SMauro Carvalho ChehabEPILOG = """
17032e9a424SMauro Carvalho ChehabThe return value is:
17132e9a424SMauro Carvalho Chehab
17232e9a424SMauro Carvalho Chehab- 0: success or Python version is not compatible with
17332e9a424SMauro Carvalho Chehabkernel-doc.  If -Werror is not used, it will also
17432e9a424SMauro Carvalho Chehabreturn 0 if there are issues at kernel-doc markups;
17532e9a424SMauro Carvalho Chehab
17632e9a424SMauro Carvalho Chehab- 1: an abnormal condition happened;
17732e9a424SMauro Carvalho Chehab
17832e9a424SMauro Carvalho Chehab- 2: argparse issued an error;
17932e9a424SMauro Carvalho Chehab
18032e9a424SMauro Carvalho Chehab- 3: When -Werror is used, it means that one or more unfiltered parse
18132e9a424SMauro Carvalho Chehab     warnings happened.
18232e9a424SMauro Carvalho Chehab"""
183094a4845SMauro Carvalho Chehab
1840a4e2412SMauro Carvalho Chehabclass MsgFormatter(logging.Formatter):
185*35c0f975SMauro Carvalho Chehab    """
186*35c0f975SMauro Carvalho Chehab    Helper class to capitalize errors and warnings, the same way
187*35c0f975SMauro Carvalho Chehab    the venerable (now retired) kernel-doc.pl used to do.
188*35c0f975SMauro Carvalho Chehab    """
189485f6f79SMauro Carvalho Chehab
1900a4e2412SMauro Carvalho Chehab    def format(self, record):
1910a4e2412SMauro Carvalho Chehab        record.levelname = record.levelname.capitalize()
1920a4e2412SMauro Carvalho Chehab        return logging.Formatter.format(self, record)
1930a4e2412SMauro Carvalho Chehab
194094a4845SMauro Carvalho Chehabdef main():
195802774d8SMauro Carvalho Chehab    """
196802774d8SMauro Carvalho Chehab    Main program.
197802774d8SMauro Carvalho Chehab
198802774d8SMauro Carvalho Chehab    """
199094a4845SMauro Carvalho Chehab
200094a4845SMauro Carvalho Chehab    parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,
20132e9a424SMauro Carvalho Chehab                                     description=DESC, epilog=EPILOG)
202094a4845SMauro Carvalho Chehab
203bd28e997SMauro Carvalho Chehab    #
204094a4845SMauro Carvalho Chehab    # Normal arguments
205bd28e997SMauro Carvalho Chehab    #
206094a4845SMauro Carvalho Chehab    parser.add_argument("-v", "-verbose", "--verbose", action="store_true",
207094a4845SMauro Carvalho Chehab                        help="Verbose output, more warnings and other information.")
208094a4845SMauro Carvalho Chehab
209094a4845SMauro Carvalho Chehab    parser.add_argument("-d", "-debug", "--debug", action="store_true",
210094a4845SMauro Carvalho Chehab                        help="Enable debug messages")
211094a4845SMauro Carvalho Chehab
212094a4845SMauro Carvalho Chehab    parser.add_argument("-M", "-modulename", "--modulename",
2132ab867a4SMauro Carvalho Chehab                        default="Kernel API",
214094a4845SMauro Carvalho Chehab                        help="Allow setting a module name at the output.")
215094a4845SMauro Carvalho Chehab
216094a4845SMauro Carvalho Chehab    parser.add_argument("-l", "-enable-lineno", "--enable_lineno",
217094a4845SMauro Carvalho Chehab                        action="store_true",
218094a4845SMauro Carvalho Chehab                        help="Enable line number output (only in ReST mode)")
219094a4845SMauro Carvalho Chehab
220bd28e997SMauro Carvalho Chehab    #
221094a4845SMauro Carvalho Chehab    # Arguments to control the warning behavior
222bd28e997SMauro Carvalho Chehab    #
223094a4845SMauro Carvalho Chehab    parser.add_argument("-Wreturn", "--wreturn", action="store_true",
224094a4845SMauro Carvalho Chehab                        help="Warns about the lack of a return markup on functions.")
225094a4845SMauro Carvalho Chehab
226094a4845SMauro Carvalho Chehab    parser.add_argument("-Wshort-desc", "-Wshort-description", "--wshort-desc",
227094a4845SMauro Carvalho Chehab                        action="store_true",
228094a4845SMauro Carvalho Chehab                        help="Warns if initial short description is missing")
229094a4845SMauro Carvalho Chehab
230094a4845SMauro Carvalho Chehab    parser.add_argument("-Wcontents-before-sections",
231094a4845SMauro Carvalho Chehab                        "--wcontents-before-sections", action="store_true",
232094a4845SMauro Carvalho Chehab                        help=WARN_CONTENTS_BEFORE_SECTIONS_DESC)
233094a4845SMauro Carvalho Chehab
234094a4845SMauro Carvalho Chehab    parser.add_argument("-Wall", "--wall", action="store_true",
235094a4845SMauro Carvalho Chehab                        help="Enable all types of warnings")
236094a4845SMauro Carvalho Chehab
237094a4845SMauro Carvalho Chehab    parser.add_argument("-Werror", "--werror", action="store_true",
238094a4845SMauro Carvalho Chehab                        help="Treat warnings as errors.")
239094a4845SMauro Carvalho Chehab
240094a4845SMauro Carvalho Chehab    parser.add_argument("-export-file", "--export-file", action='append',
241094a4845SMauro Carvalho Chehab                        help=EXPORT_FILE_DESC)
242094a4845SMauro Carvalho Chehab
243bd28e997SMauro Carvalho Chehab    #
244094a4845SMauro Carvalho Chehab    # Output format mutually-exclusive group
245bd28e997SMauro Carvalho Chehab    #
246094a4845SMauro Carvalho Chehab    out_group = parser.add_argument_group("Output format selection (mutually exclusive)")
247094a4845SMauro Carvalho Chehab
248094a4845SMauro Carvalho Chehab    out_fmt = out_group.add_mutually_exclusive_group()
249094a4845SMauro Carvalho Chehab
250094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-m", "-man", "--man", action="store_true",
251094a4845SMauro Carvalho Chehab                         help="Output troff manual page format.")
252094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-r", "-rst", "--rst", action="store_true",
253094a4845SMauro Carvalho Chehab                         help="Output reStructuredText format (default).")
254094a4845SMauro Carvalho Chehab    out_fmt.add_argument("-N", "-none", "--none", action="store_true",
255094a4845SMauro Carvalho Chehab                         help="Do not output documentation, only warnings.")
256094a4845SMauro Carvalho Chehab
257bd28e997SMauro Carvalho Chehab    #
258094a4845SMauro Carvalho Chehab    # Output selection mutually-exclusive group
259bd28e997SMauro Carvalho Chehab    #
260094a4845SMauro Carvalho Chehab    sel_group = parser.add_argument_group("Output selection (mutually exclusive)")
261094a4845SMauro Carvalho Chehab    sel_mut = sel_group.add_mutually_exclusive_group()
262094a4845SMauro Carvalho Chehab
263094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-e", "-export", "--export", action='store_true',
264094a4845SMauro Carvalho Chehab                         help=EXPORT_DESC)
265094a4845SMauro Carvalho Chehab
266094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-i", "-internal", "--internal", action='store_true',
267094a4845SMauro Carvalho Chehab                         help=INTERNAL_DESC)
268094a4845SMauro Carvalho Chehab
269094a4845SMauro Carvalho Chehab    sel_mut.add_argument("-s", "-function", "--symbol", action='append',
270094a4845SMauro Carvalho Chehab                         help=FUNCTION_DESC)
271094a4845SMauro Carvalho Chehab
272bd28e997SMauro Carvalho Chehab    #
2730873e554SMauro Carvalho Chehab    # Those are valid for all 3 types of filter
274bd28e997SMauro Carvalho Chehab    #
275094a4845SMauro Carvalho Chehab    parser.add_argument("-n", "-nosymbol", "--nosymbol", action='append',
276094a4845SMauro Carvalho Chehab                        help=NOSYMBOL_DESC)
277094a4845SMauro Carvalho Chehab
2780873e554SMauro Carvalho Chehab    parser.add_argument("-D", "-no-doc-sections", "--no-doc-sections",
2796cc45ee5SMauro Carvalho Chehab                        action='store_true', help="Don't output DOC sections")
2800873e554SMauro Carvalho Chehab
281094a4845SMauro Carvalho Chehab    parser.add_argument("files", metavar="FILE",
282094a4845SMauro Carvalho Chehab                        nargs="+", help=FILES_DESC)
283094a4845SMauro Carvalho Chehab
284094a4845SMauro Carvalho Chehab    args = parser.parse_args()
285094a4845SMauro Carvalho Chehab
286094a4845SMauro Carvalho Chehab    if args.wall:
287094a4845SMauro Carvalho Chehab        args.wreturn = True
288094a4845SMauro Carvalho Chehab        args.wshort_desc = True
289094a4845SMauro Carvalho Chehab        args.wcontents_before_sections = True
290094a4845SMauro Carvalho Chehab
2910a4e2412SMauro Carvalho Chehab    logger = logging.getLogger()
2920a4e2412SMauro Carvalho Chehab
293094a4845SMauro Carvalho Chehab    if not args.debug:
2940a4e2412SMauro Carvalho Chehab        logger.setLevel(logging.INFO)
295094a4845SMauro Carvalho Chehab    else:
2960a4e2412SMauro Carvalho Chehab        logger.setLevel(logging.DEBUG)
2970a4e2412SMauro Carvalho Chehab
2980a4e2412SMauro Carvalho Chehab    formatter = MsgFormatter('%(levelname)s: %(message)s')
2990a4e2412SMauro Carvalho Chehab
3000a4e2412SMauro Carvalho Chehab    handler = logging.StreamHandler()
3010a4e2412SMauro Carvalho Chehab    handler.setFormatter(formatter)
3020a4e2412SMauro Carvalho Chehab
3030a4e2412SMauro Carvalho Chehab    logger.addHandler(handler)
304094a4845SMauro Carvalho Chehab
3057740f9dbSMauro Carvalho Chehab    python_ver = sys.version_info[:2]
3067740f9dbSMauro Carvalho Chehab    if python_ver < (3,6):
307bd28e997SMauro Carvalho Chehab        #
3086cc45ee5SMauro Carvalho Chehab        # Depending on the Kernel configuration, kernel-doc --none is called at
309fc973dcdSMauro Carvalho Chehab        # build time. As we don't want to break compilation due to the
310fc973dcdSMauro Carvalho Chehab        # usage of an old Python version, return 0 here.
311bd28e997SMauro Carvalho Chehab        #
312fc973dcdSMauro Carvalho Chehab        if args.none:
3136cc45ee5SMauro Carvalho Chehab            logger.error("Python 3.6 or later is required by kernel-doc. Skipping checks")
3147740f9dbSMauro Carvalho Chehab            sys.exit(0)
3157740f9dbSMauro Carvalho Chehab
316fc973dcdSMauro Carvalho Chehab        sys.exit("Python 3.6 or later is required by kernel-doc. Aborting.")
317fc973dcdSMauro Carvalho Chehab
3187740f9dbSMauro Carvalho Chehab    if python_ver < (3,7):
3197740f9dbSMauro Carvalho Chehab        logger.warning("Python 3.7 or later is required for correct results")
3207740f9dbSMauro Carvalho Chehab
321bd28e997SMauro Carvalho Chehab    #
3226cc45ee5SMauro Carvalho Chehab    # Import kernel-doc libraries only after checking the Python version
323bd28e997SMauro Carvalho Chehab    #
324992a9df4SJonathan Corbet    from kdoc.kdoc_files import KernelFiles             # pylint: disable=C0415
325992a9df4SJonathan Corbet    from kdoc.kdoc_output import RestFormat, ManFormat  # pylint: disable=C0415
326fc973dcdSMauro Carvalho Chehab
327094a4845SMauro Carvalho Chehab    if args.man:
3282ab867a4SMauro Carvalho Chehab        out_style = ManFormat(modulename=args.modulename)
329094a4845SMauro Carvalho Chehab    elif args.none:
330094a4845SMauro Carvalho Chehab        out_style = None
331094a4845SMauro Carvalho Chehab    else:
332094a4845SMauro Carvalho Chehab        out_style = RestFormat()
333094a4845SMauro Carvalho Chehab
334799b0d2aSMauro Carvalho Chehab    kfiles = KernelFiles(verbose=args.verbose,
335094a4845SMauro Carvalho Chehab                         out_style=out_style, werror=args.werror,
336094a4845SMauro Carvalho Chehab                         wreturn=args.wreturn, wshort_desc=args.wshort_desc,
3372ab867a4SMauro Carvalho Chehab                         wcontents_before_sections=args.wcontents_before_sections)
338094a4845SMauro Carvalho Chehab
339799b0d2aSMauro Carvalho Chehab    kfiles.parse(args.files, export_file=args.export_file)
340094a4845SMauro Carvalho Chehab
3414fa5e411SMauro Carvalho Chehab    for t in kfiles.msg(enable_lineno=args.enable_lineno, export=args.export,
342094a4845SMauro Carvalho Chehab                        internal=args.internal, symbol=args.symbol,
34316740c29SMauro Carvalho Chehab                        nosymbol=args.nosymbol, export_file=args.export_file,
3440873e554SMauro Carvalho Chehab                        no_doc_sections=args.no_doc_sections):
3454fa5e411SMauro Carvalho Chehab        msg = t[1]
3464fa5e411SMauro Carvalho Chehab        if msg:
3474fa5e411SMauro Carvalho Chehab            print(msg)
348094a4845SMauro Carvalho Chehab
34911afeab6SMauro Carvalho Chehab    error_count = kfiles.errors
35011afeab6SMauro Carvalho Chehab    if not error_count:
35111afeab6SMauro Carvalho Chehab        sys.exit(0)
35211afeab6SMauro Carvalho Chehab
35311afeab6SMauro Carvalho Chehab    if args.werror:
354fc973dcdSMauro Carvalho Chehab        print("%s warnings as errors" % error_count)    # pylint: disable=C0209
355802774d8SMauro Carvalho Chehab        sys.exit(WERROR_RETURN_CODE)
35611afeab6SMauro Carvalho Chehab
35711afeab6SMauro Carvalho Chehab    if args.verbose:
358fc973dcdSMauro Carvalho Chehab        print("%s errors" % error_count)                # pylint: disable=C0209
35911afeab6SMauro Carvalho Chehab
36011afeab6SMauro Carvalho Chehab    sys.exit(0)
36111afeab6SMauro Carvalho Chehab
362bd28e997SMauro Carvalho Chehab#
363094a4845SMauro Carvalho Chehab# Call main method
364bd28e997SMauro Carvalho Chehab#
365094a4845SMauro Carvalho Chehabif __name__ == "__main__":
366094a4845SMauro Carvalho Chehab    main()
367