]> granicus.if.org Git - python/commitdiff
bpo-20210: Support the *disabled* marker in Setup files (GH-132)
authorxdegaye <xdegaye@gmail.com>
Sat, 27 May 2017 16:25:03 +0000 (18:25 +0200)
committerGitHub <noreply@github.com>
Sat, 27 May 2017 16:25:03 +0000 (18:25 +0200)
Extension modules listed after the *disabled* marker are not built at all,
neither by the Makefile nor by setup.py.

Makefile.pre.in
Misc/NEWS
Modules/Setup.dist
Modules/makesetup
setup.py

index 21418055aa8f27cf37efe1e6dbce1615bd04025c..0aefcf2a307cfad284f80112e9b018d46a301b47 100644 (file)
 
 # === Variables set by makesetup ===
 
-MODNAMES=       _MODNAMES_
-MODOBJS=        _MODOBJS_
-MODLIBS=        _MODLIBS_
+MODBUILT_NAMES=    _MODBUILT_NAMES_
+MODDISABLED_NAMES= _MODDISABLED_NAMES_
+MODOBJS=           _MODOBJS_
+MODLIBS=           _MODLIBS_
 
 # === Variables set by configure
 VERSION=       @VERSION@
index 6b8809e1b583b956ecc45a3f0578b89de57e7c7b..0b479e868f47f94fbcd81da0bb2768006e3e1f4c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1122,6 +1122,10 @@ Documentation
 Build
 -----
 
+- bpo-20210: Support the *disabled* marker in Setup files. Extension modules
+  listed after this marker are not built at all, neither by the Makefile nor by
+  setup.py.
+
 - bpo-29941: Add ``--with-assertions`` configure flag to explicitly enable
   C ``assert()`` checks. Defaults to off. ``--with-pydebug`` implies
   ``--with-assertions``.
index 8b87fc8143f089df76d175a0587bbeda5ace886d..6b4c217b0a4cbef0f4c5c8b1e38facc5f60e942f 100644 (file)
 # directory.)
 
 # Each line in this file describes one or more optional modules.
-# Modules enabled here will not be compiled by the setup.py script,
+# Modules configured here will not be compiled by the setup.py script,
 # so the file can be used to override setup.py's behavior.
+# Tag lines containing just the word "*static*", "*shared*" or "*disabled*"
+# (without the quotes but with the stars) are used to tag the following module
+# descriptions. Tag lines may alternate throughout this file.  Modules are
+# built statically when they are preceded by a "*static*" tag line or when
+# there is no tag line between the start of the file and the module
+# description.  Modules are built as a shared library when they are preceded by
+# a "*shared*" tag line.  Modules are not built at all, not by the Makefile,
+# nor by the setup.py script, when they are preceded by a "*disabled*" tag
+# line.
 
 # Lines have the following structure:
 #
@@ -34,9 +43,7 @@
 #
 # which defines a Make variable definition inserted into Makefile.in
 #
-# Finally, if a line contains just the word "*shared*" (without the
-# quotes but with the stars), then the following modules will not be
-# built statically.  The build process works like this:
+# The build process works like this:
 #
 # 1. Build all modules that are declared as static in Modules/Setup,
 #    combine them into libpythonxy.a, combine that into python.
 # toplevel "make install" target.)  (For compatibility,
 # *noconfig* has the same effect as *shared*.)
 #
-# In addition, *static* explicitly declares the following modules to
-# be static.  Lines containing "*static*" and "*shared*" may thus
-# alternate throughout this file.
-
 # NOTE: As a standard policy, as many modules as can be supported by a
 # platform should be present.  The distribution comes with all modules
 # enabled that are supported by most platforms and don't require you
@@ -152,7 +155,7 @@ _symtable symtablemodule.c
 
 # Uncommenting the following line tells makesetup that all following
 # modules are to be built as shared libraries (see above for more
-# detail; also note that *static* reverses this effect):
+# detail; also note that *static* or *disabled* cancels this effect):
 
 #*shared*
 
@@ -394,3 +397,11 @@ _symtable symtablemodule.c
 
 # Another example -- the 'xxsubtype' module shows C-level subtyping in action
 xxsubtype xxsubtype.c
+
+# Uncommenting the following line tells makesetup that all following modules
+# are not built (see above for more detail).
+#
+#*disabled*
+#
+#_sqlite3 _tkinter _curses pyexpat
+#_codecs_jp _codecs_kr _codecs_tw unicodedata
index d6f766e1413e7315708e80e86a1d6ff5bae39d6b..31faf861d1b6f9e525dc72d72ebfd773b3000aa0 100755 (executable)
@@ -29,7 +29,9 @@
 #
 # Copying Makefile.pre to Makefile:
 # - insert an identifying comment at the start
-# - replace _MODNAMES_ by the list of modules from Setup
+# - replace _MODBUILT_NAMES_ by the list of *static* and *shared* modules
+#   from Setup
+# - replace _MODDISABLED_NAMES_ by the list of *disabled* 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
@@ -111,7 +113,8 @@ sed -e 's/[         ]*#.*//' -e '/^[        ]*$/d' |
 # Rules appended by makedepend
 " >$rulesf
        DEFS=
-       NAMES=
+       BUILT=
+       DISABLED=
        MODS=
        SHAREDMODS=
        OBJS=
@@ -143,6 +146,7 @@ sed -e 's/[         ]*#.*//' -e '/^[        ]*$/d' |
                '*static*')     doconfig=yes; continue;;
                '*noconfig*')   doconfig=no; continue;;
                '*shared*')     doconfig=no; continue;;
+               '*disabled*')   doconfig=disabled; continue;;
                esac
                srcs=
                cpps=
@@ -183,7 +187,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_]*)     NAMES="$NAMES $arg"; mods="$mods $arg";;
+                       [a-zA-Z_]*)     mods="$mods $arg";;
                        *)              echo 1>&2 "bad word $arg in $line"
                                        exit 1;;
                        esac
@@ -192,6 +196,14 @@ sed -e 's/[        ]*#.*//' -e '/^[        ]*$/d' |
                yes)
                        LIBS="$LIBS $libs"
                        MODS="$MODS $mods"
+                       BUILT="$BUILT $mods"
+                       ;;
+               no)
+                       BUILT="$BUILT $mods"
+                       ;;
+               disabled)
+                       DISABLED="$DISABLED $mods"
+                       continue
                        ;;
                esac
                case $noobjects in
@@ -282,7 +294,8 @@ 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%_MODBUILT_NAMES_%$BUILT%" >>$sedf
+               echo "s%_MODDISABLED_NAMES_%$DISABLED%" >>$sedf
                echo "s%_MODOBJS_%$OBJS%" >>$sedf
                echo "s%_MODLIBS_%$LIBS%" >>$sedf
                echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf
index 6a05643838bb4ef64ae093f7a0f816a80d6f09f4..41aad8210d82672acc9a477fd62e86a4d0dc0fed 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -229,11 +229,14 @@ class PyBuildExt(build_ext):
         headers = [sysconfig.get_config_h_filename()]
         headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
 
-        # 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 = []
+        # 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()
+
+        mods_built = []
+        mods_disabled = []
         for ext in self.extensions:
             ext.sources = [ find_module_file(filename, moddirlist)
                             for filename in ext.sources ]
@@ -245,14 +248,22 @@ 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 by the Makefile,
-            # don't build it here.
-            if ext.name in modnames:
-                removed_modules.append(ext)
+            # If a module has already been built or has been disabled in the
+            # Setup files, don't build it here.
+            if ext.name in sysconf_built:
+                mods_built.append(ext)
+            if ext.name in sysconf_dis:
+                mods_disabled.append(ext)
 
-        if removed_modules:
+        mods_configured = mods_built + mods_disabled
+        if mods_configured:
             self.extensions = [x for x in self.extensions if x not in
-                               removed_modules]
+                               mods_configured]
+            # Remove the shared libraries built by a previous build.
+            for ext in mods_configured:
+                fullpath = self.get_ext_fullpath(ext.name)
+                if os.path.exists(fullpath):
+                    os.unlink(fullpath)
 
         # When you run "make CC=altcc" or something similar, you really want
         # those environment variables passed into the setup.py phase.  Here's
@@ -295,12 +306,22 @@ class PyBuildExt(build_ext):
                   " detect_modules() for the module's name.")
             print()
 
-        if removed_modules:
+        if mods_built:
+            print()
             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])
+            print_three_column([ext.name for ext in mods_built])
+            print()
+
+        if mods_disabled:
+            print()
+            print("The following modules found by detect_modules() in"
+            " setup.py have not")
+            print("been built, they are *disabled* in the Setup files:")
+            print_three_column([ext.name for ext in mods_disabled])
+            print()
 
         if self.failed:
             failed = self.failed[:]