diff --git a/docs/clangd.rst b/docs/clangd.rst new file mode 100644 index 0000000000..93570ae178 --- /dev/null +++ b/docs/clangd.rst @@ -0,0 +1,51 @@ +========================= +Using Clangd with Libvirt +========================= + +`clangd `__ is an implementation of the +`language server protocol +`__ for C +and C++. + +When paired with an LSP-compatible editor or IDE (e.g. emacs, +vim, vscode), ``clangd`` can helpful when working with libvirt's +C sources e.g. navigating the code base. + +Whilst other C LSPs are available, ``clangd`` should work +correctly with the libvirt because clang is a supported compiler +for libvirt, and ``clangd`` is part of the same code base as +clang. + +If clang is the default compiler on your system, then ``clangd`` +can be used as soon as ``meson setup`` has been run. + +If gcc is your build environment's default compiler, then +additional steps are required to use ``clangd``: + +``clangd`` looks for a ``compile_commands.json`` file in the top +level directory of the project and also in the ``build/`` +subdirectory to discover which include paths, compiler flags etc. +should be used when it parses each source file. + +Meson creates a ``compile_commands.json`` in the build directory. +Meson defaults to the system's default C compiler. When the +default compiler is gcc, its ``compile_commands.json`` output +cannot be used with ``clangd`` due to differences in compiler +invocation flags when building libvirt. + +Create a separate build directory with a ``clangd`` compatible +``compile_commands.json`` as follows: + +:: + + CC=clang CXX=clang++ meson setup build-clang + +Point ``clangd`` (v12 or later) at the correct +``compile_commands.json`` by placing the following into a +``.clangd`` file in the root of the project: + +:: + + --- + CompileFlags: + CompilationDatabase: "build-clang" diff --git a/docs/hacking.rst b/docs/hacking.rst index a04da9cb58..11cd21223a 100644 --- a/docs/hacking.rst +++ b/docs/hacking.rst @@ -28,6 +28,9 @@ The `"Git checkout" section `__ of the libvirt installation instructions give an overview of the compilation process. +Optionally, `Clangd with libvirt `__ can be used to +navigate the code base etc. within most code editors (and IDEs). + Preparing patches ================= diff --git a/docs/meson.build b/docs/meson.build index 201fd4c984..70d271ec6e 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -32,6 +32,7 @@ docs_rst_files = [ 'ci', 'ci-dashboard', 'ci-runners', + 'clangd', 'coding-style', 'committer-guidelines', 'compiling',