]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #28444: Fix missing extensions modules when cross compiling.
authorXavier de Gaye <xdegaye@users.sourceforge.net>
Sat, 29 Oct 2016 14:57:20 +0000 (16:57 +0200)
committerXavier de Gaye <xdegaye@users.sourceforge.net>
Sat, 29 Oct 2016 14:57:20 +0000 (16:57 +0200)
Makefile.pre.in
Misc/NEWS
Modules/makesetup
setup.py

index b379ce9b1ee3246780790c2c26c1c36f58f9c30d..ba633da5867822b63b1e8e220d22f8d099957a9d 100644 (file)
@@ -20,6 +20,7 @@
 
 # === Variables set by makesetup ===
 
+MODNAMES=       _MODNAMES_
 MODOBJS=        _MODOBJS_
 MODLIBS=        _MODLIBS_
 
index 7b1d9d94fe1688275b6abbbd104446d26dfe1c30..2e87316ef1145dc93781e7e8965a731249766609 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -502,6 +502,8 @@ Windows
 Build
 -----
 
+- Issue #28444: Fix missing extensions modules when cross compiling.
+
 - Issue #28248: Update Windows build to use OpenSSL 1.0.2j.
 
 - Issue #28258: Fixed build with Estonian locale (python-config and distclean
index 3297b78a20d3dc0f7593145bd12d4a4b8d32c705..e204a0595cd7adffd30fb62b5279f1b2e6062b69 100755 (executable)
@@ -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
index 29ff1a836d642a1f27b4b0be0098e9941c2d4d5b..40f8bf20ee746c6120cb98e512da0190d1116a46 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -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()