这一篇,主要讲述利用伪目标特性可以生成多个目标,以及make的文件搜索设置
target : prerequisites
command
…
或
target : prerequisites ; command
command
1、 makefile:依赖关系,生成目标的方法
2、 上面的语法规则:command和prerequisites在一行,以分号隔开。
3、 规则的通配符:*、?、[...]
(1) “~”:
~/test表示当前用户的$HOME目录下的test目录
~hchen/test表示用户hchen的宿主目录下的test目录
在Win或MS-DOS下,用户没有宿主目录,则~所指目录根据环境变量HOME而定
(2) 通配符可替代一系列的文件。若文件名中有通配符*,则需要使用反斜杠“\*”,例子:
clean :
rm -f *.o
print : *.c
lpr -p $?
touch print
objects = *.o,这句话是objects的值是*.o,而不是表示能像宏一样展开的所有[.o]文件的的集合。若想
要通配符在变量中展开:objects := $(wildcard *.o),这用法要使用关键字wildcard
4、 文件搜索:
在大工程中,大量的源文件,文件搜索功能是很重要的。我们一般会为源文件进行分类,并发在不同目录
中。一般的做法是让make自动去搜索目标文件的依赖文件,当然也可以直接在文件前加上路径。
自动寻找俩种方法
(1) VPATH = src:../headers
上面定义的VPATH变量指定了俩个目录,src和../headers,make按顺序进行搜索。用冒号分隔。
(2) vpath全小写。三种格式:
<1> vpath <pattern> <directories>
为符合模式<pattern>指定搜索目录<directories>
<2> vpath <pattern>
清除符合模式<pattern>的文件的搜索目录
<3> vpath
清除所有已设置好了的文件的搜索目录
vpath使用方法中的<pattern>需要包含”%”字符。“%”的意思是匹配零或若干字符。例如:%.h表示所
有以.h结尾的文件。<pattern>指定了要搜索的文件集,而<directories>则指定了<pattern>的文件集的
搜索的目录。例:
vpath %.h ../headers
vpath的用法可以很灵活。
vpath %.c foo
vpath % blish
vpath %.c bar
顺序去搜索:foo、blish、bar
vpath %.c foo:bar
vpath % blish
顺序搜素:foo、bar、blish
5、 伪目标:有一个很重要的作用,同时生成多个目标文件。
使用.PHONY : clean,显示的指明clean是一个伪目标,向make说明不管是否有这个文件,在makefile中的
clean都是一个伪目标,一般不建议跟文件名重名去命名这个标签,它只是一个要执行的动作。
.PHONY : clean
clean :
rm *.o temp
当我们为伪目标指定依赖文件时,就可以用来生成多个目标文件。伪目标同样可以将其放在第一个,作为
默认目标,利用这个特性可生成多个目标:
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
由于伪目标的特性,总是被执行,其依赖的三个目标总不如all新,所以三个目标的规则总是被执行,这
样就达到了一口气同时生成多个目标的目的。
伪目标也可以是依赖文件:
.PHONY : cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
这样,就可以使用make cleanall/make cleanobj/make cleandiff三种命令,实现不用的目的。
Makefile规则(二)介绍如何自动生成目标的依赖关系并且自动更新依赖关系
Makefile规则(三)中介绍变量,了解变量的使用就可以很方便的简写makefile了