Мінімальні вимоги (must-have)
Перевір, що виконано:
idf.py set-target esp32s3
idf.py reconfigure
idf.py build
Після цього ОБОВʼЯЗКОВО має зʼявитися файл:
build/compile_commands.json
clangd НЕ шукає compile_commands автоматично, якщо ти відкрив vim не з кореня. в корені проекту створити симлінк:
$ ln -s build/compile_commands.json compile_commands.json
👉 Саме він — джерело істини для clangd
Налаштування clangd у vim (через coc)
КРОК 1. Знайди xtensa-gcc
$ which xtensa-esp32s3-elf-gcc
Типово:
~/.espressif/tools/xtensa-esp32s3-elf/bin/xtensa-esp32s3-elf-gcc
КРОК 2. Додай .clangd у корінь проєкту
Саме так, файл .clangd, без розширення.
CompileFlags:
# Дозволяє clangd використовувати базу даних компіляції з build/
CompilationDatabase: "."
Add: [
- --target=xtensa-esp32s3-elf
# Важливо: вказуємо шлях до інклюдів інструментарію espressif
- -I/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/xtensa-esp32s3-elf/include,
- -I/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/lib/gcc/xtensa-esp32s3-elf/12.2.0/include,
"--driver-mode=gcc"
]
Remove: [-m*, -f*]
Index:
Background: Build
Шляхи інклудів можна знай ти, наприклад так:
$ xtensa-esp32s3-elf-gcc -v -E -x c -
Using built-in specs.
COLLECT_GCC=xtensa-esp32s3-elf-gcc
Target: xtensa-esp32s3-elf
Configured with: /builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=aarch64-host_unknown-linux-gnu --target=xtensa-esp32s3-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf/xtensa-esp32s3-elf --with-headers=/builds/idf/crosstool-NG/builds/xtensa-esp32s3-elf/xtensa-esp32s3-elf/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-12.2.0_20230208' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-mpfr=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-mpc=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --with-isl=/builds/idf/crosstool-NG/.build/HOST-aarch64-linux-gnu/xtensa-esp32s3-elf/buildtools/complibs-host --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 12.2.0 (crosstool-NG esp-12.2.0_20230208)
COLLECT_GCC_OPTIONS='-v' '-E'
/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../libexec/gcc/xtensa-esp32s3-elf/12.2.0/cc1 -E -quiet -v -iprefix /home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/ - -dumpbase -
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/include"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/include-fixed"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/sys-include"
ignoring duplicate directory "/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/../../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/include"
#include "..." search starts here:
#include <...> search starts here:
/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/include
/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/include-fixed
/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/sys-include
/home/archpi/.espressif/tools/xtensa-esp32s3-elf/esp-12.2.0_20230208/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/12.2.0/../../../../xtensa-esp32s3-elf/include
End of search list.
... і шукаємо #include <...> search starts here:. Після цього йде список усіх шляхів, де компілятор шукає файли.
КРОК 3. Конфігурація vim
У coc-settings.json:
{
"clangd.path": "/usr/lib/llvm18/bin/clangd",
"clangd.arguments": [
// ВИКОРИСТОВУЙТЕ ШЛЯХ, ЗНАЙДЕНИЙ КОМАНДОЮ 'which'
"--query-driver=/home/archpi/.espressif/tools/**/bin/xtensa-esp32s3-elf-gcc*",
"--background-index",
"--compile-commands-dir=build",
"--query-driver=/home/archpi/.espressif/tools/**/riscv32-esp-elf-gcc"
"--clang-tidy",
"--completion-style=detailed"
// Залиште `--header-insertion=never` якщо вам так зручно
],
"clangd.semanticHighlighting": true,
"coc.preferences.formatOnSaveFiletypes": ["cpp", "c"]
}
Як скинути кеш і обновити настройки
- rm -rf build/ sdkconfig build/compile_commands.json
- Створи свіжий compile_commands.json:
idf.py set-target esp32s3 idf.py reconfigure ln -s build/compile_commands.json .- Закрити, та знову відкрити
vim, або:CocRestart
- Закрити, та знову відкрити