Make命令教程
三、Makefile文件的语法 3.1 注释 井号(#)在Makefile中表示注释。
3.2 回声(echoing) 正常情况下,make会打印每条命令,然后再执行,这就叫做回声(echoing)。
执行上面的规则,会得到下面的结果。
在命令的前面加上@,就可以关闭回声。
现在再执行make test,就不会有任何输出。 由于在构建过程中,需要了解当前在执行哪条命令,所以通常只在注释和纯显示的echo命令前面加上@。
3.3 通配符 通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。
3.4 模式匹配 Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。
等同于下面的写法。
使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建。 3.5 变量和赋值符 Makefile 允许使用等号自定义变量。
上面代码中,变量 txt 等于 Hello World。调用时,变量需要放在 $( ) 之中。 调用Shell变量,需要在美元符号前,再加一个美元符号,这是因为Make命令会对美元符号转义。
有时,变量的值可能指向另一个变量。
上面代码中,变量 v1 的值是另一个变量 v2。这时会产生一个问题,v1 的值到底在定义时扩展(静态扩展),还是在运行时扩展(动态扩展)?如果 v2 的值是动态的,这两种扩展方式的结果可能会差异很大。 为了解决类似问题,Makefile一共提供了四个赋值运算符 (=、:=、?=、+=),它们的区别请看StackOverflow。
3.6 内置变量(Implicit Variables) Make命令提供一系列内置变量,比如,$(CC) 指向当前使用的编译器,$(MAKE) 指向当前使用的Make工具。这主要是为了跨平台的兼容性,详细的内置变量清单见手册。
3.7 自动变量(Automatic Variables) Make命令还提供一些自动变量,它们的值与当前规则有关。主要有以下几个。 (1)$@ $@指代当前目标,就是Make命令当前构建的那个目标。比如,make foo的 $@ 就指代foo。
等同于下面的写法。
(2)$< $< 指代第一个前置条件。比如,规则为 t: p1 p2,那么$< 就指代p1。
等同于下面的写法。
(3)$? $? 指代比目标更新的所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,其中 p2 的时间戳比 t 新,$?就指代p2。 (4)$^ $^ 指代所有前置条件,之间以空格分隔。比如,规则为 t: p1 p2,那么 $^ 就指代 p1 p2 。 (5)$* $* 指代匹配符 % 匹配的部分, 比如% 匹配 f1.txt 中的f1 ,$* 就表示 f1。 (6)$(@D) 和 $(@F) $(@D) 和 $(@F) 分别指向 $@ 的目录名和文件名。比如,$@是 src/input.c,那么$(@D) 的值为 src ,$(@F) 的值为 input.c。 (7)$(<D) 和 $(<F) $(<D) 和 $(<F) 分别指向 $< 的目录名和文件名。 所有的自动变量清单,请看手册。下面是自动变量的一个例子。
上面代码将 src 目录下的 txt 文件,拷贝到 dest 目录下。首先判断 dest 目录是否存在,如果不存在就新建,然后,$< 指代前置文件(src/%.txt), $@ 指代目标文件(dest/%.txt)。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |