Makefile: Add a dependency on $(LDLIBRARY) for the sharedmods target #163
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When building shared modules (
*.pyd
) for MinGW, they link against the import library for the main python (e.g.-lpython3.11
). When linking shared modules on Linux, this doesn't happen, but those shared libraries are linked with undefined references which then are fulfilled by the host process when they are loaded.Add a dependency to make sure that
$(LDLIBRARY)
, e.g.libpython$(LDVERSION).dll.a
, exists before starting to build the shared modules.Previously, if
libpython$(LDVERSION).dll.a
didn't exist when the shared modules were linked, some of them failed to link, but this wasn't reported as an error in the build, and a later invocation ofsetup.py
would retry building them, which then would succeed. E.g. there was a seemingly benign race condition in the build.However, in some rare cases, the race condition no longer was benign. The build also produces a corresponding static library,
$(LIBRARY)
, e.g.libpython$(VERSION)$(ABIFLAGS).a
- which in the end would be named similarly,libpython3.11.a
, when$(LDLIBRARY)
would belibpython3.11.dll.a
.If the static library exists but the import library doesn't, then most modules would still fail to link, but a few ones wouldn't (
select
,_multiprocessing
,_overlapped
and_socket
). The ones that did succeed linking with the static library would crash at runtime though.By making sure that the right, intended library to fulfill the linker parameter
-lpython3.11
exists before building the shared modules, we avoid the whole race condition that in some rare cases could produce a Python build that crashes at runtime.For Linux targets, this extra dependency is unnecessary, but should not cause other problems (
$(LDLIBRARY)
is set to the same as$(LIBRARY)
if not building any shared library).This fixes MSYS2 cpython-mingw issue #162.