From c0364fc7c2693fb070917ee62aeb8d2551710821 Mon Sep 17 00:00:00 2001 From: xdegaye Date: Sat, 27 May 2017 18:25:03 +0200 Subject: 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. --- Makefile.pre.in | 7 ++++--- Misc/NEWS | 4 ++++ Modules/Setup.dist | 29 ++++++++++++++++++++--------- Modules/makesetup | 21 +++++++++++++++++---- setup.py | 47 ++++++++++++++++++++++++++++++++++------------- 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[:] -- cgit v0.12