Makefile规则(一):生成多个目标

时间:2022-03-19 06:12:13

这一篇,主要讲述利用伪目标特性可以生成多个目标,以及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了