DEV Community

Takuya Matsuyama
Takuya Matsuyama

Posted on

How to install Neovim on Apple Silicon M1 Mac

TL;DR

Do this:

xcode-select --install
brew install --HEAD tree-sitter
brew install --HEAD luajit
brew install --HEAD neovim
Enter fullscreen mode Exit fullscreen mode

My work log

Yesterday, my M1 Macbook Air has arrived and I started setting it up.
But I encountered an error when installing Neovim via Homebrew. It doesn't simply let me install with brew install neovim because the formula doesn't exist for M1 macs.

I found that Neovim developers have already worked on it and you can install like so:

brew install --HEAD neovim
Enter fullscreen mode Exit fullscreen mode

but it failed:

...
==> Installing dependencies for neovim: tree-sitter, cmake, lua, luarocks, unibilium, libtermkey, libuv, libvterm, luajit and msgpack
==> Installing neovim dependency: tree-sitter
==> make
==> make install PREFIX=/opt/homebrew/Cellar/tree-sitter/0.17.3
==> cargo install
Last 15 lines from /Users/***/Library/Logs/Homebrew/tree-sitter/03.cargo:
  thread 'main' panicked at '

  Internal error occurred: Command "clang" "-O3" "-ffunction-sections" "-fdata-sections" "-fPIC" "--target=aarch64-apple-darwin" "-I" "src" "-I" "include" "-Wall" "-Wextra" "-o" "/private/tmp/tree-sitter-20210103-22123-s208p2/tree-sitter-0.17.3/target/release/build/tree-sitter-622599610e6262f9/out/src/lib.o" "-c" "src/lib.c" with args "clang" did not execute successfully (status code exit code: 1).

  ', /Users/***/Library/Caches/Homebrew/cargo_cache/registry/src/github.com-1ecc6299db9ec823/cc-1.0.25/src/lib.rs:2260:5
  note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
The following warnings were emitted during compilation:

warning: error: unknown target triple 'unknown-apple-macosx11.0.0', please use -triple or -arch

error: failed to compile `tree-sitter-cli v0.17.3 (/private/tmp/tree-sitter-20210103-22123-s208p2/tree-sitter-0.17.3/cli)`, intermediate artifacts can be found at `/private/tmp/tree-sitter-20210103-22123-s208p2/tree-sitter-0.17.3/target`

Caused by:
  build failed

Do not report this issue to Homebrew/brew or Homebrew/core!
Enter fullscreen mode Exit fullscreen mode

Looks like a dependency tree-sitter was failed to build.
Ok, let's install it from HEAD:

brew install --HEAD tree-sitter
==> Cloning https://github.com/tree-sitter/tree-sitter.git
Cloning into '/Users/***/Library/Caches/Homebrew/tree-sitter--git'...
==> Checking out branch master
Already on 'master'
Your branch is up to date with 'origin/master'.
==> make
==> make install PREFIX=/opt/homebrew/Cellar/tree-sitter/HEAD-115bf3f
==> cargo install
🍺  /opt/homebrew/Cellar/tree-sitter/HEAD-115bf3f: 14 files, 5.0MB, built in 42 seconds
Removing: /Users/***/Library/Caches/Homebrew/tree-sitter--0.17.3.tar.gz... (506.8KB)
Enter fullscreen mode Exit fullscreen mode

Ok, it worked.
But then, luajit failed to install:

🍺  /opt/homebrew/Cellar/libvterm/0.1.4: 12 files, 393KB
==> Installing neovim dependency: luajit
==> Patching
Warning: Calling ENV.O2 is deprecated! There is no replacement.
Please report this issue to the homebrew/core tap (not Homebrew/brew or Homebrew/core):
  /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/luajit.rb:43

==> make amalg PREFIX=/opt/homebrew/Cellar/luajit/2.0.5
Last 15 lines from /Users/***/Library/Logs/Homebrew/luajit/01.make:
#error "Need at least GCC 4.3 or newer"
 ^
3 errors generated.
lj_arch.h:55:2: error: "No support for this architecture (yet)"
#error "No support for this architecture (yet)"
 ^
lj_arch.h:294:2: error: "No target architecture defined"
#error "No target architecture defined"
 ^
lj_arch.h:317:2: error: "Need at least GCC 4.3 or newer"
#error "Need at least GCC 4.3 or newer"
 ^
3 errors generated.
Makefile:254: *** Unsupported target architecture.  Stop.
make: *** [amalg] Error 2
Enter fullscreen mode Exit fullscreen mode

Alright, let's install it also from HEAD:

/opt/homebrew/bin/brew install --HEAD luajit
==> Cloning https://luajit.org/git/luajit-2.0.git
Updating /Users/***/Library/Caches/Homebrew/luajit--git
==> Checking out branch v2.1
Already on 'v2.1'
Your branch is up to date with 'origin/v2.1'.
HEAD is now at 1e66d0f9 Merge branch 'master' into v2.1
Warning: Calling ENV.O2 is deprecated! There is no replacement.
Please report this issue to the homebrew/core tap (not Homebrew/brew or Homebrew/core):
  /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/luajit.rb:43

==> make amalg PREFIX=/opt/homebrew/Cellar/luajit/HEAD-1e66d0f XCFLAGS=-DLUAJIT_ENABLE_GC64
==> make install PREFIX=/opt/homebrew/Cellar/luajit/HEAD-1e66d0f XCFLAGS=-DLUAJIT_ENABLE_GC64
🍺  /opt/homebrew/Cellar/luajit/HEAD-1e66d0f: 37 files, 2.3MB, built in 11 seconds
Enter fullscreen mode Exit fullscreen mode

Cool. Now, try installing neovim again:

/opt/homebrew/bin/brew install --HEAD neovim
==> Downloading https://homebrew.bintray.com/bottles/msgpack-3.3.0.arm64_big_sur.bottle.tar.gz
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/780553bf2083258555b13aeea05333331a9a541f819afac70c31ffcf78ecd2ed--msgpack-3.3.0.arm64_big_sur.bottle.tar.gz
==> Downloading https://github.com/libmpack/libmpack-lua/releases/download/1.0.8/libmpack-lua-1.0.8.tar.gz
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/4b91349796a66e38e93acd77e6ca14212c869090429fd88271def2be5293d83f--libmpack-lua-1.0.8.tar.gz
==> Downloading https://luarocks.org/manifests/gvvaughan/lpeg-1.0.2-1.src.rock
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/0bc17975f0cf3981083172aa7da329b874e5780fa81494f5dd07d0665fcec23b--lpeg-1.0.2-1.src.rock
==> Downloading https://luarocks.org/manifests/kikito/inspect-3.1.1-0.src.rock
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/ecc1fa84ce4c83c9406f6d1202d4a88c80ede4a0a2bfd8d8d2bd54fd042226bb--inspect-3.1.1-0.src.rock
==> Downloading https://github.com/keplerproject/lua-compat-5.3/archive/v0.7.tar.gz
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/5f4e552e95b9a6223a5e4fabb7f04bf4b886057024507c76b1d5b803218c9363--lua-compat-5.3-0.7.tar.gz
==> Downloading https://github.com/luvit/luv/releases/download/1.30.0-0/luv-1.30.0-0.tar.gz
Already downloaded: /Users/***/Library/Caches/Homebrew/downloads/a9ce5a949370965d8f0fe70a47e7d102a3b4b6b831dbd4d088a83bbe1c00a3a2--luv-1.30.0-0.tar.gz
==> Cloning https://github.com/neovim/neovim.git
Updating /Users/***/Library/Caches/Homebrew/neovim--git
==> Checking out branch master
Already on 'master'
Your branch is up to date with 'origin/master'.
HEAD is now at 7a81a0c Merge pull request #13665 from janlazo/vim-8.2.0917
==> Installing dependencies for neovim: msgpack
==> Installing neovim dependency: msgpack
==> Pouring msgpack-3.3.0.arm64_big_sur.bottle.tar.gz
🍺  /opt/homebrew/Cellar/msgpack/3.3.0: 757 files, 5.3MB
==> Installing neovim --HEAD
==> luarocks make --lua-dir=/opt/homebrew/opt/luajit --tree=/private/tmp/neovim-20210103-14924-bnufr5/deps-build
==> luarocks make --lua-dir=/opt/homebrew/opt/luajit --tree=/private/tmp/neovim-20210103-14924-bnufr5/deps-build
==> luarocks make --lua-dir=/opt/homebrew/opt/luajit --tree=/private/tmp/neovim-20210103-14924-bnufr5/deps-build
==> cmake . -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -DCMAKE_INSTALL_PREFIX=/private/tmp/neovim-20210103-14924-bnufr5/deps-build -DLUA_BUILD_TYPE=System -DWITH_SHARED_LIBUV=
==> make install
==> cmake .. -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ -DLIBLUV_INCLUDE_DIR=/private/tmp/neovim-20210103-14924-bnufr5/deps-build/include -DLIBLUV_LIBRARY=/private/tmp/neovim-
==> make install
🍺  /opt/homebrew/Cellar/neovim/HEAD-7a81a0c: 1,452 files, 21.3MB, built in 31 seconds
Enter fullscreen mode Exit fullscreen mode

Gotcha~

Top comments (9)

Collapse
 
bookercodes profile image
Alex Booker

This helped me, thank you!

Collapse
 
mentariochain profile image
MentarioNetwork

Hello. For my M1 Pro the command line is not working with just brew install I have to add arch -arm64 before brew install command. Take a note who faced with the same problem.

Collapse
 
martin_york_c66943733e567 profile image
Martin York • Edited

I tried following this and it installs.
But it still seems to be running as the x86 binaries.

After starting neovim run the command:

:!uname -m
x86_64

If I run this command from the terminal:

$uname -m
arm64

So this still looks like it is building and runnning as an x86 binary not arm.
If you are using neovim as a build environment this is pain as it builds x86 binaries (by default).

Using the suggestion by "MentarioNetwork" does not help.

Collapse
 
martin_york_c66943733e567 profile image
Martin York • Edited

My mistake. I was using the binary in /usr/local/bin/nvim The arm64 version is in /opt/homebrew/bin

Collapse
 
martialboniou profile image
Martial

Thank you very much!

Collapse
 
drio profile image
David Rio Deiros

Thank you. Very helpful.
What do you do when you want to update? Do you recompile/update only neovim or you recompile the other dependencies also?

Collapse
 
drio profile image
David Rio Deiros

If you want homebrew to fetch the latest head you have to use —fetch-HEAD:

--fetch-HEAD: Fetch the upstream repository to detect if the HEAD
 installation of the formula is outdated. Otherwise, the repository’s 
HEAD will only be checked for updates when a new stable or 
development version has been released.

How often do you force a —fetch-HEAD? And when you do, do you also —fetch-HEAD the other dependencies (luajit and treesitter)?

Collapse
 
rasukarusan profile image
Rasukarusan

thanks! It's good for me!

Collapse
 
xbear23 profile image
xbear23

Thanks!