大家在使用vscode查看linux源代码时,会有很多飘红处,而且函数的跳转非常不方便。所以linux给了一个脚本gen_compile_commands.py,此脚本类似ctags这样,产生相应的关联之类的数据库,方便函数及文件的跳转等等。非常好。但是这个文档的说明不是太友好,加上网上一些资料也不是说得特别清楚,都是一句话,直接执行gen_compile_commands.py即可以产生compile_commands.json文件,但是你下载下来,解压源码发现是不行的,只会产生一个空的compile_commands.json文件。
我也是遇到这个坑。
后来查看了一些资料,包括gen_compile_commands.py源代码,他的文件头的注释如下:
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) Google LLC, 2018
#
# Author: Tom Roeder <tmroeder@google.com>
#
"""A tool for generating compile_commands.json in the Linux kernel."""
import argparse
没有什么参考价值,如果文件说明一下 xx.py -d kernel_build_path,那我觉得就有价值了。
发现py只是对.cmd文件的解析,部分代码如下:
def cmdfiles_in_dir(directory):
"""Generate the iterator of .cmd files found under the directory.
Walk under the given directory, and yield every .cmd file found.
Args:
directory: The directory to search for .cmd files.
Yields:
The path to a .cmd file.
"""
filename_matcher = re.compile(_FILENAME_PATTERN)
我在源代码下find . -name "*.cmd",发现一个都没有,就更奇怪了。后来突然想起,我make时指定了输出路径,make O=../build j24,即输出到上层的build目录下,我进入上层的build目录下,发现产生了非常多的.cmd文件。我是5.10.x的源代码,如下:
原因找到了,那就非常好解决了。
第一步:编译内核源代码,如果没有执行,不会产生.cmd文件,就不用谈第二步了,这也是为什么没编译的代码无法产生json文件的原因
第二步:执行gen_compile_commands.py -d build_output_path,然后将产生的json文件加入vscode的配置中,vscode加入后,解析大约需要几分钟,解析好,函数随意跳转,方便。
注意上面的-d build_output_path,这个如果没有写,默认就是“.",即当前目录,就像我上面所述一样,我kernel编译输出的路径是../build,我在执行gen_compile_commands.py没有指定.cmd的目录,所以输出的就是空的json文件。
我暂时是这么理解,如果大家遇到其他更好的方法,欢迎评论,指正。
希望上述解析对你有帮助。