From: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
To: Linux Doc Mailing List <linux-doc@vger.kernel.org>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
"Jonathan Corbet" <corbet@lwn.net>,
"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH 20/27] docs: sphinx/kernel_abi: parse ABI files only once
Date: Mon, 10 Feb 2025 11:18:09 +0100 [thread overview]
Message-ID: <5205c53838b6ea25f4cdd4cc1e3d17c0141e75a6.1739182025.git.mchehab+huawei@kernel.org> (raw)
In-Reply-To: <cover.1739182025.git.mchehab+huawei@kernel.org>
Right now, the logic parses ABI files on 4 steps, one for each
directory. While this is fine in principle, by doing that, not
all symbol cross-references will be created.
Change the logic to do the parsing only once in order to get
a global dictionary to be used when creating ABI cross-references.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
---
Documentation/admin-guide/abi-obsolete.rst | 2 +-
Documentation/admin-guide/abi-removed.rst | 2 +-
Documentation/admin-guide/abi-stable.rst | 2 +-
Documentation/admin-guide/abi-testing.rst | 2 +-
Documentation/sphinx/kernel_abi.py | 115 ++++++++++++---------
scripts/lib/abi/abi_parser.py | 22 ++--
6 files changed, 81 insertions(+), 64 deletions(-)
diff --git a/Documentation/admin-guide/abi-obsolete.rst b/Documentation/admin-guide/abi-obsolete.rst
index 6d4d9ab7b8c3..bdef91d2cea4 100644
--- a/Documentation/admin-guide/abi-obsolete.rst
+++ b/Documentation/admin-guide/abi-obsolete.rst
@@ -9,4 +9,4 @@ marked to be removed at some later point in time.
The description of the interface will document the reason why it is
obsolete and when it can be expected to be removed.
-.. kernel-abi:: ABI/obsolete
+.. kernel-abi:: obsolete
diff --git a/Documentation/admin-guide/abi-removed.rst b/Documentation/admin-guide/abi-removed.rst
index 9fc78af6f077..bea0608b8442 100644
--- a/Documentation/admin-guide/abi-removed.rst
+++ b/Documentation/admin-guide/abi-removed.rst
@@ -3,4 +3,4 @@
ABI removed symbols
===================
-.. kernel-abi:: ABI/removed
+.. kernel-abi:: removed
diff --git a/Documentation/admin-guide/abi-stable.rst b/Documentation/admin-guide/abi-stable.rst
index c47c2a295865..33637c0d4fd5 100644
--- a/Documentation/admin-guide/abi-stable.rst
+++ b/Documentation/admin-guide/abi-stable.rst
@@ -12,4 +12,4 @@ for at least 2 years.
Most interfaces (like syscalls) are expected to never change and always
be available.
-.. kernel-abi:: ABI/stable
+.. kernel-abi:: stable
diff --git a/Documentation/admin-guide/abi-testing.rst b/Documentation/admin-guide/abi-testing.rst
index 40b31985e587..55054985a8ff 100644
--- a/Documentation/admin-guide/abi-testing.rst
+++ b/Documentation/admin-guide/abi-testing.rst
@@ -18,4 +18,4 @@ Programs that use these interfaces are strongly encouraged to add their
name to the description of these interfaces, so that the kernel
developers can easily notify them if any changes occur.
-.. kernel-abi:: ABI/testing
+.. kernel-abi:: testing
diff --git a/Documentation/sphinx/kernel_abi.py b/Documentation/sphinx/kernel_abi.py
index 0a4057183208..964f586de171 100644
--- a/Documentation/sphinx/kernel_abi.py
+++ b/Documentation/sphinx/kernel_abi.py
@@ -49,6 +49,13 @@ from abi_parser import AbiParser
__version__ = "1.0"
+logger = logging.getLogger('kernel_abi')
+path = os.path.join(srctree, "Documentation/ABI")
+
+# Parse ABI symbols only once
+kernel_abi = AbiParser(path, logger=logger)
+kernel_abi.parse_abi()
+kernel_abi.check_issues()
def setup(app):
@@ -64,14 +71,15 @@ class KernelCmd(Directive):
u"""KernelABI (``kernel-abi``) directive"""
required_arguments = 1
- optional_arguments = 2
+ optional_arguments = 3
has_content = False
final_argument_whitespace = True
- logger = logging.getLogger('kernel_abi')
parser = None
option_spec = {
"debug": directives.flag,
+ "no-symbols": directives.flag,
+ "no-files": directives.flag,
}
def run(self):
@@ -79,62 +87,67 @@ class KernelCmd(Directive):
if not doc.settings.file_insertion_enabled:
raise self.warning("docutils: file insertion disabled")
- path = os.path.join(srctree, "Documentation", self.arguments[0])
- self.parser = AbiParser(path, logger=self.logger)
- self.parser.parse_abi()
- self.parser.check_issues()
-
- node = self.nested_parse(None, self.arguments[0])
- return node
-
- def nested_parse(self, data, fname):
env = self.state.document.settings.env
content = ViewList()
node = nodes.section()
- if data is not None:
- # Handles the .rst file
- for line in data.split("\n"):
- content.append(line, fname, 0)
+ abi_type = self.arguments[0]
- self.do_parse(content, node)
+ if "no-symbols" in self.options:
+ show_symbols = False
+ else:
+ show_symbols = True
+ if "no-files" in self.options:
+ show_file = False
+ else:
+ show_file = True
+
+ tab_width = self.options.get('tab-width',
+ self.state.document.settings.tab_width)
+
+ old_f = None
+ n = 0
+ n_sym = 0
+ for msg, f, ln in kernel_abi.doc(show_file=show_file,
+ show_symbols=show_symbols,
+ filter_path=abi_type):
+ n_sym += 1
+ msg_list = statemachine.string2lines(msg, tab_width,
+ convert_whitespace=True)
+ if "debug" in self.options:
+ lines = [
+ "", "", ".. code-block:: rst",
+ " :linenos:", ""
+ ]
+ for m in msg_list:
+ lines.append(" " + m)
+ else:
+ lines = msg_list
+
+ for line in lines:
+ # sphinx counts lines from 0
+ content.append(line, f, ln - 1)
+ n += 1
+
+ if f != old_f:
+ # Add the file to Sphinx build dependencies
+ env.note_dependency(os.path.abspath(f))
+
+ old_f = f
+
+ # Sphinx doesn't like to parse big messages. So, let's
+ # add content symbol by symbol
+ if content:
+ self.do_parse(content, node)
+ content = ViewList()
+
+ if show_symbols and not show_file:
+ logger.verbose("%s ABI: %i symbols (%i ReST lines)" % (abi_type, n_sym, n))
+ elif not show_symbols and show_file:
+ logger.verbose("%s ABI: %i files (%i ReST lines)" % (abi_type, n_sym, n))
else:
- # Handles the ABI parser content, symbol by symbol
-
- old_f = fname
- n = 0
- for msg, f, ln in self.parser.doc():
- msg_list = statemachine.string2lines(msg, tab_width,
- convert_whitespace=True)
- if "debug" in self.options:
- lines = [
- "", "", ".. code-block:: rst",
- " :linenos:", ""
- ]
- for m in msg_list:
- lines.append(" " + m)
- else:
- lines = msg_list
-
- for line in lines:
- # sphinx counts lines from 0
- content.append(line, f, ln - 1)
- n += 1
-
- if f != old_f:
- # Add the file to Sphinx build dependencies
- env.note_dependency(os.path.abspath(f))
-
- old_f = f
-
- # Sphinx doesn't like to parse big messages. So, let's
- # add content symbol by symbol
- if content:
- self.do_parse(content, node)
- content = ViewList()
-
- self.logger.info("%s: parsed %i lines" % (fname, n))
+ logger.verbose("%s ABI: %i data (%i ReST lines)" % (abi_type, n_sym, n))
return node.children
diff --git a/scripts/lib/abi/abi_parser.py b/scripts/lib/abi/abi_parser.py
index 6fac461d794c..87d1b9e14bb3 100644
--- a/scripts/lib/abi/abi_parser.py
+++ b/scripts/lib/abi/abi_parser.py
@@ -266,12 +266,20 @@ class AbiParser:
def parse_readme(self, nametag, fname):
"""Parse ABI README file"""
+ nametag["what"] = ["ABI file contents"]
+ nametag["path"] = "README"
with open(fname, "r", encoding="utf8", errors="backslashreplace") as fp:
- nametag["description"] = "```\n"
for line in fp:
- nametag["description"] += " " + line
+ match = self.re_tag.match(line)
+ if match:
+ new = match.group(1).lower()
- nametag["description"] += "```\n"
+ match = self.re_valid.search(new)
+ if match:
+ nametag["description"] += "\n:" + line
+ continue
+
+ nametag["description"] += line
def parse_file(self, fname, path, basename):
"""Parse a single file"""
@@ -459,12 +467,8 @@ class AbiParser:
continue
if filter_path:
- if filter_path == "README":
- if not names[0].endswith("README"):
- continue
- else:
- if v.get("path") != filter_path:
- continue
+ if v.get("path") != filter_path:
+ continue
msg = ""
--
2.48.1
next prev parent reply other threads:[~2025-02-10 10:18 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 10:17 [PATCH 00/27] Improve ABI documentation generation Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 01/27] docs: sphinx: remove kernellog.py file Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 02/27] docs: sphinx/kernel_abi: adjust coding style Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 03/27] docs: admin-guide: abi: add SPDX tags to ABI files Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 04/27] ABI: sysfs-class-rfkill: fix kernelversion tags Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 05/27] ABI: sysfs-bus-coresight-*: " Mauro Carvalho Chehab
2025-02-10 10:33 ` Suzuki K Poulose
2025-02-10 10:17 ` [PATCH 06/27] ABI: sysfs-driver-dma-idxd: fix date tags Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 07/27] ABI: sysfs-fs-f2fs: " Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 08/27] ABI: sysfs-power: fix a what tag Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 09/27] scripts/documentation-file-ref-check: don't check perl/python scripts Mauro Carvalho Chehab
2025-02-10 10:17 ` [PATCH 10/27] scripts/get_abi.py: add a Python tool to generate ReST output Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 11/27] scripts/get_abi.py: add support for symbol search Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 12/27] docs: use get_abi.py for ABI generation Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 13/27] scripts/lib/abi/abi_parser.py: optimize parse_abi() function Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 14/27] scripts/lib/abi/abi_parser.py: use an interactor for ReST output Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 15/27] docs: sphinx/kernel_abi: use AbiParser directly Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 16/27] docs: sphinx/kernel_abi: reduce buffer usage for ABI messages Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 17/27] docs: sphinx/kernel_abi: properly split lines Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 18/27] scripts/get_abi.pl: Add filtering capabilities to rest output Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 19/27] scripts/get_abi.pl: add support to parse ABI README file Mauro Carvalho Chehab
2025-02-10 10:18 ` Mauro Carvalho Chehab [this message]
2025-02-10 10:18 ` [PATCH 21/27] docs: admin-guide/abi: split files from symbols Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 22/27] docs: sphinx/automarkup: add cross-references for ABI Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 23/27] docs: sphinx/kernel_abi: avoid warnings during Sphinx module init Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 24/27] scripts/lib/abi/abi_parser.py: Rename title name for ABI files Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 25/27] scripts/lib/abi/abi_parser.py: make it backward-compatible with Python 3.6 Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 26/27] scripts/get_abi.py: add support for undefined ABIs Mauro Carvalho Chehab
2025-02-10 10:18 ` [PATCH 27/27] scripts/get_abi.pl: drop now obsoleted script Mauro Carvalho Chehab
2025-02-10 18:30 ` [PATCH 00/27] Improve ABI documentation generation Jonathan Corbet
2025-02-10 20:27 ` Mauro Carvalho Chehab
2025-03-27 21:58 ` [f2fs-dev] " patchwork-bot+f2fs
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=5205c53838b6ea25f4cdd4cc1e3d17c0141e75a6.1739182025.git.mchehab+huawei@kernel.org \
--to=mchehab+huawei@kernel.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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®