summaryrefslogtreecommitdiff
path: root/python2.7/patches/issue9189.diff
diff options
context:
space:
mode:
Diffstat (limited to 'python2.7/patches/issue9189.diff')
-rw-r--r--python2.7/patches/issue9189.diff342
1 files changed, 342 insertions, 0 deletions
diff --git a/python2.7/patches/issue9189.diff b/python2.7/patches/issue9189.diff
new file mode 100644
index 0000000..e553893
--- /dev/null
+++ b/python2.7/patches/issue9189.diff
@@ -0,0 +1,342 @@
+Index: b/Lib/sysconfig.py
+===================================================================
+--- a/Lib/sysconfig.py
++++ b/Lib/sysconfig.py
+@@ -227,11 +227,19 @@
+ done[n] = v
+
+ # do variable interpolation here
+- while notdone:
+- for name in notdone.keys():
++ variables = list(notdone.keys())
++
++ # Variables with a 'PY_' prefix in the makefile. These need to
++ # be made available without that prefix through sysconfig.
++ # Special care is needed to ensure that variable expansion works, even
++ # if the expansion uses the name without a prefix.
++ renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
++
++ while len(variables) > 0:
++ for name in tuple(variables):
+ value = notdone[name]
+ m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+- if m:
++ if m is not None:
+ n = m.group(1)
+ found = True
+ if n in done:
+@@ -242,23 +250,48 @@
+ elif n in os.environ:
+ # do it like make: fall back to environment
+ item = os.environ[n]
++
++ elif n in renamed_variables:
++ if name.startswith('PY_') and name[3:] in renamed_variables:
++ item = ""
++
++ elif 'PY_' + n in notdone:
++ found = False
++
++ else:
++ item = str(done['PY_' + n])
++
+ else:
+ done[n] = item = ""
++
+ if found:
+ after = value[m.end():]
+ value = value[:m.start()] + item + after
+ if "$" in after:
+ notdone[name] = value
+ else:
+- try: value = int(value)
++ try:
++ value = int(value)
+ except ValueError:
+ done[name] = value.strip()
+ else:
+ done[name] = value
+- del notdone[name]
++ variables.remove(name)
++
++ if name.startswith('PY_') \
++ and name[3:] in renamed_variables:
++
++ name = name[3:]
++ if name not in done:
++ done[name] = value
++
++
+ else:
+- # bogus variable reference; just drop it since we can't deal
+- del notdone[name]
++ # bogus variable reference (e.g. "prefix=$/opt/python");
++ # just drop it since we can't deal
++ done[name] = value
++ variables.remove(name)
++
+ # strip spurious spaces
+ for k, v in done.items():
+ if isinstance(v, str):
+Index: b/Makefile.pre.in
+===================================================================
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -62,12 +62,18 @@
+ # Compiler options
+ OPT= @OPT@
+ BASECFLAGS= @BASECFLAGS@
+-CFLAGS= $(BASECFLAGS) @CFLAGS@ $(OPT) $(EXTRA_CFLAGS)
++CONFIGURE_CFLAGS= @CFLAGS@
++CONFIGURE_CPPFLAGS= @CPPFLAGS@
++CONFIGURE_LDFLAGS= @LDFLAGS@
++# Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the
++# command line to append to these values without stomping the pre-set
++# values.
++PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS)
+ # Both CPPFLAGS and LDFLAGS need to contain the shell's value for setup.py to
+ # be able to build extension modules using the directories specified in the
+ # environment variables
+-CPPFLAGS= -I. -IInclude -I$(srcdir)/Include @CPPFLAGS@
+-LDFLAGS= @LDFLAGS@
++PY_CPPFLAGS= -I. -IInclude -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS)
++PY_LDFLAGS= $(CONFIGURE_LDFLAGS) $(LDFLAGS)
+ LDLAST= @LDLAST@
+ SGI_ABI= @SGI_ABI@
+ CCSHARED= @CCSHARED@
+@@ -76,7 +82,7 @@
+ # Extra C flags added for building the interpreter object files.
+ CFLAGSFORSHARED=@CFLAGSFORSHARED@
+ # C flags used for building the interpreter object files
+-PY_CFLAGS= $(CFLAGS) $(CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
++PY_CORE_CFLAGS= $(PY_CFLAGS) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) -DPy_BUILD_CORE
+
+
+ # Machine-dependent subdirectories
+@@ -397,7 +403,7 @@
+
+ # Build the interpreter
+ $(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY)
+- $(LINKCC) $(LDFLAGS) $(LINKFORSHARED) -o $@ \
++ $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ \
+ Modules/python.o \
+ $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
+
+@@ -413,7 +419,7 @@
+ s*) quiet="-q";; \
+ *) quiet="";; \
+ esac; \
+- $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' \
++ $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' LDFLAGS='$(PY_LDFLAGS)' OPT='$(OPT)' \
+ ./$(BUILDPYTHON) -E $(srcdir)/setup.py $$quiet build
+
+ # Build static library
+@@ -430,18 +436,18 @@
+
+ libpython$(VERSION).so: $(LIBRARY_OBJS)
+ if test $(INSTSONAME) != $(LDLIBRARY); then \
+- $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
++ $(BLDSHARED) $(PY_LDFLAGS) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+ $(LN) -f $(INSTSONAME) $@; \
+ else \
+- $(BLDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
++ $(BLDSHARED) $(PY_LDFLAGS) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+ fi
+
+ libpython$(VERSION).dylib: $(LIBRARY_OBJS)
+- $(CC) -dynamiclib -Wl,-single_module $(LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(VERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
++ $(CC) -dynamiclib -Wl,-single_module $(PY_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(VERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
+
+
+ libpython$(VERSION).sl: $(LIBRARY_OBJS)
+- $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST)
++ $(LDSHARED) $(PY_LDFLAGS) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST)
+
+ # Copy up the gdb python hooks into a position where they can be automatically
+ # loaded by gdb during Lib/test/test_gdb.py
+@@ -480,7 +486,7 @@
+ # for a shared core library; otherwise, this rule is a noop.
+ $(DLLLIBRARY) libpython$(VERSION).dll.a: $(LIBRARY_OBJS)
+ if test -n "$(DLLLIBRARY)"; then \
+- $(LDSHARED) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \
++ $(LDSHARED) $(PY_LDFLAGS) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \
+ $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST); \
+ else true; \
+ fi
+@@ -524,7 +530,7 @@
+ $(SIGNAL_OBJS) \
+ $(MODOBJS) \
+ $(srcdir)/Modules/getbuildinfo.c
+- $(CC) -c $(PY_CFLAGS) \
++ $(CC) -c $(PY_CORE_CFLAGS) \
+ -DSVNVERSION="\"`LC_ALL=C $(SVNVERSION)`\"" \
+ -DHGVERSION="\"`LC_ALL=C $(HGVERSION)`\"" \
+ -DHGTAG="\"`LC_ALL=C $(HGTAG)`\"" \
+@@ -532,7 +538,7 @@
+ -o $@ $(srcdir)/Modules/getbuildinfo.c
+
+ Modules/getpath.o: $(srcdir)/Modules/getpath.c Makefile
+- $(CC) -c $(PY_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \
++ $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \
+ -DPREFIX='"$(prefix)"' \
+ -DEXEC_PREFIX='"$(exec_prefix)"' \
+ -DVERSION='"$(VERSION)"' \
+@@ -540,7 +546,7 @@
+ -o $@ $(srcdir)/Modules/getpath.c
+
+ Modules/python.o: $(srcdir)/Modules/python.c
+- $(MAINCC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/python.c
++ $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/python.c
+
+
+ # Use a stamp file to prevent make -j invoking pgen twice
+@@ -551,7 +557,7 @@
+ -touch Parser/pgen.stamp
+
+ $(PGEN): $(PGENOBJS)
+- $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
++ $(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)
+
+ Parser/grammar.o: $(srcdir)/Parser/grammar.c \
+ $(srcdir)/Include/token.h \
+@@ -571,10 +577,10 @@
+ Python/compile.o Python/symtable.o Python/ast.o: $(GRAMMAR_H) $(AST_H)
+
+ Python/getplatform.o: $(srcdir)/Python/getplatform.c
+- $(CC) -c $(PY_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c
++ $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c
+
+ Python/importdl.o: $(srcdir)/Python/importdl.c
+- $(CC) -c $(PY_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
++ $(CC) -c $(PY_CORE_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c
+
+ Objects/unicodectype.o: $(srcdir)/Objects/unicodectype.c \
+ $(srcdir)/Objects/unicodetype_db.h
+@@ -1157,7 +1163,7 @@
+
+ # Some make's put the object file in the current directory
+ .c.o:
+- $(CC) -c $(PY_CFLAGS) -o $@ $<
++ $(CC) -c $(PY_CORE_CFLAGS) -o $@ $<
+
+ # Run reindent on the library
+ reindent:
+Index: b/Modules/makesetup
+===================================================================
+--- a/Modules/makesetup
++++ b/Modules/makesetup
+@@ -219,7 +219,7 @@
+ case $doconfig in
+ no) cc="$cc \$(CCSHARED) \$(CFLAGS) \$(CPPFLAGS)";;
+ *)
+- cc="$cc \$(PY_CFLAGS)";;
++ cc="$cc \$(PY_CORE_CFLAGS)";;
+ esac
+ rule="$obj: $src; $cc $cpps -c $src -o $obj"
+ echo "$rule" >>$rulesf
+Index: b/configure.ac
+===================================================================
+--- a/configure.ac
++++ b/configure.ac
+@@ -507,14 +507,13 @@
+ (it is also a good idea to do 'make clean' before compiling)])
+ fi
+
+-# If the user set CFLAGS, use this instead of the automatically
+-# determined setting
+-preset_cflags="$CFLAGS"
+-AC_PROG_CC
+-if test ! -z "$preset_cflags"
+-then
+- CFLAGS=$preset_cflags
++# Don't let AC_PROG_CC set the default CFLAGS. It normally sets -g -O2
++# when the compiler supports them, but we don't always want -O2, and
++# we set -g later.
++if test -z "$CFLAGS"; then
++ CFLAGS=
+ fi
++AC_PROG_CC
+
+ AC_SUBST(CXX)
+ AC_SUBST(MAINCC)
+Index: b/Lib/distutils/sysconfig.py
+===================================================================
+--- a/Lib/distutils/sysconfig.py
++++ b/Lib/distutils/sysconfig.py
+@@ -322,11 +322,19 @@
+ done[n] = v
+
+ # do variable interpolation here
+- while notdone:
+- for name in notdone.keys():
++ variables = list(notdone.keys())
++
++ # Variables with a 'PY_' prefix in the makefile. These need to
++ # be made available without that prefix through sysconfig.
++ # Special care is needed to ensure that variable expansion works, even
++ # if the expansion uses the name without a prefix.
++ renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS')
++
++ while len(variables) > 0:
++ for name in tuple(variables):
+ value = notdone[name]
+ m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
+- if m:
++ if m is not None:
+ n = m.group(1)
+ found = True
+ if n in done:
+@@ -337,25 +345,47 @@
+ elif n in os.environ:
+ # do it like make: fall back to environment
+ item = os.environ[n]
++
++ elif n in renamed_variables:
++ if name.startswith('PY_') and name[3:] in renamed_variables:
++ item = ""
++
++ elif 'PY_' + n in notdone:
++ found = False
++
++ else:
++ item = str(done['PY_' + n])
++
+ else:
+ done[n] = item = ""
++
+ if found:
+ after = value[m.end():]
+ value = value[:m.start()] + item + after
+ if "$" in after:
+ notdone[name] = value
+ else:
+- try: value = int(value)
++ try:
++ value = int(value)
+ except ValueError:
+ done[name] = value.strip()
+ else:
+ done[name] = value
+- del notdone[name]
+- else:
+- # bogus variable reference; just drop it since we can't deal
+- del notdone[name]
++ variables.remove(name)
++
++ if name.startswith('PY_') \
++ and name[3:] in renamed_variables:
+
+- fp.close()
++ name = name[3:]
++ if name not in done:
++ done[name] = value
++
++
++ else:
++ # bogus variable reference (e.g. "prefix=$/opt/python");
++ # just drop it since we can't deal
++ done[name] = value
++ variables.remove(name)
+
+ # strip spurious spaces
+ for k, v in done.items():