Skip to content

Commit

Permalink
bpo-44009: Provide "python3.x-intel64" for Apple Silicon Macs (python…
Browse files Browse the repository at this point in the history
…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.
  • Loading branch information
ned-deily committed May 2, 2021
1 parent 91554e4 commit 0cb33da
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 9 deletions.
21 changes: 21 additions & 0 deletions Mac/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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 \
Expand Down
6 changes: 6 additions & 0 deletions Mac/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
...............................
Expand All @@ -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
====================================================

Expand Down
13 changes: 13 additions & 0 deletions Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -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@

Expand Down Expand Up @@ -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 \
Expand Down Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
15 changes: 10 additions & 5 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -752,6 +752,7 @@ PYTHONFRAMEWORKPREFIX
PYTHONFRAMEWORKDIR
PYTHONFRAMEWORKIDENTIFIER
PYTHONFRAMEWORK
LIPO_INTEL64_FLAGS
LIPO_32BIT_FLAGS
ARCH_RUN_32BIT
UNIVERSALSDK
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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; }

Expand Down Expand Up @@ -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
Expand All @@ -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"
Expand Down
12 changes: 8 additions & 4 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -1874,6 +1876,7 @@ yes)
AC_MSG_RESULT($CC)
fi

LIPO_INTEL64_FLAGS=""
if test "${enable_universalsdk}"
then
case "$UNIVERSAL_ARCHS" in
Expand All @@ -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"
Expand Down

0 comments on commit 0cb33da

Please sign in to comment.