伍 – 预约义变量的应用
在 makefile 中存在一些预约义的变量
-
主动变量
- $@, $^, $<
-
非凡变量
- $(MAKE), $(MAKECMDGOALS),$(MAKEFILE_LIST)
- ……
主动变量的意义
- $@
以后规定中触发命令被执行的指标
- $^
以后规定中所有依赖
- $<
以后规定中的第一个依赖
主动变量的应用示例
留神:
- “$”对于 makefile 有非凡含意
输入时须要加一个 “$” 进行本义
- “$@” 对于 Bash shell 有非凡含意
输入是须要加上 “” 进行本义
.PHONY : first second third
all : first second third
@echo "\$$@ => $@"
@echo "$$^ => $^"
@echo "$$< => $<"
first :
second :
third :
// 输入
$@ => all
$^ => first second third
$< => first
一些非凡变量的含意
-
$(MAKE)
- 以后 make 解释器的文件名
-
$(MAKECMDGOALS)
- 命令行中 指定的指标名(make 的命令行参数)
-
$(MAKEFILE_LIST)
- make 所须要解决的 makefile 文件列表
- 以后 makefile 的文件名总是位于列表的最初
- 文件名之间以空格进行分隔
编程试验 1
.PHONY : all out first second thirid
all out :
@echo "$(MAKE)"
@echo "$(MAKECMDGOALS)"
@echo "$(MAKEFILE_LIST)"
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make
// 输入
make // 以后解释器的文件名就是 make
// make 时没有待指标,所以为空
makefile // 后面有一个空格,文件名之间以空格进行分隔
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make all
make
all // 命令行中的指标 all
makefile
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make all out
make
all out // 命令行中的指标 all out
makefile
make
all out // // 命令行中的指标 all out
makefile
编程试验 2
.PHONY : all out first second third kevin
all out :
@echo "$(MAKE)"
@echo "$(MAKECMDGOALS)"
@echo "$(MAKEFILE_LIST)"
first :
@echo "first"
second :
@echo "second"
third :
@echo "thirid"
# 相似函数调用
kevin :
$(MAKE) first
$(MAKE) second
$(MAKE) third
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make kevin
// 输入
make first
make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'
first
make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'
make second
make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'
second
make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'
make third
make[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'
thirid
make[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC
试验论断:
大型软件开发过程中,makefile 是分成好几个子文件来编写的,这些 makefile 能够进行互相调用,这样进行互相调用 $(MAKE) target
一些非凡变量的含意
-
$(MAKE_VERSION)
- 以后 make 解释器的版本
-
$(CURDIR)
- 以后 make 解释器的工作目录
-
$(.VARIABLES)
- 所有曾经定义的变量名列表(预约义变量和自定义变量)
编程试验 3.1
.PHONY : test1 test2
TDelphi := Delphi Tang
D.T.Software := D.T.
test1 :
@echo "$(MAKE_VERSION)"
@echo "$(CURDIR)"
@echo "$(.VARIABLES)"
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test1
// 输入
4.1
/mnt/hgfs/Fileshare_LinuxC
<D ?F .SHELLFLAGS CWEAVE ?D @D @F MAKE_VERSION CURDIR SHELL RM CO COMPILE.mod _ PREPROCESS.F LINK.m LINK.o OUTPUT_OPTION COMPILE.cpp MAKEFILE_LIST GNUMAKEFLAGS LINK.p CC CHECKOUT,v LESSOPEN CPP LINK.cc SSH_CONNECTION PATH LD TEXI2DVI YACC SSH_TTY XDG_RUNTIME_DIR ARFLAGS LINK.r LINT COMPILE.f LINT.c YACC.m YACC.y AR .FEATURES TANGLE LS_COLORS GET %F D.T.Software DISPLAY COMPILE.F CTANGLE .LIBPATTERNS LINK.C PWD LINK.S PREPROCESS.r *D LINK.c LINK.s HOME LESSCLOSE LOGNAME ^D MAKELEVEL COMPILE.m MAKE MAKECMDGOALS SHLVL AS PREPROCESS.S COMPILE.p XDG_SESSION_ID USER FC .DEFAULT_GOAL %D TDelphi WEAVE MAKE_COMMAND LINK.cpp F77 OLDPWD .VARIABLES PC *F LANGUAGE COMPILE.def LEX MAKEFLAGS MFLAGS SSH_CLIENT MAIL LEX.l LEX.m +D COMPILE.r MAKE_TERMOUT +F M2C MAKEFILES COMPILE.cc <F CXX COFLAGS COMPILE.C ^F COMPILE.S LINK.F SUFFIXES COMPILE.c COMPILE.s .INCLUDE_DIRS .RECIPEPREFIX MAKEINFO MAKE_TERMERR OBJC MAKE_HOST TEX LANG TERM F77FLAGS LINK.f
理论开发中能够 $(.VARIABLES)
查看以后 make 解释器中反对预约义变量
编程试验 3.2
.PHONY : test1 test2
test2 :
@echo "$(RM)"
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test2
// 输入
rm -f
这里的论断就是理论开发过程中能够之间应用 "$(RM)"
来代替 rm -f
这个命令,比方上面这个模式
clean :
$(RM) *.o $(TARGET)
小结
- makefile 提供了预约义变量供开发者应用
- 预约义变量的应用可能使得 makefile 的开发更高效
- 主动变量是 makefile 中最常见的元素
- 应用 $(.VARIABLES) 可能获取所有的非凡变量