Cuando un repositorio contiene varios proyectos de firmware en C o C++ que se compilan de forma independiente y comparten un raíz común, surge un problema con clangd: por defecto, la herramienta busca un compile_commands.json en los directorios padre del archivo abierto, lo que provoca mezclas no deseadas entre proyectos. Cada proyecto necesita su propia base de datos de compilación, pero mantener un único fichero compartido obliga a reescribirlo al cambiar de proyecto, y abrir instancias separadas del editor tampoco resuelve el problema, porque ambos procesos de clangd leerían el mismo archivo con datos contradictorios.
La solución que propone Felix es un script de bash llamado device-env que recibe como argumento un objetivo de build y crea un entorno de desarrollo temporal y específico para ese objetivo. El script genera un directorio efímero donde coloca: una copia del compile_commands.json generado con bob ninja-tool -f compdb, un wrapper ejecutable también llamado clangd que invoca al binario real con los argumentos --compile-commands-dir y --query-driver=**, y un bashrc mínimo que antepone ese directorio al PATH del shell. Como el wrapper aparece antes que cualquier otro clangd en el PATH, los editores lanzados desde ese shell (por ejemplo Helix) arrancan automáticamente la instancia correcta sin necesidad de configuración adicional en el editor.
El mecanismo aprovecha el orden de inicialización del shell: el bashrc temporal carga primero el ~/.bashrc del usuario y luego modifica el PATH, lo que evita que herramientas como direnv coloquen otro clangd por delante. Cada shell obtiene su propia base de datos y su propio proceso de clangd, de modo que se pueden tener varios proyectos abiertos simultáneamente sin interferencias. El autor señala, además, que la idea de usar un directorio temporal con ejecutables envoltorio es generalizable a cualquier herramienta que se configure de forma global o a través del editor que la invoca.
