From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Linux Doc Mailing List <linux-doc@vger.kernel.org>,
Randy Dunlap <rdunlap@infradead.org>
Cc: Jonathan Corbet <corbet@lwn.net>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] kernel-doc: add support for handling global variables
Date: Sun, 7 Sep 2025 23:34:47 +0200 [thread overview]
Message-ID: <20250907233447.0cbe9954@foz.lan> (raw)
In-Reply-To: <80f85eacc306e62de8c9c68712c653ba290c2ff2.1757262141.git.mchehab+huawei@kernel.org>
Em Sun, 7 Sep 2025 18:22:22 +0200
Mauro Carvalho Chehab <mchehab+huawei@kernel.org> escreveu:
> Specially on kAPI, sometimes it is desirable to be able to
> describe global variables that are part of kAPI.
>
> Documenting vars with Sphinx is simple, as we don't need
> to parse a data struct. All we need is the variable
> declaration and use natice C domain ::c:var: to format it
> for us.
>
> Add support for it.
>
> Link: https://lore.kernel.org/linux-doc/491c3022-cef8-4860-a945-c9c4a3b63c09@infradead.org/T/#m947c25d95cb1d96a394410ab1131dc8e9e5013f1
> Suggested-by: Randy Dunlap <rdunlap@infradead.org>
> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Btw, this is still at RFC level, as, for the final version we need:
- to document this new kernel-doc feature;
- to suppress (or keep) the end ";";
- do some cleanups/improvements at the regex to ensure that it is generic
enough. For instance, the way it was defineded, it doesn't handle yet
variables with assigned values like:
extern int foo = 5;
- if it has a default non-zero value, should it be documented or not,
and, if so, how;
- to decide if we add "extern" to all outputs, to none of them or if we
just follow what is at the documented declaration (the current
implementation does the latter;
- to decide weather use "global"/"var" or something else.
Also, it would be interesting to have a real case where we want
to document kAPI variables.
Randy,
if you have some real case examples, perhaps you could pick this patch
and add on a patch series after taking the above into consideration.
> ---
> scripts/lib/kdoc/kdoc_output.py | 31 +++++++++++++++++++++++++++++++
> scripts/lib/kdoc/kdoc_parser.py | 25 ++++++++++++++++++++++++-
> 2 files changed, 55 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/lib/kdoc/kdoc_output.py b/scripts/lib/kdoc/kdoc_output.py
> index 1eca9a918558..405a5c407522 100644
> --- a/scripts/lib/kdoc/kdoc_output.py
> +++ b/scripts/lib/kdoc/kdoc_output.py
> @@ -199,6 +199,10 @@ class OutputFormat:
> self.out_enum(fname, name, args)
> return self.data
>
> + if dtype == "global":
> + self.out_global(fname, name, args)
> + return self.data
> +
> if dtype == "typedef":
> self.out_typedef(fname, name, args)
> return self.data
> @@ -227,6 +231,9 @@ class OutputFormat:
> def out_enum(self, fname, name, args):
> """Outputs an enum"""
>
> + def out_global(self, fname, name, args):
> + """Outputs a global variable"""
> +
> def out_typedef(self, fname, name, args):
> """Outputs a typedef"""
>
> @@ -472,6 +479,18 @@ class RestFormat(OutputFormat):
> self.lineprefix = oldprefix
> self.out_section(args)
>
> + def out_global(self, fname, name, args):
> + oldprefix = self.lineprefix
> + ln = args.declaration_start_line
> + prototype = args.other_stuff["var_type"]
> +
> + self.data += f"
>
> .. c:var:: {prototype}
>
> "
> +
> + self.print_lineno(ln)
> + self.lineprefix = " "
> + self.output_highlight(args.get('purpose', ''))
> + self.data += "
> "
> +
> def out_typedef(self, fname, name, args):
>
> oldprefix = self.lineprefix
> @@ -772,6 +791,18 @@ class ManFormat(OutputFormat):
> self.data += f'.SH "{section}"' + "
> "
> self.output_highlight(text)
>
> + def out_global(self, fname, name, args):
> + out_name = self.arg_name(args, name)
> + prototype = args.other_stuff["var_type"]
> +
> + self.data += f'.TH "{self.modulename}" 9 "{out_name}" "{self.man_date}" "API Manual" LINUX' + "
> "
> +
> + self.data += ".SH NAME
> "
> + self.data += f"{prototype} \- {args['purpose']}
> "
> +
> + self.data += ".SH SYNOPSIS
> "
> + self.data += f"enum {name}" + " {
> "
> +
> def out_typedef(self, fname, name, args):
> module = self.modulename
> purpose = args.get('purpose')
> diff --git a/scripts/lib/kdoc/kdoc_parser.py b/scripts/lib/kdoc/kdoc_parser.py
> index 574972e1f741..e2a3f4574894 100644
> --- a/scripts/lib/kdoc/kdoc_parser.py
> +++ b/scripts/lib/kdoc/kdoc_parser.py
> @@ -64,7 +64,7 @@ type_param = KernRe(r"@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)", cache=False)
> # Tests for the beginning of a kerneldoc block in its various forms.
> #
> doc_block = doc_com + KernRe(r'DOC:\s*(.*)?', cache=False)
> -doc_begin_data = KernRe(r"^\s*\*?\s*(struct|union|enum|typedef)\b\s*(\w*)", cache = False)
> +doc_begin_data = KernRe(r"^\s*\*?\s*(struct|union|enum|typedef|global)\b\s*(\w*)", cache = False)
> doc_begin_func = KernRe(str(doc_com) + # initial " * '
> r"(?:\w+\s*\*\s*)?" + # type (not captured)
> r'(?:define\s+)?' + # possible "define" (not captured)
> @@ -886,6 +886,27 @@ class KernelDoc:
> self.output_declaration('enum', declaration_name,
> purpose=self.entry.declaration_purpose)
>
> + def dump_global(self, ln, proto):
> + """
> + Stores global variables that are part of kAPI.
> + """
> + VAR_ATTRIBS = [
> + "extern",
> + ]
> + OPTIONAL_VAR_ATTR = "^(?:" + "|".join(VAR_ATTRIBS) + ")?"
> +
> + r= KernRe(OPTIONAL_VAR_ATTR + r"(\w.*)\s+([\w_]+)[\d\]\[]*\s*;(?:#.*)?$")
> + if not r.match(proto):
> + self.emit_msg(ln,f"{proto}: can't parse variable")
> + return
> +
> + declaration_name = r.group(2)
> + var_type = r.group(0)
> +
> + self.output_declaration("global", declaration_name,
> + var_type=var_type,
> + purpose=self.entry.declaration_purpose)
> +
> def dump_declaration(self, ln, prototype):
> """
> Stores a data declaration inside self.entries array.
> @@ -897,6 +918,8 @@ class KernelDoc:
> self.dump_typedef(ln, prototype)
> elif self.entry.decl_type in ["union", "struct"]:
> self.dump_struct(ln, prototype)
> + elif self.entry.decl_type == "global":
> + self.dump_global(ln, prototype)
> else:
> # This would be a bug
> self.emit_message(ln, f'Unknown declaration type: {self.entry.decl_type}')
Thanks,
Mauro
next prev parent reply other threads:[~2025-09-07 21:34 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-07 16:22 Mauro Carvalho Chehab
2025-09-07 21:34 ` Mauro Carvalho Chehab [this message]
2025-09-09 6:22 ` Randy Dunlap
2025-09-09 20:12 ` Mauro Carvalho Chehab
2025-09-09 7:27 ` Randy Dunlap
2025-09-09 15:57 ` Randy Dunlap
2025-09-09 16:18 ` Mauro Carvalho Chehab
2025-09-09 18:20 ` Randy Dunlap
2025-09-09 20:37 ` Mauro Carvalho Chehab
2025-09-09 19:58 ` Mauro Carvalho Chehab
2025-09-09 20:09 ` Mauro Carvalho Chehab
2025-09-09 21:06 ` Randy Dunlap
2025-09-09 23:09 ` Mauro Carvalho Chehab
2025-09-09 23:49 ` Randy Dunlap
2025-09-09 23:50 ` Randy Dunlap
2025-09-10 0:02 ` Randy Dunlap
2025-09-10 4:23 ` Mauro Carvalho Chehab
2025-09-10 5:59 ` Randy Dunlap
2025-09-10 6:13 ` Randy Dunlap
2025-09-10 8:54 ` Mauro Carvalho Chehab
2025-11-15 0:50 ` Randy Dunlap
2025-11-16 10:28 ` Mauro Carvalho Chehab
2025-11-16 19:46 ` Randy Dunlap
2025-11-17 9:45 ` Mauro Carvalho Chehab
2025-11-17 17:45 ` Randy Dunlap
2025-09-10 9:24 ` Jani Nikula
2025-09-10 12:13 ` Mauro Carvalho Chehab
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250907233447.0cbe9954@foz.lan \
--to=mchehab+huawei@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rdunlap@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®