在 makefile 中存在一些预定义的变量,如自动变量:[email protected],$^,$< 等;还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等。下来我们先来解释下自动变量的意义:a> [email protected] 是指当前规则中触发命令被执行的目标;b> $^ 是指当前规则中的所有依赖;c> $< 是指当前规则中的第一个依赖。关于自动变量的使用如下
下来我们以代码为例来进行分析说明
.PHONY : all first second third all : first second third @echo "\[email protected] => [email protected]" @echo "$$^ => $^" @echo "$$< => $<" first: second: third:
看看编译结果
我们看到和我们之前解释的是一样的。[email protected]便是打印我们的目标名,$^ 打印的便是依赖条件,$< 打印的是依赖当中的第一个。那么我们就可以将之前写的 makefile 进行改写了
CC := g++ TARGET := hello.out $(TARGET) : func.o main.o $(CC) -o [email protected] $^ func.o : func.c $(CC) -o [email protected] -c $^ main.o : main.c $(CC) -o [email protected] -c $^ .PHONY : rebuild clean all rebuild : clean all all : $(TARGET) clean : rm *.o $(TARGET)
我们来看看编译结果是否和之前的一样的。
我们看到和之前的效果是一样的,那么这样做的好处是什么呢?在大型的项目中,我们后面难免会进行新功能的开发,那么此时写的新文件便可以海子街放在目标之后,其他的不用管就OK了,这样就非常方便。
下来我们来看看那些特殊变量的含义:a> $(MAKE) 是指当前 make 解释器的文件名;b>$(MAKECMDGOALS) 是指命令行中指定的目标名(make 的命令行参数);c>$(MAKEFILE_LIST) 指 make 所需要处理的 makefile 文件列表,当前 makefile 的文件名总是位于列表的最后,文件名之间以空格进行分隔。
下来我们还是以代码为例来进行说明
.PHONY : all out first second third test all out : @echo "$(MAKE)" @echo "$(MAKECMDGOALS)" @echo "$(MAKEFILE_LIST)" first : @echo "first" second : @echo "second" third : @echo "third" test : @$(MAKE) first @$(MAKE) second @$(MAKE) third
我们来看看编译效果
我们第一次直接 make 的时候,因为当前解释器是 make ,所以会直接打印 make,命令行后面没带参数,因此第二行是空的,最后一行是因为只有一个 makefile,但是在它前面会有一个空格。第二次 make all 的时候,因为命令行的参数为 all,所以第二行会输出 all。第三次 make test 的时候,因为需要进行三次 MAKE,所以会有三次进入到对应目录下进行进行 make 命令。第四次 make all out 的时候,在执行 all 的时候分别打印一次,在执行 out 的时候再次会打印一次。
下来我们来继续看看另一些特殊变量的含义:a> $(MAKE_VERSION) 是指当面 make 解释器的版本;b> $(CURDIR) 是指当前 make 解释器的工作目录;c> $(.VARIABLES) 是指所有已经定义的变量名列表(预定义变量和自定义变量)。
还是以代码为例来进行说明
.PHONY : test1 test2 TDelphi := Delphi Tang D.T.Software := D.T. test1 : @echo "$(MAKE_VERSION)" @echo "$(CURDIR)" @echo "$(.VARIABLES)" test2 : @echo "$(RM)"
我们来看看编译效果
我们看到直接 make 的时候,执行的是 test1 目标,先是打印当前 make 的版本,接着是当前目录,然后是当前的环境变量。我们在下面用 make -v 直接看到当前 make 解释器的版本就是 3.81,而且当前目录就是 /mnt/hgfs/winshare/mentu/make1/5 。接着我们看到了我们自己定义的两个环境变量。接下来在执行 make test2,看到 RM 其实就是 rm -f,就是强制删除的符号,我们是不是就可以在前面定义的 makefile 中将 rm -f 全部替换为 $(RM) 呢。通过对 makefile 中的预定义变量的学习,总结如下:1、makefile 提供了预定义变量供开发者使用;2、预定义变量的使用能够使得 makefile 的开发更高效;3、自动变量是 makefile 中最常见的元素;4、使用 $(.VARIABLES) 能够获取所有的特殊变量。
欢迎大家一起来学习 makefile,可以加我QQ:243343083。
原文地址:http://blog.51cto.com/12810168/2128702