本文以 ffmpeg-n4.4.1 的版本为准,主要分析 ffmpeg 项目中 Makefile 的逻辑。
我的环境是window10 + msys2 ,以这个环境为基础进行讲解。
《ffmpeg-configure编译分析》 之前已经讲解了 configure 的作用,就是根据不同的编译环境,生成了相应的 configure.h 跟 config.mak。例如 如果指定 --toolchain=msvc ,makefile里面的规则 就会使用vs2019的 cl.exe 跟 link.exe 来编译跟链接 C代码。如果没指定 toolchain, 就会默认使用 msys2 里面的 gcc.exe 来编译跟链接 C代码。
msys2 里面执行./configure --toolchain=msvc
跟 ./configure
生成的 config.mak 差异如下。
从上图可以看到,configure 的时候可以通过 --toolchain 影响编译的时候使用什么样的编译器。
常见错误:
1,Makefile:25: *** missing separator. Stop.
上面的错误基本上是因为 makefile 中要执行的命令,前面不是tab键,而是几个空格,编辑器问题。
在开始分析之前,讲一个 makefile 的调试技巧,推荐阅读《如何调试MAKEFILE变量》
make -f Makefile -f vars.mk HOSTPROGS
这里我对 vars.mk 做了点修改,因为源 vars.mk 没处理特殊字符,直接echo 会报错。ffmpeg makefile 的变量很多特殊字符。我用了 warning 来输出,就不会报错。
vars.mk 文件内容如下:
%:
$(warning '$*=$($*)')
d-%:
# @printf "%s =888 %s\n" "abc" $($*)
$(warning '$*=$($*)')
# @echo '$*=$($*)'
# @echo ' origin = $(origin $*)'
# @echo ' value = $(value $*)'
# @echo ' flavor = $(flavor $*)'
现在从第一行代码开始分析 ffmpeg 里 Makefile 文件的逻辑。不熟悉 makefile 的可以先看一遍《跟我一起写 makefile》
第1~2行代码如下:
MAIN_MAKEFILE=1
include ffbuild/config.mak