From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F266F3F86E0 for ; Mon, 10 Aug 2026 14:33:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786372411; cv=none; b=u/ZWjiGw28LEXfpz6jQnZfcS4xRKH25ZdcWtjy1TfMfC3Fbb1wdV203iatM7ELmVcoUp3P1nC+LAUGrQqDwkGvUNoSm6sZhqgZYLmAkKjPChhfih2lVW39fwPjt43oOv0Nl9beAax7JbJxDemVbpaw+qyRwn0WPXSdT1E+D5GpU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786372411; c=relaxed/simple; bh=64TB55FHYFwfaYz9gCVrUPYWAOUkrsbqFhpR+gClBKM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j2C/Ihm+z0oIWIYCTw/MM7aBSPalE8gc9rpqasJkJVLMY+JfZ0j9j2hS/UcBFu5AoFG/C+iej2UfeGF29NMWmBok9vjOLJK/RrjxTkTFezKqLJL+KPR2HCtSoCeIK/sj1Rqj8/Wk1zub+x7qYYTny6PnE+DxPCrxrsRdNhRy0Vw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LzQvdwry; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LzQvdwry" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-cb5b8572b70so2174225a12.2 for ; Mon, 10 Aug 2026 07:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786372409; x=1786977209; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mW6857ZUCKMxTWq8NsQePygvrLZZIX0lwqlDz2Pl/S8=; b=LzQvdwryqh/oRypoaAwf9nrotr1vFHaayuFEFk9n1CSCYkXdkCPJClrUF4SP0mU1dF KJOHdYwM5ux1pJjMJK8ZiYhT5Opkwp3/dkrsFa71AeubkmLePUBvUl4prVKcyfJLYK1l Fi8QTTPzG1sN4lZ0YtWCG31VvCxMzV0qvm9yc6vIIniQDLmazemLKFC7yBeu9KSzR/r8 6KgU33BcxI0T6gBzSP3b2ko3rWh9LVrJ9dNv6Jml3K8T5p786eGSFdqqo9UKn+vCnotK d2qXXHLTaGb5yl/bsk7NZ+IIOj/a1ikT3Au0fem+eZzsgaWhBklrlPrIiVYoWYXZTizC BxSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786372409; x=1786977209; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=mW6857ZUCKMxTWq8NsQePygvrLZZIX0lwqlDz2Pl/S8=; b=ZhMLVp+fWr3JrD1zpz1+j3d5JLRkyh1QWG4Py7VPQF68lS9rAdfM68a8PD7fF1b9eQ ksAJwpq1nPslZkWqTdoLNuT198sadNzoK1X9HvZOksUDU4fAnnjXPMJgO3hvGjiZdoHA 5vndlrSAaZdACrONwjxIGcabX/NQQK9V8sxsl+j4hFeQ22ltHlO5ofKG7eWq1bw42Gkg M571HWuzXC2cqmqwb8FC7vHxICWo9HfygGOlf2ibsQM6VnWPAsDUUrTTHLaAkwDKn4YL EPRMHhU2r+fcG0YOBH5Uy5hPbgfErd/S2qJnQez04PtA2/6BtvMdDi2rLADwsViDxk3X k7yg== X-Forwarded-Encrypted: i=1; AHgh+RqL9yfPX3FRem01vf5zctZ14wwwVA0yDdPkbXRcfvYRHdRs6Exq4xN9k6kyOGnS+WzZNjd+jplriTjygng=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9CZ0uw4PdCRUuShoJWCw3yrNyJfNM4X6GAB4vB/cWFM2VSD67 9e4AE501FFx2VT4ab2j0PdDlz4ISWFiftgSw2PffZ1naoGSlUiMrLV10 X-Gm-Gg: AR+sD10iiZrDpzOltRpS2ZCXIjsS4sSG71VO711j4eO/QdGGxpBeB5W43cF9VLJHbaL iyB1UIlrAyD2qzW6fZcztMxVh361P6MsDbHM9tdVVes+3jxZFXum5RjMerx7bclp8KRoahIJJXa Z7H8R2jpQFF8wKgKeZigLJApN+PAp6LuRPpH+NEWBpK8flpARwXMHnH7eu+oNKXoCgG4z+ym8E0 VmwFKIdI3Z3lwhFMRJLjWoX0ZZbrx3A8YnUGQawMlYhp68wQk8v6XHEQTqL1zbm/2n0dMGzKIgD cSP4gOUbkgDjjEGh0J+k2/OCWDTYHdVmPsETYjFU0LzhVBujURhf6wq3fW3V8+H0JvRSplnC7P2 Dsnd5y05hb7QXI0vm50i51fIWt/urpynAJU3nR9gOGlUE5Edx4jOkCNH4IExYS+E9iUnLtfpRog d+ValEQaDsFVhmoiZSMWTIp9+vLD/dccugw+owmcABT5iVOijNM1V2mPtYm4ozSG3D1k4MN4Pnq 9E= X-Received: by 2002:a05:6a21:3a44:b0:3cb:eb06:ce09 with SMTP id adf61e73a8af0-3cc1a38a664mr3122778637.25.1786372409128; Mon, 10 Aug 2026 07:33:29 -0700 (PDT) Received: from localhost.localdomain ([64.186.250.142]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-1410cc132c1sm22197001c88.8.2026.08.10.07.33.26 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 10 Aug 2026 07:33:28 -0700 (PDT) From: Chen Miao To: corbet@lwn.net, alexs@kernel.org, si.yanteng@linux.dev, skhan@linuxfoundation.org, dzm91@hust.edu.cn, mchehab@kernel.org, wy@wyuan.org Cc: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Chen Miao Subject: [PATCH v2 3/5] docs: sphinx-build-wrapper: prefer gmake Date: Mon, 10 Aug 2026 22:33:07 +0800 Message-ID: <20260810143311.57775-4-chenmiao.ku@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20260810143311.57775-1-chenmiao.ku@gmail.com> References: <20260810143311.57775-1-chenmiao.ku@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Homebrew installs GNU Make as gmake on macOS, but the Sphinx build wrapper invokes make directly when generating Info and Rust documentation. This can make the dependency check succeed while those documentation targets still use an incompatible make implementation. Honor MAKE when it names a compatible GNU Make. Otherwise check gmake and then make, selecting the first GNU Make 4.0 or newer. This keeps the wrapper's selection consistent with sphinx-pre-install. Signed-off-by: Chen Miao --- tools/docs/sphinx-build-wrapper | 55 ++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/tools/docs/sphinx-build-wrapper b/tools/docs/sphinx-build-wrapper index 1bb962202..aa6a297db 100755 --- a/tools/docs/sphinx-build-wrapper +++ b/tools/docs/sphinx-build-wrapper @@ -71,6 +71,7 @@ from jobserver import JobserverExec # pylint: disable=C0413,C0411,E0401 # VENV_DEFAULT = "sphinx_latest" MIN_PYTHON_VERSION = PythonVersion("3.7").version +MIN_MAKE_VERSION = PythonVersion("4.0").version PAPER = ["", "a4", "letter"] TARGETS = { @@ -97,6 +98,46 @@ class SphinxBuilder: with the Kernel. """ + @staticmethod + def get_make_version(cmd): + """Return the GNU Make version, or None for another make.""" + if not cmd: + return None + + try: + result = subprocess.run( + [cmd, "--version"], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + check=True, + ) + except (OSError, subprocess.CalledProcessError): + 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 get_make(self): + """Select the first GNU Make 4.0 or newer in preference order.""" + candidates = [ + self.env.get("MAKE"), + shutil.which("gmake"), + shutil.which("make"), + ] + + for cmd in candidates: + version = self.get_make_version(cmd) + if version and version >= MIN_MAKE_VERSION: + return cmd + + sys.exit("GNU Make 4.0 or newer is required") + def get_path(self, path, use_cwd=False, abs_path=False): """ Ancillary routine to handle patches the right way, as shell does. @@ -569,9 +610,10 @@ class SphinxBuilder: texinfo directory. """ + make = self.get_make() for output_dir in output_dirs: try: - subprocess.run(["make", "info"], cwd=output_dir, check=True) + subprocess.run([make, "info"], cwd=output_dir, check=True) except subprocess.CalledProcessError as e: sys.exit(f"Error generating info docs: {e}") @@ -787,12 +829,11 @@ class SphinxBuilder: if rustdoc and target in ["htmldocs", "epubdocs"]: print("Building rust docs") - if "MAKE" in self.env: - cmd = [self.env["MAKE"]] - else: - cmd = ["make", "LLVM=1"] - - cmd += [ "rustdoc"] + make = self.get_make() + cmd = [make] + if make != self.env.get("MAKE"): + cmd.append("LLVM=1") + cmd.append("rustdoc") if self.verbose: print(" ".join(cmd)) -- 2.50.1 (Apple Git-155)