make及makefile

  1. 目标-target
  2. 前置条件prerequisites
  3. 命令commands
  4. 其他语法

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中的知识还包括:内置变量,自动变量,判断,循环,函数等等


转载请注明来源

×

喜欢就点赞,疼爱就打赏