Re: [PATCH v1 2/2] docs: sphinx-pre-install: check GNU Make version

Mauro Carvalho Chehab <[email protected]>
Newsgroups org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Sun,  9 Aug 2026 18:19:21 +0800
Chen Miao <[email protected]> wrote:

> The kernel documentation build requires GNU Make 4.0 or newer, but the
> Sphinx dependency checker only verifies that a make executable exists.
> This lets incompatible make implementations pass the check and fail
> later during the build.
> 
> Check the GNU Make version on all supported systems. If make is missing
> or too old, report it as a missing dependency. Also accept a compatible
> gmake command, which is how Homebrew provides GNU Make on macOS.
> 
> Document the requirement and the macOS gmake fallback.
> 
> Signed-off-by: Chen Miao <[email protected]>
> ---
>  Documentation/doc-guide/sphinx.rst            |  4 +-
>  .../translations/zh_CN/doc-guide/sphinx.rst   |  2 +
>  Documentation/translations/zh_CN/how-to.rst   |  3 +-
>  tools/docs/sphinx-pre-install                 | 52 ++++++++++++++++++-
>  4 files changed, 58 insertions(+), 3 deletions(-)
> 
> diff --git a/Documentation/doc-guide/sphinx.rst b/Documentation/doc-guide/sphinx.rst
> index 62aca56b8..d9b9e025f 100644
> --- a/Documentation/doc-guide/sphinx.rst
> +++ b/Documentation/doc-guide/sphinx.rst
> @@ -136,7 +136,9 @@ commands are printed without ``sudo``. The PDF dependencies are provided by
>  the ``mactex`` cask; use ``--no-pdf`` when only building HTML documentation.
>  The default virtualenv mode is recommended on macOS because PyYAML is
>  installed from ``Documentation/sphinx/requirements.txt`` rather than from a
> -Homebrew formula.
> +Homebrew formula. The script also checks for GNU Make 4.0 or newer; when
> +Homebrew provides it as ``gmake``, use ``gmake htmldocs`` instead of
> +``make htmldocs``.
>  
>  Installing Sphinx Minimal Version
>  ---------------------------------
> diff --git a/Documentation/translations/zh_CN/doc-guide/sphinx.rst b/Documentation/translations/zh_CN/doc-guide/sphinx.rst
> index 154142318..93f27d35a 100644
> --- a/Documentation/translations/zh_CN/doc-guide/sphinx.rst
> +++ b/Documentation/translations/zh_CN/doc-guide/sphinx.rst
> @@ -114,6 +114,8 @@ PDF和LaTeX构建
>  ``sudo``。PDF 依赖通过 ``mactex`` cask 提供;如果只构建 HTML 文档,请使用
>  ``--no-pdf``。macOS 用户建议使用默认的 Python 虚拟环境,因为 PyYAML 会从
>  ``Documentation/sphinx/requirements.txt`` 安装,而不是通过 Homebrew 安装。
> +脚本还会检查 GNU Make 4.0 或更高版本;如果 Homebrew 将其安装为 ``gmake``,
> +请使用 ``gmake htmldocs``,而不是 ``make htmldocs``。
>  
>  Sphinx构建
>  ==========
> diff --git a/Documentation/translations/zh_CN/how-to.rst b/Documentation/translations/zh_CN/how-to.rst
> index e8c91d81a..84f277124 100644
> --- a/Documentation/translations/zh_CN/how-to.rst
> +++ b/Documentation/translations/zh_CN/how-to.rst
> @@ -106,7 +106,8 @@ Linux 发行版和简单地使用 Linux 命令行,那么可以迅速开始了
>  sudo。PDF 构建所需的 MacTeX 通过 Homebrew cask 安装;如果只构建 HTML 文档,
>  可以执行 ``./tools/docs/sphinx-pre-install --no-pdf``。macOS 用户建议使用默认
>  的 Python 虚拟环境,因为 PyYAML 会从 ``Documentation/sphinx/requirements.txt``
> -安装,而不是通过 Homebrew 安装。
> +安装,而不是通过 Homebrew 安装。脚本还会检查 GNU Make 4.0 或更高版本;如果
> +Homebrew 将其安装为 ``gmake``,请使用 ``gmake htmldocs``,而不是 ``make htmldocs``。
>  
>  如果您处于一个多用户环境中,为了避免对其他人造成影响,建议您配置单用户
>  sphinx 虚拟环境,即只需要执行::
> diff --git a/tools/docs/sphinx-pre-install b/tools/docs/sphinx-pre-install
> index 51a296cc7..079655078 100755
> --- a/tools/docs/sphinx-pre-install
> +++ b/tools/docs/sphinx-pre-install
> @@ -40,6 +40,7 @@ from kdoc.python_version import PythonVersion
>  
>  RECOMMENDED_VERSION = PythonVersion("3.4.3").version
>  MIN_PYTHON_VERSION = PythonVersion("3.7").version
> +MIN_MAKE_VERSION = PythonVersion("4.0").version
>  
>  
>  class DepManager:
> @@ -308,6 +309,55 @@ class MissingCheckers(AncillaryMethods):
>  
>          return None
>  
> +    def get_make_version(self, cmd):
> +        """Get the GNU Make version, or None if cmd is not GNU Make."""
> +        if not cmd:
> +            return None
> +
> +        try:
> +            result = self.run(
> +                [cmd, "--version"],
> +                capture_output=True,
> +                text=True,
> +                check=True,
> +            )
> +        except (subprocess.CalledProcessError, FileNotFoundError):
> +            return None
> +
> +        match = re.search(
> +            r"^GNU Make\s+([0-9]+(?:\.[0-9]+)*)", result.stdout, re.MULTILINE
> +        )
> +        if not match:
> +            return None
> +
> +        return PythonVersion.parse_version(match.group(1))
> +
> +    def check_make(self):
> +        """Check for GNU Make 4.0 or newer."""
> +        make = self.which("make")
> +        version = self.get_make_version(make)

I would invert the check: test first for "gmake", and then for "make".

Lots of Linux distros have an alias for gmake, like on Fedora:

	lrwxrwxrwx 1 root root        4 Apr 24 21:33 /usr/bin/gmake -> make
	-rwxr-xr-x 1 root root   287384 Apr 24 21:33 /usr/bin/make

Yet, I would do it on a different way:

	make = self.which("gmake")
	if not make:
		make = self.which("make")

	version = self.get_make_version(make)

This should simplify the code a little bit.

> +
> +        if version and version >= MIN_MAKE_VERSION:
> +            return
> +
> +        # macOS commonly has an incompatible /usr/bin/make, while Homebrew
> +        # installs GNU Make as gmake. Also accept gmake on other systems when
> +        # it is the only compatible command available.
> +        gmake = self.which("gmake")
> +        gmake_version = self.get_make_version(gmake)
> +        if gmake_version and gmake_version >= MIN_MAKE_VERSION:
> +            make_name = os.path.basename(make) if make else "make"
> +            gmake_name = os.path.basename(gmake)
> +            make_ver = PythonVersion.ver_str(version) if version else "unknown"
> +            gmake_ver = PythonVersion.ver_str(gmake_version)
> +            print(
> +                f"Note: {make_name} ({make_ver}) does not meet the GNU Make "
> +                f"requirement; use {gmake_name} ({gmake_ver}) instead."
> +            )
> +            return

With that, you probably can remove most of the above.

Btw, you likely need to teach tools/docs/sphinx-build-wrapper
to also consider gmake binary, as it can run make internally
to generate info and Rust docs.

Thanks,
Mauro
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.