现在的位置: 首页 > 综合 > 正文

makefile复习

2013年08月04日 ⁄ 综合 ⁄ 共 2164字 ⁄ 字号 评论关闭

一、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. 自动生成依赖性

抱歉!评论已关闭.