Configuración de Clangd para el Indexado y Navegación del Código Fuente del Kernel de Linux

La integración de Clangd como servidor de protocolo de lenguaje (LSP) permite habilitar funciones avanzadas de autocompletado y navegación de código en el código fuente del kernel de Linux. Esta configuración es compatible con editores como Neovim, Vim y Visual Studio Code.

  1. Entorno de Desarrollo

  • Sistema Operativo: Ubuntu 20.04 (ejecutándose en WSL2)
  • Editor: Visual Studio Code
  • Servidor LSP: Clangd
  • Versión del Kernel: rama longterm 5.15.x (ej. 5.15.145)
  1. Preparación del Compilador

El kernel de Linux suele compilarse con gcc, pero las banderas de compilación generadas por este no siempre son compatibles con clangd, lo que provoca errores de argumentos desconocidos (Unknown argument) durante el indexado. Por este motivo, es recomendable utilizar clang como compilador principal.

Para la versión 5.15 del kernel, se requiere una versión mínima de Clang 10.0.1. Dado que los repositorios estándar de Ubuntu 20.04 suelen ofrecer la versión 10.0.0, es necesario instalar una versión más reciente, como la 12, para garantizar la compatibilidad total.

sudo apt-get update
sudo apt-get install -y clang-12 clangd-12

Nota importante: La versión de clang utilizada para compilar debe coincidir exactamente con la versión de clangd que actúa como LSP para evitar conflictos de banderas de compilación.

  1. Compilación y Generación de la Base de Datos de Compilación

Una vez descargado y extraído el archivo fuente del kernel (por ejemplo, linux-5.15.145.tar.xz), acceda al directorio raíz del proyecto y ejecute los siguientes comandos para configurar, compilar y generar el archivo compile_commands.json.

# Configurar el kernel usando Clang 12
make CC=clang-12 defconfig

# Compilar el kernel aprovechando todos los núcleos disponibles
make CC=clang-12 -j$(nproc)

# Generar el archivo JSON para el LSP
python3 ./scripts/clang-tools/gen_compile_commands.py -d .

  1. Configuración del Editor (Visual Studio Code)

Para que el editor utilice correctamente el servidor LSP configurado, es necesario ajustar las preferencias del espacio de trabajo.

  1. Abra la carpeta del código fuente del kernel en VSCode.
  2. Instale la extensión oficial de clangd desde el mercado de extensiones.
  3. Desactive el motor de IntelliSense de la extensión predeterminada de C/C++ para evitar conflictos.
  4. Especifique la ruta del ejecutable clangd-12 para que coincida con el compilador utilizado.

Agregue la siguiente configuración en el archivo .vscode/settings.json de su espacio de trabajo:

{
    "C_Cpp.intelliSenseEngine": "disabled",
    "clangd.path": "/usr/bin/clangd-12",
    "clangd.arguments": [
        "--background-index",
        "--clang-tidy",
        "--header-insertion=iwyu"
    ]
}

Después de reiniciar el editor, el servidor comenzará a indexar el código fuente en segundo plano, habilitando el salto a definiciones y el autocompletado sin mostrar errores.

  1. Resolución de Errores de Indexado

Es común encontrarse con advertencias o errores en el panel de salida del LSP con mensajes como:

Unknown argument: '-fno-stack-protector'
Unknown warning option '-Wno-frame-address'; did you mean '-Wno-address'?
Unknown warning option '-Wno-pointer-to-enum-cast'; did you mean '-Wno-pointer-compare'?

Causas y Soluciones:

  • Incompatibilidad de compiladores: Si el archivo compile_commands.json se generó utilizando gcc, contendrá banderas exclusivas de GNU que Clangd no reconoce. Solución: Recompile el proyecto utilizando clang o cree un archivo .clangd en la raíz del proyecto para filtrar y eliminar las banderas no soportadas mediante la directiva CompileFlags: Remove:.
  • Desajuste de versiones: Si se utilizó clang para compilar, pero el LSP está ejecutando una versión diferente de clangd, las banderas soportadas variarán. Solución: Asegúrese de configurar la ruta absoluta del ejecutable clangd en el editor para que apunte a la misma versión mayor utilizada durante la compilación (ej. clangd-12 para clang-12).

Etiquetas: clangd linux-kernel lsp visual-studio-code compile-commands

Publicado el 6-20 07:50