makefile语法摘要—FFmpeg makefile源码分析

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

阅读本文需要有 makefile 基础,推荐先看一般 《跟我一起写 makefile》

本文主要讲解 FFmpeg 的 Makefile 文件用到的 语法跟一些函数,可以当手册查询,在 makefile 里面,函数也叫关键字。


1,vpath 函数。指定某些文件的搜索路径,示例代码如下:

vpath %.o   /home/ubuntu/

install: test33.o
    echo "666"

运行结果如下:

make-syntax-1-1

能输出 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)

运行结果如下:

make-syntax-1-2

可以看到,不是 55 66 ,而是 77 ,66 ,因为 x 的最终的值是 77。这样会很影响写代码的逻辑,可以用 := 取最近的值。把上面的代码注释打开就是 55 66 了。


3,wildcard,泛匹配函数。跟正则匹配类似,可以返回多个匹配上的结果,示例代码如下:

DATA_FILES := $(wildcard ./presets/*.ffpreset)

install:
    echo $(DATA_FILES)

运行结果如下:

make-syntax-1-3

可以看到 .ffpreset 后缀的文件都匹配出来了。


4,define ,自定义函数,代码如下:

define DOFFTOOL
OBJS-$(1) =8888
endef

$(eval $(call DOFFTOOL,ffmpeg))

install:
    echo $(OBJS-ffmpeg)

运行结果如下:

make-syntax-1-4

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)

运行结果如下:

make-syntax-1-5

makefile 的语法就是可以定义多个一样的依赖项,全部都会执行。


7,以 - 开头,以 - 开头的命令都是忽略错误的,例如 -include,文件不存在就忽略错误,不要报错。


8,!CONFIG_AVRESAMPLE=yes! 感叹号是取反,也就是 CONFIG_AVRESAMPLE 不等于 yes。至于等于什么,我也不知道。


9,特殊变量,$@$^$<

$@ 表示所有的目标文件,$^ 表示所有的依赖文件,$< 表示第一个依赖文件。示例代码如下:

install: configure Changelog
    echo $@"--"$(^)

install2: configure Changelog
    echo $@"--"$(<)

运行结果如下:

make-logic-1-2



感谢 NETINT(镕铭微电子) 赞助《FFmpeg原理》免费版一书的服务器费用,下面是 VPU 产品介绍

版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2023-05-17 11:39:55

results matching ""

    No results matching ""