From 0cb33da1cc9cebb9b2d67d446feb1cfd36fe7f55 Mon Sep 17 00:00:00 2001 From: Ned Deily Date: Sun, 2 May 2021 04:48:29 -0400 Subject: bpo-44009: Provide "python3.x-intel64" for Apple Silicon Macs (GH-25804) This allows reliably forcing macOS universal2 framework builds to run under Rosetta 2 Intel-64 emulation on Apple Silicon Macs if needed for testing or when universal2 wheels are not yet available. --- Mac/Makefile.in | 21 +++++++++++++++++++++ Mac/README.rst | 6 ++++++ Makefile.pre.in | 13 +++++++++++++ .../macOS/2021-05-02-03-45-30.bpo-44009.uvhmlh.rst | 4 ++++ configure | 15 ++++++++++----- configure.ac | 12 ++++++++---- 6 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2021-05-02-03-45-30.bpo-44009.uvhmlh.rst diff --git a/Mac/Makefile.in b/Mac/Makefile.in index 0b32673..f969128 100644 --- a/Mac/Makefile.in +++ b/Mac/Makefile.in @@ -20,6 +20,7 @@ FRAMEWORKUNIXTOOLSPREFIX=@FRAMEWORKUNIXTOOLSPREFIX@ PYTHONFRAMEWORK=@PYTHONFRAMEWORK@ PYTHONFRAMEWORKIDENTIFIER=@PYTHONFRAMEWORKIDENTIFIER@ LIPO_32BIT_FLAGS=@LIPO_32BIT_FLAGS@ +LIPO_INTEL64_FLAGS=@LIPO_INTEL64_FLAGS@ CC=@CC@ MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@ export MACOSX_DEPLOYMENT_TARGET @@ -92,6 +93,16 @@ installunixtools: $(LN) -s $(BINDIR)/$${fn} $${fn} ;\ done ;\ fi + -if test "x$(LIPO_INTEL64_FLAGS)" != "x"; then \ + cd "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" && \ + for fn in \ + python3-intel64 \ + ; \ + do \ + rm -f $${fn} ;\ + $(LN) -s $(BINDIR)/$${fn} $${fn} ;\ + done ;\ + fi -if test "x$(ENSUREPIP)" != "xno" ; then \ cd "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" && \ for fn in \ @@ -142,6 +153,16 @@ altinstallunixtools: $(LN) -s $(BINDIR)/$${fn} $${fn} ;\ done ;\ fi + -if test "x$(LIPO_INTEL64_FLAGS)" != "x"; then \ + cd "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" && \ + for fn in \ + python$(VERSION)-intel64 \ + ; \ + do \ + rm -f $${fn} ;\ + $(LN) -s $(BINDIR)/$${fn} $${fn} ;\ + done ;\ + fi -if test "x$(ENSUREPIP)" != "xno" ; then \ cd "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" && \ for fn in \ diff --git a/Mac/README.rst b/Mac/README.rst index 29093e9..35bbfde 100644 --- a/Mac/README.rst +++ b/Mac/README.rst @@ -162,6 +162,9 @@ following combinations of SDKs and universal-archs flavors are available: The makefile for a framework build will also install ``python3.x-32`` binaries when the universal architecture includes at least one 32-bit architecture (that is, for all flavors but ``64-bit`` and ``intel-64``). +It will also install ``python3.x-intel64`` binaries in the ``universal2`` +case to allow easy execution with the Rosetta 2 Intel emulator on Apple +Silicon Macs. Running a specific architecture ............................... @@ -181,6 +184,9 @@ subprocesses also run in 32-bit-mode if the main interpreter does, use a ``python3.x-32`` binary and use the value of ``sys.executable`` as the ``subprocess`` ``Popen`` executable value. +Likewise, use ``python3.x-intel64`` to force execution in ``x86_64`` mode +with ``universal2`` binaries. + Building and using a framework-based Python on macOS ==================================================== diff --git a/Makefile.pre.in b/Makefile.pre.in index 72ccbcf..0836655 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -189,6 +189,9 @@ STRIPFLAG=-s # Flags to lipo to produce a 32-bit-only universal executable LIPO_32BIT_FLAGS=@LIPO_32BIT_FLAGS@ +# Flags to lipo to produce an intel-64-only universal executable +LIPO_INTEL64_FLAGS=@LIPO_INTEL64_FLAGS@ + # Options to enable prebinding (for fast startup prior to Mac OS X 10.3) OTHER_LIBTOOL_OPT=@OTHER_LIBTOOL_OPT@ @@ -1344,6 +1347,12 @@ altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ -output $(DESTDIR)$(BINDIR)/python$(VERSION)-32$(EXE) \ $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ fi + if test "x$(LIPO_INTEL64_FLAGS)" != "x" ; then \ + rm -f $(DESTDIR)$(BINDIR)python$(VERSION)-intel64$(EXE); \ + lipo $(LIPO_INTEL64_FLAGS) \ + -output $(DESTDIR)$(BINDIR)/python$(VERSION)-intel64$(EXE) \ + $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ + fi bininstall: altbininstall if test ! -d $(DESTDIR)$(LIBPC); then \ @@ -1379,6 +1388,10 @@ bininstall: altbininstall rm -f $(DESTDIR)$(BINDIR)/python3-32$(EXE); \ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-32$(EXE) python3-32$(EXE)) \ fi + if test "x$(LIPO_INTEL64_FLAGS)" != "x" ; then \ + rm -f $(DESTDIR)$(BINDIR)/python3-intel64$(EXE); \ + (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-intel64$(EXE) python3-intel64$(EXE)) \ + fi # Install the versioned manual page altmaninstall: diff --git a/Misc/NEWS.d/next/macOS/2021-05-02-03-45-30.bpo-44009.uvhmlh.rst b/Misc/NEWS.d/next/macOS/2021-05-02-03-45-30.bpo-44009.uvhmlh.rst new file mode 100644 index 0000000..f9f11c8 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2021-05-02-03-45-30.bpo-44009.uvhmlh.rst @@ -0,0 +1,4 @@ +Provide "python3.x-intel64" executable to allow reliably forcing macOS +universal2 framework builds to run under Rosetta 2 Intel-64 emulation on +Apple Silicon Macs. This can be useful for testing or when universal2 +wheels are not yet available. diff --git a/configure b/configure index 4dc0eab..86591e2 100755 --- a/configure +++ b/configure @@ -752,6 +752,7 @@ PYTHONFRAMEWORKPREFIX PYTHONFRAMEWORKDIR PYTHONFRAMEWORKIDENTIFIER PYTHONFRAMEWORK +LIPO_INTEL64_FLAGS LIPO_32BIT_FLAGS ARCH_RUN_32BIT UNIVERSALSDK @@ -1519,11 +1520,12 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-universal-archs=ARCH - specify the kind of universal binary that should be - created. this option is only valid when + specify the kind of macOS universal binary that + should be created. This option is only valid when --enable-universalsdk is set; options are: - ("universal2", "32-bit", "64-bit", "3-way", "intel", - "intel-32", "intel-64", or "all") see Mac/README.rst + ("universal2", "intel-64", "intel-32", "intel", + "32-bit", "64-bit", "3-way", or "all") see + Mac/README.rst --with-framework-name=FRAMEWORK specify the name for the python framework on macOS only valid when --enable-framework is set. see @@ -3139,6 +3141,7 @@ then fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-universal-archs" >&5 $as_echo_n "checking for --with-universal-archs... " >&6; } @@ -7522,6 +7525,7 @@ $as_echo_n "checking which compiler should be used... " >&6; } $as_echo "$CC" >&6; } fi + LIPO_INTEL64_FLAGS="" if test "${enable_universalsdk}" then case "$UNIVERSAL_ARCHS" in @@ -7543,8 +7547,9 @@ $as_echo "$CC" >&6; } universal2) UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" LIPO_32BIT_FLAGS="" + LIPO_INTEL64_FLAGS="-extract x86_64" ARCH_RUN_32BIT="true" - ;; + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" diff --git a/configure.ac b/configure.ac index 221996a..0ea9ecf 100644 --- a/configure.ac +++ b/configure.ac @@ -220,12 +220,14 @@ then fi AC_SUBST(LIPO_32BIT_FLAGS) +AC_SUBST(LIPO_INTEL64_FLAGS) AC_MSG_CHECKING(for --with-universal-archs) AC_ARG_WITH(universal-archs, AS_HELP_STRING([--with-universal-archs=ARCH], - [specify the kind of universal binary that should be created. this option is - only valid when --enable-universalsdk is set; options are: - ("universal2", "32-bit", "64-bit", "3-way", "intel", "intel-32", "intel-64", or "all") + [specify the kind of macOS universal binary that should be created. + This option is only valid when --enable-universalsdk is set; options are: + ("universal2", "intel-64", "intel-32", "intel", "32-bit", + "64-bit", "3-way", or "all") see Mac/README.rst]), [ UNIVERSAL_ARCHS="$withval" @@ -1874,6 +1876,7 @@ yes) AC_MSG_RESULT($CC) fi + LIPO_INTEL64_FLAGS="" if test "${enable_universalsdk}" then case "$UNIVERSAL_ARCHS" in @@ -1895,8 +1898,9 @@ yes) universal2) UNIVERSAL_ARCH_FLAGS="-arch arm64 -arch x86_64" LIPO_32BIT_FLAGS="" + LIPO_INTEL64_FLAGS="-extract x86_64" ARCH_RUN_32BIT="true" - ;; + ;; intel) UNIVERSAL_ARCH_FLAGS="-arch i386 -arch x86_64" LIPO_32BIT_FLAGS="-extract i386" -- cgit v0.12