Jacob Ford
Jacob Ford

Reputation: 5173

How can I run two isolated installations of Homebrew?

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

Answers (2)

Jacob Ford
Jacob Ford

Reputation: 5173

  1. 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)"
    
  2. 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.

  3. 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'
    
  4. 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

  5. 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

liviaerxin
liviaerxin

Reputation: 667

  1. 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.

  2. 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.

  3. 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
    
  4. 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

Related Questions