在 makefile 中存在一些预定义的变量,如自动变量:$@,$^,$<等;还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等。下来我们先来解释下自动变量的意义:a> $@ 是指当前规则中触发命令被执行的目标;b> $^ 是指当前规则中的所有依赖;c> $< 是指当前规则中的第一个依赖。关于自动变量的使用如下
我们提供的服务有:成都网站设计、网站建设、微信公众号开发、网站优化、网站认证、马边彝族ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的马边彝族网站制作公司下来我们以代码为例来进行分析说明
.PHONY : all first second third all : first second third @echo "\$$@ => $@" @echo "$$^ => $^" @echo "$$< => $<" first: second: third:看看编译结果
我们看到和我们之前解释的是一样的。$@便是打印我们的目标名,$^ 打印的便是依赖条件,$< 打印的是依赖当中的第一个。那么我们就可以将之前写的 makefile 进行改写了
CC := g++ TARGET := hello.out $(TARGET) : func.o main.o $(CC) -o $@ $^ func.o : func.c $(CC) -o $@ -c $^ main.o : main.c $(CC) -o $@ -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。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:预定义变量的使用(五)-创新互联
文章起源:http://scgulin.cn/article/didhsg.html