Skip to content

Commit

Permalink
Merge pull request #3438 from rami3l/fix/macos-uname-lies
Browse files Browse the repository at this point in the history
macOS `uname -m` can lie due to Rosetta shenanigans
  • Loading branch information
rbtcollins authored Aug 15, 2023
2 parents 2b55a22 + e2c2cf8 commit bd08d35
Showing 1 changed file with 24 additions and 4 deletions.
28 changes: 24 additions & 4 deletions rustup-init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -316,10 +316,30 @@ get_architecture() {
fi
fi

if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then
# Darwin `uname -m` lies
if sysctl hw.optional.x86_64 | grep -q ': 1'; then
_cputype=x86_64
if [ "$_ostype" = Darwin ]; then
# Darwin `uname -m` can lie due to Rosetta shenanigans. If you manage to
# invoke a native shell binary and then a native uname binary, you can
# get the real answer, but that's hard to ensure, so instead we use
# `sysctl` (which doesn't lie) to check for the actual architecture.
if [ "$_cputype" = i386 ]; then
# Handling i386 compatibility mode in older macOS versions (<10.15)
# running on x86_64-based Macs.
# Starting from 10.15, macOS explicitly bans all i386 binaries from running.
# See: <https://support.apple.com/en-us/HT208436>

# Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code.
if sysctl hw.optional.x86_64 2> /dev/null || true | grep -q ': 1'; then
_cputype=x86_64
fi
elif [ "$_cputype" = x86_64 ]; then
# Handling x86-64 compatibility mode (a.k.a. Rosetta 2)
# in newer macOS versions (>=11) running on arm64-based Macs.
# Rosetta 2 is built exclusively for x86-64 and cannot run i386 binaries.

# Avoid `sysctl: unknown oid` stderr output and/or non-zero exit code.
if sysctl hw.optional.arm64 2> /dev/null || true | grep -q ': 1'; then
_cputype=arm64
fi
fi
fi

Expand Down

0 comments on commit bd08d35

Please sign in to comment.