专栏算法工具链使用VSCode+clangd看kernel代码

使用VSCode+clangd看kernel代码

guo2025-05-06
64
0

clangd插件以及clangd LSP语言服务,实现代码的补齐和代码跳转功能,其原理是

  • 利用cmake、xmake、ninja的编译命令导出功能产生compile_commands.json
  • 利用bear工具捕捉makefile的编译命令生成compile_commands.json
  • 工程本身makefile支持生成compile_commands.json,该种情况下要求clangd LSP语言服务版本号大于11.

clangd插件VSCode配置setting.json

安装VSCode的clangd插件比较简单,不述。

setting.json(Ctrl+Shift + P, Setting-(Ctrl+Shift + P, Setting---> Preferences: Open Folder Settings (JSON)(SSH:远程的)),该问题一般在/home/${username}/.vscode-server/data/Machine/目录下。配置如下:
  • clangd.path为clangd语言服务进程位置,一般VSCode自动安装的位置在~/.vscode-server/data/User/globalStorage/llvm-vs-code-extensions.vscode-clangd/install下,手动安装的设置正确的路径即可。
  • C_Cpp.intelliSenseEngine设置为disabled,是为了解决clangd和C/C++两个插件都提供的C++ language server功能在同一个vscode项目中同时启动的冲突。
  • --compile-commands-dir=${workspaceFolder}设置在当前工程目录下找compile_commands.json.clangd文件。
  • --background-index在后台建立源码工程索引。
  • editor.fontFamily设置候选的显示字体。

clangd默认开启format on save功能,会对整个文件重新格式化。如果不需要这样,可以禁止format on save功能(Ctrl+Shift + P, Setting-clangd默认开启format on save功能,会对整个文件重新格式化。如果不需要这样,可以禁止format on save功能(Ctrl+Shift + P, Setting---> Preferences: Open Folder Settings),如下所示

源码

需拿到J6 SDK的源码,如生态版本的V1.0.0:J6X-Acore-Eco-V1.0.0-20241230.tar.gz。解压后即看到kernelhobot-drivers目录。

创建VSCode workspace

SSH远程登录远程机器上,创建类似v1sdk.code-workspace VSCode工作区文件即可。

cat v1sdk.code-workspace

{

"folders": [

{

"path": "./v1sdk"

}

]

}

然后VSCode远程开发插件remote-ssh直接登录远程机器上File -> Open Workplace from这个工作区文件即可。

compile_commands.json的生成

compile_commands.json的生成有如下2种方法,其中第1种方法比较简单快捷,第2种方法比较通用。

编译整个工程生成

编译成功后,生成compile_commands.json操作如下,本例使用J6 debug版本。
#生成compile_commands.json

out/debug-gcc_12.2-64/build$ python3 ../../../kernel/scripts/clang-tools/gen_compile_commands.py

#移到工程根目录

out/debug-gcc_12.2-64/build$ mv compile_commands.json ../../../

Linux makfile生成compile_commands.json方法

Linux kernel在支持生成compile_commands.json,只需要在kernel代码文件夹下使用命令(以arm64为例):

make CC=clang-xx ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- compile_commands.json -j32 即可。
  • 整个操作过程如下:

    • 确认clang 编译器版本和支持,后边要用到,若无,Ubuntu安装:sudo apt install clang。注意是clang,不是clangd

    # which clang- +TAB键选一个数字大的,至少是clang-11

    ~$ which clang-

    clang-14 clang-cpp-14 clang-format clang-format-14 clang-format-diff clang-format-diff-14

    • 编译kernel所需要的.config文件生成

      2种方法:

    1. 从其他工程copy过来。

    2. 工程生成

    $ export srctree=$(pwd) $ export OUTPUT_BUILD_DIR=${srctree}/../out
    $ make hobot_j6e_defconfig #若是有config选项需要你确认,看自己情况一般选择N,比如:Use pointer authentication for kernel (ARM64_PTR_AUTH_KERNEL) [Y/n/?] (NEW) n
    • 编译kernel生成compile_commands.json
    $ HEADER_DIRS="-Idrivers/tty/serial/8250 -Idrivers/i2c/busses -I../hobot-drivers/i2c -I../hobot-drivers/fusa/diag -I../hobot-drivers/syscon" $ make EXTRA_CFLAGS="$HEADER_DIRS" ARCH=arm64 SUBARCH=arm64 CC=clang-14 CROSS_COMPILE=aarch64-linux-gnu- compile_commands.json -j32 $ du -sh compile_commands.json 9.8M compile_commands.json

      以上是V1.0编译所需要的头文件包含,编译过程中若有编译错误,需要自行解决。

    • 移动compile_commands.json到vscode的根目录,即kernel目录的上一级目录。

.clangd

clangd无法识别一些gcc,g++的编译命令需将这些编译命令剔除,否则clangd无法正常工作。需要在kernel目录下增加.clangd文件,内容如下。

一些清理工作

前面用make生成了很多中间编译问题等,对阅读代码是不需要的,需要清理下。主要是在kernel下执行:make clean即可。
注意该命令可能会把生成compile_commands.json删除,清理之前保存下,清理之后还原下即可。

 

 

查看clangd LSP是否正常工作

  • 在第4步完成后,需要关闭VSCode,然后重新打开第3步所设置的Workspace。刚刚打开后VSCode状态栏会出现如下indexing转圈,则说明clangd LSP正常工作了。

  • 也可以查看工程根目录下.cache/clangd是否索引数据库生成,若有则说明clangd LSP正常工作了。
  • 若不正常工作,可以点开clangd:idle查看下相关log解决。

MCU工程

创建VSCode workspace

同上。SSH远程登录远程机器上,创建类似mcu.code-workspace VSCode工作区文件即可。注意:path需要指定到mcu这个目录,而不是工程目录v10MCU。

{

"folders": [

{

"path": "../xx/v10MCU/mcu"

}

]

}

然后VSCode远程开发插件remote-ssh直接登录远程机器上File -> Open Workplace from这个工作区文件即可。

生成MCU的compile_commands.json

  1. 修改编译系统Build/Autosar/build_autosar.pyBuild/FreeRtos/build_freertos.py
把cmd = "scons" + jn + " --site-dir=" + SCONS_SITE_DIR + " " + \里的“scons“替换为"bear --config /xxx/bear_config_ghs.json --output ./compile_commands.json -- scons"即可。
  1. bear_config_ghs.json 配置

  1. 正常编译,compile_commands.json生成在工程目录的mcu目录里。

.clangd

为了让clangd正常支持MCU ARM32交叉编译环境,需要在工程目录下增加一个.clangd文件,如下。

CompileFlags:

Add: --target=arm-none-eabi

Remove: -mabi=lp32

高效工作快捷键

  • 移动光标到行首: home

  • 移动光标到行尾: end

  • 跳转文档头部: Ctrl+home

  • 跳转文档尾部: Ctrl+end

  • 花括号跳转: Ctrl+Shift+\

  • 文件跳转:Ctrl+P

  • 行跳转:Ctrl+G

  • 文件夹和workspace跳转: Ctrl + R

  • Alt + ← (Windows/Linux) 或 Ctrl + ← (macOS) - 光标回到上一个编辑的位置。

  • Alt + → (Windows/Linux) 或 Ctrl + → (macOS) - 光标回到下一个编辑的位置。

  • Ctrl + Tab 在打开的编辑器之间切换。

  • Ctrl + P 打开@Symbol模式,输入符号名可快速跳转到该符号定义处。

  • F12 跳转到当前光标下符号的定义处。

  • Find All References: Shift+Alt+F12

  • 批量修改:F2

VSCode+clangd 代码浏览常用操作

  • Ctrl + 左键单击变量/函数,可以跳到定义处。
  • Shift + F12变量/函数,可以列出该变量/函数在当前文件中所有的引用处。
  • Find symbol in file (Ctrl-P @foo) or workspace (Ctrl-P #foo).
  • 悬停提示:鼠标悬停(或按Ctrl-K)。
算法工具链
征程6技术深度解析杂谈
评论0
0/1000