diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index f205dcadebd..e9cc4a95d4d 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -242,6 +242,8 @@ def get_makefile_filename(): 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 --git a/Lib/plat-linux/regen b/Lib/plat-linux/regen index c76950e2324..10633cbc9a9 100755 --- a/Lib/plat-linux/regen +++ b/Lib/plat-linux/regen @@ -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 --git a/Lib/sysconfig.py b/Lib/sysconfig.py index f18b1bc9580..ef530617a35 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -337,6 +337,8 @@ def get_makefile_filename(): 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 @@ def _generate_posix_vars(): # _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 _generate_posix_vars(): 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 --git a/Makefile.pre.in b/Makefile.pre.in index 02a0b64bb5a..394a73535f5 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -109,6 +109,7 @@ MACHDEP= @MACHDEP@ # Multiarch directory (may be empty) MULTIARCH= @MULTIARCH@ +MULTIARCH_CPPFLAGS = @MULTIARCH_CPPFLAGS@ # Install prefix for architecture-independent files prefix= @prefix@ @@ -784,6 +785,7 @@ Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile 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) @@ -1263,7 +1265,7 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c 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); \ @@ -1298,6 +1300,10 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c 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 \ @@ -1336,13 +1342,19 @@ libinstall: build_all $(srcdir)/Lib/$(PLATDIR) $(srcdir)/Modules/xxmodule.c $(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 \ @@ -1350,6 +1362,7 @@ $(srcdir)/Lib/$(PLATDIR): 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 @@ -1448,7 +1461,7 @@ sharedinstall: sharedmods --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 @@ -1627,6 +1640,9 @@ clobber: clean profile-removal -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 --git a/Misc/NEWS b/Misc/NEWS index 956303a3a18..46e4296d235 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -25,6 +25,16 @@ IDLE - Issue #27310: Fix IDLE.app failure to launch on OS X due to vestigial import. +Build +----- + +- Issue #23968: Rename the platform directory from plat-$(MACHDEP) to + plat-$(PLATFORM_TRIPLET). + Rename the config directory (LIBPL) from config-$(LDVERSION) to + config-$(LDVERSION)-$(PLATFORM_TRIPLET). + Install the platform specifc _sysconfigdata module into the platform + directory and rename it to include the ABIFLAGS. + What's New in Python 3.6.0 alpha 2 ================================== diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b5199125a55..56175d9544e 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1693,6 +1693,16 @@ make_impl_info(PyObject *version_info) 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 --git a/configure b/configure index da4a59a96a5..38537162278 100755 --- a/configure +++ b/configure @@ -704,6 +704,7 @@ LIBRARY BUILDEXEEXT EGREP NO_AS_NEEDED +MULTIARCH_CPPFLAGS PLATFORM_TRIPLET PLATDIR MULTIARCH @@ -776,6 +777,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -886,6 +888,7 @@ datadir='${datarootdir}' 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 @@ do | -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 @@ fi 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 @@ Fine tuning of the installation directories: --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] @@ -2877,6 +2890,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 @@ -5332,9 +5346,16 @@ if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then 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 @@ -14768,7 +14789,11 @@ LDVERSION='$(VERSION)$(ABIFLAGS)' $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 --git a/configure.ac b/configure.ac index 1fbc655d449..fa1bdec1385 100644 --- a/configure.ac +++ b/configure.ac @@ -872,10 +872,17 @@ if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then 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 @@ AC_MSG_RESULT($LDVERSION) 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