您的位置:首页 > 其它

初学用make进行项目管理

2011-01-03 21:11 281 查看



Make是Linux下的项目管理工具,其作用就是自动进行程序的编译和链接,从而生成指定的目标程序。其工作时的执行步骤如下,

(1)读入所有的Makefile

(2)读入被include的其他Makefile(后面有解释)

(3)初始化文件中的变量

(4)推到隐式规则,然后分析所有规则

(5)为所有目标创建依赖关系链

(6)根据依赖关系,决定生成那些目标

(7)执行命令

其规则格式一般为

目标文件 : 依赖文件

执行命令(生成目标文件,本行必须以Tab键开头)

其中目标文件可以是编译文件,执行文件,还可以是一个标签(相见后面的伪目标)

依赖文件是指生成目标文件所需要的文件,目标文件或者标签。

执行命令就是所需执行的命令。

上面的规则确定了一个依赖关系。如果依赖文件中的任何一个文件比目标文件要新的话,就会执行的所设置的命令。如

main : main.c

gcc main.c -o main #如果命令很长,可以使用'/'作为换行符。

上面的规则就是如果源文件main.c要比执行文件main新的话,就会执行命令gcc main.c -o
main。当然这只是一个简单的例子,make的功能要比这强大的多。

在Makefile中,规则的顺序是很重要的,因为,Makefile会把第一个出现的目标作为最终目标,

make的使用依靠的是程序员编写的Makefile文件,这个文件包含了一个工程编译所需遵循的所有规则。这个文件一般包含了五部分内容:

1:显式规则

书写者显式指出的规则,如上面的例子。

2:隐式规则

make具有自动推导功能,提供了一些默认的规则,如目标文件是main.o,它会自动将文件main.c当作依赖文件,而相应的命令也会设为gcc
-c main.c main.o

3:变量定义

Makefile中的变量定义,更像是C语言中的宏定义。当执行时,变量总是在引用位置上展开。Makefile中的变量定义分为两种,一种是,另一种
是。

4:文件指示

包括三个部分,分别是文件包含,制定有效部分,定义多行命令。这三部分也和C中的某些内容相似,如文件包含---include,制定有效部分
---#ifdef。

文件包含使用关键字include,语法为

include 文件名称

其中文件名称可以包括路径和通配符。在include前面可以有空字符,但不能以Tab键开始(make以Tab开头当作命令的开头)。文件名称可以包含
多个文件。如include a.mk b.mk c.mk,也可以使用通配符include
*.mk来代替。在规则中可以使用的通配符有'*',’[]',其中'*'代表任意长度的字符串,'[]'则是代表所有与括号内字符相同的字符。

如果使用通配符的命令,make将会在当前目录下搜索所有文件名以.mk结尾的文件,并包含到本文件的当前位置。当然,也可以指定搜索目录:

(1)如果make执行时,有-I或者--include-dir参数,那么make会在指定的目录中进行搜索。如 make
-I/home/you,则会在目录/home/you下搜索指定文件。

(2)赋值给Makefile文件的特殊变量VPATH后,则make会在所指定的目录中去寻找文件,不同的目录用':'号隔开。如文件中包含内容
VPATH =
src:include,这条语句指定了两个目录,src和include,make会在当前目录找不到指定文件时,到目录src和include中搜
索。

(3)使用make的vpath关键字也可以设置文件搜索路径。其使用方法有三种:1、vpath <pattern>
<directory>为符合模式<pattern>的文件指定搜索目录<directory>,如vpath
%.h /home/you表示在目录/home/you中搜索所有文件名以.h结尾的文件。vpaht语句可以连续使用 2、vpath
<pattern>清楚符合模式<pattern>的文件的搜索目录。3、vpath清楚所有设置了的文件搜索目录。

如果指定文件没有找到,则make会继续载入其他文件内容,并且生成一条警告信息。等到文件读取完成,make会再次重试载入指定文件,如果还是不行,则
make才终止。当然,如果使用命令-include
文件名称,则make不会理会未读取的文件而继续执行。有时环境变量MAKEFILES的使用也能达到include的作用,只是这样引入的目标不会有作
用。

5:注释

Makefile中的注释以#开头,而且注释只能是行注释。当然,如果文件中需要使用字符‘#’,可以使用转义字符/。

在Makefile中,目标文件还可以是伪目标。如

clean:

rm *.o

伪目标只是一个标签,并不是个真是的文件。这些目标只能通过显式的指明才能生成。上面的例子,只能调用make
clean,结果就是删除所有文件名以.o结尾的文件。为了避免和某个文件重名(如当前项目要生成的程序名称为clean,此时就会有冲突),因此,一般
伪目标都使用.PHONY来显式的指明,如上例可以写为

.PHONY:clean

clean:

rm *.o

当然,也可以为伪目标指定依赖文件。由于伪目标并不会生成具体的文件,所以如果当前工程包含多个程序,则可以把伪目标作为最终目标。如某个项目中需要生成
三个程序,program1,program2,program3,则可以如下书写Makefile文件。

.PHONY:all

all:program1 program2 program3

program1:program.o

gcc -o program1 program.o

program2:program.o

gcc -o program2 program.o

program3:program.o

gcc -o program3 program.o

同样,伪目标同样也可以成为依赖文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: