Make单词,是制作的意思,就是要做出来某个文件,常用作构建命令来使用
通常需要配合Makefile一起使用
Makefile文件由一系列的规则组成,每条规则的形式如下:
<target> : <pererquisites>
[tab] <commands>
所以Makefile的文件样式如下:
<target> : <pererquisites>
[tab] <commands>
<target> : <pererquisites>
[tab] <commands>
<target> : <pererquisites>
[tab] <commands>
target表示目标,不可省略
pererquisites表示前置条件,可以省略
tab表示tab按键,不可省略
commands表示命令,可以省略
pererquisites和commands二者不可以都省略
目标-target
一个目标就构成了一条规则,目标可以是文件名,指明Make命令所要构建的对象,例如在makefile中编写如下内容:
a.txt: b.txt c.txt
cat b.txt c.txt > a.txt
表示文件a.txt依赖于b.txt和c.txt,将b.txt和c.txt的内容输入到a.txt中去
目标还可以是某个操作的名字,成为伪目标phony target,例如
clean:
rm *.txt
表示删除所有txt后缀名的文件,下面这个makefile作为演示:
a.txt: b.txt c.txt
cat b.txt c.txt>a.txt
b.txt:
echo "this is b" > b.txt
c.txt:
echo "this is c" > c.txt
clean:
rm *.txt
执行make a.txt
命令,会生成a.txt b.txt c.txt三个文件
执行make clean
命令,则会删除这三个文件
如果执行命令之前,当前目录中已经有了a.txt文件,那么文件会被覆盖,再次执行,则会提示make: 'a.txt' is up to date
在开发工作中,比较常用的是伪命令,很多项目的构建都是使用makefile,例如前面的例子,如果存在名为clean
的文件,那么make clean
命令则不会正确执行,提示make: 'clean' is up to date
,因为他把clean当成了文件,这时就需要在makefile中明确声明clean
是一个伪目标:
.PHONY: clean
clean:
rm *.txt
即可正确执行
如果执行make命令时没有指定目标,那么就会执行makefile中的第一个目标,上述例子中,就会执行a.txt
前置条件prerequisites
前置条件表示执行目标之前的必要条件,例如上述例子,目标a.txt的前置条件是b.txt和c.txt,如果b.txt和c.txt不存在,那么make命令将去寻找并执行b.txt和c.txt作为目标的规则,如果找不到,将会执行失败。
上述例子中目标b.txt和c.txt都没有前置条件,意味着他跟其他的文件都无关,只要这个文件不存在,每次调用make b.txt
,他都会生成。
如果连续执行两次make b.txt
,第一次会新建一个,第二次Make发现b.txt没有变动,就不会生成新的文件。
命令commands
命令表示如何更新目标文件,或者伪目标所要执行的命令,由一行或多行的shell命令组成,是构建目标的具体指令。
每行命令在单独的shell中执行,因此第二行的取不到第一行的值
get:
export x=1
echo "x=[$$x]"
解决方案是用\转义
get:
export x=1;\
echo "x=[$$x]"
其他语法
#表示注释
make会打印每一条命令然后再执行,包括注释,在make中叫做回声echoing,在命令或者注释前面加上@就可以取消回声
可以自定义变量: a=123
,调用时,变量需要放在$()
中,如果调用的是shell变量(上文get的例子),则需要使用$$,因为make命令会对美元符号进行转义,变量的值也可以指向另一个变量b=$(a)
赋值运算符包含4种:= := ?= +=
makefile中的知识还包括:内置变量,自动变量,判断,循环,函数等等
转载请注明来源