Skip to content

bpo-45548: Some test modules must be built as shared libs (GH-29268) #29268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,13 @@ Build Changes
except empty tuple singleton.
(Contributed by Christian Heimes in :issue:`45522`)

* ``Modules/Setup`` and ``Modules/makesetup`` have been improved and tied up.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* ``Modules/Setup`` and ``Modules/makesetup`` have been improved and tied up.
* ``Modules/Setup`` and ``Modules/makesetup`` have been improved and tidied up.

Extension modules can now be built through ``makesetup``. All except some
test modules can be linked statically into main binary or library.
(Contributed by Brett Cannon and Christian Heimes in :issue:`45548`,
:issue:`45570`, :issue:`45571`, and :issue:`43974`.)


C API Changes
=============

Expand Down
13 changes: 11 additions & 2 deletions Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -705,8 +705,17 @@ $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS)
fi


oldsharedmods: $(SHAREDMODS)

# create relative links from build/lib.platform/egg.so to Modules/egg.so
# pybuilddir.txt is created too late. We cannot use it in Makefile
# targets. ln --relative is not portable.
oldsharedmods: $(SHAREDMODS) pybuilddir.txt
@target=`cat pybuilddir.txt`; \
$(MKDIR_P) $$target; \
for mod in X $(SHAREDMODS); do \
if test $$mod != X; then \
$(LN) -sf ../../$$mod $$target/`basename $$mod`; \
fi; \
done

Makefile Modules/config.c: Makefile.pre \
$(srcdir)/Modules/config.c.in \
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
``Modules/Setup`` and ``Modules/makesetup`` have been improved. The
``Setup`` file now contains working rules for all extensions. Outdated
comments have been removed. Rules defined by ``makesetup`` track
dependencies correctly.
10 changes: 6 additions & 4 deletions Modules/Setup
Original file line number Diff line number Diff line change
Expand Up @@ -297,14 +297,16 @@ xxsubtype xxsubtype.c # Required for the test suite to pass!

#_xxsubinterpreters _xxsubinterpretersmodule.c
#_xxtestfuzz _xxtestfuzz/_xxtestfuzz.c _xxtestfuzz/fuzzer.c
#_ctypes_test _ctypes/_ctypes_test.c
#_testbuffer _testbuffer.c
#_testimportmultiple _testimportmultiple.c
#_testinternalcapi _testinternalcapi.c
#_testmultiphase _testmultiphase.c

# Some testing modules MUST be built as shared libraries.

#*shared*
#_testcapi _testcapimodule.c # CANNOT be statically compiled!
#_ctypes_test _ctypes/_ctypes_test.c
#_testcapi _testcapimodule.c
#_testimportmultiple _testimportmultiple.c
#_testmultiphase _testmultiphase.c

# ---
# Uncommenting the following line tells makesetup that all following modules
Expand Down
3 changes: 2 additions & 1 deletion Modules/makesetup
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,8 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
cc="$cc \$(PY_BUILTIN_MODULE_CFLAGS)";;
esac
mods_upper=$(echo $mods | tr '[a-z]' '[A-Z]')
rule="$obj: $src \$(MODULE_${mods_upper}_DEPS) \$(PYTHON_HEADERS); $cc $cpps -c $src -o $obj"
# force rebuild when header file or module build flavor (static/shared) is changed
rule="$obj: $src \$(MODULE_${mods_upper}_DEPS) \$(PYTHON_HEADERS) Modules/config.c; $cc $cpps -c $src -o $obj"
echo "$rule" >>$rulesf
done
case $doconfig in
Expand Down
17 changes: 11 additions & 6 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,12 +426,13 @@ def update_sources_depends(self):
# re-compile extensions if a header file has been changed
ext.depends.extend(headers)

def remove_configured_extensions(self):
def handle_configured_extensions(self):
# The sysconfig variables built by makesetup that list the already
# built modules and the disabled modules as configured by the Setup
# files.
sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
sysconf_built = set(sysconfig.get_config_var('MODBUILT_NAMES').split())
sysconf_shared = set(sysconfig.get_config_var('MODSHARED_NAMES').split())
sysconf_dis = set(sysconfig.get_config_var('MODDISABLED_NAMES').split())

mods_built = []
mods_disabled = []
Expand All @@ -449,11 +450,15 @@ def remove_configured_extensions(self):
mods_configured]
# Remove the shared libraries built by a previous build.
for ext in mods_configured:
# Don't remove shared extensions which have been built
# by Modules/Setup
if ext.name in sysconf_shared:
continue
fullpath = self.get_ext_fullpath(ext.name)
if os.path.exists(fullpath):
if os.path.lexists(fullpath):
os.unlink(fullpath)

return (mods_built, mods_disabled)
return mods_built, mods_disabled

def set_compiler_executables(self):
# When you run "make CC=altcc" or something similar, you really want
Expand All @@ -478,7 +483,7 @@ def build_extensions(self):
self.remove_disabled()

self.update_sources_depends()
mods_built, mods_disabled = self.remove_configured_extensions()
mods_built, mods_disabled = self.handle_configured_extensions()
self.set_compiler_executables()

if LIST_MODULE_NAMES:
Expand Down