如何生成linux内核源码的compile_commands.json?

我使用cquery进行代码导航,使用bear make生成compile_commands.json。但是在实际操作中,make是成功的,同时也生成了compile_commands.json文件,但是这里面有些源码的信息却没有,导致不能进行与这些源文件相关的代码导航。请问有人有类似的经验吗?还是这种时候就改global登场了?

bear make 会应用你当前环境下的编译条件,例如以下代码,当编译条件是 DARWIN 时,LINUX 分支的代码就没有被索引了:

#ifdef LINUX
  char *platform = "Linux";
#else
#ifdef DARWIN
  char *platform = "Darwin";
#endif
#endif

这个效果必须是 libclang 5.0.1 以上 (5.0.0 以下则是整块 #if 代码都没有索引),更多讨论:幫忙改進 C++ LSP 體驗 - #58,来自 twlz0ne

不知道你说的是不是这个问题。请补充完整你的问题,附上操作步骤、代码片段、截图。

另外使用bear make前注意make clean防止有些targets已經構建了,compile_commands.json缺乏相應信息

我之前用這個命令生成compile_commands.json

wget 'https://git.archlinux.org/svntogit/packages.git/plain/trunk/config?h=packages/linux' -O .config
yes '' | make config
bear make -j bzImage modules

如果不同#if #ifdef分支都想索引,cquery是解決不了的(一個源文件只存一個版本,即使用多個translation units用不同方式編譯它),某些C++ IDE可以處理。對於Linux kernel這種重度依賴macro的,還要結合ggtags

多谢各位帮助, 由于平时对linux内核的源码不熟悉, 目前在编译的环节上就出了问题… 后面的工作进行不下去了… 在找同事帮助中…