5.预定义变量的使用
学自<狄泰软件学院>
在makefile中存在一些预定义的变量
自动变量
- $@, $^, $<
特殊变量
- (MAKE) , (MAKECMDFOALS) , (MAKEFILE_LIST)
- (MAKE_VERSION), (CURDIR) , (.VARIABLES)
- ….
自动变量
- $@: 当前规则中触发命令被执行的目标
当一个规则中有多少个目标。$@ 所指的是其中任何造成规则命令被运行的目标。
- $^ : 当前规则中的所有依赖
- $< : 当前规则中的第一个依赖
示例代码:自动变量的使用示例
.PHONY: all frist second third
test first: second third
@echo "\$$@ => $@"
@echo "$$^ => $^"
@echo "$$< => $<"
输出结果:
$ make
$@ => test
$^ => second third
$< => second
分析:
**1.“$”对于makefile有特殊含义:**输出时需要加上一个“$”进行转义
**2.“$@”对于Bash Shell有特殊含义:**输出时需要加上“\”进行转义
特殊变量
- $(MAKE)
- 当前make解释器的文件名
打印当前make解析器的名字:如ubuntu中make解析器文件名为”make”;window命令行中make解析器文件名为”mingw32-make”;
$(MAKECMDGOALS)
- 命令行中指定的目标名(make的命令行参数)
在命令行执行make命令后面指定的目标名。如执行make all。
$(MAKECMDGOALS)输出为 ”all” 。如果直接执行make也就是输出为空。
$(MAKEFILE_LIST)
- Make所需要处理的makefile文件列表
- 当前makefile的文件名总是位于列表的最后
- 文件名之间以空格进行分隔
$(MAKE_VERSION)
- 当前make解释器的版本
$(CURDIR)
- 当前make解释器的工作目录
$(.VARIABLES)
1.所有已经定义的变量名列表(预定义变量和自定义变量)
在我们阅读或者开发时,我们可以通过这个特殊变量查看本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
.PHONY : test1 test2
TDelphi := Delphi Tang
D.T.Software := D.T.
test1 :
@echo "$(MAKE_VERSION)"
@echo "$(CURDIR)"
@echo "$(.VARIABLES)"
test2 :
@echo "$(RM)"
输出结果:
C:\exercise\makefile>make all
“mingw32-make”
“all”
" makefile"
C:\exercise\makefile>make test
mingw32-make[1]: Entering directoryC:/exercise/makefile' "first" mingw32-make[1]: Leaving directory
C:/exercise/makefile’
mingw32-make[1]: Entering directoryC:/exercise/makefile' "second" mingw32-make[1]: Leaving directory
C:/exercise/makefile’
mingw32-make[1]: Entering directoryC:/exercise/makefile' "third" mingw32-make[1]: Leaving directory
C:/exercise/makefile’
C:\exercise\makefile>make test1
“3.81”
“C:/exercise/makefile”
“<D ?F CommonProgramFiles CARBON_MEM_DISABLE MAKEFLAGS F77FLAGS CWEAVE ?D @D HOMEDRIVE @F ^D CURDIR SHELL RM CO ProgramFiles(x86) PREPROCESS.F LINK.o OUTPUT_OPTION COMPILE.cpp PATHEXT MAKEFILE_LIST FPS_BROWSER_USER_PROFILE_STRING TMP LINK.p CM2015DIR CC SystemDrive CommonProgramFiles(x86) VS100COMNTOOLS CHECKOUT,v CPP SystemRoot LINK.cc PATH LD TEXI2DVI YACC COMPILE.mod include PROCESSOR_ARCHITECTURE LINK.r USERPROFILE LINT COMPILE.f LINT.c ALLUSERSPROFILE ComSpec YACC.y AR NUMBER_OF_PROCESSORS .FEATURES TANGLE ProgramW6432 GET D TDelphi LOCALAPPDATA ARFLAGS WEAVE MAKE_COMMAND LINK.cpp PROCESSOR_ARCHITEW6432 F77 COMPILE.cc .VARIABLES PC *F PROCESSOR_IDENTIFIER OS MSDevDir COMPILE.def LEX HOMEPATH PROMPT MFLAGS *D LEX.l PSModulePath +D windir COMPILE.r +F M2C SUFFIXES APPDATA TEMP MAKEFILES <F CXX COFLAGS COMPILE.C ^F COMPILE.S LINK.F ProgramFiles COMPILE.c SESSIONNAME PROCESSOR_REVISION COMPILE.s MOZ_PLUGIN_PATH MAKELEVEL MAKEINFO XILINX_FOR_ALTIUM_OVERRIDE TEX PROCESSOR_LEVEL FPS_BROWSER_APP_PROFILE_STRING LINK.f USERDOMAIN_ROAMINGPROFILE”
C:\exercise\makefile>make test2
“rm -f”