diff options
-rw-r--r-- | Makefile.pre.in | 1 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rwxr-xr-x | Modules/makesetup | 5 | ||||
-rw-r--r-- | setup.py | 43 |
4 files changed, 28 insertions, 23 deletions
diff --git a/Makefile.pre.in b/Makefile.pre.in index 7ec7ee1a46..51904366a0 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -20,6 +20,7 @@ # === Variables set by makesetup === +MODNAMES= _MODNAMES_ MODOBJS= _MODOBJS_ MODLIBS= _MODLIBS_ @@ -95,6 +95,8 @@ Windows Build ----- +- Issue #28444: Fix missing extensions modules when cross compiling. + - Issue #28208: Update Windows build to use SQLite 3.14.2.0. - Issue #28248: Update Windows build to use OpenSSL 1.0.2j. diff --git a/Modules/makesetup b/Modules/makesetup index 3297b78a20..e204a0595c 100755 --- a/Modules/makesetup +++ b/Modules/makesetup @@ -29,6 +29,7 @@ # # Copying Makefile.pre to Makefile: # - insert an identifying comment at the start +# - replace _MODNAMES_ by the list of modules from Setup # - replace _MODOBJS_ by the list of objects from Setup (except for # Setup files after a -n option) # - replace _MODLIBS_ by the list of libraries from Setup @@ -110,6 +111,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | # Rules appended by makedepend " >$rulesf DEFS= + NAMES= MODS= SHAREDMODS= OBJS= @@ -181,7 +183,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | *.*) echo 1>&2 "bad word $arg in $line" exit 1;; -u) skip=libs; libs="$libs -u";; - [a-zA-Z_]*) mods="$mods $arg";; + [a-zA-Z_]*) NAMES="$NAMES $arg"; mods="$mods $arg";; *) echo 1>&2 "bad word $arg in $line" exit 1;; esac @@ -280,6 +282,7 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' | echo "1i\\" >$sedf str="# Generated automatically from $makepre by makesetup." echo "$str" >>$sedf + echo "s%_MODNAMES_%$NAMES%" >>$sedf echo "s%_MODOBJS_%$OBJS%" >>$sedf echo "s%_MODLIBS_%$LIBS%" >>$sedf echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf @@ -8,7 +8,6 @@ import importlib.util import sysconfig from distutils import log -from distutils import text_file from distutils.errors import * from distutils.core import Extension, setup from distutils.command.build_ext import build_ext @@ -230,7 +229,12 @@ class PyBuildExt(build_ext): headers = [sysconfig.get_config_h_filename()] headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) - for ext in self.extensions[:]: + # The sysconfig variable built by makesetup, listing the already + # built modules as configured by the Setup files. + modnames = sysconfig.get_config_var('MODNAMES').split() + + removed_modules = [] + for ext in self.extensions: ext.sources = [ find_module_file(filename, moddirlist) for filename in ext.sources ] if ext.depends is not None: @@ -241,26 +245,14 @@ class PyBuildExt(build_ext): # re-compile extensions if a header file has been changed ext.depends.extend(headers) - # If a module has already been built statically, - # don't build it here - if ext.name in sys.builtin_module_names: - self.extensions.remove(ext) - - # Parse Modules/Setup and Modules/Setup.local to figure out which - # modules are turned on in the file. - remove_modules = [] - for filename in ('Modules/Setup', 'Modules/Setup.local'): - input = text_file.TextFile(filename, join_lines=1) - while 1: - line = input.readline() - if not line: break - line = line.split() - remove_modules.append(line[0]) - input.close() - - for ext in self.extensions[:]: - if ext.name in remove_modules: - self.extensions.remove(ext) + # If a module has already been built by the Makefile, + # don't build it here. + if ext.name in modnames: + removed_modules.append(ext) + + if removed_modules: + self.extensions = [x for x in self.extensions if x not in + removed_modules] # When you run "make CC=altcc" or something similar, you really want # those environment variables passed into the setup.py phase. Here's @@ -303,6 +295,13 @@ class PyBuildExt(build_ext): " detect_modules() for the module's name.") print() + if removed_modules: + print("The following modules found by detect_modules() in" + " setup.py, have been") + print("built by the Makefile instead, as configured by the" + " Setup files:") + print_three_column([ext.name for ext in removed_modules]) + if self.failed: failed = self.failed[:] print() |