一、makefile文件简介:makefile文件主要包含了5部分内容:
01. 显式规则:说明了如何生成一个或多个目标文件。包括要生成的文件、文件的依赖文件、生成的命令。
02. 隐式规则:make有自动推导功能,所以饮食的规则可以比较粗糙地简略书写makefile文件。
03. 变量定义:变量一般都是字符串。当makefile文件被执行时,其中的变量都会扩展到相应的引用位置上。
04. 文件指示:包括三部分:a. 在一个makefile文件中引用另一个makefile文件;
b. 根据某些情况制定makefile文件中的有效部分;
c. 定义一个多行的命令;
05. 注释:makefile文件中只有行注释,用‘#’字符。如果要在makefile中用‘#’,可以用反斜杠转义,如‘\#’。
注:
01. 默认情况下,make命令会在当前目录下按顺序寻找文件名为“GNUmakefile”、"Makefile"、"makefile"的文件,找到后解释这些文件。
02. 如果要指定特定的makefile文件,可以使用make的-f和--file参数,如:
[root@www]#make -f makelinux
03. 在makefile中使用include关键字可以把别的makefile文件包含进来,在include前面可以有些空字符,但是不能是以TAB键开始。例如有这样几个makefile文件:a.mk、b.mk c.mk,还有一个文件叫foo.make以及一个变量$(bar)
include foo.make *.mk $(bar) 等价于 include foo.make a.mk b.mk c.mk $(bar)
03. GNU的make工作时的执行步骤如下:
(1)读入所有的makefile;
(2)读入被include包括的其他makefile;
(3)初始化文件中的变量;
(4)推导隐式规则,并分析所有规则;
(5)为所有的目标文件创建依赖性关系链;
(6)根据依赖关系,决定哪些目标要重新生成;
(7)切换生成命令。
二、make书写规则
make书写规则包含两个部分,一个是依赖关系,另一个是生成目标的方法。在makefile文件中,规则的顺序是很重要的。因为makefile文件中只应该有一个最终目标,其他的目标都是连带出来的,所以一定要让make知道最终目标是什么。
01. 规则举例
foo.o: foo.c defs.h #foo 模块 gcc -c -g foo.c
文件的依赖关系:foo.o依赖于foo.c和defs.h文件,如果foo.c或者defs.h文件的日期比foo.o文件的日期新,或者foo.o不存在,则发生依赖关系;
如果生成foo.o,要用到gcc命令。
02. 在规则中使用通配符
make支持三种通配符:
‘*’
‘?’
‘[...]’
如:
clean: rm -f *.o pirnt: *.c lpr -p $? touch print
以上说明,通配符同样可以应用在变量中。makefile文件中的变量其实就是C/C++中的宏。如果要让通配符在变量中展开,也就是让objects的值成为所有【.o】的文件名的集合,如:
objects:= $(wildcard *.o)
这种用法由关键字wildcard给出。
03. 文件搜索
在一些大的工程中,有大量的源文件,通常的做法是把许多的源文件分类,并存放在不同的目录中。所以,当make需要去寻找文件的依赖关系是,可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make自动去找。
第一种办法:VPATH是个特殊变量
VPATH = src:../headers
第二种方法:vpath是make的关键字,不是变量
vpath <pattern> <directories> --为符合模式<pattern>的文件制定搜索目录<directories>
vpath <pattern> --清除符合<pattern>的文件搜索目录
vpath --清除所有一杯设置好了的文件搜索目录
vpath使用方法中的<pattern>需要包含‘%’字符。‘%’的意思是匹配一个以上的字符。
<pattern>指定了要搜索的文件集
<directories>指定了<pattern>文件集的搜索目录。如:
vpath %.h ../headers
表示,要求make在../headers目录下搜索所有以.h结尾的文件(如果某文件在当前目录中没有找到的话)。可以连续地使用vpath语句,已制定不同搜索策略。如果连续的vpath语句中出现了相同的<pattern>,或者被重复了的<pattern>,make会按照vpath语句的先后顺序来执行搜索。如:
vpath %.c foo vpath % blish vpath %.c bar
以上语句表示以.c结尾的文件,现在foo目录,然后再blish目录,最后在bar目录中进行搜索。
vpath %.c foo:bar vpath % blish
以上语句表示以.c结尾的文件,现在foo目录,然后再bar目录,最后在blish目录搜索。
04. 伪目标
05. 多目标
06. 静态模式
07. 自动生成依赖性