mirror of
https://github.com/python/cpython
synced 2024-10-14 16:37:41 +00:00
bpo-42955: Add Python/module_names.h (GH-24258)
Add a private list of all stdlib modules: _Py_module_names. * Add Tools/scripts/generate_module_names.py script. * Makefile: Add "make regen-module-names" command. * setup.py: Add --list-module-names option. * GitHub Action and Travis CI also runs "make regen-module-names", not ony "make regen-all", to ensure that the module names remains up to date.
This commit is contained in:
parent
e8e66eab94
commit
cad8020cb8
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
|
@ -63,6 +63,7 @@ jobs:
|
||||||
# Build Python with the libpython dynamic library
|
# Build Python with the libpython dynamic library
|
||||||
./configure --with-pydebug --enable-shared
|
./configure --with-pydebug --enable-shared
|
||||||
make -j4 regen-all
|
make -j4 regen-all
|
||||||
|
make regen-module-names
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
run: |
|
run: |
|
||||||
changes=$(git status --porcelain)
|
changes=$(git status --porcelain)
|
||||||
|
|
|
@ -172,6 +172,7 @@ before_script:
|
||||||
- eval "$(pyenv init -)"
|
- eval "$(pyenv init -)"
|
||||||
- pyenv global 3.8
|
- pyenv global 3.8
|
||||||
- PYTHON_FOR_REGEN=python3.8 make -j4 regen-all
|
- PYTHON_FOR_REGEN=python3.8 make -j4 regen-all
|
||||||
|
- make regen-module-names
|
||||||
- changes=`git status --porcelain`
|
- changes=`git status --porcelain`
|
||||||
- |
|
- |
|
||||||
# Check for changes in regenerated files
|
# Check for changes in regenerated files
|
||||||
|
|
|
@ -252,7 +252,7 @@ PYTHON= python$(EXE)
|
||||||
BUILDPYTHON= python$(BUILDEXE)
|
BUILDPYTHON= python$(BUILDEXE)
|
||||||
|
|
||||||
PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@
|
PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@
|
||||||
UPDATE_FILE=@PYTHON_FOR_REGEN@ $(srcdir)/Tools/scripts/update_file.py
|
UPDATE_FILE=$(PYTHON_FOR_REGEN) $(srcdir)/Tools/scripts/update_file.py
|
||||||
PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
|
PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@
|
||||||
_PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
|
_PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@
|
||||||
BUILD_GNU_TYPE= @build@
|
BUILD_GNU_TYPE= @build@
|
||||||
|
@ -757,6 +757,8 @@ regen-limited-abi: all
|
||||||
regen-all: regen-opcode regen-opcode-targets regen-typeslots \
|
regen-all: regen-opcode regen-opcode-targets regen-typeslots \
|
||||||
regen-token regen-ast regen-keyword regen-importlib clinic \
|
regen-token regen-ast regen-keyword regen-importlib clinic \
|
||||||
regen-pegen-metaparser regen-pegen
|
regen-pegen-metaparser regen-pegen
|
||||||
|
@echo
|
||||||
|
@echo "Note: make regen-module-names and autoconf should be run manually"
|
||||||
|
|
||||||
############################################################################
|
############################################################################
|
||||||
# Special rules for object files
|
# Special rules for object files
|
||||||
|
@ -896,6 +898,15 @@ regen-keyword:
|
||||||
$(srcdir)/Lib/keyword.py.new
|
$(srcdir)/Lib/keyword.py.new
|
||||||
$(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new
|
$(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new
|
||||||
|
|
||||||
|
.PHONY: regen-module-names
|
||||||
|
regen-module-names: build_all
|
||||||
|
# Regenerate Python/module_names.h
|
||||||
|
# using Tools/scripts/generate_module_names.py
|
||||||
|
$(RUNSHARED) ./$(BUILDPYTHON) \
|
||||||
|
$(srcdir)/Tools/scripts/generate_module_names.py \
|
||||||
|
> $(srcdir)/Python/module_names.h.new
|
||||||
|
$(UPDATE_FILE) $(srcdir)/Python/module_names.h $(srcdir)/Python/module_names.h.new
|
||||||
|
|
||||||
Python/compile.o Python/symtable.o Python/ast_unparse.o Python/ast.o Python/future.o: $(srcdir)/Include/Python-ast.h
|
Python/compile.o Python/symtable.o Python/ast_unparse.o Python/ast.o Python/future.o: $(srcdir)/Include/Python-ast.h
|
||||||
|
|
||||||
Python/getplatform.o: $(srcdir)/Python/getplatform.c
|
Python/getplatform.o: $(srcdir)/Python/getplatform.c
|
||||||
|
@ -1145,7 +1156,9 @@ PYTHON_HEADERS= \
|
||||||
$(srcdir)/Include/internal/pycore_ucnhash.h \
|
$(srcdir)/Include/internal/pycore_ucnhash.h \
|
||||||
$(srcdir)/Include/internal/pycore_unionobject.h \
|
$(srcdir)/Include/internal/pycore_unionobject.h \
|
||||||
$(srcdir)/Include/internal/pycore_warnings.h \
|
$(srcdir)/Include/internal/pycore_warnings.h \
|
||||||
$(DTRACE_HEADERS)
|
$(DTRACE_HEADERS) \
|
||||||
|
\
|
||||||
|
$(srcdir)/Python/module_names.h
|
||||||
|
|
||||||
$(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS)
|
$(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS)
|
||||||
|
|
||||||
|
|
|
@ -291,6 +291,7 @@
|
||||||
<ClInclude Include="..\Python\ceval_gil.h" />
|
<ClInclude Include="..\Python\ceval_gil.h" />
|
||||||
<ClInclude Include="..\Python\condvar.h" />
|
<ClInclude Include="..\Python\condvar.h" />
|
||||||
<ClInclude Include="..\Python\importdl.h" />
|
<ClInclude Include="..\Python\importdl.h" />
|
||||||
|
<ClInclude Include="..\Python\module_names.h" />
|
||||||
<ClInclude Include="..\Python\thread_nt.h" />
|
<ClInclude Include="..\Python\thread_nt.h" />
|
||||||
<ClInclude Include="..\Python\wordcode_helpers.h" />
|
<ClInclude Include="..\Python\wordcode_helpers.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
|
@ -360,6 +360,9 @@
|
||||||
<ClInclude Include="..\Python\importdl.h">
|
<ClInclude Include="..\Python\importdl.h">
|
||||||
<Filter>Python</Filter>
|
<Filter>Python</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\Python\module_names.h">
|
||||||
|
<Filter>Python</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\Python\thread_nt.h">
|
<ClInclude Include="..\Python\thread_nt.h">
|
||||||
<Filter>Python</Filter>
|
<Filter>Python</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
336
Python/module_names.h
Normal file
336
Python/module_names.h
Normal file
|
@ -0,0 +1,336 @@
|
||||||
|
// Auto-generated by Tools/scripts/generate_module_names.py.
|
||||||
|
|
||||||
|
static const char* _Py_module_names[] = {
|
||||||
|
|
||||||
|
// Built-in modules
|
||||||
|
"_abc",
|
||||||
|
"_ast",
|
||||||
|
"_codecs",
|
||||||
|
"_collections",
|
||||||
|
"_functools",
|
||||||
|
"_imp",
|
||||||
|
"_io",
|
||||||
|
"_locale",
|
||||||
|
"_operator",
|
||||||
|
"_signal",
|
||||||
|
"_sre",
|
||||||
|
"_stat",
|
||||||
|
"_string",
|
||||||
|
"_symtable",
|
||||||
|
"_thread",
|
||||||
|
"_tracemalloc",
|
||||||
|
"_warnings",
|
||||||
|
"_weakref",
|
||||||
|
"atexit",
|
||||||
|
"builtins",
|
||||||
|
"errno",
|
||||||
|
"faulthandler",
|
||||||
|
"gc",
|
||||||
|
"itertools",
|
||||||
|
"marshal",
|
||||||
|
"posix",
|
||||||
|
"pwd",
|
||||||
|
"sys",
|
||||||
|
"time",
|
||||||
|
|
||||||
|
// Pure Python modules (Lib/*.py)
|
||||||
|
"__future__",
|
||||||
|
"abc",
|
||||||
|
"aifc",
|
||||||
|
"antigravity",
|
||||||
|
"argparse",
|
||||||
|
"ast",
|
||||||
|
"asynchat",
|
||||||
|
"asyncore",
|
||||||
|
"base64",
|
||||||
|
"bdb",
|
||||||
|
"binhex",
|
||||||
|
"bisect",
|
||||||
|
"bz2",
|
||||||
|
"cProfile",
|
||||||
|
"calendar",
|
||||||
|
"cgi",
|
||||||
|
"cgitb",
|
||||||
|
"chunk",
|
||||||
|
"cmd",
|
||||||
|
"code",
|
||||||
|
"codecs",
|
||||||
|
"codeop",
|
||||||
|
"colorsys",
|
||||||
|
"compileall",
|
||||||
|
"configparser",
|
||||||
|
"contextlib",
|
||||||
|
"contextvars",
|
||||||
|
"copy",
|
||||||
|
"copyreg",
|
||||||
|
"crypt",
|
||||||
|
"csv",
|
||||||
|
"dataclasses",
|
||||||
|
"datetime",
|
||||||
|
"decimal",
|
||||||
|
"difflib",
|
||||||
|
"dis",
|
||||||
|
"doctest",
|
||||||
|
"enum",
|
||||||
|
"filecmp",
|
||||||
|
"fileinput",
|
||||||
|
"fnmatch",
|
||||||
|
"fractions",
|
||||||
|
"ftplib",
|
||||||
|
"functools",
|
||||||
|
"genericpath",
|
||||||
|
"getopt",
|
||||||
|
"getpass",
|
||||||
|
"gettext",
|
||||||
|
"glob",
|
||||||
|
"graphlib",
|
||||||
|
"gzip",
|
||||||
|
"hashlib",
|
||||||
|
"heapq",
|
||||||
|
"hmac",
|
||||||
|
"imaplib",
|
||||||
|
"imghdr",
|
||||||
|
"imp",
|
||||||
|
"inspect",
|
||||||
|
"io",
|
||||||
|
"ipaddress",
|
||||||
|
"keyword",
|
||||||
|
"linecache",
|
||||||
|
"locale",
|
||||||
|
"lzma",
|
||||||
|
"mailbox",
|
||||||
|
"mailcap",
|
||||||
|
"mimetypes",
|
||||||
|
"modulefinder",
|
||||||
|
"netrc",
|
||||||
|
"nntplib",
|
||||||
|
"ntpath",
|
||||||
|
"nturl2path",
|
||||||
|
"numbers",
|
||||||
|
"opcode",
|
||||||
|
"operator",
|
||||||
|
"optparse",
|
||||||
|
"os",
|
||||||
|
"pathlib",
|
||||||
|
"pdb",
|
||||||
|
"pickle",
|
||||||
|
"pickletools",
|
||||||
|
"pipes",
|
||||||
|
"pkgutil",
|
||||||
|
"platform",
|
||||||
|
"plistlib",
|
||||||
|
"poplib",
|
||||||
|
"posixpath",
|
||||||
|
"pprint",
|
||||||
|
"profile",
|
||||||
|
"pstats",
|
||||||
|
"pty",
|
||||||
|
"py_compile",
|
||||||
|
"pyclbr",
|
||||||
|
"pydoc",
|
||||||
|
"queue",
|
||||||
|
"quopri",
|
||||||
|
"random",
|
||||||
|
"re",
|
||||||
|
"reprlib",
|
||||||
|
"rlcompleter",
|
||||||
|
"runpy",
|
||||||
|
"sched",
|
||||||
|
"secrets",
|
||||||
|
"selectors",
|
||||||
|
"shelve",
|
||||||
|
"shlex",
|
||||||
|
"shutil",
|
||||||
|
"signal",
|
||||||
|
"site",
|
||||||
|
"smtpd",
|
||||||
|
"smtplib",
|
||||||
|
"sndhdr",
|
||||||
|
"socket",
|
||||||
|
"socketserver",
|
||||||
|
"sre_compile",
|
||||||
|
"sre_constants",
|
||||||
|
"sre_parse",
|
||||||
|
"ssl",
|
||||||
|
"stat",
|
||||||
|
"statistics",
|
||||||
|
"string",
|
||||||
|
"stringprep",
|
||||||
|
"struct",
|
||||||
|
"subprocess",
|
||||||
|
"sunau",
|
||||||
|
"symtable",
|
||||||
|
"sysconfig",
|
||||||
|
"tabnanny",
|
||||||
|
"tarfile",
|
||||||
|
"telnetlib",
|
||||||
|
"tempfile",
|
||||||
|
"textwrap",
|
||||||
|
"this",
|
||||||
|
"threading",
|
||||||
|
"timeit",
|
||||||
|
"token",
|
||||||
|
"tokenize",
|
||||||
|
"trace",
|
||||||
|
"traceback",
|
||||||
|
"tracemalloc",
|
||||||
|
"tty",
|
||||||
|
"turtle",
|
||||||
|
"types",
|
||||||
|
"typing",
|
||||||
|
"uu",
|
||||||
|
"uuid",
|
||||||
|
"warnings",
|
||||||
|
"wave",
|
||||||
|
"weakref",
|
||||||
|
"webbrowser",
|
||||||
|
"xdrlib",
|
||||||
|
"zipapp",
|
||||||
|
"zipfile",
|
||||||
|
"zipimport",
|
||||||
|
|
||||||
|
// Packages and sub-packages
|
||||||
|
"asyncio",
|
||||||
|
"collections",
|
||||||
|
"concurrent",
|
||||||
|
"concurrent.futures",
|
||||||
|
"ctypes",
|
||||||
|
"ctypes.macholib",
|
||||||
|
"curses",
|
||||||
|
"dbm",
|
||||||
|
"distutils",
|
||||||
|
"distutils.command",
|
||||||
|
"email",
|
||||||
|
"email.mime",
|
||||||
|
"encodings",
|
||||||
|
"ensurepip",
|
||||||
|
"ensurepip._bundled",
|
||||||
|
"html",
|
||||||
|
"http",
|
||||||
|
"idlelib",
|
||||||
|
"importlib",
|
||||||
|
"json",
|
||||||
|
"lib2to3",
|
||||||
|
"lib2to3.fixes",
|
||||||
|
"lib2to3.pgen2",
|
||||||
|
"logging",
|
||||||
|
"msilib",
|
||||||
|
"multiprocessing",
|
||||||
|
"multiprocessing.dummy",
|
||||||
|
"pydoc_data",
|
||||||
|
"sqlite3",
|
||||||
|
"tkinter",
|
||||||
|
"turtledemo",
|
||||||
|
"unittest",
|
||||||
|
"urllib",
|
||||||
|
"venv",
|
||||||
|
"wsgiref",
|
||||||
|
"xml",
|
||||||
|
"xml.dom",
|
||||||
|
"xml.etree",
|
||||||
|
"xml.parsers",
|
||||||
|
"xml.sax",
|
||||||
|
"xmlrpc",
|
||||||
|
"zoneinfo",
|
||||||
|
|
||||||
|
// Extension modules built by setup.py
|
||||||
|
"_asyncio",
|
||||||
|
"_bisect",
|
||||||
|
"_blake2",
|
||||||
|
"_bz2",
|
||||||
|
"_codecs_cn",
|
||||||
|
"_codecs_hk",
|
||||||
|
"_codecs_iso2022",
|
||||||
|
"_codecs_jp",
|
||||||
|
"_codecs_kr",
|
||||||
|
"_codecs_tw",
|
||||||
|
"_contextvars",
|
||||||
|
"_crypt",
|
||||||
|
"_csv",
|
||||||
|
"_ctypes",
|
||||||
|
"_curses",
|
||||||
|
"_curses_panel",
|
||||||
|
"_datetime",
|
||||||
|
"_dbm",
|
||||||
|
"_decimal",
|
||||||
|
"_elementtree",
|
||||||
|
"_gdbm",
|
||||||
|
"_hashlib",
|
||||||
|
"_heapq",
|
||||||
|
"_json",
|
||||||
|
"_lsprof",
|
||||||
|
"_lzma",
|
||||||
|
"_md5",
|
||||||
|
"_multibytecodec",
|
||||||
|
"_multiprocessing",
|
||||||
|
"_opcode",
|
||||||
|
"_pickle",
|
||||||
|
"_posixshmem",
|
||||||
|
"_posixsubprocess",
|
||||||
|
"_queue",
|
||||||
|
"_random",
|
||||||
|
"_sha1",
|
||||||
|
"_sha256",
|
||||||
|
"_sha3",
|
||||||
|
"_sha512",
|
||||||
|
"_socket",
|
||||||
|
"_sqlite3",
|
||||||
|
"_ssl",
|
||||||
|
"_statistics",
|
||||||
|
"_struct",
|
||||||
|
"_tkinter",
|
||||||
|
"_uuid",
|
||||||
|
"_xxsubinterpreters",
|
||||||
|
"_zoneinfo",
|
||||||
|
"array",
|
||||||
|
"audioop",
|
||||||
|
"binascii",
|
||||||
|
"cmath",
|
||||||
|
"fcntl",
|
||||||
|
"grp",
|
||||||
|
"math",
|
||||||
|
"mmap",
|
||||||
|
"nis",
|
||||||
|
"ossaudiodev",
|
||||||
|
"pyexpat",
|
||||||
|
"readline",
|
||||||
|
"resource",
|
||||||
|
"select",
|
||||||
|
"spwd",
|
||||||
|
"syslog",
|
||||||
|
"termios",
|
||||||
|
"unicodedata",
|
||||||
|
"zlib",
|
||||||
|
|
||||||
|
// Built-in and extension modules built by Modules/Setup
|
||||||
|
"_abc",
|
||||||
|
"_codecs",
|
||||||
|
"_collections",
|
||||||
|
"_functools",
|
||||||
|
"_io",
|
||||||
|
"_locale",
|
||||||
|
"_operator",
|
||||||
|
"_signal",
|
||||||
|
"_sre",
|
||||||
|
"_stat",
|
||||||
|
"_symtable",
|
||||||
|
"_thread",
|
||||||
|
"_tracemalloc",
|
||||||
|
"_weakref",
|
||||||
|
"atexit",
|
||||||
|
"errno",
|
||||||
|
"faulthandler",
|
||||||
|
"itertools",
|
||||||
|
"posix",
|
||||||
|
"pwd",
|
||||||
|
"time",
|
||||||
|
|
||||||
|
// Windows extension modules
|
||||||
|
"_msi",
|
||||||
|
"_winapi",
|
||||||
|
"msvcrt",
|
||||||
|
"nt",
|
||||||
|
"winreg",
|
||||||
|
"winsound",
|
||||||
|
|
||||||
|
};
|
200
Tools/scripts/generate_module_names.py
Normal file
200
Tools/scripts/generate_module_names.py
Normal file
|
@ -0,0 +1,200 @@
|
||||||
|
# This script lists the names of standard library modules
|
||||||
|
# to update Python/module_names.h
|
||||||
|
import os.path
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import sysconfig
|
||||||
|
|
||||||
|
|
||||||
|
SRC_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||||
|
STDLIB_PATH = os.path.join(SRC_DIR, 'Lib')
|
||||||
|
MODULES_SETUP = os.path.join(SRC_DIR, 'Modules', 'Setup')
|
||||||
|
SETUP_PY = os.path.join(SRC_DIR, 'setup.py')
|
||||||
|
|
||||||
|
IGNORE = {
|
||||||
|
'__init__',
|
||||||
|
'__pycache__',
|
||||||
|
'site-packages',
|
||||||
|
|
||||||
|
# Helper modules of public modules.
|
||||||
|
# For example, sysconfig uses _osx_support.
|
||||||
|
'_aix_support',
|
||||||
|
'_collections_abc',
|
||||||
|
'_compat_pickle',
|
||||||
|
'_compression',
|
||||||
|
'_markupbase',
|
||||||
|
'_osx_support',
|
||||||
|
'_sitebuiltins',
|
||||||
|
'_strptime',
|
||||||
|
'_threading_local',
|
||||||
|
'_weakrefset',
|
||||||
|
|
||||||
|
# Used to bootstrap setup.py
|
||||||
|
'_bootsubprocess',
|
||||||
|
|
||||||
|
# pure Python implementation
|
||||||
|
'_py_abc',
|
||||||
|
'_pydecimal',
|
||||||
|
'_pyio',
|
||||||
|
|
||||||
|
# test modules
|
||||||
|
'__phello__.foo',
|
||||||
|
'_ctypes_test',
|
||||||
|
'_testbuffer',
|
||||||
|
'_testcapi',
|
||||||
|
'_testconsole',
|
||||||
|
'_testimportmultiple',
|
||||||
|
'_testinternalcapi',
|
||||||
|
'_testmultiphase',
|
||||||
|
'_xxtestfuzz',
|
||||||
|
'distutils.tests',
|
||||||
|
'idlelib.idle_test',
|
||||||
|
'lib2to3.tests',
|
||||||
|
'test',
|
||||||
|
'xxlimited',
|
||||||
|
'xxlimited_35',
|
||||||
|
'xxsubtype',
|
||||||
|
}
|
||||||
|
|
||||||
|
# Windows extension modules
|
||||||
|
WINDOWS_MODULES = (
|
||||||
|
'_msi',
|
||||||
|
'_testconsole',
|
||||||
|
'_winapi',
|
||||||
|
'msvcrt',
|
||||||
|
'nt',
|
||||||
|
'winreg',
|
||||||
|
'winsound'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def write_comment(fp, comment):
|
||||||
|
print(f"// {comment}", file=fp)
|
||||||
|
|
||||||
|
|
||||||
|
def write_modules(fp, names):
|
||||||
|
for name in sorted(names):
|
||||||
|
if name in IGNORE:
|
||||||
|
continue
|
||||||
|
print(f'"{name}",', file=fp)
|
||||||
|
print(file=fp)
|
||||||
|
|
||||||
|
|
||||||
|
def list_builtin_modules(fp):
|
||||||
|
write_comment(fp, "Built-in modules")
|
||||||
|
write_modules(fp, sys.builtin_module_names)
|
||||||
|
|
||||||
|
|
||||||
|
# Pure Python modules (Lib/*.py)
|
||||||
|
def list_python_modules(fp):
|
||||||
|
write_comment(fp, "Pure Python modules (Lib/*.py)")
|
||||||
|
names = []
|
||||||
|
for filename in os.listdir(STDLIB_PATH):
|
||||||
|
if not filename.endswith(".py"):
|
||||||
|
continue
|
||||||
|
name = filename.removesuffix(".py")
|
||||||
|
names.append(name)
|
||||||
|
write_modules(fp, names)
|
||||||
|
|
||||||
|
|
||||||
|
def _list_sub_packages(path, names, parent=None):
|
||||||
|
for name in os.listdir(path):
|
||||||
|
package_path = os.path.join(path, name)
|
||||||
|
if name in IGNORE:
|
||||||
|
continue
|
||||||
|
if not os.path.isdir(package_path):
|
||||||
|
continue
|
||||||
|
if not any(package_file.endswith(".py")
|
||||||
|
for package_file in os.listdir(package_path)):
|
||||||
|
continue
|
||||||
|
if parent:
|
||||||
|
qualname = f"{parent}.{name}"
|
||||||
|
else:
|
||||||
|
qualname = name
|
||||||
|
if qualname in IGNORE:
|
||||||
|
continue
|
||||||
|
names.append(qualname)
|
||||||
|
_list_sub_packages(package_path, names, qualname)
|
||||||
|
|
||||||
|
|
||||||
|
# Packages and sub-packages
|
||||||
|
def list_packages(fp):
|
||||||
|
write_comment(fp, "Packages and sub-packages")
|
||||||
|
names = []
|
||||||
|
_list_sub_packages(STDLIB_PATH, names)
|
||||||
|
write_modules(fp, names)
|
||||||
|
|
||||||
|
|
||||||
|
# Windows extensions
|
||||||
|
def list_windows_extensions(fp):
|
||||||
|
write_comment(fp, "Windows extension modules")
|
||||||
|
write_modules(fp, WINDOWS_MODULES)
|
||||||
|
|
||||||
|
|
||||||
|
# Extension modules built by setup.py
|
||||||
|
def list_setup(fp):
|
||||||
|
cmd = [sys.executable, SETUP_PY, "-q", "build", "--list-module-names"]
|
||||||
|
output = subprocess.check_output(cmd)
|
||||||
|
output = output.decode("utf8")
|
||||||
|
names = output.splitlines()
|
||||||
|
|
||||||
|
write_comment(fp, "Extension modules built by setup.py")
|
||||||
|
write_modules(fp, names)
|
||||||
|
|
||||||
|
|
||||||
|
# Built-in and extension modules built by Modules/Setup
|
||||||
|
def list_modules_setup(fp):
|
||||||
|
assign_var = re.compile("^[A-Z]+=")
|
||||||
|
|
||||||
|
names = []
|
||||||
|
with open(MODULES_SETUP, encoding="utf-8") as modules_fp:
|
||||||
|
for line in modules_fp:
|
||||||
|
# Strip comment
|
||||||
|
line = line.partition("#")[0]
|
||||||
|
line = line.rstrip()
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
if assign_var.match(line):
|
||||||
|
# Ignore "VAR=VALUE"
|
||||||
|
continue
|
||||||
|
if line in ("*disabled*", "*shared*"):
|
||||||
|
continue
|
||||||
|
parts = line.split()
|
||||||
|
if len(parts) < 2:
|
||||||
|
continue
|
||||||
|
# "errno errnomodule.c" => write "errno"
|
||||||
|
name = parts[0]
|
||||||
|
names.append(name)
|
||||||
|
|
||||||
|
write_comment(fp, "Built-in and extension modules built by Modules/Setup")
|
||||||
|
write_modules(fp, names)
|
||||||
|
|
||||||
|
|
||||||
|
def list_modules(fp):
|
||||||
|
print("// Auto-generated by Tools/scripts/generate_module_names.py.", file=fp)
|
||||||
|
print(file=fp)
|
||||||
|
print("static const char* _Py_module_names[] = {", file=fp)
|
||||||
|
print(file=fp)
|
||||||
|
|
||||||
|
list_builtin_modules(fp)
|
||||||
|
list_python_modules(fp)
|
||||||
|
list_packages(fp)
|
||||||
|
list_setup(fp)
|
||||||
|
list_modules_setup(fp)
|
||||||
|
list_windows_extensions(fp)
|
||||||
|
|
||||||
|
print("};", file=fp)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if not sysconfig.is_python_build():
|
||||||
|
print(f"ERROR: {sys.executable} is not a Python build",
|
||||||
|
file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
list_modules(sys.stdout)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
51
setup.py
51
setup.py
|
@ -46,6 +46,9 @@
|
||||||
# This global variable is used to hold the list of modules to be disabled.
|
# This global variable is used to hold the list of modules to be disabled.
|
||||||
DISABLED_MODULE_LIST = []
|
DISABLED_MODULE_LIST = []
|
||||||
|
|
||||||
|
# --list-module-names option used by Tools/scripts/generate_module_names.py
|
||||||
|
LIST_MODULE_NAMES = False
|
||||||
|
|
||||||
|
|
||||||
def get_platform():
|
def get_platform():
|
||||||
# Cross compiling
|
# Cross compiling
|
||||||
|
@ -447,12 +450,20 @@ def build_extensions(self):
|
||||||
# Detect which modules should be compiled
|
# Detect which modules should be compiled
|
||||||
self.detect_modules()
|
self.detect_modules()
|
||||||
|
|
||||||
self.remove_disabled()
|
if not LIST_MODULE_NAMES:
|
||||||
|
self.remove_disabled()
|
||||||
|
|
||||||
self.update_sources_depends()
|
self.update_sources_depends()
|
||||||
mods_built, mods_disabled = self.remove_configured_extensions()
|
mods_built, mods_disabled = self.remove_configured_extensions()
|
||||||
self.set_compiler_executables()
|
self.set_compiler_executables()
|
||||||
|
|
||||||
|
if LIST_MODULE_NAMES:
|
||||||
|
for ext in self.extensions:
|
||||||
|
print(ext.name)
|
||||||
|
for name in self.missing:
|
||||||
|
print(name)
|
||||||
|
return
|
||||||
|
|
||||||
build_ext.build_extensions(self)
|
build_ext.build_extensions(self)
|
||||||
|
|
||||||
if SUBPROCESS_BOOTSTRAP:
|
if SUBPROCESS_BOOTSTRAP:
|
||||||
|
@ -1118,6 +1129,7 @@ def detect_crypt(self):
|
||||||
# bpo-31904: crypt() function is not provided by VxWorks.
|
# bpo-31904: crypt() function is not provided by VxWorks.
|
||||||
# DES_crypt() OpenSSL provides is too weak to implement
|
# DES_crypt() OpenSSL provides is too weak to implement
|
||||||
# the encryption.
|
# the encryption.
|
||||||
|
self.missing.append('_crypt')
|
||||||
return
|
return
|
||||||
|
|
||||||
if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
|
if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
|
||||||
|
@ -1125,8 +1137,7 @@ def detect_crypt(self):
|
||||||
else:
|
else:
|
||||||
libs = []
|
libs = []
|
||||||
|
|
||||||
self.add(Extension('_crypt', ['_cryptmodule.c'],
|
self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs))
|
||||||
libraries=libs))
|
|
||||||
|
|
||||||
def detect_socket(self):
|
def detect_socket(self):
|
||||||
# socket(2)
|
# socket(2)
|
||||||
|
@ -1735,27 +1746,29 @@ def detect_multiprocessing(self):
|
||||||
if MS_WINDOWS:
|
if MS_WINDOWS:
|
||||||
multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
|
multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
|
||||||
'_multiprocessing/semaphore.c']
|
'_multiprocessing/semaphore.c']
|
||||||
|
|
||||||
else:
|
else:
|
||||||
multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
|
multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
|
||||||
if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
|
if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
|
||||||
sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
|
sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
|
||||||
multiprocessing_srcs.append('_multiprocessing/semaphore.c')
|
multiprocessing_srcs.append('_multiprocessing/semaphore.c')
|
||||||
if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
|
|
||||||
sysconfig.get_config_var('HAVE_SHM_UNLINK')):
|
|
||||||
posixshmem_srcs = ['_multiprocessing/posixshmem.c']
|
|
||||||
libs = []
|
|
||||||
if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
|
|
||||||
# need to link with librt to get shm_open()
|
|
||||||
libs.append('rt')
|
|
||||||
self.add(Extension('_posixshmem', posixshmem_srcs,
|
|
||||||
define_macros={},
|
|
||||||
libraries=libs,
|
|
||||||
include_dirs=["Modules/_multiprocessing"]))
|
|
||||||
|
|
||||||
self.add(Extension('_multiprocessing', multiprocessing_srcs,
|
self.add(Extension('_multiprocessing', multiprocessing_srcs,
|
||||||
include_dirs=["Modules/_multiprocessing"]))
|
include_dirs=["Modules/_multiprocessing"]))
|
||||||
|
|
||||||
|
if (not MS_WINDOWS and
|
||||||
|
sysconfig.get_config_var('HAVE_SHM_OPEN') and
|
||||||
|
sysconfig.get_config_var('HAVE_SHM_UNLINK')):
|
||||||
|
posixshmem_srcs = ['_multiprocessing/posixshmem.c']
|
||||||
|
libs = []
|
||||||
|
if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
|
||||||
|
# need to link with librt to get shm_open()
|
||||||
|
libs.append('rt')
|
||||||
|
self.add(Extension('_posixshmem', posixshmem_srcs,
|
||||||
|
define_macros={},
|
||||||
|
libraries=libs,
|
||||||
|
include_dirs=["Modules/_multiprocessing"]))
|
||||||
|
else:
|
||||||
|
self.missing.append('_posixshmem')
|
||||||
|
|
||||||
def detect_uuid(self):
|
def detect_uuid(self):
|
||||||
# Build the _uuid module if possible
|
# Build the _uuid module if possible
|
||||||
uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
|
uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
|
||||||
|
@ -2549,6 +2562,12 @@ def copy_scripts(self):
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
global LIST_MODULE_NAMES
|
||||||
|
|
||||||
|
if "--list-module-names" in sys.argv:
|
||||||
|
LIST_MODULE_NAMES = True
|
||||||
|
sys.argv.remove("--list-module-names")
|
||||||
|
|
||||||
set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
|
set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
|
||||||
set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
|
set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue