Linux 内核为模块生成 compile-commands.json

St.*_*rio 1 c linux makefile linux-device-driver linux-kernel

问题:大多数宏定义甚至头文件都不会被 IDE 查找,因为 IDE 配置中没有指定包含路径。它禁止自动完成和导航。

这是我的Makefile

#-Wno-declaration-after-statement
ccflags-y := -std=gnu11 -Wno-declaration-after-statement -Werror
obj-m += pfsw.o
pfsw-objs := src/init.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

我运行make V=1并注意到编译命令和包含路径实际上非常麻烦(计算 Linux 特定-include的参数):

gcc -Wp,-MD,/home/memyself/lkm/procfs_write/src/.init.o.d  -nostdinc 
   -isystem /usr/lib/gcc/x86_64-linux-gnu/7/include  
   -I./arch/x86/include -I./arch/x86/include/generated  -I./include -I./arch/x86/include/uapi
   -I./arch/x86/include/generated/uapi -I./include/uapi -I./include/generated/uapi 
   -include ./include/linux/kconfig.h -Iubuntu/include  -include ./include/linux/compiler_types.h 
   -D__KERNEL__
   //tons of options ommitted...
   -c -o /home/memyself/lkm/procfs_write/src/init.o
    /home/memyself/lkm/procfs_write/src/init.c
Run Code Online (Sandbox Code Playgroud)

问题:有没有办法生成compile-command.json通知 IDE 有关包含路径的信息?还是唯一的解决办法是手动将include路径一一传递给IDE?

0an*_*riy 6

由于 CLang 有很多不同的工具,包括一些分析代码的工具,因此需要compile-command.json。这就是为什么来自 Google 的 Tom Roeder在提交b30204640192(“脚本:添加一个工具以生成 compile_commands.json 文件”)中为此提供了一个 scripts/clang-tools/gen_compile_commands.py

注意,内核必须在列表中编译一次才能使这个脚本工作。

PS 我想你正在尝试 MS Visual Studio Code?

感谢我的同事 Alex,他是它的用户,并告诉我存在这样的脚本。