伍 - 预约义变量的应用

在makefile 中存在一些预约义的变量

  • 主动变量

    • $@, $^, $<
  • 非凡变量

    • $(MAKE), $(MAKECMDGOALS),$(MAKEFILE_LIST)
    • ......

主动变量的意义

  • $@

以后规定中触发命令被执行的指标

  • $^

以后规定中所有依赖

  • $<

以后规定中的第一个依赖

主动变量的应用示例

留神:

  1. “$” 对于 makefile 有非凡含意

输入时须要加一个 "$" 进行本义

  1. "$@" 对于 Bash shell 有非凡含意

输入是须要加上 "" 进行本义

.PHONY : first second thirdall : 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 thiridall 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 allmakeall         // 命令行中的指标 all makefilezhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make all outmakeall out   // 命令行中的指标 all out makefilemakeall out   // // 命令行中的指标 all out makefile

编程试验2

.PHONY : all out first second third kevinall 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 firstmake[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'firstmake[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'make secondmake[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'secondmake[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC'make thirdmake[1]: Entering directory '/mnt/hgfs/Fileshare_LinuxC'thiridmake[1]: Leaving directory '/mnt/hgfs/Fileshare_LinuxC

试验论断:
大型软件开发过程中,makefile 是分成好几个子文件来编写的,这些makefile 能够进行互相调用,这样进行互相调用 $(MAKE) target

一些非凡变量的含意

  • $(MAKE_VERSION)

    • 以后 make 解释器的版本
  • $(CURDIR)

    • 以后 make 解释器的工作目录
  • $(.VARIABLES)

    • 所有曾经定义的变量名列表(预约义变量和自定义变量)

编程试验3.1

.PHONY : test1 test2TDelphi := Delphi TangD.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 test2test2 :    @echo "$(RM)"
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make test2// 输入rm -f

这里的论断就是理论开发过程中能够之间应用 "$(RM)" 来代替 rm -f 这个命令,比方上面这个模式

clean :    $(RM) *.o $(TARGET)

小结

  • makefile 提供了预约义变量供开发者应用
  • 预约义变量的应用可能使得 makefile 的开发更高效
  • 主动变量是 makefile 中最常见的元素
  • 应用 $(.VARIABLES) 可能获取所有的非凡变量