diff -r 6247dd0f230e Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py Sat Jun 04 14:40:03 2016 -0700 +++ b/Lib/distutils/sysconfig.py Sun Jun 05 00:38:11 2016 +0200 @@ -242,6 +242,8 @@ return os.path.join(_sys_home or project_base, "Makefile") lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) + if hasattr(sys.implementation, '_multiarch'): + config_file += '-%s' % sys.implementation._multiarch return os.path.join(lib_dir, config_file, 'Makefile') diff -r 6247dd0f230e Lib/plat-linux/regen --- a/Lib/plat-linux/regen Sat Jun 04 14:40:03 2016 -0700 +++ b/Lib/plat-linux/regen Sun Jun 05 00:38:11 2016 +0200 @@ -1,8 +1,33 @@ #! /bin/sh case `uname` in -Linux*) ;; +Linux*|GNU*) ;; *) echo Probably not on a Linux system 1>&2 exit 1;; esac -set -v -h2py -i '(u_long)' /usr/include/sys/types.h /usr/include/netinet/in.h /usr/include/dlfcn.h +if [ -z "$CC" ]; then + echo >&2 "$(basename $0): CC is not set" + exit 1 +fi +headers="sys/types.h netinet/in.h dlfcn.h" +incdirs="$(echo $($CC -v -E - < /dev/null 2>&1|awk '/^#include/, /^End of search/' | grep '^ '))" +if [ -z "$incdirs" ]; then + incdirs="/usr/include" +fi +for h in $headers; do + absh= + for d in $incdirs; do + if [ -f "$d/$h" ]; then + absh="$d/$h" + break + fi + done + if [ -n "$absh" ]; then + absheaders="$absheaders $absh" + else + echo >&2 "$(basename $0): header $h not found" + exit 1 + fi +done + +set -x +${H2PY:-h2py} -i '(u_long)' $absheaders diff -r 6247dd0f230e Lib/sysconfig.py --- a/Lib/sysconfig.py Sat Jun 04 14:40:03 2016 -0700 +++ b/Lib/sysconfig.py Sun Jun 05 00:38:11 2016 +0200 @@ -337,6 +337,8 @@ config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) else: config_dir_name = 'config' + if hasattr(sys.implementation, '_multiarch'): + config_dir_name += '-%s' % sys.implementation._multiarch return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') def _generate_posix_vars(): @@ -379,7 +381,7 @@ # _sysconfigdata module manually and populate it with the build vars. # This is more than sufficient for ensuring the subsequent call to # get_platform() succeeds. - name = '_sysconfigdata' + name = '_sysconfigdata_' + sys.abiflags if 'darwin' in sys.platform: import types module = types.ModuleType(name) @@ -405,7 +407,9 @@ def _init_posix(vars): """Initialize the module as appropriate for POSIX systems.""" # _sysconfigdata is generated at build time, see _generate_posix_vars() - from _sysconfigdata import build_time_vars + name = '_sysconfigdata_' + sys.abiflags + _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0) + build_time_vars = _temp.build_time_vars vars.update(build_time_vars) def _init_non_posix(vars): diff -r 6247dd0f230e Makefile.pre.in --- a/Makefile.pre.in Sat Jun 04 14:40:03 2016 -0700 +++ b/Makefile.pre.in Sun Jun 05 00:38:11 2016 +0200 @@ -109,6 +109,7 @@ # Multiarch directory (may be empty) MULTIARCH= @MULTIARCH@ +MULTIARCH_CPPFLAGS = @MULTIARCH_CPPFLAGS@ # Install prefix for architecture-independent files prefix= @prefix@ @@ -784,6 +785,7 @@ Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(CC) -c $(PY_CORE_CFLAGS) \ -DABIFLAGS='"$(ABIFLAGS)"' \ + $(MULTIARCH_CPPFLAGS) \ -o $@ $(srcdir)/Python/sysmodule.c $(IO_OBJS): $(IO_H) @@ -1259,7 +1261,7 @@ else true; \ fi; \ done - @for i in $(srcdir)/Lib/*.py `cat pybuilddir.txt`/_sysconfigdata.py; \ + @for i in $(srcdir)/Lib/*.py; \ do \ if test -x $$i; then \ $(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \ @@ -1294,6 +1296,10 @@ esac; \ done; \ done + $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS).py \ + $(DESTDIR)$(LIBDEST)/$(PLATDIR); \ + echo $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS).py \ + $(LIBDEST)/$(PLATDIR) $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt if test -d $(DESTDIR)$(LIBDEST)/distutils/tests; then \ $(INSTALL_DATA) $(srcdir)/Modules/xxmodule.c \ @@ -1332,13 +1338,19 @@ $(PYTHON_FOR_BUILD) -m lib2to3.pgen2.driver $(DESTDIR)$(LIBDEST)/lib2to3/PatternGrammar.txt # Create the PLATDIR source directory, if one wasn't distributed.. +# For multiarch targets, use the plat-linux/regen script. $(srcdir)/Lib/$(PLATDIR): mkdir $(srcdir)/Lib/$(PLATDIR) - cp $(srcdir)/Lib/plat-generic/regen $(srcdir)/Lib/$(PLATDIR)/regen + if [ -n "$(MULTIARCH)" ]; then \ + cp $(srcdir)/Lib/plat-linux/regen $(srcdir)/Lib/$(PLATDIR)/regen; \ + else \ + cp $(srcdir)/Lib/plat-generic/regen $(srcdir)/Lib/$(PLATDIR)/regen; \ + fi; \ export PATH; PATH="`pwd`:$$PATH"; \ export PYTHONPATH; PYTHONPATH="`pwd`/Lib"; \ export DYLD_FRAMEWORK_PATH; DYLD_FRAMEWORK_PATH="`pwd`"; \ export EXE; EXE="$(BUILDEXE)"; \ + export CC; CC="$(CC)"; \ if [ -n "$(MULTIARCH)" ]; then export MULTIARCH; MULTIARCH=$(MULTIARCH); fi; \ export PYTHON_FOR_BUILD; \ if [ "$(BUILD_GNU_TYPE)" = "$(HOST_GNU_TYPE)" ]; then \ @@ -1346,6 +1358,7 @@ else \ PYTHON_FOR_BUILD="$(PYTHON_FOR_BUILD)"; \ fi; \ + export H2PY; H2PY="$$PYTHON_FOR_BUILD $(abs_srcdir)/Tools/scripts/h2py.py"; \ cd $(srcdir)/Lib/$(PLATDIR); $(RUNSHARED) ./regen python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh @@ -1444,7 +1457,7 @@ --install-scripts=$(BINDIR) \ --install-platlib=$(DESTSHARED) \ --root=$(DESTDIR)/ - -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata.py + -rm $(DESTDIR)$(DESTSHARED)/_sysconfigdata_$(ABIFLAGS).py -rm -r $(DESTDIR)$(DESTSHARED)/__pycache__ # Here are a couple of targets for MacOSX again, to install a full @@ -1623,6 +1636,9 @@ -rm -rf build platform -rm -rf $(PYTHONFRAMEWORKDIR) -rm -f python-config.py python-config + if [ -n "$(MULTIARCH)" ]; then \ + rm -rf $(srcdir)/Lib/$(PLATDIR); \ + fi # Make things extra clean, before making a distribution: # remove all generated files, even Makefile[.pre] diff -r 6247dd0f230e Python/sysmodule.c --- a/Python/sysmodule.c Sat Jun 04 14:40:03 2016 -0700 +++ b/Python/sysmodule.c Sun Jun 05 00:38:11 2016 +0200 @@ -1693,6 +1693,16 @@ if (res < 0) goto error; +#ifdef MULTIARCH + value = PyUnicode_FromString(MULTIARCH); + if (value == NULL) + goto error; + res = PyDict_SetItemString(impl_info, "_multiarch", value); + Py_DECREF(value); + if (res < 0) + goto error; +#endif + /* dict ready */ ns = _PyNamespace_New(impl_info); diff -r 6247dd0f230e configure --- a/configure Sat Jun 04 14:40:03 2016 -0700 +++ b/configure Sun Jun 05 00:38:11 2016 +0200 @@ -704,6 +704,7 @@ BUILDEXEEXT EGREP NO_AS_NEEDED +MULTIARCH_CPPFLAGS PLATFORM_TRIPLET PLATDIR MULTIARCH @@ -776,6 +777,7 @@ docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -886,6 +888,7 @@ sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1138,6 +1141,15 @@ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1275,7 +1287,7 @@ for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1428,6 +1440,7 @@ --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -2876,6 +2889,7 @@ ac_config_headers="$ac_config_headers pyconfig.h" + ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then @@ -5331,9 +5345,16 @@ as_fn_error $? "internal configure error for the platform triplet, please file a bug report" "$LINENO" 5 fi fi -PLATDIR=plat-$MACHDEP - - +if test x$PLATFORM_TRIPLET = x; then + PLATDIR=plat-$MACHDEP +else + PLATDIR=plat-$PLATFORM_TRIPLET +fi + + +if test x$MULTIARCH != x; then + MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\"" +fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Wl,--no-as-needed" >&5 @@ -14767,7 +14788,11 @@ $as_echo "$LDVERSION" >&6; } -LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" +if test x$PLATFORM_TRIPLET = x; then + LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" +else + LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" +fi # Check whether right shifting a negative integer extends the sign bit diff -r 6247dd0f230e configure.ac --- a/configure.ac Sat Jun 04 14:40:03 2016 -0700 +++ b/configure.ac Sun Jun 05 00:38:11 2016 +0200 @@ -872,10 +872,17 @@ AC_MSG_ERROR([internal configure error for the platform triplet, please file a bug report]) fi fi -PLATDIR=plat-$MACHDEP +if test x$PLATFORM_TRIPLET = x; then + PLATDIR=plat-$MACHDEP +else + PLATDIR=plat-$PLATFORM_TRIPLET +fi AC_SUBST(PLATDIR) AC_SUBST(PLATFORM_TRIPLET) - +if test x$MULTIARCH != x; then + MULTIARCH_CPPFLAGS="-DMULTIARCH=\\\"$MULTIARCH\\\"" +fi +AC_SUBST(MULTIARCH_CPPFLAGS) AC_MSG_CHECKING([for -Wl,--no-as-needed]) save_LDFLAGS="$LDFLAGS" @@ -4462,7 +4469,11 @@ dnl define LIBPL after ABIFLAGS and LDVERSION is defined. AC_SUBST(PY_ENABLE_SHARED) -LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" +if test x$PLATFORM_TRIPLET = x; then + LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}" +else + LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}" +fi AC_SUBST(LIBPL) # Check whether right shifting a negative integer extends the sign bit