? ? ? ? 大家在使用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文件。
我暫時是這么理解,如果大家遇到其他更好的方法,歡迎評論,指正。
希望上述解析對你有幫助。