Reputation: 5173
I want to install and run two versions of Homebrew simultaneously on an Apple Silicon Mac: an ARM64 version, and an Intel version running under Rosetta 2.
I know I can prepend any brew command with arch --x86_64
to emulate Intel for that command, but this can lead to conflicts for formulas whose dependencies you already have built for ARM64. For example:
Error: gnupg dependencies not built for the x86_64 CPU architecture:
pkg-config was built for arm64
gettext was built for arm64
readline was built for arm64
[email protected] was built for arm64
How can I install and run two separate, isolated versions of Homebrew (one for native ARM64 and one for emulated Intel), keeping each of their installed formulae and dependencies separate?
Upvotes: 54
Views: 29645
Reputation: 5173
Install Homebrew natively on Apple Silicon (will install to /opt/homebrew
by default):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Install Intel-emulated Homebrew (will install to /usr/local
by default):
arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
If you haven't yet installed Rosetta 2, you'll need to run softwareupdate --install-rosetta
first.
Create an alias for Intel homebrew. I'm calling mine brow
because O for old. But hey you do your own thing.
In ~/.zshrc
(or your shell's equivalent) add:
alias brow='arch --x86_64 /usr/local/Homebrew/bin/brew'
Add ARM Homebrew to your PATH.
In ~/.zshrc
(or your shell's equivalent) add:
# Homebrew on Apple Silicon
path=('/opt/homebrew/bin' $path)
export PATH
If you're still on bash
it'd be PATH=/opt/homebrew/bin:$PATH
Confirm
which brew
should return /opt/homebrew/bin/brew
brew --prefix
should return /opt/homebrew
which brow
should return brow: aliased to arch --x86_64 /usr/local/Homebrew/bin/brew
brow --prefix
should return /usr/local
If you have the same command installed in both Homebrews, it'll default to Apple Silicon (/opt/homebrew/
) since we prepended that one in our PATH. To override, run the command with its full path (/usr/local/bin/youtube-dl
), or override your PATH
for one command (PATH=/usr/local/bin youtube-dl
).
I also created another handy alias in .zshrc
(alias ib='PATH=/usr/local/bin'
) so I can prepend any Homebrew-installed command with ib
to force using the Intel version of that command:
~ ▶ which youtube-dl
/opt/homebrew/bin/youtube-dl
~ ▶ ib which youtube-dl
/usr/local/bin/youtube-dl
If you prefer Intel to be the default brew
, add /opt/homebrew/bin
to the end of your PATH instead of the beginning.
Upvotes: 120
Reputation: 667
Install Native Homebrew
❯ arch --arm64 zsh -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
all Homebrew related stuffs are in /opt/homebrew
.
Install Rosetta Homebrew
❯ arch --x86_64 zsh -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
all Homebrew related stuffs are in /usr/local
.
Configuring ~/.zshrc
to use Brew
defaultly based on arch
,
# Multiple Homebrews on Apple Silicon
if [ "$(arch)" = "arm64" ]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
export PATH="/opt/homebrew/opt/[email protected]/bin:$PATH"
# export LDFLAGS="-L/opt/homebrew/opt/[email protected]/lib" # For compilers to find [email protected]
else
eval "$(/usr/local/bin/brew shellenv)"
export PATH="/usr/local/opt/[email protected]/bin:$PATH"
export PATH="/usr/local/opt/[email protected]/bin:$PATH"
# export LDFLAGS="-L/usr/local/opt/[email protected]/lib" # For compilers to find [email protected]
fi
Test
❯ arch
arm64
❯ which brew
/opt/homebrew/bin/brew
❯ arch -x86_64 zsh
❯ arch
i386
❯ which brew
/usr/local/bin/brew
# set alias as you like
❯ rzsh='arch -x86_64 zsh'
Upvotes: 29