MinGW下编译ffmpeg源码时生成compile_commands.json

在前面的博文MinGW下编译nginx源码中,有介绍到使用compiledb工具在MinGW环境中生成compile_commands.json,以为compiledb是捕获的make时的输出,而nginx生成时控制台是有输出编译时的命令行信息的,笔者之前编译过ffmpeg的源码,它不是完全输出编译时的命令行信息,而只是简单的输出CC XXX.o这样的信息,那compiledb能否正常生成compile_commands.json呢?为此笔者尝试了一下。

笔者编译开源源码时,为了不污染源码,一般喜欢单独创建一个build目录来编译,这也是开源界所提倡的。所以笔者在MinGW下编译ffmpeg源码时也是如此。要编译ffmpeg的源码,与大多数开源代码一样,需要先运行configure脚本,生成Makefile,再调用make来编译。

ffmpeg源码下建立build目录,并在其下执行:

bash 复制代码
$ ../configure --prefix=
$ compiledb make -j8

看是否会生成compile_commands.json,结果却生成不了。我以为真是从我们看到的屏幕信息中捕获的信息,于是我让它在编译时把命令显示出来:

bash 复制代码
$ compiledb make -j8 V=1

make的命令行参数V=1定义变量V让它显示详细信息,参见源码ffbuild/common.mak

Makefile规则中可以看到所有编译规则都是调用的COMPILE宏,再执行的相应的命令,如果没定义变量V则重写了BRIEF中所列的所有命令,调用printf命令 目标的格式显示,再执行相应的命令。

可以使用remake工具进行调试查看。在MinGW下使用命令:

bash 复制代码
$ pacman -S remake

安装remake。

build目录使用命令:

bash 复制代码
$ remake -X

调试Makefile,再使用expand COMPILE_C查看展开后的变量COMPILE_C

回到主题,使用

bash 复制代码
$ compiledb make -j8 V=1

依旧不能生成compile_commands.json,为此我还调试了compiledb源码,发现实际是解析到了结果,但是最后因为找不到实际的源文件,所以未生成compile_commands.jsonMinGW下编译ffmpeg源码时,在build目录下使用../configure生成的Makefile,是使用的绝对路径,而不是相对路径,MinGW下的Windows目录的绝对路径表示与Windows的本身表示的不一样,Windows本身的路径如:H:\OpenSource\ffmpeg\build,在MinGW下是/h/OpenSource/ffmpeg/build

从前面ffbuild/common.mak中的COMPILE宏中可以知道编译源文件时是使用了SRC_PATHSRC_LINK变量,使用remakep SRC_PATH命令查看位置,在ffbuild/config.mak:15


ffbuild/config.mak是由configure程序生成的,那需要在configure源码去找生成ffbuild/config.mak时的写入代码:

bash 复制代码
cat > ffbuild/config.mak <<EOF
# Automatically generated by configure - do not modify!
ifndef FFMPEG_CONFIG_MAK
FFMPEG_CONFIG_MAK=1
FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
DOCDIR=\$(DESTDIR)$docdir
MANDIR=\$(DESTDIR)$mandir
PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir
INSTALL_NAME_DIR=$install_name_dir
SRC_PATH=$source_path
SRC_LINK=$source_link

8106行开始写入,8121行使用了$source_path变量

查找设置$source_path变量的地方,4248行开始:

原来它只假定了源码的根目录使用configure命令和把根目录作为src目录使用configure命令两种方式的相对路径,其它都是使用的绝对路径。为了支持在子目录build下使用configure命令,添加:

bash 复制代码
elif test -f ../configure; then
    source_path=..

再次运行

bash 复制代码
$ ../configure --prefix=
$ compiledb make -j8

这回正常生成compile_commands.json了。

当然了,如果只是想生成compile_commands.json,也可以直接在根目录运行:

bash 复制代码
$ ./configure --prefix=
$ compiledb -n make -j8

即可。这样就可以使用VSCode打开项目,在代码中正常跳转了!

总结下来,compiledb其实是可以正常生成compile_commands.json的,并且它并不是以我们在屏幕上看到的输出来生成compile_commands.json的。感兴趣的读者可以自行去看它的python源码

如果对你有帮助,欢迎点赞收藏!

相关推荐
海兰2 天前
【高速缓存】RedisVL 存储类型选择指南:Hash 与 JSON
人工智能·redis·算法·缓存·json·哈希算法
减瓦2 天前
Jackson 使用指南
java·spring boot·json
制造数据与AI践行者老蒋2 天前
离谱!PromptTemplate 遇上 JSON,花括号直接引发解析战争
数据库·microsoft·json
chenjingming6662 天前
JWT(JSON Web Token)有效期查看登录过期时间
json
Yeauty3 天前
你那条 ffmpeg 命令,一键翻成 Rust builder 代码
开发语言·rust·ffmpeg
绘梨衣的sakura路3 天前
Fastjson ≤ 1.2.83 新型 RCE 漏洞深度分析:三层绕过机制与完整利用链
安全·web安全·json
江湖十年3 天前
Go 语言中 YAML to JSON 踩坑笔记
后端·go·json
前网易架构师-高司机4 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
前网易架构师-高司机4 天前
带标注的浮游藻类24种数据集,识别率91.5 %数据集, 23175张图,支持yolo,coco json,voc xml,文末有模型训练代码
yolo·json·数据集·微观·生物·浮游·藻类
Yeauty4 天前
用 Whisper 转录前,你不用再离开 Rust
开发语言·rust·ffmpeg·音视频·视频