Q:一个完成的Makefile应该包含哪些东西呢?
A: 在一个完整的Makefile中,包含了5个东西:显式规则、隐含规则、变量的定义、指示符和注释。
注释:注释是最简单的了,Makefile中以"#"开头的行都为注释行。
显示规则:它描述了在何种情况下如何更新一个或者多个被称为目标的文件(Makefile的目标文件),在书写Makefile是需要明确地给出目标文件、目标的依赖文件列表以及更新目标文件所需要的命令。
如:
========================================================================
all: a.o b.o
gcc -o $@ $<
========================================================================
隐藏规则:它是make根据此类目标文件的命名(典型的是文件名的后缀)而自动推导出来的规则。make根据目标文件的名字,自动产生目标的依赖文件并使用默认的命令来对目标进行更新。
如:
========================================================================
foo : foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
========================================================================
变量定义:就是使用一个字符串代表一段文本串,当定义了变量以后,Makefile后续在需要使用此文本串的地方,通过引用这个变量来实现对文本串的使用。
Makefile指示符:指示符指明在make程序读取makefile文件过程中所要执行的一个动作。其中包括:
读取一个文件,读取给定文件名的文件: include xxxx
决定(通常是根据一个变量的得值)处理或者忽略Makefile中的某一特定部分。
定义一个多行变量。
注:默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”。
在实际项目中,可能我们并没有使用上述的三个名字,而是自己随便整了一个名字。如:MAKEFILE.MK。这时我们可以通过‘-f‘来告诉make我们实际的makefile文件。
当实际的工程比较大时,往往Makefile文件会比较大,此时我们可能会把一些公用的东西单独写到一个文件中。那么,我们在Makefile文件需要使用该文件的内容时可以使用"include"指示符。这样,make暂停读取当前的Makefile,而转去读取“include”指定的一个或者多个文件,完成以后再继续当前Makefile的读取。Makefile中指示符“include”书写在独立的一行,其形式如下:
include Files......
在看别人写的Makefile中,经常能看到这么一场:
===============================================================================
.PHONY: clean
clean:
-rm -f *.o
===============================================================================
会看到‘-rm‘多了一个横线,“-”的意思是告诉make,忽略此操作的错误。make继续执行。
Make 是如何解析Makefile文件的呢?
GUN make的执行过程分为两个阶段。
第一阶段:读取所有的makefile文件(包括“MAKIFILES”变量指定的、指示符“include”指定的、以及命令行选项“-f(--file)”指定makefile文件),内建所有的变量、明确规则和隐含规则,并建立所有目标和依赖之间的依赖关系结构链表。
第二阶段:根据第一阶段已经建立的依赖关系结构链表决定哪些目标需要更新,并使用对应的规则来重建这些目标。
原文:http://blog.csdn.net/lpjybn/article/details/23347671