本文为看雪论坛优秀文章
看雪论坛作者ID:Ssage泓清
一
前言
二
浅谈代码索引
CLion对代码索引的功能 貌似就是通过clangd实现的。
make ## 原编译命令 --> 不生成compile_commands.json
bear make ## 使用bear --> 生成compile_commands.json
set(CMAKE_EXPORT_COMPILE_COMMANDS True)
这里特别提一嘴,对于mk体系编译的的项目 mk脚本,其本质上是make,但是对于安卓的来说,生成编译描述文件非常简单。 官方有文档(https://developer.android.com/ndk/guides/ndk-build#json)提供命令。
ndk-build GEN_COMPILE_COMMANDS_DB=true ## 构建的时候顺便生成compile_commands.json
三
敲定方案
毫无疑问 Kernel的源码大多是c文件,以及少部分的汇编文件,设备树文件......
Kernel正好是make体系,理论上是可以用Bear的。由于我做教程的时候,已经把内核编译结束了,实在不想重新编译内核,理论上选哪个都一样,我们只是要个编译描述文件罢。
四
开始动手
## 这里选择common-android12-5.10分支
repo init -u https://android.googlesource.com/kernel/manifest -b common-android12-5.10
repo sync
BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh
cd common # 进入内核源码根目录
# clone vscode-linux-kernel项目到.vscode文件夹
# 该文件夹为vscode配置文件夹 类似于.idea
git clone --depth=1 https://github.com/amezin/vscode-linux-kernel.git .vscode
python .vscode/generate_compdb.py -O ../out/android12-5.10/common/
ls -al | grep compile_commands.json
# -rw-r--r-- 1 kali kali 8888862 Nov 30 01:07 compile_commands.json
对于Out-of-tree编译的内核模块
详细见原项目地址的Out-of-tree module development (https://github.com/amezin/vscode-linux-kernel#out-of-tree-module-development)
这一套代码解析方案也完美的适用于Out-of-tree的内核模块
{
"files.associations": {
"iostream": "cpp",
"intrinsics.h": "c",
"ostream": "cpp",
"vector": "cpp"
},
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.formatOnType": true,
// 关闭 C/C++ Extension Pack 插件的提示 防止其与clangd冲突
"C_Cpp.errorSquiggles": "Disabled",
"C_Cpp.intelliSenseEngineFallback": "Disabled",
"C_Cpp.intelliSenseEngine": "Disabled",
"C_Cpp.autocomplete": "Disabled", // So you don't get autocomplete from both extensions.
// 指向clangd路径
"clangd.path": "/tmp/NDK/ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin/clangd",
"clangd.arguments": [
// compelie_commands.json 文件的目录位置
"--compile-commands-dir=${workspaceFolder}/",
// 让 Clangd 生成更详细的日志
"--log=verbose",
// 输出的 JSON 文件更美观
"--pretty",
// 全局补全
"--all-scopes-completion",
// 建议风格:打包(重载函数只会给出一个建议)相反可以设置为detailed
"--completion-style=bundled",
// 跨文件重命名变量
"--cross-file-rename",
// 允许补充头文件
"--header-insertion=iwyu",
// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
"--header-insertion-decorators",
// 在后台自动分析文件 基于 complie_commands
"--background-index",
// 启用 Clang-Tidy 以提供「静态检查」
"--clang-tidy",
// Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查
// 参数后部分的*表示通配符
// 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
// 默认格式化风格: 谷歌开源项目代码指南
"--fallback-style=file",
// 同时开启的任务数量
"-j=2",
// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)
"--pch-storage=disk",
// 启用这项时,补全函数时,将会给参数提供占位符
// 我选择禁用
"--function-arg-placeholders=false"
],
}
五
做一些润滑
CompileFlags:
Add: [-Wno-declaration-after-, -Wno-int-conversion, -Wno-all]
Diagnostics:
ClangTidy:
Remove: bugprone-sizeof-expression
看雪ID:Ssage泓清
https://bbs.pediy.com/user-home-942658.htm
# 往期推荐
球分享
球点赞
球在看
点击“阅读原文”,了解更多!