Skip to content

Commit a0dd99b

Browse files
Allow passing json file
1 parent 7f10e66 commit a0dd99b

File tree

4 files changed

+59
-13
lines changed

4 files changed

+59
-13
lines changed

Makefile.pre.in

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,11 @@ sharedmods: $(SHAREDMODS) pybuilddir.txt
16011601
# dependency on BUILDPYTHON ensures that the target is run last
16021602
.PHONY: checksharedmods
16031603
checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
1604-
@$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-stdlib-info
1604+
@if [ -n "@MISSING_STDLIB_CONFIG@" ]; then \
1605+
$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-stdlib-info="@MISSING_STDLIB_CONFIG@"; \
1606+
else \
1607+
$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-stdlib-info; \
1608+
fi
16051609
@$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py
16061610

16071611
.PHONY: rundsymutil

Tools/build/check_extension_modules.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import _imp
2424
import argparse
2525
import enum
26+
import json
2627
import logging
2728
import os
2829
import pathlib
@@ -118,8 +119,9 @@
118119

119120
parser.add_argument(
120121
"--generate-stdlib-info",
121-
action="store_true",
122-
help="Generate file with stdlib module info",
122+
nargs="?",
123+
const=True,
124+
help="Generate file with stdlib module info, with optional config file",
123125
)
124126

125127

@@ -287,7 +289,7 @@ def list_module_names(self, *, all: bool = False) -> set[str]:
287289
names.update(WINDOWS_MODULES)
288290
return names
289291

290-
def generate_stdlib_info(self) -> None:
292+
def generate_stdlib_info(self, config_path: str | None = None) -> None:
291293

292294
disabled_modules = {modinfo.name for modinfo in self.modules
293295
if modinfo.state in (ModuleState.DISABLED, ModuleState.DISABLED_SETUP)}
@@ -296,6 +298,25 @@ def generate_stdlib_info(self) -> None:
296298
na_modules = {modinfo.name for modinfo in self.modules
297299
if modinfo.state == ModuleState.NA}
298300

301+
config_messages = {}
302+
if config_path:
303+
try:
304+
with open(config_path, encoding='utf-8') as f:
305+
config_messages = json.load(f)
306+
except (FileNotFoundError, json.JSONDecodeError) as e:
307+
logger.error("Failed to load distributor config %s: %s", config_path, e)
308+
309+
default_messages = {
310+
**{name: f"Windows-only standard library module '{name}' was not found"
311+
for name in WINDOWS_MODULES},
312+
**{name: f"Standard library module disabled during build '{name}' was not found"
313+
for name in disabled_modules},
314+
**{name: f"Unsupported platform for standard library module '{name}'"
315+
for name in na_modules},
316+
}
317+
318+
messages = {**default_messages, **config_messages}
319+
299320
content = f'''\
300321
# Standard library information used by the traceback module for more informative
301322
# ModuleNotFound error messages.
@@ -305,14 +326,7 @@ def generate_stdlib_info(self) -> None:
305326
NOT_AVAILABLE_MODULES = {sorted(na_modules)!r}
306327
WINDOWS_ONLY_MODULES = {sorted(WINDOWS_MODULES)!r}
307328
308-
MISSING_STDLIB_MODULE_MESSAGES = {{
309-
**{{name: f"Windows-only standard library module '{{name}}' was not found"
310-
for name in WINDOWS_ONLY_MODULES}},
311-
**{{name: f"Standard library module disabled during build '{{name}}' was not found"
312-
for name in DISABLED_MODULES}},
313-
**{{name: f"Unsupported platform for standard library module '{{name}}'"
314-
for name in NOT_AVAILABLE_MODULES}},
315-
}}
329+
MISSING_STDLIB_MODULE_MESSAGES = {messages!r}
316330
'''
317331

318332
output_path = self.builddir / "_stdlib_modules_info.py"
@@ -539,7 +553,8 @@ def main() -> None:
539553
print(name)
540554
elif args.generate_stdlib_info:
541555
checker.check()
542-
checker.generate_stdlib_info()
556+
config_path = None if args.generate_stdlib_info is True else args.generate_stdlib_info
557+
checker.generate_stdlib_info(config_path)
543558
else:
544559
checker.check()
545560
checker.summary(verbose=args.verbose)

configure

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

configure.ac

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,15 @@ if test "$with_pkg_config" = yes -a -z "$PKG_CONFIG"; then
307307
AC_MSG_ERROR([pkg-config is required])]
308308
fi
309309

310+
dnl Allow distributors to provide custom missing stdlib module error messages
311+
AC_ARG_WITH([missing-stdlib-config],
312+
[AS_HELP_STRING([--with-missing-stdlib-config=FILE],
313+
[File with custom module error messages for missing stdlib modules])],
314+
[MISSING_STDLIB_CONFIG="$withval"],
315+
[MISSING_STDLIB_CONFIG=""]
316+
)
317+
AC_SUBST([MISSING_STDLIB_CONFIG])
318+
310319
# Set name for machine-dependent library files
311320
AC_ARG_VAR([MACHDEP], [name for machine-dependent library files])
312321
AC_MSG_CHECKING([MACHDEP])

0 commit comments

Comments
 (0)