From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B01A9F4FA; Wed, 13 Aug 2025 21:32:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120756; cv=none; b=gY8V9kjxRh2PYbAPl7w+eyf0N6npaLAWnlUAVATkIivJzNhiDwb2+rE9YbRwqMkELmC2xQ9X8QagkakuKoys48PjG9TpuwI9Ycf40KNlMJHiElemp2cTlqLoBbroXhn2fS2VWe6IM0oSy2CPSuYIB66NndlAuIuHLR3JwuJUq+0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120756; c=relaxed/simple; bh=RGGrljcHtBNsV9dA5thNwiPGsF27rSe2lon6zIKk04s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mCWgo2pIMExa5AS+9oY8MF+tvmAClsiJCRgdGRndtagj5UTdmpaqmFHxYUDPavt5Xj+0j1OHMnSa4TeTcGBbfNxp5rZwRu/NbFJC5qFIyNfkXMlQgFMpjWFqIl2sqk+D8KB5GdQVYvn5G9hsnggDJ81h+R1sKVbTOg7Cb2Iu79w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=kh8pRt1B; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="kh8pRt1B" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net DF34940AF4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120748; bh=CzjeRF3zEfcug+dawfkO511YWICGxQRsIv8DTRbd8oQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kh8pRt1BBFms4rVRHqjKXNgeVLqr327kp9YARc/RClq529zhBN6d4tRG/AQspHRpQ sJ3/pysQnQxsqbB8pcSS8bVXegYpUV+dYlapwsljqmpyaRB7AqjH+04/xfSlaU2XSV l0rHSf8v1EnyV9cEIyTtco6F1/pMBadQmeR4di07fSS1osrnXo35zx7FQqd0vLdRPI knMPrQURnAvE/u54lrYYxApPs7UEKa+10c7Ilm1OO5IVQs/N5uCE8PyuwZhfucJOs2 uOf7+/bNDZlvEx7qyXh8jUKZRxhyu0QnQBMJSDRuv8KfMyPvpzzHdhGPpa6FgZHsN+ rcPh7cWCWNnjw== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id DF34940AF4; Wed, 13 Aug 2025 21:32:27 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 01/13] docs: Move the "features" tools to tools/doc Date: Wed, 13 Aug 2025 15:32:00 -0600 Message-ID: <20250813213218.198582-2-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The scripts for managing the features docs are found in three different directories; unite them all under tools/doc and update references as needed. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/sphinx/kernel_feat.py | 4 ++-- .../features/scripts =3D> tools/doc}/features-refresh.sh | 0 {scripts =3D> tools/doc}/get_feat.pl | 2 +- {Documentation/features =3D> tools/doc}/list-arch.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename {Documentation/features/scripts =3D> tools/doc}/features-refresh.sh= (100%) rename {scripts =3D> tools/doc}/get_feat.pl (99%) rename {Documentation/features =3D> tools/doc}/list-arch.sh (83%) diff --git a/Documentation/sphinx/kernel_feat.py b/Documentation/sphinx/ker= nel_feat.py index e3a51867f27b..5453a7b1fc9f 100644 --- a/Documentation/sphinx/kernel_feat.py +++ b/Documentation/sphinx/kernel_feat.py @@ -13,7 +13,7 @@ :license: GPL Version 2, June 1991 see Linux/COPYING for details. =20 The ``kernel-feat`` (:py:class:`KernelFeat`) directive calls the - scripts/get_feat.pl script to parse the Kernel ABI files. + tools/doc/get_feat.pl script to parse the Kernel ABI files. =20 Overview of directive's argument and options. =20 @@ -83,7 +83,7 @@ class KernelFeat(Directive): srctree =3D os.path.abspath(os.environ["srctree"]) =20 args =3D [ - os.path.join(srctree, 'scripts/get_feat.pl'), + os.path.join(srctree, 'tools/doc/get_feat.pl'), 'rest', '--enable-fname', '--dir', diff --git a/Documentation/features/scripts/features-refresh.sh b/tools/doc= /features-refresh.sh similarity index 100% rename from Documentation/features/scripts/features-refresh.sh rename to tools/doc/features-refresh.sh diff --git a/scripts/get_feat.pl b/tools/doc/get_feat.pl similarity index 99% rename from scripts/get_feat.pl rename to tools/doc/get_feat.pl index 40fb28c8424e..d75e7c85dc85 100755 --- a/scripts/get_feat.pl +++ b/tools/doc/get_feat.pl @@ -18,7 +18,7 @@ my $enable_fname; my $basename =3D abs_path($0); $basename =3D~ s,/[^/]+$,/,; =20 -my $prefix=3D$basename . "../Documentation/features"; +my $prefix=3D$basename . "../../Documentation/features"; =20 # Used only at for full features output. The script will auto-adjust # such values for the minimal possible values diff --git a/Documentation/features/list-arch.sh b/tools/doc/list-arch.sh similarity index 83% rename from Documentation/features/list-arch.sh rename to tools/doc/list-arch.sh index ac8ff7f6f859..96fe83b7058b 100755 --- a/Documentation/features/list-arch.sh +++ b/tools/doc/list-arch.sh @@ -8,4 +8,4 @@ =20 ARCH=3D${1:-$(uname -m | sed 's/x86_64/x86/' | sed 's/i386/x86/' | sed 's/= s390x/s390/')} =20 -$(dirname $0)/../../scripts/get_feat.pl list --arch $ARCH +$(dirname $0)/get_feat.pl list --arch $ARCH --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 914B72D0619; Wed, 13 Aug 2025 21:32:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; cv=none; b=mFPOmwcYhV1dE4W35fH+PnRBa8H3v705UF1xVzX5N3EiRcP6EnLtIg4+K/soTqH9JHtwCKIvJcc4H+4ZsfaX95smaWvmThnidJyts2l9VvbTgANswwV7J/O0ZPJpRdBPuv7XQIt8PsKaK3j4ADxvXg8IanRvRFsoialS1VRZiBo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; c=relaxed/simple; bh=GAeSo81aRJCHa6njntB+bHNuYGxPFpAiBOc+6zf1/+g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=oo3Mw2I3JVNPnh609nkDs/ihRwfTZcZI192E3DX4mzXp6zjyZj85vYcX3OQjByavVf99xdSdELxTPF1MXmgydtGzIFargO+fa9imgwdqY0hKvbeMsZ9nALfn6VOMTyvS5ZHIk0rL1E9JekIPKeS/QGZdAQqh7HeXBoNxoJUSVH4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=c6SwqjFF; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="c6SwqjFF" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 7998840AF5 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120748; bh=PsPNbSaYzwvhzthLzHDyROjNPxhZjHCPCuc2sHZOU0M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=c6SwqjFFaGUzkYjXMPRDY3maNfLir6CDu0UqnTEjzxl43FrpBf0WmfvNlDAAlzhZC HbUtzT8ziHER4OBI/GRRLGBiXtP96NRzBuWsTq9r+Updjw2KDhOINYmeZgzlW/4lIi CbHo8NL+fGyVSyd4Yldnb8oGkeqhcssXEghSNF/jJ3sxD9NcbjRKh4Pv1O9Tvk5eWa E2tf4MfDf4/unpfWM+aynHeZcH76J1UsIK4eMVgUNtMc4w3PD6YRZRMAOlypQlRq0Q WKA32CXs/u5Cf32DfDdj3f5SkAvwkq9Dy1XRr7VbiMNaZ8Dncqs76Yg/WedY2S5ZS5 FVlOjTK0gBfRw== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 7998840AF5; Wed, 13 Aug 2025 21:32:28 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 02/13] docs: move checktransupdate.py to tools/doc Date: Wed, 13 Aug 2025 15:32:01 -0600 Message-ID: <20250813213218.198582-3-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The checktranslate.py tool currently languishes in scripts/; move it to tools/doc and update references accordingly. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/doc-guide/checktransupdate.rst | 6 +++--- .../translations/zh_CN/doc-guide/checktransupdate.rst | 6 +++--- Documentation/translations/zh_CN/how-to.rst | 2 +- MAINTAINERS | 2 +- {scripts =3D> tools/doc}/checktransupdate.py | 8 ++++---- 5 files changed, 12 insertions(+), 12 deletions(-) rename {scripts =3D> tools/doc}/checktransupdate.py (98%) diff --git a/Documentation/doc-guide/checktransupdate.rst b/Documentation/d= oc-guide/checktransupdate.rst index dfaf9d373747..48bf1ee9a62e 100644 --- a/Documentation/doc-guide/checktransupdate.rst +++ b/Documentation/doc-guide/checktransupdate.rst @@ -27,15 +27,15 @@ Usage =20 :: =20 - ./scripts/checktransupdate.py --help + tools/doc/checktransupdate.py --help =20 Please refer to the output of argument parser for usage details. =20 Samples =20 -- ``./scripts/checktransupdate.py -l zh_CN`` +- ``tools/doc/checktransupdate.py -l zh_CN`` This will print all the files that need to be updated in the zh_CN loca= le. -- ``./scripts/checktransupdate.py Documentation/translations/zh_CN/dev-to= ols/testing-overview.rst`` +- ``tools/doc/checktransupdate.py Documentation/translations/zh_CN/dev-to= ols/testing-overview.rst`` This will only print the status of the specified file. =20 Then the output is something like: diff --git a/Documentation/translations/zh_CN/doc-guide/checktransupdate.rs= t b/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst index d20b4ce66b9f..165e25155084 100644 --- a/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst +++ b/Documentation/translations/zh_CN/doc-guide/checktransupdate.rst @@ -28,15 +28,15 @@ =20 :: =20 - ./scripts/checktransupdate.py --help + tools/doc/checktransupdate.py --help =20 =E5=85=B7=E4=BD=93=E7=94=A8=E6=B3=95=E8=AF=B7=E5=8F=82=E8=80=83=E5=8F=82= =E6=95=B0=E8=A7=A3=E6=9E=90=E5=99=A8=E7=9A=84=E8=BE=93=E5=87=BA =20 =E7=A4=BA=E4=BE=8B =20 -- ``./scripts/checktransupdate.py -l zh_CN`` +- ``tools/doc/checktransupdate.py -l zh_CN`` =E8=BF=99=E5=B0=86=E6=89=93=E5=8D=B0 zh_CN =E8=AF=AD=E8=A8=80=E4=B8=AD= =E9=9C=80=E8=A6=81=E6=9B=B4=E6=96=B0=E7=9A=84=E6=89=80=E6=9C=89=E6=96=87=E4= =BB=B6=E3=80=82 -- ``./scripts/checktransupdate.py Documentation/translations/zh_CN/dev-to= ols/testing-overview.rst`` +- ``tools/doc/checktransupdate.py Documentation/translations/zh_CN/dev-to= ols/testing-overview.rst`` =E8=BF=99=E5=B0=86=E5=8F=AA=E6=89=93=E5=8D=B0=E6=8C=87=E5=AE=9A=E6=96= =87=E4=BB=B6=E7=9A=84=E7=8A=B6=E6=80=81=E3=80=82 =20 =E7=84=B6=E5=90=8E=E8=BE=93=E5=87=BA=E7=B1=BB=E4=BC=BC=E5=A6=82=E4=B8=8B= =E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=9A diff --git a/Documentation/translations/zh_CN/how-to.rst b/Documentation/tr= anslations/zh_CN/how-to.rst index ddd99c0f9b4d..cf66c72ee0c5 100644 --- a/Documentation/translations/zh_CN/how-to.rst +++ b/Documentation/translations/zh_CN/how-to.rst @@ -437,7 +437,7 @@ git email =E9=BB=98=E8=AE=A4=E4=BC=9A=E6=8A=84=E9=80=81= =E7=BB=99=E6=82=A8=E4=B8=80=E4=BB=BD=EF=BC=8C=E6=89=80=E4=BB=A5=E6=82=A8=E5= =8F=AF=E4=BB=A5=E5=88=87=E6=8D=A2=E4=B8=BA=E5=AE=A1=E9=98=85=E8=80=85=E7=9A= =84=E8=A7=92 =E5=AF=B9=E4=BA=8E=E9=A6=96=E6=AC=A1=E5=8F=82=E4=B8=8E Linux =E5=86=85=E6= =A0=B8=E4=B8=AD=E6=96=87=E6=96=87=E6=A1=A3=E7=BF=BB=E8=AF=91=E7=9A=84=E6=96= =B0=E6=89=8B=EF=BC=8C=E5=BB=BA=E8=AE=AE=E6=82=A8=E5=9C=A8 linux =E7=9B=AE= =E5=BD=95=E4=B8=AD=E8=BF=90=E8=A1=8C=E4=BB=A5=E4=B8=8B=E5=91=BD=E4=BB=A4=EF= =BC=9A :: =20 - ./script/checktransupdate.py -l zh_CN`` + tools/doc/checktransupdate.py -l zh_CN`` =20 =E8=AF=A5=E5=91=BD=E4=BB=A4=E4=BC=9A=E5=88=97=E5=87=BA=E9=9C=80=E8=A6=81= =E7=BF=BB=E8=AF=91=E6=88=96=E6=9B=B4=E6=96=B0=E7=9A=84=E8=8B=B1=E6=96=87=E6= =96=87=E6=A1=A3=EF=BC=8C=E7=BB=93=E6=9E=9C=E5=90=8C=E6=97=B6=E4=BF=9D=E5=AD= =98=E5=9C=A8 checktransupdate.log =E4=B8=AD=E3=80=82 =20 diff --git a/MAINTAINERS b/MAINTAINERS index dafc11712544..a3a396fc1c3f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7301,8 +7301,8 @@ S: Maintained P: Documentation/doc-guide/maintainer-profile.rst T: git git://git.lwn.net/linux.git docs-next F: Documentation/ +F: tools/doc/ F: scripts/check-variable-fonts.sh -F: scripts/checktransupdate.py F: scripts/documentation-file-ref-check F: scripts/get_abi.py F: scripts/kernel-doc* diff --git a/scripts/checktransupdate.py b/tools/doc/checktransupdate.py similarity index 98% rename from scripts/checktransupdate.py rename to tools/doc/checktransupdate.py index e39529e46c3d..61bd7b02ca55 100755 --- a/scripts/checktransupdate.py +++ b/tools/doc/checktransupdate.py @@ -9,9 +9,9 @@ commit to find the latest english commit from the translati= on commit differences occur, report the file and commits that need to be updated. =20 The usage is as follows: -- ./scripts/checktransupdate.py -l zh_CN +- tools/doc/checktransupdate.py -l zh_CN This will print all the files that need to be updated or translated in the= zh_CN locale. -- ./scripts/checktransupdate.py Documentation/translations/zh_CN/dev-tools= /testing-overview.rst +- tools/doc/checktransupdate.py Documentation/translations/zh_CN/dev-tools= /testing-overview.rst This will only print the status of the specified file. =20 The output is something like: @@ -168,7 +168,7 @@ def check_per_file(file_path): def valid_locales(locale): """Check if the locale is valid or not""" script_path =3D os.path.dirname(os.path.abspath(__file__)) - linux_path =3D os.path.join(script_path, "..") + linux_path =3D os.path.join(script_path, "../..") if not os.path.isdir(f"{linux_path}/Documentation/translations/{locale= }"): raise ArgumentTypeError("Invalid locale: {locale}") return locale @@ -232,7 +232,7 @@ def config_logging(log_level, log_file=3D"checktransupd= ate.log"): def main(): """Main function of the script""" script_path =3D os.path.dirname(os.path.abspath(__file__)) - linux_path =3D os.path.join(script_path, "..") + linux_path =3D os.path.join(script_path, "../..") =20 parser =3D ArgumentParser(description=3D"Check the translation update") parser.add_argument( --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 915252D061E; Wed, 13 Aug 2025 21:32:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; cv=none; b=sEPT6rYk4e4hVUR9C2WsVZ/zW3LBLuRxlUKfCV2IGFiNSoFnDSxagdmL+0eZgzcVTtpToIeuX879nyfLn9Arwi1WVaQZg19zxwgpK28ljZiAVvdc6z3dkHqL9ZoZMo8cXBGgGT4Bj2J+bzVMrVRYLcmKTxM62WcWfz67wDUXs8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; c=relaxed/simple; bh=v7g6zpss8IUeemtM0CDlpIOABCzgG7YdeGrLH61dWag=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a/CbsfIdE9ieSTPK1uO/D/rzlZAMgeScCLKo3HH4GVCcxSBaWcC9McSJ2BcPWFy6JwGylplN6MxZiZ6Zh/mZVfyrtWgQaHeIiLejSRS285lFyrKQsRv27Ml5P3reyracXaqc/vCY3VHPeOnZktySXwcawpv55bOwhWXRpb2iLps= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=eJ2HIX6A; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="eJ2HIX6A" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 1309940AF6 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120749; bh=MDQvvRBEgYN5FGOXnKomMUjquDhJ5zdv5Vhtz4dl+kg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eJ2HIX6AbD2s6Xeo9Xcvqto0smu6TVpB5Fl84zvlN2muIUPI0TAtMlvAoY3E+1bXc XaIQHFZiAh+AV4urXbB0a1C/huY1EkyJqelPw3MlNz5iNA65QaG8S3/Dd7KNC/vHbP HQElVJgF1G+GAykZR0rYBLv+R3762Tg10kuE2ZrnRlBFrJ4Zos6bzkxQt7hOrTLlTH g8EOJAYh56aeL3ljQaXvU/aJ97z6kmiqblyM8SaFPnRdQNqk6SIagJtj2rLu0VP/aW dMNVU3xu/2OX3+yFuN1hUQw94Oa6I3Vc4T1JibscikopAzvMS264YHmsJldK90/T3R vybGpyuwi7Epw== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 1309940AF6; Wed, 13 Aug 2025 21:32:29 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 03/13] docs: move scripts/check-variable-fonts.sh to tools/doc Date: Wed, 13 Aug 2025 15:32:02 -0600 Message-ID: <20250813213218.198582-4-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move this script to live with the rest of the documentation tools. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap --- Documentation/Makefile | 2 +- MAINTAINERS | 1 - {scripts =3D> tools/doc}/check-variable-fonts.sh | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) rename {scripts =3D> tools/doc}/check-variable-fonts.sh (98%) diff --git a/Documentation/Makefile b/Documentation/Makefile index 820f07e0afe6..70095465dce1 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -146,7 +146,7 @@ pdfdocs: DENY_VF =3D XDG_CONFIG_HOME=3D$(FONTS_CONF_DEN= Y_VF) pdfdocs: latexdocs @$(srctree)/scripts/sphinx-pre-install --version-check $(foreach var,$(SPHINXDIRS), \ - $(MAKE) PDFLATEX=3D"$(PDFLATEX)" LATEXOPTS=3D"$(LATEXOPTS)" $(DENY_VF)= -C $(BUILDDIR)/$(var)/latex || sh $(srctree)/scripts/check-variable-fonts.= sh || exit; \ + $(MAKE) PDFLATEX=3D"$(PDFLATEX)" LATEXOPTS=3D"$(LATEXOPTS)" $(DENY_VF)= -C $(BUILDDIR)/$(var)/latex || sh $(srctree)/tools/doc/check-variable-font= s.sh || exit; \ mkdir -p $(BUILDDIR)/$(var)/pdf; \ mv $(subst .tex,.pdf,$(wildcard $(BUILDDIR)/$(var)/latex/*.tex)) $(BUI= LDDIR)/$(var)/pdf/; \ ) diff --git a/MAINTAINERS b/MAINTAINERS index a3a396fc1c3f..ca4c7992369d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7302,7 +7302,6 @@ P: Documentation/doc-guide/maintainer-profile.rst T: git git://git.lwn.net/linux.git docs-next F: Documentation/ F: tools/doc/ -F: scripts/check-variable-fonts.sh F: scripts/documentation-file-ref-check F: scripts/get_abi.py F: scripts/kernel-doc* diff --git a/scripts/check-variable-fonts.sh b/tools/doc/check-variable-fon= ts.sh similarity index 98% rename from scripts/check-variable-fonts.sh rename to tools/doc/check-variable-fonts.sh index ce63f0acea5f..9660df53d716 100755 --- a/scripts/check-variable-fonts.sh +++ b/tools/doc/check-variable-fonts.sh @@ -106,7 +106,7 @@ if [ "x$notocjkvffonts" !=3D "x" ] ; then echo 'Or, CJK pages can be skipped by uninstalling texlive-xecjk.' echo echo 'For more info on denylisting, other options, and variable font, see= header' - echo 'comments of scripts/check-variable-fonts.sh.' + echo 'comments of tools/doc/check-variable-fonts.sh.' echo '=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D' fi =20 --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72F5E3093CE; Wed, 13 Aug 2025 21:32:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; cv=none; b=Wo86KjyBsgz/B3mXDtmulKu+5wnuU/v/bRsCPR18DTu505hNZv8R69SDJtzZKl31WdviNWtwMEI9nZs647vXSx0JO3DGgvynZelg8t2U+U+Hwpo9rzH93qcuZpnPfiqER5CyE7ZNfKwR0dJM6YCN/5CKmLC9fhdm8OdebOwpj6g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; c=relaxed/simple; bh=XG0IUTzgggjHC7XpWjNslDa9iaLpJbCXZTSzuwzJvw4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aGMCNS3ID321FJ6AYW7rwtPsWq4x7ZL43MqFBoev351lQm7v3+WM1/D8RUWWFchk3EAlxEuDFYOWRRoZPH2hs5yBUW/CPLha19MuXEl/HNJKIMSjMjcLgeO6Y+ULpXtQHcEFzhGigCut1mTo4ofdfcGG9ziIvfbRc8Pg3IJ0KZw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=Hu3VU+RS; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="Hu3VU+RS" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net A1A5440AF7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120750; bh=GwRKiICIPVgXd2SKXzVv6F2/MjfrEfTZ1LdNZfZSnnE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Hu3VU+RSuMGiprUals2x6pp71+vCP21VAiAtLsEiMMHbdnR+iO6UhUkEgM+cJCVO5 f1tMSxxhxhIZUak1qObUH+qk2sQGqJl6SGRT/jwhme0IVhzCGGyaNLRygyQiYoo3YI pVvYymi0UpBMpzDuGzMfM4hSfBM51x1vKq7LwdBpeGCcQIeQyGVCy2Ipz5KiW+zkQz tciT13De7HAG39IUzVnjrXLIm0XKAuBsV2U8qgz8QhYgttojZXo3OD7ua6TeUlXO6s EcpaZhkrX7DQB6VsqTlP09Eb4z5Lefc+GGDkXEK5fI3jCZsle3QYTJbQcC9hV7akU/ hJ8W8fvekI7oQ== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id A1A5440AF7; Wed, 13 Aug 2025 21:32:29 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 04/13] docs: move scripts/documentation-file-ref-check to tools/doc Date: Wed, 13 Aug 2025 15:32:03 -0600 Message-ID: <20250813213218.198582-5-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add this script to the growing collection of documentation tools. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/Makefile | 4 ++-- MAINTAINERS | 3 +-- scripts/sphinx-pre-install | 2 +- {scripts =3D> tools/doc}/documentation-file-ref-check | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) rename {scripts =3D> tools/doc}/documentation-file-ref-check (99%) diff --git a/Documentation/Makefile b/Documentation/Makefile index 70095465dce1..f7b8342f9666 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -8,7 +8,7 @@ subdir- :=3D devicetree/bindings ifneq ($(MAKECMDGOALS),cleandocs) # Check for broken documentation file references ifeq ($(CONFIG_WARN_MISSING_DOCUMENTS),y) -$(shell $(srctree)/scripts/documentation-file-ref-check --warn) +$(shell $(srctree)/tools/doc/documentation-file-ref-check --warn) endif =20 # Check for broken ABI files @@ -167,7 +167,7 @@ endif # HAVE_SPHINX # work or silently pass without Sphinx. =20 refcheckdocs: - $(Q)cd $(srctree);scripts/documentation-file-ref-check + $(Q)cd $(srctree); tools/doc/documentation-file-ref-check =20 cleandocs: $(Q)rm -rf $(BUILDDIR) diff --git a/MAINTAINERS b/MAINTAINERS index ca4c7992369d..ec9872642597 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7302,7 +7302,6 @@ P: Documentation/doc-guide/maintainer-profile.rst T: git git://git.lwn.net/linux.git docs-next F: Documentation/ F: tools/doc/ -F: scripts/documentation-file-ref-check F: scripts/get_abi.py F: scripts/kernel-doc* F: scripts/lib/abi/* @@ -7342,7 +7341,7 @@ M: Mauro Carvalho Chehab L: linux-doc@vger.kernel.org S: Maintained F: Documentation/sphinx/parse-headers.pl -F: scripts/documentation-file-ref-check +F: tools/doc/ F: scripts/sphinx-pre-install =20 DOCUMENTATION/ITALIAN diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install index b8474848df4e..5d006a037428 100755 --- a/scripts/sphinx-pre-install +++ b/scripts/sphinx-pre-install @@ -406,7 +406,7 @@ class MissingCheckers(AncillaryMethods): Right now, we still need Perl for doc build, as it is required by some tools called at docs or kernel build time, like: =20 - scripts/documentation-file-ref-check + tools/doc/documentation-file-ref-check =20 Also, checkpatch is on Perl. """ diff --git a/scripts/documentation-file-ref-check b/tools/doc/documentation= -file-ref-check similarity index 99% rename from scripts/documentation-file-ref-check rename to tools/doc/documentation-file-ref-check index 408b1dbe7884..2dc53f5661b1 100755 --- a/scripts/documentation-file-ref-check +++ b/tools/doc/documentation-file-ref-check @@ -17,7 +17,7 @@ my %false_positives =3D ( ); =20 my $scriptname =3D $0; -$scriptname =3D~ s,.*/([^/]+/),$1,; +$scriptname =3D~ s,tools/doc/([^/]+/),$1,; =20 # Parse arguments my $help =3D 0; --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D490F2EE5FD; Wed, 13 Aug 2025 21:32:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; cv=none; b=uaNWLKJkg3ZxC7AiB8ctKWpEIRTyLZtWrOjK2Xt8EJ7ipBKguFIyxxKtLvq7g7jhmRz5iD0OyULM5cgcCwwCXEMZ21jqCHdUED0NnN7ru4Tu0yNkWjcQPMyPnbXwDdiyG1miJeQ/lnXe3Kuf+BKP5lnwg0plyUiih0gQqkt6I2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; c=relaxed/simple; bh=LTmqyp1/ibDp2tcqxUewokyf5alWURxLCwluqirhyC0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fmrdr2lyIMJ9kxZ5hbpm2b4pp9+NRebrU/ZTgeXq7D9xni7LmfdamDPO7fyTgIXWXHCHVLJCnI//VAhD3s4NXYzuhv0vdX0MRYOqhA8B9EfQ7gPMxwTmf2E0m3X7IvatQXgKxNKF5OPQbJpat/PQVYcN+yL68G6RZn1KlONfkls= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=bFpG3rQm; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="bFpG3rQm" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 3A1F940AF8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120750; bh=EMIkJCSFEzX4JDPJfUNMvF3Fqzv6hrJlDW3m1/cGsBE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bFpG3rQmfysW1PQMFQxVj1u0aAHu7Pepzw+ope22rFpIG3m7HVceHL1zkEMSjNKBZ eYFje5JFwpD792uE48brZljMs4pPgKPck+Uytk5vLMitlEaZxGNnfTGlEoI4UtYq88 UWWIhPmrSu9MCF7Ux5nQ8nW55afCtlBU0S9uf+GfTzzQooxhlXibt0gPa41UhHqy2h Vr2TA6ZaZif5fFW+vq+dtOyVeBNdQRT3veGmwEWvIe5upvKaRW9boCMjvIUrQ/Gdxe 6WAC7lckHH2Dord1YKNX8Fax39IZ3GZ2uXI14Dtfi6Ug2IQnJ1NV4Qo/G5JQNOBHq8 s5ZxQgcKSJFbg== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 3A1F940AF8; Wed, 13 Aug 2025 21:32:30 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 05/13] docs: move parallel-wrapper.sh to tools/doc/ Date: Wed, 13 Aug 2025 15:32:04 -0600 Message-ID: <20250813213218.198582-6-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This little script was buried in Documentation/sphinx/; put it with the other documentation-related tools. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap --- Documentation/Makefile | 2 +- {Documentation/sphinx =3D> tools/doc}/parallel-wrapper.sh | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {Documentation/sphinx =3D> tools/doc}/parallel-wrapper.sh (100%) diff --git a/Documentation/Makefile b/Documentation/Makefile index f7b8342f9666..962c4fab94b0 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -91,7 +91,7 @@ quiet_cmd_sphinx =3D SPHINX $@ --> file://$(abspath $(BU= ILDDIR)/$3/$4) PYTHONPYCACHEPREFIX=3D"$(PYTHONPYCACHEPREFIX)" \ BUILDDIR=3D$(abspath $(BUILDDIR)) SPHINX_CONF=3D$(abspath $(src)/$5/$(SPH= INX_CONF)) \ $(PYTHON3) $(srctree)/scripts/jobserver-exec \ - $(CONFIG_SHELL) $(srctree)/Documentation/sphinx/parallel-wrapper.sh \ + $(CONFIG_SHELL) $(srctree)/tools/doc/parallel-wrapper.sh \ $(SPHINXBUILD) \ -b $2 \ -c $(abspath $(src)) \ diff --git a/Documentation/sphinx/parallel-wrapper.sh b/tools/doc/parallel-= wrapper.sh similarity index 100% rename from Documentation/sphinx/parallel-wrapper.sh rename to tools/doc/parallel-wrapper.sh --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D497D2F0C64; Wed, 13 Aug 2025 21:32:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; cv=none; b=lQzc5V2td/ofBRD1sVwqWFnoInDXfLork4biYZVVemN72qYDAdKTOaV4Zl8NAlbSkBMnBQ+56wFbNrYHIMKQxduW+SnqUhXdk4C040ow1+Vk1B9RfPrNSSD5ORYzDny5eu7NdbT3I99o54lZ++Tfu0lMhTmD94h9zpu9j6l2DvY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120757; c=relaxed/simple; bh=i6r2cjqRgdoWCE3T1s1d2OsuEgwemxbRmk7qaifEkZg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tmS2lS7D+0pIEdbFqS1tmSqfCjgSUTuZNDwmOuaFVAgIowIM14hgbqV+DvWgBwiMaymR0C/5dbG7YYZ6QhZsAxPoBVG/nsqc6oCWI4Yp3xluWxKjSSchZKB9jPlYbhvjQLz44EOE16aEDhZeBpjzWiE60yUhUYUqJQzKsbfFKtU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=NNsqny6d; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="NNsqny6d" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net D079840AF9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120751; bh=uai5P2Z7dyR9FKIsZAMHGxNGWkNu0mA8sIZFMSJISjA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NNsqny6daSZRimNvA/M9l5hXdBoJOUJpxTyTBcYWgpIF+vW6zsxqK6pzTF/qB7U2S c9TapNRWzkeSofL29YPDhZBirG1eVIDai2cqJZFCop3tDWM8cmXuof6DNq50al4nNh sMMv+qVzxPwP1/k37oDz6DMeHiWWRxPoZdEDx/uTwMOys4aiCM+txRNnngwcohn49t mF9rV9k5kFvad7oUgIy0e059c9IzxUBi11Xwmv12YjR4Jsm+r9HmFE7noDRtoIuUPZ InOj/l3rPRzwdyC0aOlcfZvB7jqWF+M8HxqxVg4WF1A/DfVKbivgzI8By4JIDeO4FJ F8VPItWcFV5iA== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id D079840AF9; Wed, 13 Aug 2025 21:32:30 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 06/13] docs: move get_abi.py to tools/doc Date: Wed, 13 Aug 2025 15:32:05 -0600 Message-ID: <20250813213218.198582-7-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move this tool out of scripts/ to join the other documentation tools; fix up a couple of erroneous references in the process. It's worth noting that this script will fail badly unless one has a PYTHONPATH referencing scripts/lib/abi. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap --- Documentation/Kconfig | 2 +- Documentation/Makefile | 2 +- Documentation/sphinx/kernel_abi.py | 2 +- MAINTAINERS | 1 - {scripts =3D> tools/doc}/get_abi.py | 0 5 files changed, 3 insertions(+), 4 deletions(-) rename {scripts =3D> tools/doc}/get_abi.py (100%) diff --git a/Documentation/Kconfig b/Documentation/Kconfig index 3a0e7ac0c4e3..70178e9e0c6c 100644 --- a/Documentation/Kconfig +++ b/Documentation/Kconfig @@ -19,7 +19,7 @@ config WARN_ABI_ERRORS described at Documentation/ABI/README. Yet, as they're manually written, it would be possible that some of those files would have errors that would break them for being parsed by - scripts/get_abi.pl. Add a check to verify them. + tools/doc/get_abi.py. Add a check to verify them. =20 If unsure, select 'N'. =20 diff --git a/Documentation/Makefile b/Documentation/Makefile index 962c4fab94b0..eef5decb79b8 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -13,7 +13,7 @@ endif =20 # Check for broken ABI files ifeq ($(CONFIG_WARN_ABI_ERRORS),y) -$(shell $(srctree)/scripts/get_abi.py --dir $(srctree)/Documentation/ABI v= alidate) +$(shell $(srctree)/tools/doc/get_abi.py --dir $(srctree)/Documentation/ABI= validate) endif endif =20 diff --git a/Documentation/sphinx/kernel_abi.py b/Documentation/sphinx/kern= el_abi.py index 4c4375201b9e..32e39fb8bc3b 100644 --- a/Documentation/sphinx/kernel_abi.py +++ b/Documentation/sphinx/kernel_abi.py @@ -14,7 +14,7 @@ :license: GPL Version 2, June 1991 see Linux/COPYING for details. =20 The ``kernel-abi`` (:py:class:`KernelCmd`) directive calls the - scripts/get_abi.py script to parse the Kernel ABI files. + AbiParser class to parse the Kernel ABI files. =20 Overview of directive's argument and options. =20 diff --git a/MAINTAINERS b/MAINTAINERS index ec9872642597..b41b78215035 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7302,7 +7302,6 @@ P: Documentation/doc-guide/maintainer-profile.rst T: git git://git.lwn.net/linux.git docs-next F: Documentation/ F: tools/doc/ -F: scripts/get_abi.py F: scripts/kernel-doc* F: scripts/lib/abi/* F: scripts/lib/kdoc/* diff --git a/scripts/get_abi.py b/tools/doc/get_abi.py similarity index 100% rename from scripts/get_abi.py rename to tools/doc/get_abi.py --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 945D33093D9; Wed, 13 Aug 2025 21:32:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; cv=none; b=MkStagalTgRFhbwy4sdb8fqhAKeoWWS5spGnsRBr6lBDpbCyk5X2KCRJkrTDwH+Rgf0yioI70P5H5sApBP1S9WEUmrR/obDsz4Tu2SSdpEWm9R+XxPq9sYcq1XIZ3Nw17NxM45SAupeAcZ8ixFN5GcdtLtw8eAiX32/bXhS0ppI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; c=relaxed/simple; bh=EhNf0jiEtdDWAQPcaEI9GyJeZ6PI01pY8P9MzP0ffXA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EA9zK3PqU1gYC/FfpLs//9NGI+n2c9Jbm61DRl9SySrwRRvQKJdv9qnQTYFiH5aeWNcJnm16eZVyaQCOgNrQ/cooZs+b29Jf9eUmqN885PlXlAl8KW46Wm3yMz4NkUy73lsTEhU5jXk1yFtOtEIMJA6z59s+DanbNKQ3VTnhQuc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=OFm9wmCp; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="OFm9wmCp" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 6ED7A40AFA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120751; bh=jUgpkfrm8XLsvgYXsY28qPmnnuIaoJZxaMVlOOoZBdQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OFm9wmCp9vjZFfQTqIyViyS0j9mkr7RsADNIt4/9qID0crcrJ1hL3z834zAI0iAKl RKA1uD84evJQjsQ0bwhTJNLQf2jimZjKPTppmnENFCb1mwJsA7FP+PspodzvwYMe6b jJjjuBT7FyHPbzQeLqLcEA8Oqbr9F73edaCEpJWgppnt6pytKxwn/5joQ74zKd8N+9 pWjg5whpukHcqtU58MwXP+RcYtkVq7hLHYwca6g94uggtIkacL9TOBCN9aoe8yYdEN tTtvi5y2Y6Gs2YVu7FlPgsGBEzyLfB4MX4FtTGzPrFLn6DRhVX58ikWyksUtWJzTcC XjUQUCmgD6Mig== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 6ED7A40AFA; Wed, 13 Aug 2025 21:32:31 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 07/13] docs: move sphinx-pre-install to tools/doc Date: Wed, 13 Aug 2025 15:32:06 -0600 Message-ID: <20250813213218.198582-8-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Put this tool with the other documentation-related scripts. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap --- Documentation/Makefile | 14 +++++++------- Documentation/doc-guide/sphinx.rst | 4 ++-- Documentation/sphinx/kerneldoc-preamble.sty | 2 +- .../translations/it_IT/doc-guide/sphinx.rst | 4 ++-- .../translations/zh_CN/doc-guide/sphinx.rst | 4 ++-- Documentation/translations/zh_CN/how-to.rst | 2 +- MAINTAINERS | 2 -- {scripts =3D> tools/doc}/sphinx-pre-install | 0 8 files changed, 15 insertions(+), 17 deletions(-) rename {scripts =3D> tools/doc}/sphinx-pre-install (100%) diff --git a/Documentation/Makefile b/Documentation/Makefile index eef5decb79b8..818d866756b0 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -46,7 +46,7 @@ ifeq ($(HAVE_SPHINX),0) .DEFAULT: $(warning The '$(SPHINXBUILD)' command was not found. Make sure you have = Sphinx installed and in PATH, or set the SPHINXBUILD make variable to point= to the full path of the '$(SPHINXBUILD)' executable.) @echo - @$(srctree)/scripts/sphinx-pre-install + @$(srctree)/tools/doc/sphinx-pre-install @echo " SKIP Sphinx $@ target." =20 else # HAVE_SPHINX @@ -105,7 +105,7 @@ quiet_cmd_sphinx =3D SPHINX $@ --> file://$(abspath $(= BUILDDIR)/$3/$4) fi =20 htmldocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,html,$(var),,$(var))) =20 # If Rust support is available and .config exists, add rustdoc generated c= ontents. @@ -119,7 +119,7 @@ endif endif =20 texinfodocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,texinfo,$(var),texin= fo,$(var))) =20 # Note: the 'info' Make target is generated by sphinx itself when @@ -131,7 +131,7 @@ linkcheckdocs: @$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,linkcheck,$(var),,$(v= ar))) =20 latexdocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,latex,$(var),latex,$= (var))) =20 ifeq ($(HAVE_PDFLATEX),0) @@ -144,7 +144,7 @@ else # HAVE_PDFLATEX =20 pdfdocs: DENY_VF =3D XDG_CONFIG_HOME=3D$(FONTS_CONF_DENY_VF) pdfdocs: latexdocs - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check $(foreach var,$(SPHINXDIRS), \ $(MAKE) PDFLATEX=3D"$(PDFLATEX)" LATEXOPTS=3D"$(LATEXOPTS)" $(DENY_VF)= -C $(BUILDDIR)/$(var)/latex || sh $(srctree)/tools/doc/check-variable-font= s.sh || exit; \ mkdir -p $(BUILDDIR)/$(var)/pdf; \ @@ -154,11 +154,11 @@ pdfdocs: latexdocs endif # HAVE_PDFLATEX =20 epubdocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,epub,$(var),epub,$(v= ar))) =20 xmldocs: - @$(srctree)/scripts/sphinx-pre-install --version-check + @$(srctree)/tools/doc/sphinx-pre-install --version-check @+$(foreach var,$(SPHINXDIRS),$(call loop_cmd,sphinx,xml,$(var),xml,$(var= ))) =20 endif # HAVE_SPHINX diff --git a/Documentation/doc-guide/sphinx.rst b/Documentation/doc-guide/s= phinx.rst index 607589592bfb..2a0fc6c39cf4 100644 --- a/Documentation/doc-guide/sphinx.rst +++ b/Documentation/doc-guide/sphinx.rst @@ -106,7 +106,7 @@ There's a script that automatically checks for Sphinx d= ependencies. If it can recognize your distribution, it will also give a hint about the install command line options for your distro:: =20 - $ ./scripts/sphinx-pre-install + $ ./tools/doc/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are avail= able Warning: better to also install "texlive-luatex85". You should run: @@ -116,7 +116,7 @@ command line options for your distro:: . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt =20 - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-= install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/doc/sphinx-pr= e-install line 468. =20 By default, it checks all the requirements for both html and PDF, including the requirements for images, math expressions and LaTeX build, and assumes diff --git a/Documentation/sphinx/kerneldoc-preamble.sty b/Documentation/sp= hinx/kerneldoc-preamble.sty index 5d68395539fe..736c2568377e 100644 --- a/Documentation/sphinx/kerneldoc-preamble.sty +++ b/Documentation/sphinx/kerneldoc-preamble.sty @@ -220,7 +220,7 @@ If you want them, please install non-variable ``Noto Sans CJK'' font families along with the texlive-xecjk package by following instructions from - \sphinxcode{./scripts/sphinx-pre-install}. + \sphinxcode{./tools/doc/sphinx-pre-install}. Having optional non-variable ``Noto Serif CJK'' font families will improve the looks of those translations. \end{sphinxadmonition}} diff --git a/Documentation/translations/it_IT/doc-guide/sphinx.rst b/Docume= ntation/translations/it_IT/doc-guide/sphinx.rst index 1f513bc33618..104aa159c1ce 100644 --- a/Documentation/translations/it_IT/doc-guide/sphinx.rst +++ b/Documentation/translations/it_IT/doc-guide/sphinx.rst @@ -109,7 +109,7 @@ Sphinx. Se lo script riesce a riconoscere la vostra dis= tribuzione, allora sar=C3=A0 in grado di darvi dei suggerimenti su come procedere per complet= are l'installazione:: =20 - $ ./scripts/sphinx-pre-install + $ ./tools/doc/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are avail= able Warning: better to also install "texlive-luatex85". You should run: @@ -119,7 +119,7 @@ l'installazione:: . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt =20 - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-= install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/doc/sphinx-pr= e-install line 468. =20 L'impostazione predefinita prevede il controllo dei requisiti per la gener= azione di documenti html e PDF, includendo anche il supporto per le immagini, le diff --git a/Documentation/translations/zh_CN/doc-guide/sphinx.rst b/Docume= ntation/translations/zh_CN/doc-guide/sphinx.rst index 23eac67fbc30..3d2c4e262bb5 100644 --- a/Documentation/translations/zh_CN/doc-guide/sphinx.rst +++ b/Documentation/translations/zh_CN/doc-guide/sphinx.rst @@ -84,7 +84,7 @@ PDF=E5=92=8CLaTeX=E6=9E=84=E5=BB=BA =E8=BF=99=E6=9C=89=E4=B8=80=E4=B8=AA=E8=84=9A=E6=9C=AC=E5=8F=AF=E4=BB=A5= =E8=87=AA=E5=8A=A8=E6=A3=80=E6=9F=A5Sphinx=E4=BE=9D=E8=B5=96=E9=A1=B9=E3=80= =82=E5=A6=82=E6=9E=9C=E5=AE=83=E8=AE=A4=E5=BE=97=E6=82=A8=E7=9A=84=E5=8F=91= =E8=A1=8C=E7=89=88=EF=BC=8C=E8=BF=98=E4=BC=9A=E6=8F=90=E7=A4=BA=E6=82=A8=E6= =89=80=E7=94=A8=E5=8F=91=E8=A1=8C =E7=89=88=E7=9A=84=E5=AE=89=E8=A3=85=E5=91=BD=E4=BB=A4:: =20 - $ ./scripts/sphinx-pre-install + $ ./tools/doc/sphinx-pre-install Checking if the needed tools for Fedora release 26 (Twenty Six) are avail= able Warning: better to also install "texlive-luatex85". You should run: @@ -94,7 +94,7 @@ PDF=E5=92=8CLaTeX=E6=9E=84=E5=BB=BA . sphinx_2.4.4/bin/activate pip install -r Documentation/sphinx/requirements.txt =20 - Can't build as 1 mandatory dependency is missing at ./scripts/sphinx-pre-= install line 468. + Can't build as 1 mandatory dependency is missing at ./tools/doc/sphinx-pr= e-install line 468. =20 =E9=BB=98=E8=AE=A4=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8C=E5=AE=83=E4=BC=9A= =E6=A3=80=E6=9F=A5html=E5=92=8CPDF=E7=9A=84=E6=89=80=E6=9C=89=E4=BE=9D=E8= =B5=96=E9=A1=B9=EF=BC=8C=E5=8C=85=E6=8B=AC=E5=9B=BE=E5=83=8F=E3=80=81=E6=95= =B0=E5=AD=A6=E8=A1=A8=E8=BE=BE=E5=BC=8F=E5=92=8CLaTeX=E6=9E=84=E5=BB=BA=E7= =9A=84 =E9=9C=80=E6=B1=82=EF=BC=8C=E5=B9=B6=E5=81=87=E8=AE=BE=E5=B0=86=E4=BD=BF= =E7=94=A8=E8=99=9A=E6=8B=9FPython=E7=8E=AF=E5=A2=83=E3=80=82html=E6=9E=84= =E5=BB=BA=E6=89=80=E9=9C=80=E7=9A=84=E4=BE=9D=E8=B5=96=E9=A1=B9=E8=A2=AB=E8= =AE=A4=E4=B8=BA=E6=98=AF=E5=BF=85=E9=9C=80=E7=9A=84=EF=BC=8C=E5=85=B6=E4=BB= =96=E4=BE=9D diff --git a/Documentation/translations/zh_CN/how-to.rst b/Documentation/tr= anslations/zh_CN/how-to.rst index cf66c72ee0c5..77da507d29cf 100644 --- a/Documentation/translations/zh_CN/how-to.rst +++ b/Documentation/translations/zh_CN/how-to.rst @@ -64,7 +64,7 @@ Linux =E5=8F=91=E8=A1=8C=E7=89=88=E5=92=8C=E7=AE=80=E5=8D= =95=E5=9C=B0=E4=BD=BF=E7=94=A8 Linux =E5=91=BD=E4=BB=A4=E8=A1=8C=EF=BC=8C= =E9=82=A3=E4=B9=88=E5=8F=AF=E4=BB=A5=E8=BF=85=E9=80=9F=E5=BC=80=E5=A7=8B=E4= =BA=86 :: =20 cd linux - ./scripts/sphinx-pre-install + ./tools/doc/sphinx-pre-install =20 =E4=BB=A5 Fedora =E4=B8=BA=E4=BE=8B=EF=BC=8C=E5=AE=83=E7=9A=84=E8=BE=93=E5= =87=BA=E6=98=AF=E8=BF=99=E6=A0=B7=E7=9A=84:: =20 diff --git a/MAINTAINERS b/MAINTAINERS index b41b78215035..2f1374130240 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7306,7 +7306,6 @@ F: scripts/kernel-doc* F: scripts/lib/abi/* F: scripts/lib/kdoc/* F: tools/net/ynl/pyynl/lib/doc_generator.py -F: scripts/sphinx-pre-install X: Documentation/ABI/ X: Documentation/admin-guide/media/ X: Documentation/devicetree/ @@ -7341,7 +7340,6 @@ L: linux-doc@vger.kernel.org S: Maintained F: Documentation/sphinx/parse-headers.pl F: tools/doc/ -F: scripts/sphinx-pre-install =20 DOCUMENTATION/ITALIAN M: Federico Vaga diff --git a/scripts/sphinx-pre-install b/tools/doc/sphinx-pre-install similarity index 100% rename from scripts/sphinx-pre-install rename to tools/doc/sphinx-pre-install --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 945123093D2; Wed, 13 Aug 2025 21:32:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; cv=none; b=Y5Ce08H71oyoeeWs0D0ruxrvVHDpdwFTYNrKN0tQuJwWjGo5+RBNPyHD7pXnSd8fwh7PSBlecv039tjXJthzhvy3gRypWfr2Lo179+CC9iiWRVH3XmcyLjA/1G8azGGd2K06+QgQzRmHvmYSv42xrALygwo2Rll+ly+BuqngzmA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120758; c=relaxed/simple; bh=td1wQOZTn2t7taMZPMo13hQVK7UFhFEqonm4xpsJez8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kZdwJVDDfuYkHreyEwoEvMl8p9kAFhxNbhko/kKPD6zX1YfqRRDdu9dbUkPRYoFD6joHUoE8irla4B/xRGT3wNcUDIbH16a0LW+KExfzGuB/2XNutXGg+msfpw/Yak2p3j6HnKcOW1SM2UqnENZgrL3susxS6OTfqsGjiwFoNmg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=HejI7dMK; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="HejI7dMK" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 064EC40AFB DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120752; bh=6A2E3kW8F6s7/ZG38M+WOh1FiZ91olnH6JrnWCCTVuQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=HejI7dMKH560V6rSEIIxMCRY9nokCOfubp96mrVGYhqmRhCfP0TWrFM+x0L93M0i2 Hr/sH6CsKnOOcbMykOFVpZppqXPGYimh5tMQi5sLveAh2nWcl8abnQ0Ce2QxwxrLwP Kfyh0uEAT24u9AdRbm4zlxORYnjWbZLZkePIn9yN4d3ZR77VB6xwmvIAwQzmDkj3V0 tmAIgPOHrhO0d0ap4A7nrp3orOWXryWZ++6wD/CLgDcbs/Mx9OrPM3KrgaIQCS0k9Q hsoRriCeiHpROuvcxpCT1hdbUNwcl/W8UDmrApMIFdKbtYbgzAZJGoMkfpp35hYD// LpziWBB+OAp0g== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 064EC40AFB; Wed, 13 Aug 2025 21:32:31 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 08/13] docs: move test_doc_build.py to tools/doc Date: Wed, 13 Aug 2025 15:32:07 -0600 Message-ID: <20250813213218.198582-9-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add this tool to tools/doc. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/doc-guide/sphinx.rst | 2 +- {scripts =3D> tools/doc}/test_doc_build.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename {scripts =3D> tools/doc}/test_doc_build.py (100%) diff --git a/Documentation/doc-guide/sphinx.rst b/Documentation/doc-guide/s= phinx.rst index 2a0fc6c39cf4..d874dd0ed7d0 100644 --- a/Documentation/doc-guide/sphinx.rst +++ b/Documentation/doc-guide/sphinx.rst @@ -149,7 +149,7 @@ a venv with it with, and install minimal requirements w= ith:: =20 A more comprehensive test can be done by using: =20 - scripts/test_doc_build.py + tools/doc/test_doc_build.py =20 Such script create one Python venv per supported version, optionally building documentation for a range of Sphinx versions. diff --git a/scripts/test_doc_build.py b/tools/doc/test_doc_build.py similarity index 100% rename from scripts/test_doc_build.py rename to tools/doc/test_doc_build.py --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D63C30AACA; Wed, 13 Aug 2025 21:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; cv=none; b=n5VBHJTgXiPNNd3Jqx/7pLiFm6EgSiiNGvldpAz3khpQTKw80aADJ0hAHPpq3tuVKqq3NlSFIdgQSJ+J6Du0nLAW6/vzRUmtLTEbzEoGPKN1NTw12sXoEPY3QQyTcEXzaZD+YmtZTFeL8TuU6egudGZIC16MvBPaPUw+ETndS6A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; c=relaxed/simple; bh=bCqcEuYXIZ5FS0iGGlt/V5k155zzYR3s8m9do/BeNFw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dscQwURhrY/ZYU+D645O7R2BO32mHZqPCfpHZ37Bg0sRoYOh1oETWIFJi+4Ffb44F3cssfYr/zGHJ0Uc/Hoa7XLwUoRuBZ+8CnLRl/C1jbxNEZVj/fK40j/TfBtKnh8xezNnYznLEhfcn6ateYpypVpmkCJDP9ZNrfBizy7tg2Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=hhVafAcs; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="hhVafAcs" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 9AC0A40AFC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120753; bh=n0Uge/EydivOUALbTlxUcyMHQ+hRH50kMHQoRmNZbsc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hhVafAcso4jU6ES5Kl6Km6bZcrjTFmUX3wtKUgbPPO2sA3IFGdhkIQQynqR8X2eh7 rYmgWmaEUjjpOxfMONtofgT0XumzXBf5THhtQCau7u0LQ9ZxuLEUuJyYhtUOSTWx6l Hyu0td5mqz3Eo5wCCKaE3Cw/U40ySREr9pCzBktumEnP+RCeGyJtU5mD/jqNPJ4Wx5 bfOATRAr2qKPAi0znNDLm8djZrD7K4iDurtFG4wZeD3Xw3fTMBPZj6sJtnbVC0F+Fa nKB6li2AqX3Frkwo9VpMSaToI4k5a7LgPxb3MbKrLivoy6ZUYufE2n2Oqu5a7ocyZt xkACiZS+frnew== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 9AC0A40AFC; Wed, 13 Aug 2025 21:32:32 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 09/13] docs: move parse-headers.pl to tools/doc Date: Wed, 13 Aug 2025 15:32:08 -0600 Message-ID: <20250813213218.198582-10-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Move the tool and fix all the references, including the numerous ones that said "parse_headers" instead of "parse-headers". Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap --- Documentation/doc-guide/parse-headers.rst | 6 +++--- .../translations/it_IT/doc-guide/parse-headers.rst | 6 +++--- .../translations/zh_CN/doc-guide/parse-headers.rst | 6 +++--- Documentation/userspace-api/media/Makefile | 2 +- MAINTAINERS | 1 - {Documentation/sphinx =3D> tools/doc}/parse-headers.pl | 4 ++-- 6 files changed, 12 insertions(+), 13 deletions(-) rename {Documentation/sphinx =3D> tools/doc}/parse-headers.pl (98%) diff --git a/Documentation/doc-guide/parse-headers.rst b/Documentation/doc-= guide/parse-headers.rst index 204b025f1349..954cd81523a0 100644 --- a/Documentation/doc-guide/parse-headers.rst +++ b/Documentation/doc-guide/parse-headers.rst @@ -15,14 +15,14 @@ about how to use it inside the Kernel tree. =20 .. _parse_headers: =20 -parse_headers.pl +parse-headers.pl ^^^^^^^^^^^^^^^^ =20 NAME **** =20 =20 -parse_headers.pl - parse a C file, in order to identify functions, structs, +parse-headers.pl - parse a C file, in order to identify functions, structs, enums and defines and create cross-references to a Sphinx book. =20 =20 @@ -30,7 +30,7 @@ SYNOPSIS ******** =20 =20 -\ **parse_headers.pl**\ [] [] +\ **parse-headers.pl**\ [] [] =20 Where can be: --debug, --help or --usage. =20 diff --git a/Documentation/translations/it_IT/doc-guide/parse-headers.rst b= /Documentation/translations/it_IT/doc-guide/parse-headers.rst index 026a23e49767..45b6b6fc4fb5 100644 --- a/Documentation/translations/it_IT/doc-guide/parse-headers.rst +++ b/Documentation/translations/it_IT/doc-guide/parse-headers.rst @@ -20,21 +20,21 @@ consultate ``Documentation/userspace-api/media/Makefile= ``. =20 .. _it_parse_headers: =20 -parse_headers.pl +parse-headers.pl ^^^^^^^^^^^^^^^^ =20 NOME **** =20 =20 -parse_headers.pl - analizza i file C al fine di identificare funzioni, +parse-headers.pl - analizza i file C al fine di identificare funzioni, strutture, enumerati e definizioni, e creare riferimenti per Sphinx =20 SINTASSI ******** =20 =20 -\ **parse_headers.pl**\ [] [] +\ **parse-headers.pl**\ [] [] =20 Dove pu=C3=B2 essere: --debug, --usage o --help. =20 diff --git a/Documentation/translations/zh_CN/doc-guide/parse-headers.rst b= /Documentation/translations/zh_CN/doc-guide/parse-headers.rst index a08819e904ed..22253fea5da1 100644 --- a/Documentation/translations/zh_CN/doc-guide/parse-headers.rst +++ b/Documentation/translations/zh_CN/doc-guide/parse-headers.rst @@ -19,14 +19,14 @@ Sphinx=E5=B0=86=E7=94=9F=E6=88=90=E8=AD=A6=E5=91=8A=E3= =80=82=E8=BF=99=E6=9C=89=E5=8A=A9=E4=BA=8E=E4=BF=9D=E6=8C=81=E7=94=A8=E6=88= =B7=E7=A9=BA=E9=97=B4API=E6=96=87=E6=A1=A3=E4=B8=8E=E5=86=85=E6=A0=B8=E6=9B= =B4=E6=94=B9 =20 .. _parse_headers_zh: =20 -parse_headers.pl +parse-headers.pl ---------------- =20 =E8=84=9A=E6=9C=AC=E5=90=8D=E7=A7=B0 ~~~~~~~~ =20 =20 -parse_headers.pl=E2=80=94=E2=80=94=E8=A7=A3=E6=9E=90=E4=B8=80=E4=B8=AAC=E6= =96=87=E4=BB=B6=EF=BC=8C=E8=AF=86=E5=88=AB=E5=87=BD=E6=95=B0=E3=80=81=E7=BB= =93=E6=9E=84=E4=BD=93=E3=80=81=E6=9E=9A=E4=B8=BE=E3=80=81=E5=AE=9A=E4=B9=89= =E5=B9=B6=E5=AF=B9Sphinx=E6=96=87=E6=A1=A3 +parse-headers.pl=E2=80=94=E2=80=94=E8=A7=A3=E6=9E=90=E4=B8=80=E4=B8=AAC=E6= =96=87=E4=BB=B6=EF=BC=8C=E8=AF=86=E5=88=AB=E5=87=BD=E6=95=B0=E3=80=81=E7=BB= =93=E6=9E=84=E4=BD=93=E3=80=81=E6=9E=9A=E4=B8=BE=E3=80=81=E5=AE=9A=E4=B9=89= =E5=B9=B6=E5=AF=B9Sphinx=E6=96=87=E6=A1=A3 =E5=88=9B=E5=BB=BA=E4=BA=A4=E5=8F=89=E5=BC=95=E7=94=A8=E3=80=82 =20 =20 @@ -34,7 +34,7 @@ parse_headers.pl=E2=80=94=E2=80=94=E8=A7=A3=E6=9E=90=E4= =B8=80=E4=B8=AAC=E6=96=87=E4=BB=B6=EF=BC=8C=E8=AF=86=E5=88=AB=E5=87=BD=E6= =95=B0=E3=80=81=E7=BB=93=E6=9E=84=E4=BD=93=E3=80=81=E6=9E=9A=E4=B8=BE=E3=80= =81 ~~~~~~~~ =20 =20 -\ **parse_headers.pl**\ [<=E9=80=89=E9=A1=B9>] <=E8= =BE=93=E5=87=BA=E6=96=87=E4=BB=B6> [<=E4=BE=8B=E5=A4=96=E6=96=87=E4=BB=B6>] +\ **parse-headers.pl**\ [<=E9=80=89=E9=A1=B9>] <=E8= =BE=93=E5=87=BA=E6=96=87=E4=BB=B6> [<=E4=BE=8B=E5=A4=96=E6=96=87=E4=BB=B6>] =20 <=E9=80=89=E9=A1=B9> =E5=8F=AF=E4=BB=A5=E6=98=AF=EF=BC=9A --debug, --help = =E6=88=96 --usage =E3=80=82 =20 diff --git a/Documentation/userspace-api/media/Makefile b/Documentation/use= rspace-api/media/Makefile index 3d8aaf5c253b..632798bca615 100644 --- a/Documentation/userspace-api/media/Makefile +++ b/Documentation/userspace-api/media/Makefile @@ -3,7 +3,7 @@ # Rules to convert a .h file to inline RST documentation =20 SRC_DIR=3D$(srctree)/Documentation/userspace-api/media -PARSER =3D $(srctree)/Documentation/sphinx/parse-headers.pl +PARSER =3D $(srctree)/tools/doc/parse-headers.pl UAPI =3D $(srctree)/include/uapi/linux KAPI =3D $(srctree)/include/linux =20 diff --git a/MAINTAINERS b/MAINTAINERS index 2f1374130240..c2d2ce92bf79 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7338,7 +7338,6 @@ DOCUMENTATION SCRIPTS M: Mauro Carvalho Chehab L: linux-doc@vger.kernel.org S: Maintained -F: Documentation/sphinx/parse-headers.pl F: tools/doc/ =20 DOCUMENTATION/ITALIAN diff --git a/Documentation/sphinx/parse-headers.pl b/tools/doc/parse-header= s.pl similarity index 98% rename from Documentation/sphinx/parse-headers.pl rename to tools/doc/parse-headers.pl index 7b1458544e2e..47b90bf8c96d 100755 --- a/Documentation/sphinx/parse-headers.pl +++ b/tools/doc/parse-headers.pl @@ -340,12 +340,12 @@ __END__ =20 =3Dhead1 NAME =20 -parse_headers.pl - parse a C file, in order to identify functions, structs, +parse-headers.pl - parse a C file, in order to identify functions, structs, enums and defines and create cross-references to a Sphinx book. =20 =3Dhead1 SYNOPSIS =20 -B [] [] +B [] [] =20 Where can be: --debug, --help or --usage. =20 --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6D5BA30AAC9; Wed, 13 Aug 2025 21:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; cv=none; b=uFzuCcwn7j22tv5Ouo16Z0Td37L31MAEQwJvUNx7zc5g96e+n0MA1F7GsuY7VSGNG8KvUtHF3wbLHexTlPMJeTJXgsTw2eA7gyMlJm7DrPJhlKPzfv+sYg4ZyPN37WYAWRXYYMFPpkZ9WlwA8OJB1+czdz87laxOHSkoOVuozFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; c=relaxed/simple; bh=l2wAMQP4sd8u8DIkV05eu2m8rWVPbKq2bfICqcnq5cw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QSB3pcNEaUYGIoKq29Uo31TPTC8nx++G47YZrluW42OM7K1gUC+8smAyyXlkYjU2erb5WOhiDIkyG/jgAzax3L0jGX07hUz/uDpSmD3GYPrKhB7M37ti0N+lWfd55fCzN1ody1rDJQNwRtLMMyT7vLTx05o4IGXL/Vp/9iROWik= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=SLQr5zo5; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="SLQr5zo5" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 32A8940AFE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120753; bh=32vKyyGUyTxxutit98H+4XopSx7i9WC4YipC+gt6Ig4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SLQr5zo5BocxqDDkYG4SrgGkR1dsnPio2rfyKX0XbAzUyxClkFRRGLuqy5CGKQ8xz 9L7DhaxXaG24BKEa0Nb1DRkwDU8akZuqAHjGnTVcDbbK89qrCPJKWNM4YMpXRI5xxm FBOSYgAHCxlH4dK9YK3+Khi/4RNR3j2GhAHkd3VeGzzcJvyWOjEgaVYppz7brXTY2H L0USSF98bCtS/6WnK0Uufz966NG/mVijijMoHg3xLf0oXtYbHKwyvSGqwcxM3c1GiM /HPMYzOSFiZ9lwmTPZFPk2r34KLMB9bn8nlZC4WxVmvskzEPYpO0pZM0JREWZ0WhWf 2IwwgJak8q4ow== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 32A8940AFE; Wed, 13 Aug 2025 21:32:33 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 10/13] docs: move kernel-doc to tools/doc Date: Wed, 13 Aug 2025 15:32:09 -0600 Message-ID: <20250813213218.198582-11-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Move kernel-doc to join the rest of the tools, and update references throughout the tree. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/conf.py | 2 +- Documentation/doc-guide/kernel-doc.rst | 12 ++++++------ Documentation/kbuild/kbuild.rst | 2 +- Documentation/process/coding-style.rst | 2 +- .../translations/it_IT/doc-guide/kernel-doc.rst | 8 ++++---- .../translations/sp_SP/process/coding-style.rst | 2 +- .../translations/zh_CN/doc-guide/kernel-doc.rst | 10 +++++----- Documentation/translations/zh_CN/kbuild/kbuild.rst | 2 +- .../translations/zh_CN/process/coding-style.rst | 2 +- .../translations/zh_TW/process/coding-style.rst | 2 +- MAINTAINERS | 1 - Makefile | 2 +- drivers/gpu/drm/i915/Makefile | 2 +- scripts/find-unused-docs.sh | 2 +- scripts/kernel-doc | 1 - scripts/kernel-doc.py =3D> tools/doc/kernel-doc | 0 16 files changed, 25 insertions(+), 27 deletions(-) delete mode 120000 scripts/kernel-doc rename scripts/kernel-doc.py =3D> tools/doc/kernel-doc (100%) diff --git a/Documentation/conf.py b/Documentation/conf.py index f9828f3862f9..600cf5d32af8 100644 --- a/Documentation/conf.py +++ b/Documentation/conf.py @@ -564,7 +564,7 @@ pdf_documents =3D [ # kernel-doc extension configuration for running Sphinx directly (e.g. by = Read # the Docs). In a normal build, these are supplied from the Makefile via c= ommand # line arguments. -kerneldoc_bin =3D "../scripts/kernel-doc.py" +kerneldoc_bin =3D "../tools/doc/kernel-doc.py" kerneldoc_srctree =3D ".." =20 # ------------------------------------------------------------------------= ------ diff --git a/Documentation/doc-guide/kernel-doc.rst b/Documentation/doc-gui= de/kernel-doc.rst index af9697e60165..6fc89d444ada 100644 --- a/Documentation/doc-guide/kernel-doc.rst +++ b/Documentation/doc-guide/kernel-doc.rst @@ -54,7 +54,7 @@ Running the ``kernel-doc`` tool with increased verbosity = and without actual output generation may be used to verify proper formatting of the documentation comments. For example:: =20 - scripts/kernel-doc -v -none drivers/foo/bar.c + tools/doc/kernel-doc -v -none drivers/foo/bar.c =20 The documentation format is verified by the kernel build when it is requested to perform extra gcc checks:: @@ -349,7 +349,7 @@ differentiated by whether the macro name is immediately= followed by a left parenthesis ('(') for function-like macros or not followed by one for object-like macros. =20 -Function-like macros are handled like functions by ``scripts/kernel-doc``. +Function-like macros are handled like functions by ``tools/doc/kernel-doc`= `. They may have a parameter list. Object-like macros have do not have a parameter list. =20 @@ -571,7 +571,7 @@ from the source file. =20 The kernel-doc extension is included in the kernel source tree, at ``Documentation/sphinx/kerneldoc.py``. Internally, it uses the -``scripts/kernel-doc`` script to extract the documentation comments from t= he +``tools/doc/kernel-doc`` script to extract the documentation comments from= the source. =20 .. _kernel_doc: @@ -582,17 +582,17 @@ How to use kernel-doc to generate man pages If you just want to use kernel-doc to generate man pages you can do this from the kernel git tree:: =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/man =20 Some older versions of git do not support some of the variants of syntax f= or path exclusion. One of the following commands may work for those versions= :: =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools"= ) \ | scripts/split-man.pl /tmp/man diff --git a/Documentation/kbuild/kbuild.rst b/Documentation/kbuild/kbuild.= rst index 3388a10f2dcc..ae7b0669e3ec 100644 --- a/Documentation/kbuild/kbuild.rst +++ b/Documentation/kbuild/kbuild.rst @@ -180,7 +180,7 @@ architecture. KDOCFLAGS --------- Specify extra (warning/error) flags for kernel-doc checks during the build, -see scripts/kernel-doc for which flags are supported. Note that this doesn= 't +see tools/doc/kernel-doc for which flags are supported. Note that this doe= sn't (currently) apply to documentation builds. =20 ARCH diff --git a/Documentation/process/coding-style.rst b/Documentation/process= /coding-style.rst index d1a8e5465ed9..b2d16449a27b 100644 --- a/Documentation/process/coding-style.rst +++ b/Documentation/process/coding-style.rst @@ -614,7 +614,7 @@ it. =20 When commenting the kernel API functions, please use the kernel-doc format. See the files at :ref:`Documentation/doc-guide/ ` and -``scripts/kernel-doc`` for details. Note that the danger of over-commenting +``tools/doc/kernel-doc`` for details. Note that the danger of over-comment= ing applies to kernel-doc comments all the same. Do not add boilerplate kernel-doc which simply reiterates what's obvious from the signature of the function. diff --git a/Documentation/translations/it_IT/doc-guide/kernel-doc.rst b/Do= cumentation/translations/it_IT/doc-guide/kernel-doc.rst index aa0e31d353d6..05ea0f03c80b 100644 --- a/Documentation/translations/it_IT/doc-guide/kernel-doc.rst +++ b/Documentation/translations/it_IT/doc-guide/kernel-doc.rst @@ -80,7 +80,7 @@ Al fine di verificare che i commenti siano formattati cor= rettamente, potete eseguire il programma ``kernel-doc`` con un livello di verbosit=C3=A0 alto= e senza che questo produca alcuna documentazione. Per esempio:: =20 - scripts/kernel-doc -v -none drivers/foo/bar.c + tools/doc/kernel-doc -v -none drivers/foo/bar.c =20 Il formato della documentazione =C3=A8 verificato della procedura di gener= azione del kernel quando viene richiesto di effettuare dei controlli extra con GC= C:: @@ -378,7 +378,7 @@ distinguono in base al fatto che il nome della macro si= mile a funzione sia immediatamente seguito da una parentesi sinistra ('(') mentre in quelle si= mili a oggetti no. =20 -Le macro simili a funzioni sono gestite come funzioni da ``scripts/kernel-= doc``. +Le macro simili a funzioni sono gestite come funzioni da ``tools/doc/kerne= l-doc``. Possono avere un elenco di parametri. Le macro simili a oggetti non hanno = un elenco di parametri. =20 @@ -595,7 +595,7 @@ documentazione presenti nel file sorgente (*source*). =20 L'estensione kernel-doc fa parte dei sorgenti del kernel, la si pu=C3=B2 t= rovare in ``Documentation/sphinx/kerneldoc.py``. Internamente, viene utilizzato -lo script ``scripts/kernel-doc`` per estrarre i commenti di documentazione +lo script ``tools/doc/kernel-doc`` per estrarre i commenti di documentazio= ne dai file sorgenti. =20 Come utilizzare kernel-doc per generare pagine man @@ -604,4 +604,4 @@ Come utilizzare kernel-doc per generare pagine man Se volete utilizzare kernel-doc solo per generare delle pagine man, potete farlo direttamente dai sorgenti del kernel:: =20 - $ scripts/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^too= ls) | scripts/split-man.pl /tmp/man + $ tools/doc/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^t= ools) | scripts/split-man.pl /tmp/man diff --git a/Documentation/translations/sp_SP/process/coding-style.rst b/Do= cumentation/translations/sp_SP/process/coding-style.rst index 025223be9706..73c43b49480f 100644 --- a/Documentation/translations/sp_SP/process/coding-style.rst +++ b/Documentation/translations/sp_SP/process/coding-style.rst @@ -633,7 +633,7 @@ posiblemente POR QU=C3=89 hace esto. =20 Al comentar las funciones de la API del kernel, utilice el formato kernel-doc. Consulte los archivos en :ref:`Documentation/doc-guide/ ` -y ``scripts/kernel-doc`` para m=C3=A1s detalles. +y ``tools/doc/kernel-doc`` para m=C3=A1s detalles. =20 El estilo preferido para comentarios largos (de varias l=C3=ADneas) es: =20 diff --git a/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst b/Do= cumentation/translations/zh_CN/doc-guide/kernel-doc.rst index ccfb9b8329c2..b242e52f911c 100644 --- a/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst +++ b/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst @@ -43,7 +43,7 @@ kernel-doc=E6=B3=A8=E9=87=8A=E7=94=A8 ``/**`` =E4=BD=9C= =E4=B8=BA=E5=BC=80=E5=A7=8B=E6=A0=87=E8=AE=B0=E3=80=82 ``kernel-doc`` =E5= =B7=A5=E5=85=B7=E5=B0=86=E6=8F=90=E5=8F=96 =E7=94=A8=E8=AF=A6=E7=BB=86=E6=A8=A1=E5=BC=8F=E5=92=8C=E4=B8=8D=E7=94=9F= =E6=88=90=E5=AE=9E=E9=99=85=E8=BE=93=E5=87=BA=E6=9D=A5=E8=BF=90=E8=A1=8C ``= kernel-doc`` =E5=B7=A5=E5=85=B7=EF=BC=8C=E5=8F=AF=E4=BB=A5=E9=AA=8C=E8=AF= =81=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=E7=9A=84=E6=A0=BC=E5=BC=8F =E6=98=AF=E5=90=A6=E6=AD=A3=E7=A1=AE=E3=80=82=E4=BE=8B=E5=A6=82:: =20 - scripts/kernel-doc -v -none drivers/foo/bar.c + tools/doc/kernel-doc -v -none drivers/foo/bar.c =20 =E5=BD=93=E8=AF=B7=E6=B1=82=E6=89=A7=E8=A1=8C=E9=A2=9D=E5=A4=96=E7=9A=84gc= c=E6=A3=80=E6=9F=A5=E6=97=B6=EF=BC=8C=E5=86=85=E6=A0=B8=E6=9E=84=E5=BB=BA= =E5=B0=86=E9=AA=8C=E8=AF=81=E6=96=87=E6=A1=A3=E6=A0=BC=E5=BC=8F:: =20 @@ -473,7 +473,7 @@ doc: *title* =E5=A6=82=E6=9E=9C=E6=B2=A1=E6=9C=89=E9=80=89=E9=A1=B9=EF=BC=8Ckernel-doc= =E6=8C=87=E4=BB=A4=E5=B0=86=E5=8C=85=E5=90=AB=E6=BA=90=E6=96=87=E4=BB=B6=E4= =B8=AD=E7=9A=84=E6=89=80=E6=9C=89=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=E3=80= =82 =20 kernel-doc=E6=89=A9=E5=B1=95=E5=8C=85=E5=90=AB=E5=9C=A8=E5=86=85=E6=A0=B8= =E6=BA=90=E4=BB=A3=E7=A0=81=E6=A0=91=E4=B8=AD=EF=BC=8C=E4=BD=8D=E4=BA=8E ``= Documentation/sphinx/kerneldoc.py`` =E3=80=82 -=E5=9C=A8=E5=86=85=E9=83=A8=EF=BC=8C=E5=AE=83=E4=BD=BF=E7=94=A8 ``scripts/= kernel-doc`` =E8=84=9A=E6=9C=AC=E4=BB=8E=E6=BA=90=E4=BB=A3=E7=A0=81=E4=B8= =AD=E6=8F=90=E5=8F=96=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=E3=80=82 +=E5=9C=A8=E5=86=85=E9=83=A8=EF=BC=8C=E5=AE=83=E4=BD=BF=E7=94=A8 ``tools/do= c/kernel-doc`` =E8=84=9A=E6=9C=AC=E4=BB=8E=E6=BA=90=E4=BB=A3=E7=A0=81=E4=B8= =AD=E6=8F=90=E5=8F=96=E6=96=87=E6=A1=A3=E6=B3=A8=E9=87=8A=E3=80=82 =20 .. _kernel_doc_zh: =20 @@ -482,18 +482,18 @@ kernel-doc=E6=89=A9=E5=B1=95=E5=8C=85=E5=90=AB=E5=9C= =A8=E5=86=85=E6=A0=B8=E6=BA=90=E4=BB=A3=E7=A0=81=E6=A0=91=E4=B8=AD=EF=BC=8C= =E4=BD=8D=E4=BA=8E ``Documentation/sphinx/k =20 =E5=A6=82=E6=9E=9C=E6=82=A8=E5=8F=AA=E6=83=B3=E4=BD=BF=E7=94=A8kernel-doc= =E7=94=9F=E6=88=90=E6=89=8B=E5=86=8C=E9=A1=B5=EF=BC=8C=E5=8F=AF=E4=BB=A5=E4= =BB=8E=E5=86=85=E6=A0=B8git=E6=A0=91=E8=BF=99=E6=A0=B7=E5=81=9A:: =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ | scripts/split-man.pl /tmp/man =20 =E4=B8=80=E4=BA=9B=E6=97=A7=E7=89=88=E6=9C=AC=E7=9A=84git=E4=B8=8D=E6=94= =AF=E6=8C=81=E8=B7=AF=E5=BE=84=E6=8E=92=E9=99=A4=E8=AF=AD=E6=B3=95=E7=9A=84= =E6=9F=90=E4=BA=9B=E5=8F=98=E4=BD=93=E3=80=82 =E4=BB=A5=E4=B8=8B=E5=91=BD=E4=BB=A4=E4=B9=8B=E4=B8=80=E5=8F=AF=E8=83=BD= =E9=80=82=E7=94=A8=E4=BA=8E=E8=BF=99=E4=BA=9B=E7=89=88=E6=9C=AC:: =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ | scripts/split-man.pl /tmp/man =20 - $ scripts/kernel-doc -man \ + $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools"= ) \ | scripts/split-man.pl /tmp/man =20 diff --git a/Documentation/translations/zh_CN/kbuild/kbuild.rst b/Documenta= tion/translations/zh_CN/kbuild/kbuild.rst index e5e2aebe1ebc..3650a48a8db6 100644 --- a/Documentation/translations/zh_CN/kbuild/kbuild.rst +++ b/Documentation/translations/zh_CN/kbuild/kbuild.rst @@ -158,7 +158,7 @@ UTS_MACHINE =E5=8F=98=E9=87=8F=EF=BC=88=E5=9C=A8=E6=9F= =90=E4=BA=9B=E6=9E=B6=E6=9E=84=E4=B8=AD=E8=BF=98=E5=8C=85=E6=8B=AC=E5=86=85= =E6=A0=B8=E9=85=8D=E7=BD=AE=EF=BC=89=E6=9D=A5=E7=8C=9C=E6=B5=8B=E6=AD=A3=E7= =A1=AE KDOCFLAGS --------- =E6=8C=87=E5=AE=9A=E5=9C=A8=E6=9E=84=E5=BB=BA=E8=BF=87=E7=A8=8B=E4=B8=AD= =E7=94=A8=E4=BA=8E kernel-doc =E6=A3=80=E6=9F=A5=E7=9A=84=E9=A2=9D=E5=A4=96= =EF=BC=88=E8=AD=A6=E5=91=8A/=E9=94=99=E8=AF=AF=EF=BC=89=E6=A0=87=E5=BF=97= =EF=BC=8C=E6=9F=A5=E7=9C=8B -scripts/kernel-doc =E4=BA=86=E8=A7=A3=E6=94=AF=E6=8C=81=E7=9A=84=E6=A0=87= =E5=BF=97=E3=80=82=E8=AF=B7=E6=B3=A8=E6=84=8F=EF=BC=8C=E8=BF=99=E7=9B=AE=E5= =89=8D=E4=B8=8D=E9=80=82=E7=94=A8=E4=BA=8E=E6=96=87=E6=A1=A3=E6=9E=84=E5=BB= =BA=E3=80=82 +tools/doc/kernel-doc =E4=BA=86=E8=A7=A3=E6=94=AF=E6=8C=81=E7=9A=84=E6=A0= =87=E5=BF=97=E3=80=82=E8=AF=B7=E6=B3=A8=E6=84=8F=EF=BC=8C=E8=BF=99=E7=9B=AE= =E5=89=8D=E4=B8=8D=E9=80=82=E7=94=A8=E4=BA=8E=E6=96=87=E6=A1=A3=E6=9E=84=E5= =BB=BA=E3=80=82 =20 ARCH ---- diff --git a/Documentation/translations/zh_CN/process/coding-style.rst b/Do= cumentation/translations/zh_CN/process/coding-style.rst index 0484d0c65c25..64f0c13ff831 100644 --- a/Documentation/translations/zh_CN/process/coding-style.rst +++ b/Documentation/translations/zh_CN/process/coding-style.rst @@ -545,7 +545,7 @@ Linux =E9=87=8C=E8=BF=99=E6=98=AF=E6=8F=90=E5=80=A1=E7= =9A=84=E5=81=9A=E6=B3=95=EF=BC=8C=E5=9B=A0=E4=B8=BA=E8=BF=99=E6=A0=B7=E5=8F= =AF=E4=BB=A5=E5=BE=88=E7=AE=80=E5=8D=95=E7=9A=84=E7=BB=99=E8=AF=BB=E8=80=85= =E6=8F=90=E4=BE=9B =E4=B9=9F=E5=8F=AF=E4=BB=A5=E5=8A=A0=E4=B8=8A=E5=AE=83=E5=81=9A=E8=BF=99= =E4=BA=9B=E4=BA=8B=E6=83=85=E7=9A=84=E5=8E=9F=E5=9B=A0=E3=80=82 =20 =E5=BD=93=E6=B3=A8=E9=87=8A=E5=86=85=E6=A0=B8 API =E5=87=BD=E6=95=B0=E6=97= =B6=EF=BC=8C=E8=AF=B7=E4=BD=BF=E7=94=A8 kernel-doc =E6=A0=BC=E5=BC=8F=E3=80= =82=E8=AF=A6=E8=A7=81 -Documentation/translations/zh_CN/doc-guide/index.rst =E5=92=8C scripts/ker= nel-doc =E3=80=82 +Documentation/translations/zh_CN/doc-guide/index.rst =E5=92=8C tools/doc/k= ernel-doc =E3=80=82 =20 =E9=95=BF (=E5=A4=9A=E8=A1=8C) =E6=B3=A8=E9=87=8A=E7=9A=84=E9=A6=96=E9=80= =89=E9=A3=8E=E6=A0=BC=E6=98=AF=EF=BC=9A =20 diff --git a/Documentation/translations/zh_TW/process/coding-style.rst b/Do= cumentation/translations/zh_TW/process/coding-style.rst index 311c6f6bad0b..1e9dee6bbdd0 100644 --- a/Documentation/translations/zh_TW/process/coding-style.rst +++ b/Documentation/translations/zh_TW/process/coding-style.rst @@ -548,7 +548,7 @@ Linux =E8=A3=8F=E9=80=99=E6=98=AF=E6=8F=90=E5=80=A1=E7= =9A=84=E5=81=9A=E6=B3=95=EF=BC=8C=E5=9B=A0=E7=88=B2=E9=80=99=E6=A8=A3=E5=8F= =AF=E4=BB=A5=E5=BE=88=E7=B0=A1=E5=96=AE=E7=9A=84=E7=B5=A6=E8=AE=80=E8=80=85= =E6=8F=90=E4=BE=9B =E4=B9=9F=E5=8F=AF=E4=BB=A5=E5=8A=A0=E4=B8=8A=E5=AE=83=E5=81=9A=E9=80=99= =E4=BA=9B=E4=BA=8B=E6=83=85=E7=9A=84=E5=8E=9F=E5=9B=A0=E3=80=82 =20 =E7=95=B6=E8=A8=BB=E9=87=8B=E5=85=A7=E6=A0=B8 API =E5=87=BD=E6=95=B8=E6=99= =82=EF=BC=8C=E8=AB=8B=E4=BD=BF=E7=94=A8 kernel-doc =E6=A0=BC=E5=BC=8F=E3=80= =82=E8=A9=B3=E8=A6=8B -Documentation/translations/zh_CN/doc-guide/index.rst =E5=92=8C scripts/ker= nel-doc =E3=80=82 +Documentation/translations/zh_CN/doc-guide/index.rst =E5=92=8C tools/doc/k= ernel-doc =E3=80=82 =20 =E9=95=B7 (=E5=A4=9A=E8=A1=8C) =E8=A8=BB=E9=87=8B=E7=9A=84=E9=A6=96=E9=81= =B8=E9=A2=A8=E6=A0=BC=E6=98=AF=EF=BC=9A =20 diff --git a/MAINTAINERS b/MAINTAINERS index c2d2ce92bf79..0fa427577f15 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -7302,7 +7302,6 @@ P: Documentation/doc-guide/maintainer-profile.rst T: git git://git.lwn.net/linux.git docs-next F: Documentation/ F: tools/doc/ -F: scripts/kernel-doc* F: scripts/lib/abi/* F: scripts/lib/kdoc/* F: tools/net/ynl/pyynl/lib/doc_generator.py diff --git a/Makefile b/Makefile index 6bfe776bf3c5..44577bd357bb 100644 --- a/Makefile +++ b/Makefile @@ -460,7 +460,7 @@ HOSTPKG_CONFIG =3D pkg-config =20 # the KERNELDOC macro needs to be exported, as scripts/Makefile.build # has a logic to call it -KERNELDOC =3D $(srctree)/scripts/kernel-doc.py +KERNELDOC =3D $(srctree)/tools/doc/kernel-doc.py export KERNELDOC =20 KBUILD_USERHOSTCFLAGS :=3D -Wall -Wmissing-prototypes -Wstrict-prototypes \ diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile index 853543443072..6e732e0079c1 100644 --- a/drivers/gpu/drm/i915/Makefile +++ b/drivers/gpu/drm/i915/Makefile @@ -426,7 +426,7 @@ always-$(CONFIG_DRM_I915_WERROR) +=3D \ =20 quiet_cmd_hdrtest =3D HDRTEST $(patsubst %.hdrtest,%.h,$@) cmd_hdrtest =3D $(CC) $(filter-out $(CFLAGS_GCOV), $(c_flags)) -S -o= /dev/null -x c /dev/null -include $<; \ - $(srctree)/scripts/kernel-doc -none -Werror $<; touch $@ + $(srctree)/tools/doc/kernel-doc -none -Werror $<; touch $@ =20 $(obj)/%.hdrtest: $(src)/%.h FORCE $(call if_changed_dep,hdrtest) diff --git a/scripts/find-unused-docs.sh b/scripts/find-unused-docs.sh index d6d397fbf917..0ae445dec2e4 100755 --- a/scripts/find-unused-docs.sh +++ b/scripts/find-unused-docs.sh @@ -54,7 +54,7 @@ for file in `find $1 -name '*.c'`; do if [[ ${FILES_INCLUDED[$file]+_} ]]; then continue; fi - str=3D$(PYTHONDONTWRITEBYTECODE=3D1 scripts/kernel-doc -export "$file" 2>= /dev/null) + str=3D$(PYTHONDONTWRITEBYTECODE=3D1 tools/doc/kernel-doc -export "$file" = 2>/dev/null) if [[ -n "$str" ]]; then echo "$file" fi diff --git a/scripts/kernel-doc b/scripts/kernel-doc deleted file mode 120000 index 3b6ef807791a..000000000000 --- a/scripts/kernel-doc +++ /dev/null @@ -1 +0,0 @@ -kernel-doc.py \ No newline at end of file diff --git a/scripts/kernel-doc.py b/tools/doc/kernel-doc similarity index 100% rename from scripts/kernel-doc.py rename to tools/doc/kernel-doc --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6BEC2FFDEC; Wed, 13 Aug 2025 21:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; cv=none; b=YdqdNvDX+J4Fp/GQQriZLlbED614BCQxHCrsMYZE1I8K0HN1+J3UeT4IYG8XRU4GjLY9eL33bnVjsIUjH6T9rXpu4YGqgaHmL2Sbb+Q18E5jswYedoPec9BUB86Tk7SeyEZaLCGqrOTSy3xqx4WU6SSzzndUw4Roy7mPsZtosic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; c=relaxed/simple; bh=YrTV7I0EV9/14jjGp98GHdddZ1yBD5j3sBBEqWvqx08=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=q88QLQjR0sdCxF1OF2xWuHUGl1EeAKPml1rCSt3IRD0kuctVkiXCyyCATc5T3ZoW16ayJRmXTu7OTB72PReY8J7wzT3UbQKjGCjh6VNUTmR/v4fUJVzjEub96KdklZZxdBl6Ptx+IC1Zh4g4MOZjB7aG3stU4imr7I5rv7LjyKw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=MgtBGUZ3; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="MgtBGUZ3" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net BEE2040AFD DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120754; bh=n+EXUx0NIy4qnYvjItAxM4tBrzlvkFAYtOvhUN+rFt4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=MgtBGUZ3ySXelPqfP0/vwADarDekDlbbA66cGkTrg+4hfyf4GZySaH5pZV0Dczd4N KWZ0Nbbv6k+sBcjgtyr8zGbwlgFPHI1b2DR1gQMyiziFCVekPZCcfnJjMYPbgxBxTj KZwJw9IBAk+3PjYooh0BgvBBAWNe1wbP2fqvjpSicxdkYeczBSiZdhuY88ThXL9Imi m3ev8CgInGTXNNxbeoaCsNr0Q6hB9xYu6nssNnXWGoKHwvHfVDaCFRcT+6fkYDA/Ig mIfG+rxIv5aaEru+iCkj0r2UuFXQqVo6gG1DcaaBwHBBnvBRz1zQ4F70Rc4EG4iDMv FJ6pO9q0UWNVg== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id BEE2040AFD; Wed, 13 Aug 2025 21:32:33 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 11/13] docs: move split-man.pl to tools/doc Date: Wed, 13 Aug 2025 15:32:10 -0600 Message-ID: <20250813213218.198582-12-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable ...and update all references to it. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/doc-guide/kernel-doc.rst | 6 +++--- Documentation/translations/it_IT/doc-guide/kernel-doc.rst | 2 +- Documentation/translations/zh_CN/doc-guide/kernel-doc.rst | 6 +++--- {scripts =3D> tools/doc}/split-man.pl | 0 4 files changed, 7 insertions(+), 7 deletions(-) rename {scripts =3D> tools/doc}/split-man.pl (100%) diff --git a/Documentation/doc-guide/kernel-doc.rst b/Documentation/doc-gui= de/kernel-doc.rst index 6fc89d444ada..b7c8ce55323c 100644 --- a/Documentation/doc-guide/kernel-doc.rst +++ b/Documentation/doc-guide/kernel-doc.rst @@ -584,15 +584,15 @@ from the kernel git tree:: =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man =20 Some older versions of git do not support some of the variants of syntax f= or path exclusion. One of the following commands may work for those versions= :: =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools"= ) \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man diff --git a/Documentation/translations/it_IT/doc-guide/kernel-doc.rst b/Do= cumentation/translations/it_IT/doc-guide/kernel-doc.rst index 05ea0f03c80b..bf04ceea2d83 100644 --- a/Documentation/translations/it_IT/doc-guide/kernel-doc.rst +++ b/Documentation/translations/it_IT/doc-guide/kernel-doc.rst @@ -604,4 +604,4 @@ Come utilizzare kernel-doc per generare pagine man Se volete utilizzare kernel-doc solo per generare delle pagine man, potete farlo direttamente dai sorgenti del kernel:: =20 - $ tools/doc/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^t= ools) | scripts/split-man.pl /tmp/man + $ tools/doc/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^t= ools) | tools/doc/split-man.pl /tmp/man diff --git a/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst b/Do= cumentation/translations/zh_CN/doc-guide/kernel-doc.rst index b242e52f911c..a807295bc403 100644 --- a/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst +++ b/Documentation/translations/zh_CN/doc-guide/kernel-doc.rst @@ -484,16 +484,16 @@ kernel-doc=E6=89=A9=E5=B1=95=E5=8C=85=E5=90=AB=E5=9C= =A8=E5=86=85=E6=A0=B8=E6=BA=90=E4=BB=A3=E7=A0=81=E6=A0=91=E4=B8=AD=EF=BC=8C= =E4=BD=8D=E4=BA=8E ``Documentation/sphinx/k =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- :^Documentation :^tools) \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man =20 =E4=B8=80=E4=BA=9B=E6=97=A7=E7=89=88=E6=9C=AC=E7=9A=84git=E4=B8=8D=E6=94= =AF=E6=8C=81=E8=B7=AF=E5=BE=84=E6=8E=92=E9=99=A4=E8=AF=AD=E6=B3=95=E7=9A=84= =E6=9F=90=E4=BA=9B=E5=8F=98=E4=BD=93=E3=80=82 =E4=BB=A5=E4=B8=8B=E5=91=BD=E4=BB=A4=E4=B9=8B=E4=B8=80=E5=8F=AF=E8=83=BD= =E9=80=82=E7=94=A8=E4=BA=8E=E8=BF=99=E4=BA=9B=E7=89=88=E6=9C=AC:: =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ':!Documentation' ':!tools') \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man =20 $ tools/doc/kernel-doc -man \ $(git grep -l '/\*\*' -- . ":(exclude)Documentation" ":(exclude)tools"= ) \ - | scripts/split-man.pl /tmp/man + | tools/doc/split-man.pl /tmp/man =20 diff --git a/scripts/split-man.pl b/tools/doc/split-man.pl similarity index 100% rename from scripts/split-man.pl rename to tools/doc/split-man.pl --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6CBC30AADC; Wed, 13 Aug 2025 21:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; cv=none; b=KmaPJOQTK+7ardkoRMnf9jGWSblwxi2NzCbI12q527QsTufzhixNxvHPtWehx6Uz+hBjjUoT8klliTMonnx8R3Hd30z55yUWXPizZB/2Sq5eKhP7viz+L5yTXp6VE0dVGrTv3tinY3/sR8wWZnAj94xeOvooOBTxPm4eYEI6Usw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120759; c=relaxed/simple; bh=cHVafsQkMatusIyl18LnCBDDt3qyCUmVBGagdV25Z4M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Vh386Ent/3q0NhLYpMAyznPRj8pDsNpLroOOcSZQSwbaXz83N+GN0NAxBAZbxZbjUGiVS88N2n/qjhC8Os//Wj58CVy+2+Pn5aJqD4UPM83dxpU+ePp1Ij7svLGzHmh5do/9KV7m9qOj4cWNlJKyXpTkYjFmpN57eHWyc9WLIYo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=AR2qs5kN; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="AR2qs5kN" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net 5A51D40AFF DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120754; bh=ciA6v8vzpOCLxeWYQORVHLpqww7jCTPQ8HyEFYK1r4A=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AR2qs5kNk3zh31ibd/2k7Qln6r4g1TyxFmuCjgSrowl3QoqFc5K0UhCTF/MhfBrCE /LTW/XKIrSqFHopXsn/PICyyjyLInaKPaQPwhB1075ej1SXqKfXsYX0426vrGsdsY6 78ge88lfckzPNPPqGasapy0L4EZjtCYM6EFEWRmqGOmONpMVj7mDJeH8qAb5FMGUww mqkNqAZCQ7v7akXQMKM8BWE/9uaRXj9a1SbmMyQkvui5LfnJbuL1m79MJFjlA9cxT8 qhKvQRK2eIY7SEd00tTt550NOV0qfHU44WopXYNUMzYpjH7+61/IjfA7zVoeTMp+yY o2NzMMcTszPGQ== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id 5A51D40AFF; Wed, 13 Aug 2025 21:32:34 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 12/13] docs: move find-unused-docs.sh to tools/doc Date: Wed, 13 Aug 2025 15:32:11 -0600 Message-ID: <20250813213218.198582-13-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable ...and update references accordingly. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- Documentation/doc-guide/contributing.rst | 2 +- Documentation/translations/zh_CN/doc-guide/contributing.rst | 2 +- {scripts =3D> tools/doc}/find-unused-docs.sh | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename {scripts =3D> tools/doc}/find-unused-docs.sh (85%) diff --git a/Documentation/doc-guide/contributing.rst b/Documentation/doc-g= uide/contributing.rst index 662c7a840cd5..81633c6c6c11 100644 --- a/Documentation/doc-guide/contributing.rst +++ b/Documentation/doc-guide/contributing.rst @@ -152,7 +152,7 @@ generate links to that documentation. Adding ``kernel-= doc`` directives to the documentation to bring those comments in can help the community derive the full value of the work that has gone into creating them. =20 -The ``scripts/find-unused-docs.sh`` tool can be used to find these +The ``tools/doc/find-unused-docs.sh`` tool can be used to find these overlooked comments. =20 Note that the most value comes from pulling in the documentation for diff --git a/Documentation/translations/zh_CN/doc-guide/contributing.rst b/= Documentation/translations/zh_CN/doc-guide/contributing.rst index 394a13b438b0..d205f8ed9fce 100644 --- a/Documentation/translations/zh_CN/doc-guide/contributing.rst +++ b/Documentation/translations/zh_CN/doc-guide/contributing.rst @@ -124,7 +124,7 @@ C=E4=BB=A3=E7=A0=81=E7=BC=96=E8=AF=91=E5=99=A8=E5=8F=91= =E5=87=BA=E7=9A=84=E8=AD=A6=E5=91=8A=E5=B8=B8=E5=B8=B8=E4=BC=9A=E8=A2=AB=E8= =A7=86=E4=B8=BA=E8=AF=AF=E6=8A=A5=EF=BC=8C=E4=BB=8E=E8=80=8C=E5=AF=BC=E8=87= =B4=E5=87=BA=E7=8E=B0=E4=BA=86 =E8=BF=99=E4=BD=BF=E5=BE=97=E8=BF=99=E4=BA=9B=E4=BF=A1=E6=81=AF=E6=9B=B4= =E9=9A=BE=E6=89=BE=E5=88=B0=EF=BC=8C=E4=BE=8B=E5=A6=82=E4=BD=BFSphinx=E6=97= =A0=E6=B3=95=E7=94=9F=E6=88=90=E6=8C=87=E5=90=91=E8=AF=A5=E6=96=87=E6=A1=A3= =E7=9A=84=E9=93=BE=E6=8E=A5=E3=80=82=E5=B0=86 ``kernel-doc`` =E6=8C=87=E4=BB=A4=E6=B7=BB=E5=8A=A0=E5=88=B0=E6=96=87=E6=A1=A3=E4=B8=AD= =E4=BB=A5=E5=BC=95=E5=85=A5=E8=BF=99=E4=BA=9B=E6=B3=A8=E9=87=8A=E5=8F=AF=E4= =BB=A5=E5=B8=AE=E5=8A=A9=E7=A4=BE=E5=8C=BA=E8=8E=B7=E5=BE=97=E4=B8=BA=E7=BC= =96=E5=86=99=E6=B3=A8=E9=87=8A=E6=89=80=E5=81=9A=E5=B7=A5=E4=BD=9C=E7=9A=84= =E5=85=A8=E9=83=A8=E4=BB=B7=E5=80=BC=E3=80=82 =20 -``scripts/find-unused-docs.sh`` =E5=B7=A5=E5=85=B7=E5=8F=AF=E4=BB=A5=E7=94= =A8=E6=9D=A5=E6=89=BE=E5=88=B0=E8=BF=99=E4=BA=9B=E8=A2=AB=E5=BF=BD=E7=95=A5= =E7=9A=84=E8=AF=84=E8=AE=BA=E3=80=82 +``tools/doc/find-unused-docs.sh`` =E5=B7=A5=E5=85=B7=E5=8F=AF=E4=BB=A5=E7= =94=A8=E6=9D=A5=E6=89=BE=E5=88=B0=E8=BF=99=E4=BA=9B=E8=A2=AB=E5=BF=BD=E7=95= =A5=E7=9A=84=E8=AF=84=E8=AE=BA=E3=80=82 =20 =E8=AF=B7=E6=B3=A8=E6=84=8F=EF=BC=8C=E5=B0=86=E5=AF=BC=E5=87=BA=E7=9A=84= =E5=87=BD=E6=95=B0=E5=92=8C=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84=E5=BC=95=E5= =85=A5=E6=96=87=E6=A1=A3=E6=98=AF=E6=9C=80=E6=9C=89=E4=BB=B7=E5=80=BC=E7=9A= =84=E3=80=82=E8=AE=B8=E5=A4=9A=E5=AD=90=E7=B3=BB=E7=BB=9F=E8=BF=98=E5=85=B7= =E6=9C=89=E4=BE=9B=E5=86=85=E9=83=A8 =E4=BD=BF=E7=94=A8=E7=9A=84kernel-doc=E6=B3=A8=E9=87=8A=EF=BC=9B=E9=99=A4= =E9=9D=9E=E8=BF=99=E4=BA=9B=E6=B3=A8=E9=87=8A=E6=94=BE=E5=9C=A8=E4=B8=93=E9= =97=A8=E9=92=88=E5=AF=B9=E7=9B=B8=E5=85=B3=E5=AD=90=E7=B3=BB=E7=BB=9F=E5=BC= =80=E5=8F=91=E4=BA=BA=E5=91=98=E7=9A=84=E6=96=87=E6=A1=A3=E4=B8=AD=EF=BC=8C diff --git a/scripts/find-unused-docs.sh b/tools/doc/find-unused-docs.sh similarity index 85% rename from scripts/find-unused-docs.sh rename to tools/doc/find-unused-docs.sh index 0ae445dec2e4..a64389a15f09 100755 --- a/scripts/find-unused-docs.sh +++ b/tools/doc/find-unused-docs.sh @@ -5,10 +5,10 @@ # This script detects files with kernel-doc comments for exported functions # that are not included in documentation. # -# usage: Run 'scripts/find-unused-docs.sh directory' from top level of ker= nel +# usage: Run 'tools/doc/find-unused-docs.sh directory' from top level of k= ernel # tree. # -# example: $scripts/find-unused-docs.sh drivers/scsi +# example: $tools/doc/find-unused-docs.sh drivers/scsi # # Licensed under the terms of the GNU GPL License =20 @@ -18,7 +18,7 @@ if ! [ -d "Documentation" ]; then fi =20 if [ "$#" -ne 1 ]; then - echo "Usage: scripts/find-unused-docs.sh directory" + echo "Usage: tools/doc/find-unused-docs.sh directory" exit 1 fi =20 --=20 2.50.1 From nobody Sat Oct 4 17:32:47 2025 Received: from ms.lwn.net (ms.lwn.net [45.79.88.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E509930AADE; Wed, 13 Aug 2025 21:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.79.88.28 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120762; cv=none; b=elCJ+NDt+XlAgRUwb/3NFaW5n8Bj99xg07eMMnyJy8WLANpDq8SBdKfxPNQaz5hG8tAtctrg1ux5AnbazwKt+C1BJ3qaZmFJFX+URSM3kVDN/vjN8l+rp0nc9+L5f+oKh5XXdhF8daFt5qcVNG5zhAZA6XW+r4VWyHMB5h6swYw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755120762; c=relaxed/simple; bh=sayx9cVpMALR+4qalNV3neAJpOAvUzUH1NrUeYiVCyk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CRbtIj40tBCUfv13D2tL95ogygGovFkCTKbfLkp0AgIOWDCZcfIga6Wz9Mh3PNTuHlWwP5HQsCes6PtGgWV3Vh52DO+p9JG1KUp+okHbESr+tOUll088m8Sbmni8SpxPsYpivVW9LIim8lp6rUG5E3+AqgvqBw8Gs2MSZuDXlbQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net; spf=pass smtp.mailfrom=lwn.net; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b=isesxx4Z; arc=none smtp.client-ip=45.79.88.28 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=lwn.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=lwn.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lwn.net header.i=@lwn.net header.b="isesxx4Z" DKIM-Filter: OpenDKIM Filter v2.11.0 ms.lwn.net E6E4940B00 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lwn.net; s=20201203; t=1755120755; bh=e0qbMLD6bq1qW2f8K574UtvILd21owRTmAl21bCHE/c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=isesxx4ZAnT7tb1A6btMFyXeultRxX5Pm5/XQ/v7D3GKWPOwa7ockXxM4jxnGwUA0 edUNSWoIfgqPrj1gCAvvupcDcrhv9Lq/ZkmYL+RSncMVDNsBQNbMXek2Y8KKS1ePDY OTL/2ARYl365hyfdVve1ZY1FPq1262Lhp8CHMFRzUsZPX4JxU69r40LIxlA4TZ0km1 VYFUDOlbFeHwQfY80MCH/krHZ7xbb+YkaOvnyhsmQOtyrzuEsP2JT9SEu2l4y4RvGK cq8w3sp0l046tj4x/DDiPkpz/FCYrgH3I0SqKVtJj611UmuwBkiQMMvpi6aN2H31Xo 9ubVhACxAkcZA== Received: from trenco.lwn.net (unknown [IPv6:2601:280:4600:2da9::1fe]) by ms.lwn.net (Postfix) with ESMTPA id E6E4940B00; Wed, 13 Aug 2025 21:32:34 +0000 (UTC) From: Jonathan Corbet To: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Mauro Carvalho Chehab , Akira Yokosawa , Randy Dunlap , Jonathan Corbet Subject: [PATCH 13/13] docs: remove kernel-doc.pl Date: Wed, 13 Aug 2025 15:32:12 -0600 Message-ID: <20250813213218.198582-14-corbet@lwn.net> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250813213218.198582-1-corbet@lwn.net> References: <20250813213218.198582-1-corbet@lwn.net> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable We've been using the Python version and nobody has missed this one. All credit goes to Mauro Carvalho Chehab for creating the replacement. Signed-off-by: Jonathan Corbet Acked-by: Jani Nikula Acked-by: Randy Dunlap Reviewed-by: Mauro Carvalho Chehab --- scripts/kernel-doc.pl | 2439 ----------------------------------------- 1 file changed, 2439 deletions(-) delete mode 100755 scripts/kernel-doc.pl diff --git a/scripts/kernel-doc.pl b/scripts/kernel-doc.pl deleted file mode 100755 index 5db23cbf4eb2..000000000000 --- a/scripts/kernel-doc.pl +++ /dev/null @@ -1,2439 +0,0 @@ -#!/usr/bin/env perl -# SPDX-License-Identifier: GPL-2.0 -# vim: softtabstop=3D4 - -use warnings; -use strict; - -## Copyright (c) 1998 Michael Zucchi, All Rights Reserved ## -## Copyright (C) 2000, 1 Tim Waugh ## -## Copyright (C) 2001 Simon Huggins ## -## Copyright (C) 2005-2012 Randy Dunlap ## -## Copyright (C) 2012 Dan Luedtke ## -## ## -## #define enhancements by Armin Kuster ## -## Copyright (c) 2000 MontaVista Software, Inc. ## -# -# Copyright (C) 2022 Tomasz Warnie=C5=82=C5=82o (POD) - -use Pod::Usage qw/pod2usage/; - -=3Dhead1 NAME - -kernel-doc - Print formatted kernel documentation to stdout - -=3Dhead1 SYNOPSIS - - kernel-doc [-h] [-v] [-Werror] [-Wall] [-Wreturn] [-Wshort-desc[ription]]= [-Wcontents-before-sections] - [ -man | - -rst [-enable-lineno] | - -none - ] - [ - -export | - -internal | - [-function NAME] ... | - [-nosymbol NAME] ... - ] - [-no-doc-sections] - [-export-file FILE] ... - FILE ... - -Run `kernel-doc -h` for details. - -=3Dhead1 DESCRIPTION - -Read C language source or header FILEs, extract embedded documentation com= ments, -and print formatted documentation to standard output. - -The documentation comments are identified by the "/**" opening comment mar= k. - -See Documentation/doc-guide/kernel-doc.rst for the documentation comment s= yntax. - -=3Dcut - -# more perldoc at the end of the file - -## init lots of data - -my $errors =3D 0; -my $warnings =3D 0; -my $anon_struct_union =3D 0; - -# match expressions used to find embedded type information -my $type_constant =3D '\b``([^\`]+)``\b'; -my $type_constant2 =3D '\%([-_*\w]+)'; -my $type_func =3D '(\w+)\(\)'; -my $type_param =3D '\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)'; -my $type_param_ref =3D '([\!~\*]?)\@(\w*((\.\w+)|(->\w+))*(\.\.\.)?)'; -my $type_fp_param =3D '\@(\w+)\(\)'; # Special RST handling for func ptr = params -my $type_fp_param2 =3D '\@(\w+->\S+)\(\)'; # Special RST handling for str= ucts with func ptr params -my $type_env =3D '(\$\w+)'; -my $type_enum =3D '\&(enum\s*([_\w]+))'; -my $type_struct =3D '\&(struct\s*([_\w]+))'; -my $type_typedef =3D '\&(typedef\s*([_\w]+))'; -my $type_union =3D '\&(union\s*([_\w]+))'; -my $type_member =3D '\&([_\w]+)(\.|->)([_\w]+)'; -my $type_fallback =3D '\&([_\w]+)'; -my $type_member_func =3D $type_member . '\(\)'; - -# Output conversion substitutions. -# One for each output format - -# these are pretty rough -my @highlights_man =3D ( - [$type_constant, "\$1"], - [$type_constant2, "\$1"], - [$type_func, "\\\\fB\$1\\\\fP"], - [$type_enum, "\\\\fI\$1\\\\fP"], - [$type_struct, "\\\\fI\$1\\\\fP"], - [$type_typedef, "\\\\fI\$1\\\\fP"], - [$type_union, "\\\\fI\$1\\\\fP"], - [$type_param, "\\\\fI\$1\\\\fP"], - [$type_param_ref, "\\\\fI\$1\$2\\\\fP"], - [$type_member, "\\\\fI\$1\$2\$3\\\\fP"], - [$type_fallback, "\\\\fI\$1\\\\fP"] - ); -my $blankline_man =3D ""; - -# rst-mode -my @highlights_rst =3D ( - [$type_constant, "``\$1``"], - [$type_constant2, "``\$1``"], - - # Note: need to escape () to avoid func matching later - [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"], - [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"], - [$type_fp_param, "**\$1\\\\(\\\\)**"], - [$type_fp_param2, "**\$1\\\\(\\\\)**"], - [$type_func, "\$1()"], - [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"], - [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"], - [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"], - [$type_union, "\\:c\\:type\\:`\$1 <\$2>`"], - - # in rst this can refer to any type - [$type_fallback, "\\:c\\:type\\:`\$1`"], - [$type_param_ref, "**\$1\$2**"] - ); -my $blankline_rst =3D "\n"; - -# read arguments -if ($#ARGV =3D=3D -1) { - pod2usage( - -message =3D> "No arguments!\n", - -exitval =3D> 1, - -verbose =3D> 99, - -sections =3D> 'SYNOPSIS', - -output =3D> \*STDERR, - ); -} - -my $kernelversion; - -my $dohighlight =3D ""; - -my $verbose =3D 0; -my $Werror =3D 0; -my $Wreturn =3D 0; -my $Wshort_desc =3D 0; -my $output_mode =3D "rst"; -my $output_preformatted =3D 0; -my $no_doc_sections =3D 0; -my $enable_lineno =3D 0; -my @highlights =3D @highlights_rst; -my $blankline =3D $blankline_rst; -my $modulename =3D "Kernel API"; - -use constant { - OUTPUT_ALL =3D> 0, # output all symbols and doc sections - OUTPUT_INCLUDE =3D> 1, # output only specified symbols - OUTPUT_EXPORTED =3D> 2, # output exported symbols - OUTPUT_INTERNAL =3D> 3, # output non-exported symbols -}; -my $output_selection =3D OUTPUT_ALL; -my $show_not_found =3D 0; # No longer used - -my @export_file_list; - -my @build_time; -if (defined($ENV{'KBUILD_BUILD_TIMESTAMP'}) && - (my $seconds =3D `date -d "${ENV{'KBUILD_BUILD_TIMESTAMP'}}" +%s`) ne = '') { - @build_time =3D gmtime($seconds); -} else { - @build_time =3D localtime; -} - -my $man_date =3D ('January', 'February', 'March', 'April', 'May', 'June', - 'July', 'August', 'September', 'October', - 'November', 'December')[$build_time[4]] . - " " . ($build_time[5]+1900); - -# Essentially these are globals. -# They probably want to be tidied up, made more localised or something. -# CAVEAT EMPTOR! Some of the others I localised may not want to be, which -# could cause "use of undefined value" or other bugs. -my ($function, %function_table, %parametertypes, $declaration_purpose); -my %nosymbol_table =3D (); -my $declaration_start_line; -my ($type, $declaration_name, $return_type); -my ($newsection, $newcontents, $prototype, $brcount); - -if (defined($ENV{'KBUILD_VERBOSE'}) && $ENV{'KBUILD_VERBOSE'} =3D~ '1') { - $verbose =3D 1; -} - -if (defined($ENV{'KCFLAGS'})) { - my $kcflags =3D "$ENV{'KCFLAGS'}"; - - if ($kcflags =3D~ /(\s|^)-Werror(\s|$)/) { - $Werror =3D 1; - } -} - -# reading this variable is for backwards compat just in case -# someone was calling it with the variable from outside the -# kernel's build system -if (defined($ENV{'KDOC_WERROR'})) { - $Werror =3D "$ENV{'KDOC_WERROR'}"; -} -# other environment variables are converted to command-line -# arguments in cmd_checkdoc in the build system - -# Generated docbook code is inserted in a template at a point where -# docbook v3.1 requires a non-zero sequence of RefEntry's; see: -# https://www.oasis-open.org/docbook/documentation/reference/html/refentry= .html -# We keep track of number of generated entries and generate a dummy -# if needs be to ensure the expanded template can be postprocessed -# into html. -my $section_counter =3D 0; - -my $lineprefix=3D""; - -# Parser states -use constant { - STATE_NORMAL =3D> 0, # normal code - STATE_NAME =3D> 1, # looking for function name - STATE_BODY_MAYBE =3D> 2, # body - or maybe more description - STATE_BODY =3D> 3, # the body of the comment - STATE_BODY_WITH_BLANK_LINE =3D> 4, # the body, which has a blank line - STATE_PROTO =3D> 5, # scanning prototype - STATE_DOCBLOCK =3D> 6, # documentation block - STATE_INLINE =3D> 7, # gathering doc outside main block -}; -my $state; -my $leading_space; - -# Inline documentation state -use constant { - STATE_INLINE_NA =3D> 0, # not applicable ($state !=3D STATE_INLINE) - STATE_INLINE_NAME =3D> 1, # looking for member name (@foo:) - STATE_INLINE_TEXT =3D> 2, # looking for member documentation - STATE_INLINE_END =3D> 3, # done - STATE_INLINE_ERROR =3D> 4, # error - Comment without header was found. - # Spit a warning as it's not - # proper kernel-doc and ignore the rest. -}; -my $inline_doc_state; - -#declaration types: can be -# 'function', 'struct', 'union', 'enum', 'typedef' -my $decl_type; - -# Name of the kernel-doc identifier for non-DOC markups -my $identifier; - -my $doc_start =3D '^/\*\*\s*$'; # Allow whitespace at end of comment start. -my $doc_end =3D '\*/'; -my $doc_com =3D '\s*\*\s*'; -my $doc_com_body =3D '\s*\* ?'; -my $doc_decl =3D $doc_com . '(\w+)'; -# @params and a strictly limited set of supported section names -# Specifically: -# Match @word: -# @...: -# @{section-name}: -# while trying to not match literal block starts like "example::" -# -my $doc_sect =3D $doc_com . - '\s*(\@[.\w]+|\@\.\.\.|description|context|returns?|notes?|examples?)\= s*:([^:].*)?$'; -my $doc_content =3D $doc_com_body . '(.*)'; -my $doc_block =3D $doc_com . 'DOC:\s*(.*)?'; -my $doc_inline_start =3D '^\s*/\*\*\s*$'; -my $doc_inline_sect =3D '\s*\*\s*(@\s*[\w][\w\.]*\s*):(.*)'; -my $doc_inline_end =3D '^\s*\*/\s*$'; -my $doc_inline_oneline =3D '^\s*/\*\*\s*(@[\w\s]+):\s*(.*)\s*\*/\s*$'; -my $export_symbol =3D '^\s*EXPORT_SYMBOL(_GPL)?\s*\(\s*(\w+)\s*\)\s*;'; -my $export_symbol_ns =3D '^\s*EXPORT_SYMBOL_NS(_GPL)?\s*\(\s*(\w+)\s*,\s*"= \S+"\)\s*;'; -my $function_pointer =3D qr{([^\(]*\(\*)\s*\)\s*\(([^\)]*)\)}; -my $attribute =3D qr{__attribute__\s*\(\([a-z0-9,_\*\s\(\)]*\)\)}i; - -my %parameterdescs; -my %parameterdesc_start_lines; -my @parameterlist; -my %sections; -my @sectionlist; -my %section_start_lines; -my $sectcheck; -my $struct_actual; - -my $contents =3D ""; -my $new_start_line =3D 0; - -# the canonical section names. see also $doc_sect above. -my $section_default =3D "Description"; # default section -my $section_intro =3D "Introduction"; -my $section =3D $section_default; -my $section_context =3D "Context"; -my $section_return =3D "Return"; - -my $undescribed =3D "-- undescribed --"; - -reset_state(); - -while ($ARGV[0] =3D~ m/^--?(.*)/) { - my $cmd =3D $1; - shift @ARGV; - if ($cmd eq "man") { - $output_mode =3D "man"; - @highlights =3D @highlights_man; - $blankline =3D $blankline_man; - } elsif ($cmd eq "rst") { - $output_mode =3D "rst"; - @highlights =3D @highlights_rst; - $blankline =3D $blankline_rst; - } elsif ($cmd eq "none") { - $output_mode =3D "none"; - } elsif ($cmd eq "module") { # not needed for XML, inherits from calli= ng document - $modulename =3D shift @ARGV; - } elsif ($cmd eq "function") { # to only output specific functions - $output_selection =3D OUTPUT_INCLUDE; - $function =3D shift @ARGV; - $function_table{$function} =3D 1; - } elsif ($cmd eq "nosymbol") { # Exclude specific symbols - my $symbol =3D shift @ARGV; - $nosymbol_table{$symbol} =3D 1; - } elsif ($cmd eq "export") { # only exported symbols - $output_selection =3D OUTPUT_EXPORTED; - %function_table =3D (); - } elsif ($cmd eq "internal") { # only non-exported symbols - $output_selection =3D OUTPUT_INTERNAL; - %function_table =3D (); - } elsif ($cmd eq "export-file") { - my $file =3D shift @ARGV; - push(@export_file_list, $file); - } elsif ($cmd eq "v") { - $verbose =3D 1; - } elsif ($cmd eq "Werror") { - $Werror =3D 1; - } elsif ($cmd eq "Wreturn") { - $Wreturn =3D 1; - } elsif ($cmd eq "Wshort-desc" or $cmd eq "Wshort-description") { - $Wshort_desc =3D 1; - } elsif ($cmd eq "Wall") { - $Wreturn =3D 1; - $Wshort_desc =3D 1; - } elsif (($cmd eq "h") || ($cmd eq "help")) { - pod2usage(-exitval =3D> 0, -verbose =3D> 2); - } elsif ($cmd eq 'no-doc-sections') { - $no_doc_sections =3D 1; - } elsif ($cmd eq 'enable-lineno') { - $enable_lineno =3D 1; - } elsif ($cmd eq 'show-not-found') { - $show_not_found =3D 1; # A no-op but don't fail - } else { - # Unknown argument - pod2usage( - -message =3D> "Argument unknown!\n", - -exitval =3D> 1, - -verbose =3D> 99, - -sections =3D> 'SYNOPSIS', - -output =3D> \*STDERR, - ); - } - if ($#ARGV < 0){ - pod2usage( - -message =3D> "FILE argument missing\n", - -exitval =3D> 1, - -verbose =3D> 99, - -sections =3D> 'SYNOPSIS', - -output =3D> \*STDERR, - ); - } -} - -# continue execution near EOF; - -sub findprog($) -{ - foreach(split(/:/, $ENV{PATH})) { - return "$_/$_[0]" if(-x "$_/$_[0]"); - } -} - -# get kernel version from env -sub get_kernel_version() { - my $version =3D 'unknown kernel version'; - - if (defined($ENV{'KERNELVERSION'})) { - $version =3D $ENV{'KERNELVERSION'}; - } - return $version; -} - -# -sub print_lineno { - my $lineno =3D shift; - if ($enable_lineno && defined($lineno)) { - print ".. LINENO " . $lineno . "\n"; - } -} - -sub emit_warning { - my $location =3D shift; - my $msg =3D shift; - print STDERR "$location: warning: $msg"; - ++$warnings; -} -## -# dumps section contents to arrays/hashes intended for that purpose. -# -sub dump_section { - my $file =3D shift; - my $name =3D shift; - my $contents =3D join "\n", @_; - - if ($name =3D~ m/$type_param/) { - $name =3D $1; - $parameterdescs{$name} =3D $contents; - $sectcheck =3D $sectcheck . $name . " "; - $parameterdesc_start_lines{$name} =3D $new_start_line; - $new_start_line =3D 0; - } elsif ($name eq "@\.\.\.") { - $name =3D "..."; - $parameterdescs{$name} =3D $contents; - $sectcheck =3D $sectcheck . $name . " "; - $parameterdesc_start_lines{$name} =3D $new_start_line; - $new_start_line =3D 0; - } else { - if (defined($sections{$name}) && ($sections{$name} ne "")) { - # Only warn on user specified duplicate section names. - if ($name ne $section_default) { - emit_warning("${file}:$.", "duplicate section name '$name'= \n"); - } - $sections{$name} .=3D $contents; - } else { - $sections{$name} =3D $contents; - push @sectionlist, $name; - $section_start_lines{$name} =3D $new_start_line; - $new_start_line =3D 0; - } - } -} - -## -# dump DOC: section after checking that it should go out -# -sub dump_doc_section { - my $file =3D shift; - my $name =3D shift; - my $contents =3D join "\n", @_; - - if ($no_doc_sections) { - return; - } - - return if (defined($nosymbol_table{$name})); - - if (($output_selection =3D=3D OUTPUT_ALL) || - (($output_selection =3D=3D OUTPUT_INCLUDE) && - defined($function_table{$name}))) - { - dump_section($file, $name, $contents); - output_blockhead({'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'module' =3D> $modulename, - 'content-only' =3D> ($output_selection !=3D OUTP= UT_ALL), }); - } -} - -## -# output function -# -# parameterdescs, a hash. -# function =3D> "function name" -# parameterlist =3D> @list of parameters -# parameterdescs =3D> %parameter descriptions -# sectionlist =3D> @list of sections -# sections =3D> %section descriptions -# - -sub output_highlight { - my $contents =3D join "\n",@_; - my $line; - -# DEBUG -# if (!defined $contents) { -# use Carp; -# confess "output_highlight got called with no args?\n"; -# } - -# print STDERR "contents b4:$contents\n"; - eval $dohighlight; - die $@ if $@; -# print STDERR "contents af:$contents\n"; - - foreach $line (split "\n", $contents) { - if (! $output_preformatted) { - $line =3D~ s/^\s*//; - } - if ($line eq ""){ - if (! $output_preformatted) { - print $lineprefix, $blankline; - } - } else { - if ($output_mode eq "man" && substr($line, 0, 1) eq ".") { - print "\\&$line"; - } else { - print $lineprefix, $line; - } - } - print "\n"; - } -} - -## -# output function in man -sub output_function_man(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - my $count; - my $func_macro =3D $args{'func_macro'}; - my $paramcount =3D $#{$args{'parameterlist'}}; # -1 is empty - - print ".TH \"$args{'function'}\" 9 \"$args{'function'}\" \"$man_date\"= \"Kernel Hacker's Manual\" LINUX\n"; - - print ".SH NAME\n"; - print $args{'function'} . " \\- " . $args{'purpose'} . "\n"; - - print ".SH SYNOPSIS\n"; - if ($args{'functiontype'} ne "") { - print ".B \"" . $args{'functiontype'} . "\" " . $args{'function'} = . "\n"; - } else { - print ".B \"" . $args{'function'} . "\n"; - } - $count =3D 0; - my $parenth =3D "("; - my $post =3D ","; - foreach my $parameter (@{$args{'parameterlist'}}) { - if ($count =3D=3D $#{$args{'parameterlist'}}) { - $post =3D ");"; - } - $type =3D $args{'parametertypes'}{$parameter}; - if ($type =3D~ m/$function_pointer/) { - # pointer-to-function - print ".BI \"" . $parenth . $1 . "\" " . " \") (" . $2 . ")" .= $post . "\"\n"; - } else { - $type =3D~ s/([^\*])$/$1 /; - print ".BI \"" . $parenth . $type . "\" " . " \"" . $post . "\= "\n"; - } - $count++; - $parenth =3D ""; - } - - $paramcount =3D $#{$args{'parameterlist'}}; # -1 is empty - if ($paramcount >=3D 0) { - print ".SH ARGUMENTS\n"; - } - foreach $parameter (@{$args{'parameterlist'}}) { - my $parameter_name =3D $parameter; - $parameter_name =3D~ s/\[.*//; - - print ".IP \"" . $parameter . "\" 12\n"; - output_highlight($args{'parameterdescs'}{$parameter_name}); - } - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"", uc $section, "\"\n"; - output_highlight($args{'sections'}{$section}); - } -} - -## -# output enum in man -sub output_enum_man(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - my $count; - - print ".TH \"$args{'module'}\" 9 \"enum $args{'enum'}\" \"$man_date\" = \"API Manual\" LINUX\n"; - - print ".SH NAME\n"; - print "enum " . $args{'enum'} . " \\- " . $args{'purpose'} . "\n"; - - print ".SH SYNOPSIS\n"; - print "enum " . $args{'enum'} . " {\n"; - $count =3D 0; - foreach my $parameter (@{$args{'parameterlist'}}) { - print ".br\n.BI \" $parameter\"\n"; - if ($count =3D=3D $#{$args{'parameterlist'}}) { - print "\n};\n"; - last; - } else { - print ", \n.br\n"; - } - $count++; - } - - print ".SH Constants\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - my $parameter_name =3D $parameter; - $parameter_name =3D~ s/\[.*//; - - print ".IP \"" . $parameter . "\" 12\n"; - output_highlight($args{'parameterdescs'}{$parameter_name}); - } - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"$section\"\n"; - output_highlight($args{'sections'}{$section}); - } -} - -## -# output struct in man -sub output_struct_man(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - - print ".TH \"$args{'module'}\" 9 \"" . $args{'type'} . " " . $args{'st= ruct'} . "\" \"$man_date\" \"API Manual\" LINUX\n"; - - print ".SH NAME\n"; - print $args{'type'} . " " . $args{'struct'} . " \\- " . $args{'purpose= '} . "\n"; - - my $declaration =3D $args{'definition'}; - $declaration =3D~ s/\t/ /g; - $declaration =3D~ s/\n/"\n.br\n.BI \"/g; - print ".SH SYNOPSIS\n"; - print $args{'type'} . " " . $args{'struct'} . " {\n.br\n"; - print ".BI \"$declaration\n};\n.br\n\n"; - - print ".SH Members\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - ($parameter =3D~ /^#/) && next; - - my $parameter_name =3D $parameter; - $parameter_name =3D~ s/\[.*//; - - ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; - print ".IP \"" . $parameter . "\" 12\n"; - output_highlight($args{'parameterdescs'}{$parameter_name}); - } - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"$section\"\n"; - output_highlight($args{'sections'}{$section}); - } -} - -## -# output typedef in man -sub output_typedef_man(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - - print ".TH \"$args{'module'}\" 9 \"$args{'typedef'}\" \"$man_date\" \"= API Manual\" LINUX\n"; - - print ".SH NAME\n"; - print "typedef " . $args{'typedef'} . " \\- " . $args{'purpose'} . "\n= "; - - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"$section\"\n"; - output_highlight($args{'sections'}{$section}); - } -} - -sub output_blockhead_man(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - my $count; - - print ".TH \"$args{'module'}\" 9 \"$args{'module'}\" \"$man_date\" \"A= PI Manual\" LINUX\n"; - - foreach $section (@{$args{'sectionlist'}}) { - print ".SH \"$section\"\n"; - output_highlight($args{'sections'}{$section}); - } -} - -## -# output in restructured text -# - -# -# This could use some work; it's used to output the DOC: sections, and -# starts by putting out the name of the doc section itself, but that tends -# to duplicate a header already in the template file. -# -sub output_blockhead_rst(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - - foreach $section (@{$args{'sectionlist'}}) { - next if (defined($nosymbol_table{$section})); - - if ($output_selection !=3D OUTPUT_INCLUDE) { - print ".. _$section:\n\n"; - print "**$section**\n\n"; - } - print_lineno($section_start_lines{$section}); - output_highlight_rst($args{'sections'}{$section}); - print "\n"; - } -} - -# -# Apply the RST highlights to a sub-block of text. -# -sub highlight_block($) { - # The dohighlight kludge requires the text be called $contents - my $contents =3D shift; - eval $dohighlight; - die $@ if $@; - return $contents; -} - -# -# Regexes used only here. -# -my $sphinx_literal =3D '^[^.].*::$'; -my $sphinx_cblock =3D '^\.\.\ +code-block::'; - -sub output_highlight_rst { - my $input =3D join "\n",@_; - my $output =3D ""; - my $line; - my $in_literal =3D 0; - my $litprefix; - my $block =3D ""; - - foreach $line (split "\n",$input) { - # - # If we're in a literal block, see if we should drop out - # of it. Otherwise pass the line straight through unmunged. - # - if ($in_literal) { - if (! ($line =3D~ /^\s*$/)) { - # - # If this is the first non-blank line in a literal - # block we need to figure out what the proper indent is. - # - if ($litprefix eq "") { - $line =3D~ /^(\s*)/; - $litprefix =3D '^' . $1; - $output .=3D $line . "\n"; - } elsif (! ($line =3D~ /$litprefix/)) { - $in_literal =3D 0; - } else { - $output .=3D $line . "\n"; - } - } else { - $output .=3D $line . "\n"; - } - } - # - # Not in a literal block (or just dropped out) - # - if (! $in_literal) { - $block .=3D $line . "\n"; - if (($line =3D~ /$sphinx_literal/) || ($line =3D~ /$sphinx_cbl= ock/)) { - $in_literal =3D 1; - $litprefix =3D ""; - $output .=3D highlight_block($block); - $block =3D "" - } - } - } - - if ($block) { - $output .=3D highlight_block($block); - } - - $output =3D~ s/^\n+//g; - $output =3D~ s/\n+$//g; - - foreach $line (split "\n", $output) { - print $lineprefix . $line . "\n"; - } -} - -sub output_function_rst(%) { - my %args =3D %{$_[0]}; - my ($parameter, $section); - my $oldprefix =3D $lineprefix; - - my $signature =3D ""; - my $func_macro =3D $args{'func_macro'}; - my $paramcount =3D $#{$args{'parameterlist'}}; # -1 is empty - - if ($func_macro) { - $signature =3D $args{'function'}; - } else { - if ($args{'functiontype'}) { - $signature =3D $args{'functiontype'} . " "; - } - $signature .=3D $args{'function'} . " ("; - } - - my $count =3D 0; - foreach my $parameter (@{$args{'parameterlist'}}) { - if ($count ne 0) { - $signature .=3D ", "; - } - $count++; - $type =3D $args{'parametertypes'}{$parameter}; - - if ($type =3D~ m/$function_pointer/) { - # pointer-to-function - $signature .=3D $1 . $parameter . ") (" . $2 . ")"; - } else { - $signature .=3D $type; - } - } - - if (!$func_macro) { - $signature .=3D ")"; - } - - if ($args{'typedef'} || $args{'functiontype'} eq "") { - print ".. c:macro:: ". $args{'function'} . "\n\n"; - - if ($args{'typedef'}) { - print_lineno($declaration_start_line); - print " **Typedef**: "; - $lineprefix =3D ""; - output_highlight_rst($args{'purpose'}); - print "\n\n**Syntax**\n\n"; - print " ``$signature``\n\n"; - } else { - print "``$signature``\n\n"; - } - } else { - print ".. c:function:: $signature\n\n"; - } - - if (!$args{'typedef'}) { - print_lineno($declaration_start_line); - $lineprefix =3D " "; - output_highlight_rst($args{'purpose'}); - print "\n"; - } - - # - # Put our descriptive text into a container (thus an HTML
) to he= lp - # set the function prototypes apart. - # - $lineprefix =3D " "; - if ($paramcount >=3D 0) { - print ".. container:: kernelindent\n\n"; - print $lineprefix . "**Parameters**\n\n"; - } - foreach $parameter (@{$args{'parameterlist'}}) { - my $parameter_name =3D $parameter; - $parameter_name =3D~ s/\[.*//; - $type =3D $args{'parametertypes'}{$parameter}; - - if ($type ne "") { - print $lineprefix . "``$type``\n"; - } else { - print $lineprefix . "``$parameter``\n"; - } - - print_lineno($parameterdesc_start_lines{$parameter_name}); - - $lineprefix =3D " "; - if (defined($args{'parameterdescs'}{$parameter_name}) && - $args{'parameterdescs'}{$parameter_name} ne $undescribed) { - output_highlight_rst($args{'parameterdescs'}{$parameter_name}); - } else { - print $lineprefix . "*undescribed*\n"; - } - $lineprefix =3D " "; - print "\n"; - } - - output_section_rst(@_); - $lineprefix =3D $oldprefix; -} - -sub output_section_rst(%) { - my %args =3D %{$_[0]}; - my $section; - my $oldprefix =3D $lineprefix; - - foreach $section (@{$args{'sectionlist'}}) { - print $lineprefix . "**$section**\n\n"; - print_lineno($section_start_lines{$section}); - output_highlight_rst($args{'sections'}{$section}); - print "\n"; - } - print "\n"; -} - -sub output_enum_rst(%) { - my %args =3D %{$_[0]}; - my ($parameter); - my $oldprefix =3D $lineprefix; - my $count; - my $outer; - - my $name =3D $args{'enum'}; - print "\n\n.. c:enum:: " . $name . "\n\n"; - - print_lineno($declaration_start_line); - $lineprefix =3D " "; - output_highlight_rst($args{'purpose'}); - print "\n"; - - print ".. container:: kernelindent\n\n"; - $outer =3D $lineprefix . " "; - $lineprefix =3D $outer . " "; - print $outer . "**Constants**\n\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - print $outer . "``$parameter``\n"; - - if ($args{'parameterdescs'}{$parameter} ne $undescribed) { - output_highlight_rst($args{'parameterdescs'}{$parameter}); - } else { - print $lineprefix . "*undescribed*\n"; - } - print "\n"; - } - print "\n"; - $lineprefix =3D $oldprefix; - output_section_rst(@_); -} - -sub output_typedef_rst(%) { - my %args =3D %{$_[0]}; - my ($parameter); - my $oldprefix =3D $lineprefix; - my $name; - - $name =3D $args{'typedef'}; - - print "\n\n.. c:type:: " . $name . "\n\n"; - print_lineno($declaration_start_line); - $lineprefix =3D " "; - output_highlight_rst($args{'purpose'}); - print "\n"; - - $lineprefix =3D $oldprefix; - output_section_rst(@_); -} - -sub output_struct_rst(%) { - my %args =3D %{$_[0]}; - my ($parameter); - my $oldprefix =3D $lineprefix; - - my $name =3D $args{'struct'}; - if ($args{'type'} eq 'union') { - print "\n\n.. c:union:: " . $name . "\n\n"; - } else { - print "\n\n.. c:struct:: " . $name . "\n\n"; - } - - print_lineno($declaration_start_line); - $lineprefix =3D " "; - output_highlight_rst($args{'purpose'}); - print "\n"; - - print ".. container:: kernelindent\n\n"; - print $lineprefix . "**Definition**::\n\n"; - my $declaration =3D $args{'definition'}; - $lineprefix =3D $lineprefix . " "; - $declaration =3D~ s/\t/$lineprefix/g; - print $lineprefix . $args{'type'} . " " . $args{'struct'} . " {\n$decl= aration" . $lineprefix . "};\n\n"; - - $lineprefix =3D " "; - print $lineprefix . "**Members**\n\n"; - foreach $parameter (@{$args{'parameterlist'}}) { - ($parameter =3D~ /^#/) && next; - - my $parameter_name =3D $parameter; - $parameter_name =3D~ s/\[.*//; - - ($args{'parameterdescs'}{$parameter_name} ne $undescribed) || next; - $type =3D $args{'parametertypes'}{$parameter}; - print_lineno($parameterdesc_start_lines{$parameter_name}); - print $lineprefix . "``" . $parameter . "``\n"; - $lineprefix =3D " "; - output_highlight_rst($args{'parameterdescs'}{$parameter_name}); - $lineprefix =3D " "; - print "\n"; - } - print "\n"; - - $lineprefix =3D $oldprefix; - output_section_rst(@_); -} - -## none mode output functions - -sub output_function_none(%) { -} - -sub output_enum_none(%) { -} - -sub output_typedef_none(%) { -} - -sub output_struct_none(%) { -} - -sub output_blockhead_none(%) { -} - -## -# generic output function for all types (function, struct/union, typedef, = enum); -# calls the generated, variable output_ function name based on -# functype and output_mode -sub output_declaration { - no strict 'refs'; - my $name =3D shift; - my $functype =3D shift; - my $func =3D "output_${functype}_$output_mode"; - - return if (defined($nosymbol_table{$name})); - - if (($output_selection =3D=3D OUTPUT_ALL) || - (($output_selection =3D=3D OUTPUT_INCLUDE || - $output_selection =3D=3D OUTPUT_EXPORTED) && - defined($function_table{$name})) || - ($output_selection =3D=3D OUTPUT_INTERNAL && - !($functype eq "function" && defined($function_table{$name})))) - { - &$func(@_); - $section_counter++; - } -} - -## -# generic output function - calls the right one based on current output mo= de. -sub output_blockhead { - no strict 'refs'; - my $func =3D "output_blockhead_" . $output_mode; - &$func(@_); - $section_counter++; -} - -## -# takes a declaration (struct, union, enum, typedef) and -# invokes the right handler. NOT called for functions. -sub dump_declaration($$) { - no strict 'refs'; - my ($prototype, $file) =3D @_; - my $func =3D "dump_" . $decl_type; - &$func(@_); -} - -sub dump_union($$) { - dump_struct(@_); -} - -sub dump_struct($$) { - my $x =3D shift; - my $file =3D shift; - my $decl_type; - my $members; - my $type =3D qr{struct|union}; - # For capturing struct/union definition body, i.e. "{members*}qualifie= rs*" - my $qualifiers =3D qr{$attribute|__packed|__aligned|____cacheline_alig= ned_in_smp|____cacheline_aligned}; - my $definition_body =3D qr{\{(.*)\}\s*$qualifiers*}; - my $struct_members =3D qr{($type)([^\{\};]+)\{([^\{\}]*)\}([^\{\}\;]*)= \;}; - - if ($x =3D~ /($type)\s+(\w+)\s*$definition_body/) { - $decl_type =3D $1; - $declaration_name =3D $2; - $members =3D $3; - } elsif ($x =3D~ /typedef\s+($type)\s*$definition_body\s*(\w+)\s*;/) { - $decl_type =3D $1; - $declaration_name =3D $3; - $members =3D $2; - } - - if ($members) { - if ($identifier ne $declaration_name) { - emit_warning("${file}:$.", "expecting prototype for $decl_type= $identifier. Prototype was for $decl_type $declaration_name instead\n"); - return; - } - - # ignore members marked private: - $members =3D~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi; - $members =3D~ s/\/\*\s*private:.*//gosi; - # strip comments: - $members =3D~ s/\/\*.*?\*\///gos; - # strip attributes - $members =3D~ s/\s*$attribute/ /gi; - $members =3D~ s/\s*__aligned\s*\([^;]*\)/ /gos; - $members =3D~ s/\s*__counted_by\s*\([^;]*\)/ /gos; - $members =3D~ s/\s*__counted_by_(le|be)\s*\([^;]*\)/ /gos; - $members =3D~ s/\s*__packed\s*/ /gos; - $members =3D~ s/\s*CRYPTO_MINALIGN_ATTR/ /gos; - $members =3D~ s/\s*____cacheline_aligned_in_smp/ /gos; - $members =3D~ s/\s*____cacheline_aligned/ /gos; - # unwrap struct_group(): - # - first eat non-declaration parameters and rewrite for final mat= ch - # - then remove macro, outer parens, and trailing semicolon - $members =3D~ s/\bstruct_group\s*\(([^,]*,)/STRUCT_GROUP(/gos; - $members =3D~ s/\bstruct_group_attr\s*\(([^,]*,){2}/STRUCT_GROUP(/= gos; - $members =3D~ s/\bstruct_group_tagged\s*\(([^,]*),([^,]*),/struct = $1 $2; STRUCT_GROUP(/gos; - $members =3D~ s/\b__struct_group\s*\(([^,]*,){3}/STRUCT_GROUP(/gos; - $members =3D~ s/\bSTRUCT_GROUP(\(((?:(?>[^)(]+)|(?1))*)\))[^;]*;/$= 2/gos; - - my $args =3D qr{([^,)]+)}; - # replace DECLARE_BITMAP - $members =3D~ s/__ETHTOOL_DECLARE_LINK_MODE_MASK\s*\(([^\)]+)\)/DE= CLARE_BITMAP($1, __ETHTOOL_LINK_MODE_MASK_NBITS)/gos; - $members =3D~ s/DECLARE_PHY_INTERFACE_MASK\s*\(([^\)]+)\)/DECLARE_= BITMAP($1, PHY_INTERFACE_MODE_MAX)/gos; - $members =3D~ s/DECLARE_BITMAP\s*\($args,\s*$args\)/unsigned long = $1\[BITS_TO_LONGS($2)\]/gos; - # replace DECLARE_HASHTABLE - $members =3D~ s/DECLARE_HASHTABLE\s*\($args,\s*$args\)/unsigned lo= ng $1\[1 << (($2) - 1)\]/gos; - # replace DECLARE_KFIFO - $members =3D~ s/DECLARE_KFIFO\s*\($args,\s*$args,\s*$args\)/$2 \*$= 1/gos; - # replace DECLARE_KFIFO_PTR - $members =3D~ s/DECLARE_KFIFO_PTR\s*\($args,\s*$args\)/$2 \*$1/gos; - # replace DECLARE_FLEX_ARRAY - $members =3D~ s/(?:__)?DECLARE_FLEX_ARRAY\s*\($args,\s*$args\)/$1 = $2\[\]/gos; - #replace DEFINE_DMA_UNMAP_ADDR - $members =3D~ s/DEFINE_DMA_UNMAP_ADDR\s*\($args\)/dma_addr_t $1/go= s; - #replace DEFINE_DMA_UNMAP_LEN - $members =3D~ s/DEFINE_DMA_UNMAP_LEN\s*\($args\)/__u32 $1/gos; - my $declaration =3D $members; - - # Split nested struct/union elements as newer ones - while ($members =3D~ m/$struct_members/) { - my $newmember; - my $maintype =3D $1; - my $ids =3D $4; - my $content =3D $3; - foreach my $id(split /,/, $ids) { - $newmember .=3D "$maintype $id; "; - - $id =3D~ s/[:\[].*//; - $id =3D~ s/^\s*\**(\S+)\s*/$1/; - foreach my $arg (split /;/, $content) { - next if ($arg =3D~ m/^\s*$/); - if ($arg =3D~ m/^([^\(]+\(\*?\s*)([\w\.]*)(\s*\).*)/) { - # pointer-to-function - my $type =3D $1; - my $name =3D $2; - my $extra =3D $3; - next if (!$name); - if ($id =3D~ m/^\s*$/) { - # anonymous struct/union - $newmember .=3D "$type$name$extra; "; - } else { - $newmember .=3D "$type$id.$name$extra; "; - } - } else { - my $type; - my $names; - $arg =3D~ s/^\s+//; - $arg =3D~ s/\s+$//; - # Handle bitmaps - $arg =3D~ s/:\s*\d+\s*//g; - # Handle arrays - $arg =3D~ s/\[.*\]//g; - # The type may have multiple words, - # and multiple IDs can be defined, like: - # const struct foo, *bar, foobar - # So, we remove spaces when parsing the - # names, in order to match just names - # and commas for the names - $arg =3D~ s/\s*,\s*/,/g; - if ($arg =3D~ m/(.*)\s+([\S+,]+)/) { - $type =3D $1; - $names =3D $2; - } else { - $newmember .=3D "$arg; "; - next; - } - foreach my $name (split /,/, $names) { - $name =3D~ s/^\s*\**(\S+)\s*/$1/; - next if (($name =3D~ m/^\s*$/)); - if ($id =3D~ m/^\s*$/) { - # anonymous struct/union - $newmember .=3D "$type $name; "; - } else { - $newmember .=3D "$type $id.$name; "; - } - } - } - } - } - $members =3D~ s/$struct_members/$newmember/; - } - - # Ignore other nested elements, like enums - $members =3D~ s/(\{[^\{\}]*\})//g; - - create_parameterlist($members, ';', $file, $declaration_name); - check_sections($file, $declaration_name, $decl_type, $sectcheck, $= struct_actual); - - # Adjust declaration for better display - $declaration =3D~ s/([\{;])/$1\n/g; - $declaration =3D~ s/\}\s+;/};/g; - # Better handle inlined enums - do {} while ($declaration =3D~ s/(enum\s+\{[^\}]+),([^\n])/$1,\n$2= /); - - my @def_args =3D split /\n/, $declaration; - my $level =3D 1; - $declaration =3D ""; - foreach my $clause (@def_args) { - $clause =3D~ s/^\s+//; - $clause =3D~ s/\s+$//; - $clause =3D~ s/\s+/ /; - next if (!$clause); - $level-- if ($clause =3D~ m/(\})/ && $level > 1); - if (!($clause =3D~ m/^\s*#/)) { - $declaration .=3D "\t" x $level; - } - $declaration .=3D "\t" . $clause . "\n"; - $level++ if ($clause =3D~ m/(\{)/ && !($clause =3D~m/\}/)); - } - output_declaration($declaration_name, - 'struct', - {'struct' =3D> $declaration_name, - 'module' =3D> $modulename, - 'definition' =3D> $declaration, - 'parameterlist' =3D> \@parameterlist, - 'parameterdescs' =3D> \%parameterdescs, - 'parametertypes' =3D> \%parametertypes, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose, - 'type' =3D> $decl_type - }); - } else { - print STDERR "${file}:$.: error: Cannot parse struct or union!\n"; - ++$errors; - } -} - - -sub show_warnings($$) { - my $functype =3D shift; - my $name =3D shift; - - return 0 if (defined($nosymbol_table{$name})); - - return 1 if ($output_selection =3D=3D OUTPUT_ALL); - - if ($output_selection =3D=3D OUTPUT_EXPORTED) { - if (defined($function_table{$name})) { - return 1; - } else { - return 0; - } - } - if ($output_selection =3D=3D OUTPUT_INTERNAL) { - if (!($functype eq "function" && defined($function_table{$name})))= { - return 1; - } else { - return 0; - } - } - if ($output_selection =3D=3D OUTPUT_INCLUDE) { - if (defined($function_table{$name})) { - return 1; - } else { - return 0; - } - } - die("Please add the new output type at show_warnings()"); -} - -sub dump_enum($$) { - my $x =3D shift; - my $file =3D shift; - my $members; - - # ignore members marked private: - $x =3D~ s/\/\*\s*private:.*?\/\*\s*public:.*?\*\///gosi; - $x =3D~ s/\/\*\s*private:.*}/}/gosi; - - $x =3D~ s@/\*.*?\*/@@gos; # strip comments. - # strip #define macros inside enums - $x =3D~ s@#\s*((define|ifdef|if)\s+|endif)[^;]*;@@gos; - - if ($x =3D~ /typedef\s+enum\s*\{(.*)\}\s*(\w*)\s*;/) { - $declaration_name =3D $2; - $members =3D $1; - } elsif ($x =3D~ /enum\s+(\w*)\s*\{(.*)\}/) { - $declaration_name =3D $1; - $members =3D $2; - } - - if ($members) { - if ($identifier ne $declaration_name) { - if ($identifier eq "") { - emit_warning("${file}:$.", "wrong kernel-doc identifier on= line:\n"); - } else { - emit_warning("${file}:$.", "expecting prototype for enum $= identifier. Prototype was for enum $declaration_name instead\n"); - } - return; - } - $declaration_name =3D "(anonymous)" if ($declaration_name eq ""); - - my %_members; - - $members =3D~ s/\s+$//; - $members =3D~ s/\([^;]*?[\)]//g; - - foreach my $arg (split ',', $members) { - $arg =3D~ s/^\s*(\w+).*/$1/; - push @parameterlist, $arg; - if (!$parameterdescs{$arg}) { - $parameterdescs{$arg} =3D $undescribed; - if (show_warnings("enum", $declaration_name)) { - emit_warning("${file}:$.", "Enum value '$arg' not desc= ribed in enum '$declaration_name'\n"); - } - } - $_members{$arg} =3D 1; - } - - while (my ($k, $v) =3D each %parameterdescs) { - if (!exists($_members{$k})) { - if (show_warnings("enum", $declaration_name)) { - emit_warning("${file}:$.", "Excess enum value '$k' des= cription in '$declaration_name'\n"); - } - } - } - - output_declaration($declaration_name, - 'enum', - {'enum' =3D> $declaration_name, - 'module' =3D> $modulename, - 'parameterlist' =3D> \@parameterlist, - 'parameterdescs' =3D> \%parameterdescs, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose - }); - } else { - print STDERR "${file}:$.: error: Cannot parse enum!\n"; - ++$errors; - } -} - -my $typedef_type =3D qr { ((?:\s+[\w\*]+\b){0,7}\s+(?:\w+\b|\*+))\s* }x; -my $typedef_ident =3D qr { \*?\s*(\w\S+)\s* }x; -my $typedef_args =3D qr { \s*\((.*)\); }x; - -my $typedef1 =3D qr { typedef$typedef_type\($typedef_ident\)$typedef_args = }x; -my $typedef2 =3D qr { typedef$typedef_type$typedef_ident$typedef_args }x; - -sub dump_typedef($$) { - my $x =3D shift; - my $file =3D shift; - - $x =3D~ s@/\*.*?\*/@@gos; # strip comments. - - # Parse function typedef prototypes - if ($x =3D~ $typedef1 || $x =3D~ $typedef2) { - $return_type =3D $1; - $declaration_name =3D $2; - my $args =3D $3; - $return_type =3D~ s/^\s+//; - - if ($identifier ne $declaration_name) { - emit_warning("${file}:$.", "expecting prototype for typedef $i= dentifier. Prototype was for typedef $declaration_name instead\n"); - return; - } - - create_parameterlist($args, ',', $file, $declaration_name); - - output_declaration($declaration_name, - 'function', - {'function' =3D> $declaration_name, - 'typedef' =3D> 1, - 'module' =3D> $modulename, - 'functiontype' =3D> $return_type, - 'parameterlist' =3D> \@parameterlist, - 'parameterdescs' =3D> \%parameterdescs, - 'parametertypes' =3D> \%parametertypes, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose - }); - return; - } - - while (($x =3D~ /\(*.\)\s*;$/) || ($x =3D~ /\[*.\]\s*;$/)) { - $x =3D~ s/\(*.\)\s*;$/;/; - $x =3D~ s/\[*.\]\s*;$/;/; - } - - if ($x =3D~ /typedef.*\s+(\w+)\s*;/) { - $declaration_name =3D $1; - - if ($identifier ne $declaration_name) { - emit_warning("${file}:$.", "expecting prototype for typedef $i= dentifier. Prototype was for typedef $declaration_name instead\n"); - return; - } - - output_declaration($declaration_name, - 'typedef', - {'typedef' =3D> $declaration_name, - 'module' =3D> $modulename, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose - }); - } else { - print STDERR "${file}:$.: error: Cannot parse typedef!\n"; - ++$errors; - } -} - -sub save_struct_actual($) { - my $actual =3D shift; - - # strip all spaces from the actual param so that it looks like one str= ing item - $actual =3D~ s/\s*//g; - $struct_actual =3D $struct_actual . $actual . " "; -} - -sub create_parameterlist($$$$) { - my $args =3D shift; - my $splitter =3D shift; - my $file =3D shift; - my $declaration_name =3D shift; - my $type; - my $param; - - # temporarily replace commas inside function pointer definition - my $arg_expr =3D qr{\([^\),]+}; - while ($args =3D~ /$arg_expr,/) { - $args =3D~ s/($arg_expr),/$1#/g; - } - - foreach my $arg (split($splitter, $args)) { - # strip comments - $arg =3D~ s/\/\*.*\*\///; - # ignore argument attributes - $arg =3D~ s/\sPOS0?\s/ /; - # strip leading/trailing spaces - $arg =3D~ s/^\s*//; - $arg =3D~ s/\s*$//; - $arg =3D~ s/\s+/ /; - - if ($arg =3D~ /^#/) { - # Treat preprocessor directive as a typeless variable just to = fill - # corresponding data structures "correctly". Catch it later in - # output_* subs. - push_parameter($arg, "", "", $file); - } elsif ($arg =3D~ m/\(.+\)\s*\(/) { - # pointer-to-function - $arg =3D~ tr/#/,/; - $arg =3D~ m/[^\(]+\(\*?\s*([\w\[\]\.]*)\s*\)/; - $param =3D $1; - $type =3D $arg; - $type =3D~ s/([^\(]+\(\*?)\s*$param/$1/; - save_struct_actual($param); - push_parameter($param, $type, $arg, $file, $declaration_name); - } elsif ($arg =3D~ m/\(.+\)\s*\[/) { - # array-of-pointers - $arg =3D~ tr/#/,/; - $arg =3D~ m/[^\(]+\(\s*\*\s*([\w\[\]\.]*?)\s*(\s*\[\s*[\w]+\s*= \]\s*)*\)/; - $param =3D $1; - $type =3D $arg; - $type =3D~ s/([^\(]+\(\*?)\s*$param/$1/; - save_struct_actual($param); - push_parameter($param, $type, $arg, $file, $declaration_name); - } elsif ($arg) { - $arg =3D~ s/\s*:\s*/:/g; - $arg =3D~ s/\s*\[/\[/g; - - my @args =3D split('\s*,\s*', $arg); - if ($args[0] =3D~ m/\*/) { - $args[0] =3D~ s/(\*+)\s*/ $1/; - } - - my @first_arg; - if ($args[0] =3D~ /^(.*\s+)(.*?\[.*\].*)$/) { - shift @args; - push(@first_arg, split('\s+', $1)); - push(@first_arg, $2); - } else { - @first_arg =3D split('\s+', shift @args); - } - - unshift(@args, pop @first_arg); - $type =3D join " ", @first_arg; - - foreach $param (@args) { - if ($param =3D~ m/^(\*+)\s*(.*)/) { - save_struct_actual($2); - - push_parameter($2, "$type $1", $arg, $file, $declarati= on_name); - } elsif ($param =3D~ m/(.*?):(\w+)/) { - if ($type ne "") { # skip unnamed bit-fields - save_struct_actual($1); - push_parameter($1, "$type:$2", $arg, $file, $decla= ration_name) - } - } else { - save_struct_actual($param); - push_parameter($param, $type, $arg, $file, $declaratio= n_name); - } - } - } - } -} - -sub push_parameter($$$$$) { - my $param =3D shift; - my $type =3D shift; - my $org_arg =3D shift; - my $file =3D shift; - my $declaration_name =3D shift; - - if (($anon_struct_union =3D=3D 1) && ($type eq "") && - ($param eq "}")) { - return; # ignore the ending }; from anon. struct/union - } - - $anon_struct_union =3D 0; - $param =3D~ s/[\[\)].*//; - - if ($type eq "" && $param =3D~ /\.\.\.$/) - { - if (!$param =3D~ /\w\.\.\.$/) { - # handles unnamed variable parameters - $param =3D "..."; - } elsif ($param =3D~ /\w\.\.\.$/) { - # for named variable parameters of the form `x...`, remove the= dots - $param =3D~ s/\.\.\.$//; - } - if (!defined $parameterdescs{$param} || $parameterdescs{$param} eq= "") { - $parameterdescs{$param} =3D "variable arguments"; - } - } - elsif ($type eq "" && ($param eq "" or $param eq "void")) - { - $param=3D"void"; - $parameterdescs{void} =3D "no arguments"; - } - elsif ($type eq "" && ($param eq "struct" or $param eq "union")) - # handle unnamed (anonymous) union or struct: - { - $type =3D $param; - $param =3D "{unnamed_" . $param . "}"; - $parameterdescs{$param} =3D "anonymous\n"; - $anon_struct_union =3D 1; - } - elsif ($param =3D~ "__cacheline_group" ) - # handle cache group enforcing variables: they do not need be describe= d in header files - { - return; # ignore __cacheline_group_begin and __cacheline_group_end - } - - # warn if parameter has no description - # (but ignore ones starting with # as these are not parameters - # but inline preprocessor statements); - # Note: It will also ignore void params and unnamed structs/unions - if (!defined $parameterdescs{$param} && $param !~ /^#/) { - $parameterdescs{$param} =3D $undescribed; - - if (show_warnings($type, $declaration_name) && $param !~ /\./) { - emit_warning("${file}:$.", "Function parameter or struct membe= r '$param' not described in '$declaration_name'\n"); - } - } - - # strip spaces from $param so that it is one continuous string - # on @parameterlist; - # this fixes a problem where check_sections() cannot find - # a parameter like "addr[6 + 2]" because it actually appears - # as "addr[6", "+", "2]" on the parameter list; - # but it's better to maintain the param string unchanged for output, - # so just weaken the string compare in check_sections() to ignore - # "[blah" in a parameter string; - ###$param =3D~ s/\s*//g; - push @parameterlist, $param; - $org_arg =3D~ s/\s\s+/ /g; - $parametertypes{$param} =3D $org_arg; -} - -sub check_sections($$$$$) { - my ($file, $decl_name, $decl_type, $sectcheck, $prmscheck) =3D @_; - my @sects =3D split ' ', $sectcheck; - my @prms =3D split ' ', $prmscheck; - my $err; - my ($px, $sx); - my $prm_clean; # strip trailing "[array size]" and/or beginning= "*" - - foreach $sx (0 .. $#sects) { - $err =3D 1; - foreach $px (0 .. $#prms) { - $prm_clean =3D $prms[$px]; - $prm_clean =3D~ s/\[.*\]//; - $prm_clean =3D~ s/$attribute//i; - # ignore array size in a parameter string; - # however, the original param string may contain - # spaces, e.g.: addr[6 + 2] - # and this appears in @prms as "addr[6" since the - # parameter list is split at spaces; - # hence just ignore "[..." for the sections check; - $prm_clean =3D~ s/\[.*//; - - ##$prm_clean =3D~ s/^\**//; - if ($prm_clean eq $sects[$sx]) { - $err =3D 0; - last; - } - } - if ($err) { - if ($decl_type eq "function") { - emit_warning("${file}:$.", - "Excess function parameter " . - "'$sects[$sx]' " . - "description in '$decl_name'\n"); - } elsif (($decl_type eq "struct") or - ($decl_type eq "union")) { - emit_warning("${file}:$.", - "Excess $decl_type member " . - "'$sects[$sx]' " . - "description in '$decl_name'\n"); - } - } - } -} - -## -# Checks the section describing the return value of a function. -sub check_return_section { - my $file =3D shift; - my $declaration_name =3D shift; - my $return_type =3D shift; - - # Ignore an empty return type (It's a macro) - # Ignore functions with a "void" return type. (But don't ignore "void = *") - if (($return_type eq "") || ($return_type =3D~ /void\s*\w*\s*$/)) { - return; - } - - if (!defined($sections{$section_return}) || - $sections{$section_return} eq "") - { - emit_warning("${file}:$.", - "No description found for return value of " . - "'$declaration_name'\n"); - } -} - -## -# takes a function prototype and the name of the current file being -# processed and spits out all the details stored in the global -# arrays/hashes. -sub dump_function($$) { - my $prototype =3D shift; - my $file =3D shift; - my $func_macro =3D 0; - - print_lineno($new_start_line); - - $prototype =3D~ s/^static +//; - $prototype =3D~ s/^extern +//; - $prototype =3D~ s/^asmlinkage +//; - $prototype =3D~ s/^inline +//; - $prototype =3D~ s/^__inline__ +//; - $prototype =3D~ s/^__inline +//; - $prototype =3D~ s/^__always_inline +//; - $prototype =3D~ s/^noinline +//; - $prototype =3D~ s/^__FORTIFY_INLINE +//; - $prototype =3D~ s/__init +//; - $prototype =3D~ s/__init_or_module +//; - $prototype =3D~ s/__deprecated +//; - $prototype =3D~ s/__flatten +//; - $prototype =3D~ s/__meminit +//; - $prototype =3D~ s/__must_check +//; - $prototype =3D~ s/__weak +//; - $prototype =3D~ s/__sched +//; - $prototype =3D~ s/_noprof//; - $prototype =3D~ s/__printf\s*\(\s*\d*\s*,\s*\d*\s*\) +//; - $prototype =3D~ s/__(?:re)?alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\) += //; - $prototype =3D~ s/__diagnose_as\s*\(\s*\S+\s*(?:,\s*\d+\s*)*\) +//; - $prototype =3D~ s/DECL_BUCKET_PARAMS\s*\(\s*(\S+)\s*,\s*(\S+)\s*\)/$1,= $2/; - my $define =3D $prototype =3D~ s/^#\s*define\s+//; #ak added - $prototype =3D~ s/__attribute_const__ +//; - $prototype =3D~ s/__attribute__\s*\(\( - (?: - [\w\s]++ # attribute name - (?:\([^)]*+\))? # attribute arguments - \s*+,? # optional comma at the end - )+ - \)\)\s+//x; - - # Yes, this truly is vile. We are looking for: - # 1. Return type (may be nothing if we're looking at a macro) - # 2. Function name - # 3. Function parameters. - # - # All the while we have to watch out for function pointer parameters - # (which IIRC is what the two sections are for), C types (these - # regexps don't even start to express all the possibilities), and - # so on. - # - # If you mess with these regexps, it's a good idea to check that - # the following functions' documentation still comes out right: - # - parport_register_device (function pointer parameters) - # - atomic_set (macro) - # - pci_match_device, __copy_to_user (long return type) - my $name =3D qr{[a-zA-Z0-9_~:]+}; - my $prototype_end1 =3D qr{[^\(]*}; - my $prototype_end2 =3D qr{[^\{]*}; - my $prototype_end =3D qr{\(($prototype_end1|$prototype_end2)\)}; - my $type1 =3D qr{[\w\s]+}; - my $type2 =3D qr{$type1\*+}; - - if ($define && $prototype =3D~ m/^()($name)\s+/) { - # This is an object-like macro, it has no return type and no param= eter - # list. - # Function-like macros are not allowed to have spaces between - # declaration_name and opening parenthesis (notice the \s+). - $return_type =3D $1; - $declaration_name =3D $2; - $func_macro =3D 1; - } elsif ($prototype =3D~ m/^()($name)\s*$prototype_end/ || - $prototype =3D~ m/^($type1)\s+($name)\s*$prototype_end/ || - $prototype =3D~ m/^($type2+)\s*($name)\s*$prototype_end/) { - $return_type =3D $1; - $declaration_name =3D $2; - my $args =3D $3; - - create_parameterlist($args, ',', $file, $declaration_name); - } else { - emit_warning("${file}:$.", "cannot understand function prototype: = '$prototype'\n"); - return; - } - - if ($identifier ne $declaration_name) { - emit_warning("${file}:$.", "expecting prototype for $identifier().= Prototype was for $declaration_name() instead\n"); - return; - } - - my $prms =3D join " ", @parameterlist; - check_sections($file, $declaration_name, "function", $sectcheck, $prms= ); - - # This check emits a lot of warnings at the moment, because many - # functions don't have a 'Return' doc section. So until the number - # of warnings goes sufficiently down, the check is only performed in - # -Wreturn mode. - # TODO: always perform the check. - if ($Wreturn && !$func_macro) { - check_return_section($file, $declaration_name, $return_type); - } - - # The function parser can be called with a typedef parameter. - # Handle it. - if ($return_type =3D~ /typedef/) { - output_declaration($declaration_name, - 'function', - {'function' =3D> $declaration_name, - 'typedef' =3D> 1, - 'module' =3D> $modulename, - 'functiontype' =3D> $return_type, - 'parameterlist' =3D> \@parameterlist, - 'parameterdescs' =3D> \%parameterdescs, - 'parametertypes' =3D> \%parametertypes, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose, - 'func_macro' =3D> $func_macro - }); - } else { - output_declaration($declaration_name, - 'function', - {'function' =3D> $declaration_name, - 'module' =3D> $modulename, - 'functiontype' =3D> $return_type, - 'parameterlist' =3D> \@parameterlist, - 'parameterdescs' =3D> \%parameterdescs, - 'parametertypes' =3D> \%parametertypes, - 'sectionlist' =3D> \@sectionlist, - 'sections' =3D> \%sections, - 'purpose' =3D> $declaration_purpose, - 'func_macro' =3D> $func_macro - }); - } -} - -sub reset_state { - $function =3D ""; - %parameterdescs =3D (); - %parametertypes =3D (); - @parameterlist =3D (); - %sections =3D (); - @sectionlist =3D (); - $sectcheck =3D ""; - $struct_actual =3D ""; - $prototype =3D ""; - - $state =3D STATE_NORMAL; - $inline_doc_state =3D STATE_INLINE_NA; -} - -sub tracepoint_munge($) { - my $file =3D shift; - my $tracepointname =3D 0; - my $tracepointargs =3D 0; - - if ($prototype =3D~ m/TRACE_EVENT\((.*?),/) { - $tracepointname =3D $1; - } - if ($prototype =3D~ m/DEFINE_SINGLE_EVENT\((.*?),/) { - $tracepointname =3D $1; - } - if ($prototype =3D~ m/DEFINE_EVENT\((.*?),(.*?),/) { - $tracepointname =3D $2; - } - $tracepointname =3D~ s/^\s+//; #strip leading whitespace - if ($prototype =3D~ m/TP_PROTO\((.*?)\)/) { - $tracepointargs =3D $1; - } - if (($tracepointname eq 0) || ($tracepointargs eq 0)) { - emit_warning("${file}:$.", "Unrecognized tracepoint format: \n". - "$prototype\n"); - } else { - $prototype =3D "static inline void trace_$tracepointname($tracepoi= ntargs)"; - $identifier =3D "trace_$identifier"; - } -} - -sub syscall_munge() { - my $void =3D 0; - - $prototype =3D~ s@[\r\n]+@ @gos; # strip newlines/CR's -## if ($prototype =3D~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) { - if ($prototype =3D~ m/SYSCALL_DEFINE0/) { - $void =3D 1; -## $prototype =3D "long sys_$1(void)"; - } - - $prototype =3D~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & f= unc name - if ($prototype =3D~ m/long (sys_.*?),/) { - $prototype =3D~ s/,/\(/; - } elsif ($void) { - $prototype =3D~ s/\)/\(void\)/; - } - - # now delete all of the odd-number commas in $prototype - # so that arg types & arg names don't have a comma between them - my $count =3D 0; - my $len =3D length($prototype); - if ($void) { - $len =3D 0; # skip the for-loop - } - for (my $ix =3D 0; $ix < $len; $ix++) { - if (substr($prototype, $ix, 1) eq ',') { - $count++; - if ($count % 2 =3D=3D 1) { - substr($prototype, $ix, 1) =3D ' '; - } - } - } -} - -sub process_proto_function($$) { - my $x =3D shift; - my $file =3D shift; - - $x =3D~ s@\/\/.*$@@gos; # strip C99-style comments to end of line - - if ($x =3D~ /^#/ && $x !~ /^#\s*define/) { - # do nothing - } elsif ($x =3D~ /([^\{]*)/) { - $prototype .=3D $1; - } - - if (($x =3D~ /\{/) || ($x =3D~ /\#\s*define/) || ($x =3D~ /;/)) { - $prototype =3D~ s@/\*.*?\*/@@gos; # strip comments. - $prototype =3D~ s@[\r\n]+@ @gos; # strip newlines/cr's. - $prototype =3D~ s@^\s+@@gos; # strip leading spaces - - # Handle prototypes for function pointers like: - # int (*pcs_config)(struct foo) - $prototype =3D~ s@^(\S+\s+)\(\s*\*(\S+)\)@$1$2@gos; - - if ($prototype =3D~ /SYSCALL_DEFINE/) { - syscall_munge(); - } - if ($prototype =3D~ /TRACE_EVENT/ || $prototype =3D~ /DEFINE_EVENT= / || - $prototype =3D~ /DEFINE_SINGLE_EVENT/) - { - tracepoint_munge($file); - } - dump_function($prototype, $file); - reset_state(); - } -} - -sub process_proto_type($$) { - my $x =3D shift; - my $file =3D shift; - - $x =3D~ s@[\r\n]+@ @gos; # strip newlines/cr's. - $x =3D~ s@^\s+@@gos; # strip leading spaces - $x =3D~ s@\s+$@@gos; # strip trailing spaces - $x =3D~ s@\/\/.*$@@gos; # strip C99-style comments to end of line - - if ($x =3D~ /^#/) { - # To distinguish preprocessor directive from regular declaration l= ater. - $x .=3D ";"; - } - - while (1) { - if ( $x =3D~ /([^\{\};]*)([\{\};])(.*)/ ) { - if( length $prototype ) { - $prototype .=3D " " - } - $prototype .=3D $1 . $2; - ($2 eq '{') && $brcount++; - ($2 eq '}') && $brcount--; - if (($2 eq ';') && ($brcount =3D=3D 0)) { - dump_declaration($prototype, $file); - reset_state(); - last; - } - $x =3D $3; - } else { - $prototype .=3D $x; - last; - } - } -} - - -sub map_filename($) { - my $file; - my ($orig_file) =3D @_; - - if (defined($ENV{'SRCTREE'})) { - $file =3D "$ENV{'SRCTREE'}" . "/" . $orig_file; - } else { - $file =3D $orig_file; - } - - return $file; -} - -sub process_export_file($) { - my ($orig_file) =3D @_; - my $file =3D map_filename($orig_file); - - if (!open(IN,"<$file")) { - print STDERR "Error: Cannot open file $file\n"; - ++$errors; - return; - } - - while () { - if (/$export_symbol/) { - next if (defined($nosymbol_table{$2})); - $function_table{$2} =3D 1; - } - if (/$export_symbol_ns/) { - next if (defined($nosymbol_table{$2})); - $function_table{$2} =3D 1; - } - } - - close(IN); -} - -# -# Parsers for the various processing states. -# -# STATE_NORMAL: looking for the /** to begin everything. -# -sub process_normal() { - if (/$doc_start/o) { - $state =3D STATE_NAME; # next line is always the function n= ame - $declaration_start_line =3D $. + 1; - } -} - -# -# STATE_NAME: Looking for the "name - description" line -# -sub process_name($$) { - my $file =3D shift; - my $descr; - - if (/$doc_block/o) { - $state =3D STATE_DOCBLOCK; - $contents =3D ""; - $new_start_line =3D $.; - - if ( $1 eq "" ) { - $section =3D $section_intro; - } else { - $section =3D $1; - } - } elsif (/$doc_decl/o) { - $identifier =3D $1; - my $is_kernel_comment =3D 0; - my $decl_start =3D qr{$doc_com}; - # test for pointer declaration type, foo * bar() - desc - my $fn_type =3D qr{\w+\s*\*\s*}; - my $parenthesis =3D qr{\(\w*\)}; - my $decl_end =3D qr{[-:].*}; - if (/^$decl_start([\w\s]+?)$parenthesis?\s*$decl_end?$/) { - $identifier =3D $1; - } - if ($identifier =3D~ m/^(struct|union|enum|typedef)\b\s*(\S*)/) { - $decl_type =3D $1; - $identifier =3D $2; - $is_kernel_comment =3D 1; - } - # Look for foo() or static void foo() - description; or misspelt - # identifier - elsif (/^$decl_start$fn_type?(\w+)\s*$parenthesis?\s*$decl_end?$/ = || - /^$decl_start$fn_type?(\w+[^-:]*)$parenthesis?\s*$decl_end$/) { - $identifier =3D $1; - $decl_type =3D 'function'; - $identifier =3D~ s/^define\s+//; - $is_kernel_comment =3D 1; - } - $identifier =3D~ s/\s+$//; - - $state =3D STATE_BODY; - # if there's no @param blocks need to set up default section - # here - $contents =3D ""; - $section =3D $section_default; - $new_start_line =3D $. + 1; - if (/[-:](.*)/) { - # strip leading/trailing/multiple spaces - $descr=3D $1; - $descr =3D~ s/^\s*//; - $descr =3D~ s/\s*$//; - $descr =3D~ s/\s+/ /g; - $declaration_purpose =3D $descr; - $state =3D STATE_BODY_MAYBE; - } else { - $declaration_purpose =3D ""; - } - - if (!$is_kernel_comment) { - emit_warning("${file}:$.", "This comment starts with '/**', bu= t isn't a kernel-doc comment. Refer Documentation/doc-guide/kernel-doc.rst\= n$_"); - $state =3D STATE_NORMAL; - } - - if (($declaration_purpose eq "") && $Wshort_desc) { - emit_warning("${file}:$.", "missing initial short description = on line:\n$_"); - } - - if ($identifier eq "" && $decl_type ne "enum") { - emit_warning("${file}:$.", "wrong kernel-doc identifier on lin= e:\n$_"); - $state =3D STATE_NORMAL; - } - - if ($verbose) { - print STDERR "${file}:$.: info: Scanning doc for $decl_type $i= dentifier\n"; - } - } else { - emit_warning("${file}:$.", "Cannot understand $_ on line $. - I th= ought it was a doc line\n"); - $state =3D STATE_NORMAL; - } -} - - -# -# STATE_BODY and STATE_BODY_MAYBE: the bulk of a kerneldoc comment. -# -sub process_body($$) { - my $file =3D shift; - - if ($state =3D=3D STATE_BODY_WITH_BLANK_LINE && /^\s*\*\s?\S/) { - dump_section($file, $section, $contents); - $section =3D $section_default; - $new_start_line =3D $.; - $contents =3D ""; - } - - if (/$doc_sect/i) { # case insensitive for supported section names - $newsection =3D $1; - $newcontents =3D $2; - - # map the supported section names to the canonical names - if ($newsection =3D~ m/^description$/i) { - $newsection =3D $section_default; - } elsif ($newsection =3D~ m/^context$/i) { - $newsection =3D $section_context; - } elsif ($newsection =3D~ m/^returns?$/i) { - $newsection =3D $section_return; - } elsif ($newsection =3D~ m/^\@return$/) { - # special: @return is a section, not a param description - $newsection =3D $section_return; - } - - if (($contents ne "") && ($contents ne "\n")) { - dump_section($file, $section, $contents); - $section =3D $section_default; - } - - $state =3D STATE_BODY; - $contents =3D $newcontents; - $new_start_line =3D $.; - while (substr($contents, 0, 1) eq " ") { - $contents =3D substr($contents, 1); - } - if ($contents ne "") { - $contents .=3D "\n"; - } - $section =3D $newsection; - $leading_space =3D undef; - } elsif (/$doc_end/) { - if (($contents ne "") && ($contents ne "\n")) { - dump_section($file, $section, $contents); - $section =3D $section_default; - $contents =3D ""; - } - # look for doc_com + + doc_end: - if ($_ =3D~ m'\s*\*\s*[a-zA-Z_0-9:\.]+\*/') { - emit_warning("${file}:$.", "suspicious ending line: $_"); - } - - $prototype =3D ""; - $state =3D STATE_PROTO; - $brcount =3D 0; - $new_start_line =3D $. + 1; - } elsif (/$doc_content/) { - if ($1 eq "") { - if ($section eq $section_context) { - dump_section($file, $section, $contents); - $section =3D $section_default; - $contents =3D ""; - $new_start_line =3D $.; - $state =3D STATE_BODY; - } else { - if ($section ne $section_default) { - $state =3D STATE_BODY_WITH_BLANK_LINE; - } else { - $state =3D STATE_BODY; - } - $contents .=3D "\n"; - } - } elsif ($state =3D=3D STATE_BODY_MAYBE) { - # Continued declaration purpose - chomp($declaration_purpose); - $declaration_purpose .=3D " " . $1; - $declaration_purpose =3D~ s/\s+/ /g; - } else { - my $cont =3D $1; - if ($section =3D~ m/^@/ || $section eq $section_context) { - if (!defined $leading_space) { - if ($cont =3D~ m/^(\s+)/) { - $leading_space =3D $1; - } else { - $leading_space =3D ""; - } - } - $cont =3D~ s/^$leading_space//; - } - $contents .=3D $cont . "\n"; - } - } else { - # i dont know - bad line? ignore. - emit_warning("${file}:$.", "bad line: $_"); - } -} - - -# -# STATE_PROTO: reading a function/whatever prototype. -# -sub process_proto($$) { - my $file =3D shift; - - if (/$doc_inline_oneline/) { - $section =3D $1; - $contents =3D $2; - if ($contents ne "") { - $contents .=3D "\n"; - dump_section($file, $section, $contents); - $section =3D $section_default; - $contents =3D ""; - } - } elsif (/$doc_inline_start/) { - $state =3D STATE_INLINE; - $inline_doc_state =3D STATE_INLINE_NAME; - } elsif ($decl_type eq 'function') { - process_proto_function($_, $file); - } else { - process_proto_type($_, $file); - } -} - -# -# STATE_DOCBLOCK: within a DOC: block. -# -sub process_docblock($$) { - my $file =3D shift; - - if (/$doc_end/) { - dump_doc_section($file, $section, $contents); - $section =3D $section_default; - $contents =3D ""; - $function =3D ""; - %parameterdescs =3D (); - %parametertypes =3D (); - @parameterlist =3D (); - %sections =3D (); - @sectionlist =3D (); - $prototype =3D ""; - $state =3D STATE_NORMAL; - } elsif (/$doc_content/) { - if ( $1 eq "" ) { - $contents .=3D $blankline; - } else { - $contents .=3D $1 . "\n"; - } - } -} - -# -# STATE_INLINE: docbook comments within a prototype. -# -sub process_inline($$) { - my $file =3D shift; - - # First line (state 1) needs to be a @parameter - if ($inline_doc_state =3D=3D STATE_INLINE_NAME && /$doc_inline_sect/o)= { - $section =3D $1; - $contents =3D $2; - $new_start_line =3D $.; - if ($contents ne "") { - while (substr($contents, 0, 1) eq " ") { - $contents =3D substr($contents, 1); - } - $contents .=3D "\n"; - } - $inline_doc_state =3D STATE_INLINE_TEXT; - # Documentation block end */ - } elsif (/$doc_inline_end/) { - if (($contents ne "") && ($contents ne "\n")) { - dump_section($file, $section, $contents); - $section =3D $section_default; - $contents =3D ""; - } - $state =3D STATE_PROTO; - $inline_doc_state =3D STATE_INLINE_NA; - # Regular text - } elsif (/$doc_content/) { - if ($inline_doc_state =3D=3D STATE_INLINE_TEXT) { - $contents .=3D $1 . "\n"; - # nuke leading blank lines - if ($contents =3D~ /^\s*$/) { - $contents =3D ""; - } - } elsif ($inline_doc_state =3D=3D STATE_INLINE_NAME) { - $inline_doc_state =3D STATE_INLINE_ERROR; - emit_warning("${file}:$.", "Incorrect use of kernel-doc format= : $_"); - } - } -} - - -sub process_file($) { - my $file; - my ($orig_file) =3D @_; - - $file =3D map_filename($orig_file); - - if (!open(IN_FILE,"<$file")) { - print STDERR "Error: Cannot open file $file\n"; - ++$errors; - return; - } - - $. =3D 1; - - $section_counter =3D 0; - while () { - while (!/^ \*/ && s/\\\s*$//) { - $_ .=3D ; - } - # Replace tabs by spaces - while ($_ =3D~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {}; - # Hand this line to the appropriate state handler - if ($state =3D=3D STATE_NORMAL) { - process_normal(); - } elsif ($state =3D=3D STATE_NAME) { - process_name($file, $_); - } elsif ($state =3D=3D STATE_BODY || $state =3D=3D STATE_BODY_MAYB= E || - $state =3D=3D STATE_BODY_WITH_BLANK_LINE) { - process_body($file, $_); - } elsif ($state =3D=3D STATE_INLINE) { # scanning for inline param= eters - process_inline($file, $_); - } elsif ($state =3D=3D STATE_PROTO) { - process_proto($file, $_); - } elsif ($state =3D=3D STATE_DOCBLOCK) { - process_docblock($file, $_); - } - } - - # Make sure we got something interesting. - if (!$section_counter && $output_mode ne "none") { - if ($output_selection =3D=3D OUTPUT_INCLUDE) { - emit_warning("${file}:1", "'$_' not found\n") - for keys %function_table; - } else { - emit_warning("${file}:1", "no structured comments found\n"); - } - } - close IN_FILE; -} - -$kernelversion =3D get_kernel_version(); - -# generate a sequence of code that will splice in highlighting information -# using the s// operator. -for (my $k =3D 0; $k < @highlights; $k++) { - my $pattern =3D $highlights[$k][0]; - my $result =3D $highlights[$k][1]; -# print STDERR "scanning pattern:$pattern, highlight:($result)\n"; - $dohighlight .=3D "\$contents =3D~ s:$pattern:$result:gs;\n"; -} - -if ($output_selection =3D=3D OUTPUT_EXPORTED || - $output_selection =3D=3D OUTPUT_INTERNAL) { - - push(@export_file_list, @ARGV); - - foreach (@export_file_list) { - chomp; - process_export_file($_); - } -} - -foreach (@ARGV) { - chomp; - process_file($_); -} -if ($verbose && $errors) { - print STDERR "$errors errors\n"; -} -if ($verbose && $warnings) { - print STDERR "$warnings warnings\n"; -} - -if ($Werror && $warnings) { - print STDERR "$warnings warnings as Errors\n"; - exit($warnings); -} else { - exit($output_mode eq "none" ? 0 : $errors) -} - -__END__ - -=3Dhead1 OPTIONS - -=3Dhead2 Output format selection (mutually exclusive): - -=3Dover 8 - -=3Ditem -man - -Output troff manual page format. - -=3Ditem -rst - -Output reStructuredText format. This is the default. - -=3Ditem -none - -Do not output documentation, only warnings. - -=3Dback - -=3Dhead2 Output format modifiers - -=3Dhead3 reStructuredText only - -=3Dhead2 Output selection (mutually exclusive): - -=3Dover 8 - -=3Ditem -export - -Only output documentation for the symbols that have been exported using -EXPORT_SYMBOL() and related macros in any input FILE or -export-file FILE. - -=3Ditem -internal - -Only output documentation for the symbols that have NOT been exported using -EXPORT_SYMBOL() and related macros in any input FILE or -export-file FILE. - -=3Ditem -function NAME - -Only output documentation for the given function or DOC: section title. -All other functions and DOC: sections are ignored. - -May be specified multiple times. - -=3Ditem -nosymbol NAME - -Exclude the specified symbol from the output documentation. - -May be specified multiple times. - -=3Dback - -=3Dhead2 Output selection modifiers: - -=3Dover 8 - -=3Ditem -no-doc-sections - -Do not output DOC: sections. - -=3Ditem -export-file FILE - -Specify an additional FILE in which to look for EXPORT_SYMBOL information. - -To be used with -export or -internal. - -May be specified multiple times. - -=3Dback - -=3Dhead3 reStructuredText only - -=3Dover 8 - -=3Ditem -enable-lineno - -Enable output of .. LINENO lines. - -=3Dback - -=3Dhead2 Other parameters: - -=3Dover 8 - -=3Ditem -h, -help - -Print this help. - -=3Ditem -v - -Verbose output, more warnings and other information. - -=3Ditem -Werror - -Treat warnings as errors. - -=3Dback - -=3Dcut --=20 2.50.1