makefile语法摘要—FFmpeg makefile源码分析
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
阅读本文需要有 makefile 基础,推荐先看一般 《跟我一起写 makefile》。
本文主要讲解 FFmpeg 的 Makefile 文件用到的 语法跟一些函数,可以当手册查询,在 makefile 里面,函数也叫关键字。
1,vpath 函数。指定某些文件的搜索路径,示例代码如下:
vpath %.o /home/ubuntu/
install: test33.o
echo "666"
运行结果如下:

能输出 666 是因为我 在 /home/ubuntu/ 目录创建了 test33.o 文件,第二句代码 vpath 就是指定 .o 后缀的文件在 /home/ubuntu/ 目录查找。
如果把 vpath 这句代码删了,那只会在当前目录查找 test33.o 文件。
2,:= 跟 = 赋值的区别。:= 是用当前值, = 是用展开后的值,因为 makefile 是把所有变量展开之后再赋值,例子如下:
x=55
y=$(x) 66
#y:=$(x) 66
x=77
install:
echo $(y)
运行结果如下:

可以看到,不是 55 66 ,而是 77 ,66 ,因为 x 的最终的值是 77。这样会很影响写代码的逻辑,可以用 := 取最近的值。把上面的代码注释打开就是 55 66 了。
3,wildcard,泛匹配函数。跟正则匹配类似,可以返回多个匹配上的结果,示例代码如下:
DATA_FILES := $(wildcard ./presets/*.ffpreset)
install:
echo $(DATA_FILES)
运行结果如下:

可以看到 .ffpreset 后缀的文件都匹配出来了。
4,define ,自定义函数,代码如下:
define DOFFTOOL
OBJS-$(1) =8888
endef
$(eval $(call DOFFTOOL,ffmpeg))
install:
echo $(OBJS-ffmpeg)
运行结果如下:

makefile 里面函数的定义跟使用就是上面那样,然后 ffmpeg 就是 $(1) 变量。
5,依赖关系中的竖线 |。
makefile的执行逻辑是,目标依赖于依赖文件,当依赖文件不存在时,make会去寻找其它规则创建依赖文件;当依赖文件比目标文件更新时,这条规则会被执行。
但是在 依赖关系后面加 一个 竖线 | 是啥意思呢?竖线 | 代表不关注后面的依赖项的更新时间,请看下面的示例。
ffmpeg.exe: | fftools
echo "888"
上面这句代码是指 ffmpeg.exe 依赖 fftools 目录的存在,但是即使 fftools 目录的更新时间比 ffmpeg.exe 大,也不会执行 echo 。
6,利用依赖关系赋值,示例代码如下:
CFLAGS=ppoo
install: CFLAGS += -o3
install:
echo $(CFLAGS)
运行结果如下:

makefile 的语法就是可以定义多个一样的依赖项,全部都会执行。
7,以 - 开头,以 - 开头的命令都是忽略错误的,例如 -include,文件不存在就忽略错误,不要报错。
8,!CONFIG_AVRESAMPLE=yes,! 感叹号是取反,也就是 CONFIG_AVRESAMPLE 不等于 yes。至于等于什么,我也不知道。
9,特殊变量,$@ ,$^ ,$<。
$@ 表示所有的目标文件,$^ 表示所有的依赖文件,$< 表示第一个依赖文件。示例代码如下:
install: configure Changelog
echo $@"--"$(^)
install2: configure Changelog
echo $@"--"$(<)
运行结果如下:

