Thanks to visit codestin.com
Credit goes to github.com

Skip to content

bpo-20210: support the *disabled* marker in Setup files #132

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
May 27, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -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@
Expand Down
4 changes: 4 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,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``.
Expand Down
29 changes: 20 additions & 9 deletions Modules/Setup.dist
Original file line number Diff line number Diff line change
Expand Up @@ -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:
#
Expand All @@ -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.
Expand All @@ -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
Expand Down Expand Up @@ -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*

Expand Down Expand Up @@ -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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It makes me a little sad that this is supported syntax for the Setup file (multiple module names on a line), but since this is already the case, might as well use it.

#_codecs_jp _codecs_kr _codecs_tw unicodedata
21 changes: 17 additions & 4 deletions Modules/makesetup
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -111,7 +113,8 @@ sed -e 's/[ ]*#.*//' -e '/^[ ]*$/d' |
# Rules appended by makedepend
" >$rulesf
DEFS=
NAMES=
BUILT=
DISABLED=
MODS=
SHAREDMODS=
OBJS=
Expand Down Expand Up @@ -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=
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
47 changes: 34 additions & 13 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 ]
Expand All @@ -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
Expand Down Expand Up @@ -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[:]
Expand Down