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 $@"--"$(<)
运行结果如下:
感谢 NETINT(镕铭微电子) 赞助《FFmpeg原理》免费版一书的服务器费用,下面是 VPU 产品介绍