diff -r 849826a900d2 Makefile.pre.in --- a/Makefile.pre.in Tue Oct 25 21:49:19 2016 -0500 +++ b/Makefile.pre.in Thu Oct 27 11:26:03 2016 +0200 @@ -20,6 +20,7 @@ # === Variables set by makesetup === +MODNAMES= _MODNAMES_ MODOBJS= _MODOBJS_ MODLIBS= _MODLIBS_ diff -r 849826a900d2 Modules/makesetup --- a/Modules/makesetup Tue Oct 25 21:49:19 2016 -0500 +++ b/Modules/makesetup Thu Oct 27 11:26:03 2016 +0200 @@ -29,6 +29,7 @@ # # Copying Makefile.pre to Makefile: # - insert an identifying comment at the start +# - replace _MODNAMES_ by the list of 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 @@ -110,6 +111,7 @@ # Rules appended by makedepend " >$rulesf DEFS= + NAMES= MODS= SHAREDMODS= OBJS= @@ -181,7 +183,7 @@ *.*) echo 1>&2 "bad word $arg in $line" exit 1;; -u) skip=libs; libs="$libs -u";; - [a-zA-Z_]*) mods="$mods $arg";; + [a-zA-Z_]*) NAMES="$NAMES $arg"; mods="$mods $arg";; *) echo 1>&2 "bad word $arg in $line" exit 1;; esac @@ -280,6 +282,7 @@ echo "1i\\" >$sedf str="# Generated automatically from $makepre by makesetup." echo "$str" >>$sedf + echo "s%_MODNAMES_%$NAMES%" >>$sedf echo "s%_MODOBJS_%$OBJS%" >>$sedf echo "s%_MODLIBS_%$LIBS%" >>$sedf echo "/Definitions added by makesetup/a$NL$NL$DEFS" >>$sedf diff -r 849826a900d2 setup.py --- a/setup.py Tue Oct 25 21:49:19 2016 -0500 +++ b/setup.py Thu Oct 27 11:26:03 2016 +0200 @@ -8,7 +8,6 @@ import sysconfig from distutils import log -from distutils import text_file from distutils.errors import * from distutils.core import Extension, setup from distutils.command.build_ext import build_ext @@ -230,7 +229,12 @@ headers = [sysconfig.get_config_h_filename()] headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) - for ext in self.extensions[:]: + # 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 = [] + for ext in self.extensions: ext.sources = [ find_module_file(filename, moddirlist) for filename in ext.sources ] if ext.depends is not None: @@ -241,26 +245,14 @@ # re-compile extensions if a header file has been changed ext.depends.extend(headers) - # If a module has already been built statically, - # don't build it here - if ext.name in sys.builtin_module_names: - self.extensions.remove(ext) + # If a module has already been built by the Makefile, + # don't build it here. + if ext.name in modnames: + removed_modules.append(ext) - # Parse Modules/Setup and Modules/Setup.local to figure out which - # modules are turned on in the file. - remove_modules = [] - for filename in ('Modules/Setup', 'Modules/Setup.local'): - input = text_file.TextFile(filename, join_lines=1) - while 1: - line = input.readline() - if not line: break - line = line.split() - remove_modules.append(line[0]) - input.close() - - for ext in self.extensions[:]: - if ext.name in remove_modules: - self.extensions.remove(ext) + if removed_modules: + self.extensions = [x for x in self.extensions if x not in + removed_modules] # When you run "make CC=altcc" or something similar, you really want # those environment variables passed into the setup.py phase. Here's @@ -303,6 +295,13 @@ " detect_modules() for the module's name.") print() + if removed_modules: + 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]) + if self.failed: failed = self.failed[:] print()