From 88ed1272bb951b11908eb8e55971ca2f4aa8b14c Mon Sep 17 00:00:00 2001 From: Xavier de Gaye Date: Thu, 16 Feb 2017 12:04:48 +0100 Subject: [PATCH 1/2] bpo-20210: support the *disabled* marker in Setup files --- Makefile.pre.in | 7 ++++--- Modules/Setup.dist | 29 +++++++++++++++++++--------- Modules/makesetup | 21 +++++++++++++++++---- setup.py | 47 +++++++++++++++++++++++++++++++++------------- 4 files changed, 75 insertions(+), 29 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in index f99e64e0d97156..3151930ddc143c 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/Modules/Setup.dist b/Modules/Setup.dist index 8b87fc8143f089..6b4c217b0a4cbe 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 d6f766e1413e73..31faf861d1b6f9 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 3b3d097454211c..b448f722dd97cb 100644 --- a/setup.py +++ b/setup.py @@ -229,11 +229,14 @@ def build_extensions(self): 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 @@ def build_extensions(self): # 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 @@ def print_three_column(lst): " 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[:] From 5e0bf6193f241c29d1e98b0e72fc35bad4ae5341 Mon Sep 17 00:00:00 2001 From: Xavier de Gaye Date: Wed, 24 May 2017 16:18:01 +0200 Subject: [PATCH 2/2] Add a NEWS entry. --- Misc/NEWS | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Misc/NEWS b/Misc/NEWS index 51055ef6f6f5ba..af872987c459a4 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -715,6 +715,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. + - Issue #27659: Prohibit implicit C function declarations: use -Werror=implicit-function-declaration when possible (GCC and Clang, but it depends on the compiler version). Patch written by Chi Hsuan Yen. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy