Makefile各类符号

来源:互联网 发布:手游存档软件 编辑:程序博客网 时间:2024/06/09 15:23

makefile总规则:欲更新目标,必须首先更新它的所有条件;
命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它,
在大型项目中gcc的-M选项自动生成目标文件和源文件的依赖关系

冒号表示,

main: main.o stack.o maze.o #目标:条件
gcc main.o stack.o maze.o -o main #执行的命令
main.o: main.c main.h stack.h maze.h
gcc -c main.c
stack.o: stack.c stack.h main.h
gcc -c stack.c
maze.o: maze.c maze.h main.h
gcc -c maze.c
红色部分是makefile 的理念,很重要:
执行makefile的时候会尝试更新makefile的第一条规则,第一条规则的目标称为缺省目标,只要缺省目标更新了就算完成任务,而要更新缺省目标,需要先更新缺省目标的条件。所以总结的一点就是,makefile类似堆栈,由下而上的执行makefile。

重新编译的时候只编译受影响的文件。

执行makefile重新编译的时候,仍然尝试更新缺省目标,继而取更新目标的条件目标,重新编译的条件是被修改的文件的修改时间若是最新的,则需要重新编译相关联的文件,这样受影响的目标条件被更新了,那么缺省目标也也就需要重新编译。即,以下情况下要更新

makefile的命名规则

执行make命令时,是按照GNUmakefile、makefile、Makefile的顺序找到第一个存在的文件并执行它,不过还是建议使用Makefile做文件名。除了GNU make,有些UNIX系统的make命令不
是GNU make,不会查找GNUmakefile这个文件名,如果你写的Makefile包含GNU make的特殊语法,可以起名为GNUmakefile,否则不建议用这个文件名。

@,%,^,<,-,$()等符号的说明

@:
如果执行命令前加上它,则只显示命令结果,不显示命令本身
-:
通常makefile里的命令执行出错(该命令的退出状态非0),就立刻终止makefle的执行。但是在命令前加上’-‘,即便命令出错makefile还会执行。通常rm命令和mkdir命令前面要加-号。

.phony 关键字

在目标前添加它,表示该目标是虚假目标,即伪目标。不管它的目标文件存在不存在都要更新,即需要执行,想clean一样

$()

在makefile中使用$()获取makefile中定义的变量的值,如果变量没有定义其值为空,这样可以很好的控制编译时的参数。

$@

$@获取规则中的目标,规则实例:main.o:main.cq其中main.o是目标main.c是条件且是第一个条件

$<

$<获取规则中的第一个条件

$?

$?,表示规则中所有比目标新的条件,组成一个列表,以空格分隔。

$^

$^,表示规则中的所有条件,组成一个列表,以空格分隔。

%

%是替换字符,表示1个或者多个字符,实例:%.o:%.c这个实例称之为模式规则也是makefile的隐含规则

:= = ?= +=

:=表示立即展开,即立即进行赋值;=表示延迟展开,即若当前没有定义该变量,会需找定义再展开;?=表示如foo ?= (bar)foo?==foo(bar),但不立即展开;如果先前已经定义了foo,则什么也不做,不会给foo重新赋值;+=表示追加赋值,但同时保留变量赋值符号的特性,即采用:=进行赋值的话,那么+=保持:=的特性。
一个变量的定义从=后面的第一个非空白字符开始(从(x)开始),包括后面的所有字符,直到注释或换行之前结束。如果要定义一个变量的值是一个空格,可以这样:
nullstring := (回车)

0 0
原创粉丝点击