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
openssl@1.1 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?
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.