Home

Awesome

Workarounds and Setups for ARM-based Apple-Silicon Mac

Updated with MacBook Pro (16 inch, M1 Max, 2021) Tested on macOS Monterey (12.1)

Created on Nov 17, 2020 Last update: Jan 7, 2022

M1Max updates

Yes, I've got the new 16 inch. And this time it will replace my main workstation. So instead of a side project it will be my daily driver.

Homebrew

Apple Silicon is now fully supported by homebrew.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Xcode commandline is required and there will be a propt for installation if it's not yet set up on your device.

However, brew is not automatically added to the path, you will have to manually add it to your zsh profile. It's located at ~/.zprofile. You can copy eval "$(/opt/homebrew/bin/brew shellenv)" and manually add it to the end of that file or use the script below. The previous workaround by adding it to the zshrc also works

echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

Brew Packages and Casks

I use brew cask to install all my applications, You will have to agree to Xcode license before installation.

sudo xcodebuild -license accept

An easy way for bulk installation is to keep a list of all the applications you have and use this shell script to install every apps on the list.

It works for both packages (like python, git, neovim) and applications (steam, chrome, vscode)

An example would look like this

declare -a packages=(
  'aria2'
  'git'
  'go'
  'gpg2'
  'mas'
  'mongodb'
  'neovim'
  'node'
  'python3'
  'ruby'
  'tmux'
  'vim'
  'wine'
  'winetricks'
  'wget'
)

for pkg in "${packages[@]}"; do
  brew install "$pkg"
done

declare -a cask_apps=(
  'notion'
  'steam'
  'visual-studio-code'
 #  Other apps you have goes here
)

for app in "${cask_apps[@]}"; do
  brew install "$app"
done

Shell

The terminal emulator I've been using is iTerm2, it supports arm natively and has extremely good integration with tmux and zsh.

brew install iterm2

The theme and fonts I use is Nord and Fira Code Nerd Font

I also use brew for fonts. You can install a huge selection of fonts from cask-fonts after adding it to your tap.

brew tap homebrew/cask-fonts
brew install font-fira-code-nerd-font

I've been using zsh and prezto as the plugin manager

To install, use this command to clone prezto to your home directory

git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"

After it's done, use this command to generate a config file.

setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done

You can then work on ~/.zpreztorc for plugins and settings.

A copy of my updated zpreztorc file can be found here. I've enabled autosuggestions, highlighting, fast directory change based on fasd and some other features.

Keys

I use GPG keys for signing and ssh authentication.

It can be managed with GPG2 and installed using homebrew.

brew install gpg2

All the key features are fully supported on Apple Silicon. If you do not have a key, you can use gpg --full-generate-key to get a key generated.

To use it for ssh, you have to add a subkey for authentication. And use echo enable-ssh-support >> $HOME/.gnupg/gpg-agent.conf to enable gpg ssh support.

To ask SSH to use gpg-agent instead of ssh-agent, you will need this in your zshrc file.

unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null

I often switch back and forth between gpg-agent and ssh-agent, so I kept it as a function.

Keyboard Configuration

I use karabiner-elements for the keyboard configuration. This can also be installed using brew install karabiner-elements.

Your settings can be found in ~/.config/karabiner/assets/complex_modifications/

Python and ML

Python is natively supported by apple silicon macs. However, at the time of writing, anaconda and miniconda still haven't supported arm yet. The best available is miniforge, a minimal installer for Conda specific to conda-forge. The installation guide can be found on their homepage, but easiest way is to install it with brew.

brew install miniforge

After that, you will have to initialize it for your shell.

conda init zsh

Afterwards, you can you conda to create environments and use it it host your packages.

TensorFlow

This is the only major ML framework that's natively supported.

Apple even released their own support package to improve the performance. More information can be found here

conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

Java

Java 12 can be installed as a homebrew package. However, openjdk will not be automatically added to your path. To use it directly in the terminal you have to use the following command:

sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
echo 'export PATH="/opt/homebrew/opt/openjdk/bin:$PATH"' >> ~/.zshrc

Windows Applications and Wine

Well, I don't really need windows applications to run on my mac. But I would really like to see how it performs. And it just seems to be a great challenge. And

Wine has dropped their official support for macOS. But I've been able to get their source code and get some version of it running on my mac...

For some reason, the latest verisign I've been able to compile is 6.17. However, it still need quite a lot time to get some software running. It's going to be much easier to just purchase a copy of crossover or parallels desktop.

Setups will be updated.


This is how I get most of my configurations work with MacBook Pro (13, M1, 2020) Tested on macOS Big Sur (11.0.1)

Updates

A new version of homebrew has been released that supports Apple-Silicon Mac natively. You can install the latest version (2.7.1 or above) and get things up and running. Some packages are now offering prebuilt bottles for arm macs. You can just download and pour the bottles instead of building all the packages from source. Some packages might still require you to build them from source, but there has been few compatibility issues. The whole process is much easier now compared to a few months ago when I first wrote this guide.

Docker has also released their tech preview for ARM mac, and I can get most of my daily tasks up and running with it.

Rosetta2

At the time of the writing (Nov 17), most of the applications are not (yet) supported by this new architecture and most of the applications will run with Rosetta2 created by Apple.

The first time you launches a x86-64 application on your mac, it will automatically pop up and ask you to install Rosetta. The process takes about 2 minutes. And then I am able to open those applications as if they are native built for ARM mac.

Rumors said that it takes 20 secs to load Microsoft Word at the first launch for the translation; however, it only takes 6.89 secs to open on my machine, which is as fast as, if not faster, than the loadtime on my 16 inch MacBook Pro. I don't know if it's because it's already translated when I was installing the app or Microsoft/Apple has done some optimization. For other apps, e.g. IINA, that runs with x86, even the first launch is as quick as you would expect on a new machine, most of which are under 5 secs. It's quite impressive.

Xcode build

If choose to use the git provided by xcode, after installing Xcode, you will have to agree with their license

You have not agreed to the Xcode license agreements. You must agree to both license agreements below in order to use Xcode.

Hit the Return key to view the license agreements at '/Applications/Xcode.app/Contents/Resources/English.lproj/License.rtf'

Agreeing to the Xcode/iOS license requires admin privileges, please run “sudo xcodebuild -license” and then retry this command.

Simply use its command, press space to continue and q to exit, and then type agree to agree the license. Then commands like git, make will be available.

Homebrew

Homebrew is not (yet) officially supported on Apple Silicon Macs, and their teams are working on it.
They have provided a detailed list of how core formulaes are supported. You can find that list here.

As there's no official support for this mac at this moment, most of the installations listed below are just my personal workarounds tested on my local machine. There's no guarantee that it's the best practice or it will work on your machine.

Installation

I found this alternative install method on the official documentation of homebrew, which can be found here

For ARM-based macs, their recomendation is to "do yourself a favour and install to /opt/homebrew on macOS ARM" One of the easiest way to do that is to untar it to your local directory and then move it to /opt as it requires root permission to write in the /opt folder.

cd ~
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
sudo mv homebrew /opt/homebrew

This way homebrew will be installed to the /opt/homebrew folder. We can then initiate homebrew by cd to that directory and run brew in the bin folder.

cd /opt/homebrew/bin
./brew update

This operation requires git, and git is not built-in in ARM Big Sur as it did for older macs. If you didn't install xcode beforehand, there will be another pop up that asks you to install command-line tools for developers. Expected outputs (as on my local machine):

Initialized empty Git repository in /opt/homebrew/.git/
remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 159587 (delta 18), reused 26 (delta 8), pack-reused 159541
Receiving objects: 100% (159587/159587), 40.85 MiB | 11.00 MiB/s, done.
Resolving deltas: 100% (118220/118220), done.
From https://github.com/Homebrew/brew
==> Tapping homebrew/core
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 753, done.
remote: Counting objects: 100% (753/753), done.
remote: Compressing objects: 100% (500/500), done.
remote: Total 835291 (delta 380), reused 446 (delta 253), pack-reused 834538
Receiving objects: 100% (835291/835291), 332.87 MiB | 11.64 MiB/s, done.
Resolving deltas: 100% (562744/562744), done.
Tapped 2 commands and 5344 formulae (5,629 files, 365.2MB).
Already up-to-date.

After that you can add brew (and the packages managed by brew) to your PATH.

For macOS Big Sur, the default shell is zsh. You can create a .zshrc file in your home directory and add this line to the config.

export PATH="/opt/homebrew/bin:$PATH"

Formula

Brew has not yet provided packages precompiled for arm macs. The best way to install is with the brew install -s <fomula> command. As explained by homebrew, it will "Compile formula from source even if a bottle is provided. Dependencies will still be installed from bottles if they are available." The list of supported packages can be found here

I've successfully compiled several binaries on my local machine, and I will upload the binaries as bottles to save some compile time.

List of the packages I've successfully compiled

autoconf	gnutls		libmpc		luarocks	sqlite
automake	guile		libssh2		mpfr		texinfo
bdw-gc		isl		libtasn1	msgpack		tree-sitter
cmake		jansson		libtermkey	ncurses		unbound
coreutils	jpeg		libtiff		nettle		unibilium
curl		libatomic_ops	libtool		openssl@1.1	wget
expat		libevent	libunistring	p11-kit		xz
gdbm		libffi		libuv		pcre2		zlib
gettext		libgit2		libvterm	pkg-config
git		libgpg-error	little-cms2	python@3.9
gmp		libiconv	lua		readline
gnu-sed		libidn2		luajit		sphinx-doc

Problems I've encountered: While compiling neovim, I found that the system fails to recogonize my luajit installation and keeps sending me the error: Lua interpreter not found at /opt/homebrew/opt/luajit

I solved this issue by creating a symlink within the /opt/homebrew/opt/luajit/bin folder that redirects lua to luajit,

cd /opt/homebrew/opt/luajit/bin
ln luajit-2.1.0-beta3 lua

However, even after this issue is fixed, I still get the error:

cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/vimball && /opt/homebrew/Cellar/cmake/3.18.4/bin/cmake -E copy_directory /tmp/neovim-20201117-74316-1uv0si9/runtime/pack/dist/opt/vimball /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/vimball
cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/matchit && /opt/homebrew/Cellar/cmake/3.18.4/bin/cmake -E copy_directory /tmp/neovim-20201117-74316-1uv0si9/runtime/pack/dist/opt/matchit /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/matchit
cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime && /opt/homebrew/Cellar/cmake/3.18.4/bin/cmake -E copy_directory /tmp/neovim-20201117-74316-1uv0si9/runtime/doc doc
cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/vimball && /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ doc -c quit
cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime/pack/dist/opt/matchit && /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ doc -c quit
/bin/sh: line 1: 77744 Killed: 9               /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ doc -c quit
/bin/sh: line 1: 77743 Killed: 9               /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ doc -c quit
make[2]: *** [runtime/pack/dist/opt/matchit/doc/tags] Error 137
make[2]: *** Waiting for unfinished jobs....
make[2]: *** [runtime/pack/dist/opt/vimball/doc/tags] Error 137
cd /tmp/neovim-20201117-74316-1uv0si9/build/runtime && /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ ++t\ doc -c quit
/bin/sh: line 1: 77746 Killed: 9               /tmp/neovim-20201117-74316-1uv0si9/build/bin/nvim -u NONE -i NONE -e --headless -c helptags\ ++t\ doc -c quit
make[2]: *** [runtime/doc/tags] Error 137
make[1]: *** [runtime/CMakeFiles/runtime.dir/all] Error 2
make: *** [all] Error 2

Neovim now builds with this pull request

Seeing that I cannot build neovim, I turned to emacs,

The prebuilt version for x86 cannot be run using Rosetta. It crashes at launchtime,

When I try to compile emacs myself, I failed yet again,

checking for xcrun... xcrun
checking for make... yes
checking for GNU Make... make
checking build system type... arm-apple-darwin20.1.0
checking host system type... arm-apple-darwin20.1.0
configure: error: Emacs does not support 'arm-apple-darwin20.1.0' systems.
If you think it should, please send a report to bug-gnu-emacs@gnu.org.
Check 'etc/MACHINES' for recognized configuration names.

But it did help me to test yet another bunch of packages. Ironically, the emacs.app (emacsformacosx) downloaded from GNU website works, guess I will stick to it before neovim or emacs builds natively.

Docker desktop 3.0 has just released, but Apple silicon is still not yet supported.

Games

Found a great site that has all the games that runs on Apple silicon Mac

Windows

I don't miss windows at all, and I do have a windows desktoop for gaming. But I've installed a windwos VM. Parallels Desktop is now supported on ARM mac. I tested ACVM on my machine and it outperfroms SurfaceX.