伍-《预定义变量的使用》

伍- 预定义变量的使用

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

  • 自动变量
    • $@, $^, $<
  • 特殊变量
    • $(MAKE), ( M A K E C M D G O A L S ) , (MAKECMDGOALS), (MAKECMDGOALS)(MAKEFILE_LIST)

自动变量的意义

  • $@
    当前规则中触发命令被执行的目标
  • $^
    当前规则中所有依赖
  • $<
    当前规则中的第一个依赖

自动变量的使用示例

注意:

  1. ” 对 于 m a k e f i l e 有 特 殊 含 义 输 出 时 需 要 加 一 个 " ” 对于 makefile 有特殊含义 输出时需要加一个 " makefile"" 进行转义
  2. “$@” 对于 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) 能够获取所有的特殊变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值