summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxdegaye <xdegaye@gmail.com>2017-05-27 16:25:03 (GMT)
committerGitHub <noreply@github.com>2017-05-27 16:25:03 (GMT)
commitc0364fc7c2693fb070917ee62aeb8d2551710821 (patch)
tree101662f28d5f7d8a6d5a2707b59255d88b788ed1
parent346cbd351ee0dd3ab9cb9f0e4cb625556707877e (diff)
downloadcpython-c0364fc7c2693fb070917ee62aeb8d2551710821.zip
cpython-c0364fc7c2693fb070917ee62aeb8d2551710821.tar.gz
cpython-c0364fc7c2693fb070917ee62aeb8d2551710821.tar.bz2
bpo-20210: Support the *disabled* marker in Setup files (GH-132)
Extension modules listed after the *disabled* marker are not built at all, neither by the Makefile nor by setup.py.
-rw-r--r--Makefile.pre.in7
-rw-r--r--Misc/NEWS4
-rw-r--r--Modules/Setup.dist29
-rwxr-xr-xModules/makesetup21
-rw-r--r--setup.py47
5 files changed, 79 insertions, 29 deletions
diff --git a/Makefile.pre.in b/Makefile.pre.in
index 2141805..0aefcf2 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -20,9 +20,10 @@
# === 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@
diff --git a/Misc/NEWS b/Misc/NEWS
index 6b8809e..0b479e8 100644
--- 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``.
diff --git a/Modules/Setup.dist b/Modules/Setup.dist
index 8b87fc8..6b4c217 100644
--- a/Modules/Setup.dist
+++ b/Modules/Setup.dist
@@ -11,8 +11,17 @@
# 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.
@@ -57,10 +64,6 @@
# 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
diff --git a/Modules/makesetup b/Modules/makesetup
index d6f766e..31faf86 100755
--- a/Modules/makesetup
+++ b/Modules/makesetup
@@ -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
diff --git a/setup.py b/setup.py
index 6a05643..41aad82 100644
--- 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[:]