I’ve managed to get LSP-based IDE features powered by clangd working for the Ruby VM’s source code (in my case, in Vim). Here’s how I did it!
I’ve been making a point to learn more about things I depend on recently. Today, that means learning about Ruby. And what better way to learn than to check out the source code, and jump around?
clangd is an editor-agnostic language server that uses the Language
Server Protocol to power IDE-like features in
your preferred text editor. All it needs is a compile_commands.json
,
which is basically a mapping of filename to options to pass to clang
so that it knows things like which warnings to enable and where to
search for header files.
clangd works best for projects built using cmake
, but the Ruby VM
doesn’t use cmake
. Regardless, we can make a compile_commands.json
file by using Bear to trace the execution of a Ruby build, and use the
trace information to write out a compile_commands.json
file.
Steps
I could only get these steps to work for Linux, as the Bear README mentions that on macOS you have to disable System Integrity Protection to get it to work.
1. Install Bear
I describe how I built Bear from source in the Appendix.
2. Clone the Ruby source code.
git clone https://github.com/ruby/ruby
cd ruby
3. Configure the Ruby build.
We have to tell the configure
script to use Clang to compile (or
if you’re confident that your system compiler toolchain is Clang,
you can just run ./configure
).
# Create the ./configure file
autoconf
# This only works when using clang to build Ruby
./configure CC=clang
4. Use bear
to invoke make
Bear will use a dynamically preloaded library to trace system calls
that exec clang
processes, looking at things like the command line
arguments given to Clang.
bear make
5. That’s it!
The output is ./compile_commands.json
, which should be non-empty. If
it’s empty or just has []
, it didn’t work. There’s some
troubleshooting in the Bear README.
The compile_commands.json
file will be consumed by clangd
in your
editor. Check https://langserver.org to find an LSP client for your
preferred editor, and follow its setup instructions.
Once you’ve built the compile_commands.json
file and configured your
editor to use LSP with clangd
, you should be able to do things like
Jump to Definition and Hover on the Ruby source code!
Appendix: Building Bear from source
This is probably common knowledge for people who use cmake
regularly,
but this is how I built Bear from source, because I built it on a
machine where I didn’t have root so I couldn’t write to /usr/local
.
git clone https://github.com/rizsotto/Bear
cd Bear
mkdir build
cd build
# Install to $HOME/.local/bin instead of /usr/local/bin
cmake .. "-DCMAKE_INSTALL_PREFIX=$HOME/.local"
make -j$(nproc)
make install
# → $HOME/.local/bin/bear exists now
Appendix: LSP in Neovim with LanguageClient-neovim
I use Neovim. My preferred LSP client is LanguageClient-neovim. Here’s
the parts of my Neovim config files that setup clangd
: