预定义变量的使用

预定义变量的使用

1、预定义变量

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

  • 自动变量
    • $@,$^,$<
  • 特殊变量
    • $(MAKE),$(MAKECMDGOALS),$(MAKEFILE_LIST)
    • $(MAKE_VERDION),$(CURDIR),$(.VARIABLES)

2、自动变量的意义

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

自动变量的使用示例

all : first second third
	@echo "\$$@ => $@"
	@echo "$$^ => $^"
	@echo "$$< => $<"

注意:

  • "$"对于makefile有特殊含义
    • 输出时需要加上一个"$"进行转义
  • "$@"对于Bash Shell有特殊含义
    • 输出时需要加上"\"进行转义

3、编程实验

.PHONY : all first second third

all : first second third
	@echo "\$$@ => $@"
	@echo "$$^ => $^"
	@echo "$$< => $<"
	
first :
second :
third :

//编译运行
$ make
$@ => all
$^ => first second third
$< => first

CC := gcc
TARGET := hello.out

$(TARGET) : fun.o main.o
	$(CC) -o $@ $^
	
fun.o : fun.c
	$(CC) -o $@ -c $^
	
main.o : main.c
	$(CC) -o $@ -c $^
	
.PHONY : rebuild clean all

rebuild : clean all

all : $(TARGET)

clean :
	rm *.o $(TARGET)

//编译运行
$ make
gcc -o fun.o -c fun.c
gcc -o main.o -c main.c
gcc -o hello.out fun.o main.o

4、一些特殊变量的含义

  • $(MAKE)
    • 当前make解释器的文件名
  • $(MAKECMDGOALS)
    • 命令行中指定的目标名(make的命令行参数)
  • $(MAKEFILE_LIST)
    • make所需要处理的makefile文件列表
    • 当前makefile的文件名总是位于列表的最后
    • 文件名之间以空格进行分隔

5、编程实验

.PHONY : all out first second third

all out :
	@echo "$(MAKE)"
	@echo "$(MAKECMDGOALS)"
	@echo "$(MAKEFILE_LIST)"

//编译运行
------------------------------------
$ make
make

 makefile
------------------------------------
$ make out 
make
out
 makefile
------------------------------------
$ make all
make
all
 makefile
------------------------------------
$ make out all 
make
out all
 makefile
make
out all
 makefile



.PHONY : all out first second third

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 test 
make first
make[1]: Entering directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'
first
make[1]: Leaving directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'
make second
make[1]: Entering directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'
second
make[1]: Leaving directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'
make third
make[1]: Entering directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'
third
make[1]: Leaving directory '/mnt/hgfs/VMShare/hello7688/ditai/make/5'

6、一些特殊变量的含义

  • $(MAKE_VERSION)
    • 当前make解释器的版本
  • $(CURDIR)
    • 当前make解释器的工作目录
  • $(.VARIABLES)
    • 所有已经定义的变量名列表(预定义变量和自定义变量)

7、编程实验


.PHONY : test1 test2

test1 :
	@echo "$(MAKE_VERSION)"
	@echo "$(CURDIR)"
	@echo "$(.VARIABLES)"

//编译运行
$ make
4.1
/mnt/hgfs/VMShare/hello7688/ditai/make/5
<D ?F PAPERSIZE DESKTOP_SESSION .SHELLFLAGS XDG_SESSION_TYPE CWEAVE ?D @D XAUTHORITY GDMSESSION XMODIFIERS CURDIR SHELL RM GDM_LANG VTE_VERSION _ PREPROCESS.F LINK.m XDG_CONFIG_DIRS OUTPUT_OPTION COMPILE.cpp MAKEFILE_LIST @F IM_CONFIG_PHASE GNUMAKEFLAGS SESSIONTYPE MAKELEVEL MANDATORY_PATH XDG_DATA_DIRS DBUS_SESSION_BUS_ADDRESS CC CHECKOUT,v CLUTTER_IM_MODULE LESSOPEN LC_NAME CPP LINK.cc XDG_SESSION_PATH LEX MAKE_HOST PATH LD TEXI2DVI GPG_AGENT_INFO YACC SESSION_MANAGER COMPILE.mod XDG_RUNTIME_DIR ARFLAGS LINK.r WINDOWID COMPILE.f LINT.c YACC.m LINT LINK.p YACC.y AR XDG_MENU_PREFIX LC_NUMERIC .FEATURES TANGLE SESSION XDG_GREETER_DATA_DIR LS_COLORS JOB XDG_SESSION_DESKTOP SSH_AUTH_SOCK GET %F DISPLAY COMPILE.F CTANGLE GTK_IM_MODULE .LIBPATTERNS LINK.C PWD QT_QPA_PLATFORMTHEME LINK.S XDG_SEAT PREPROCESS.r LINK.c GTK_MODULES LINK.s HOME LESSCLOSE LOGNAME QT_LINUX_ACCESSIBILITY_ALWAYS_ON +F M2C CO MAKE_VERSION GNOME_DESKTOP_SESSION_ID ^D XDG_VTNR LC_TIME COMPILE.m MAKE QT_IM_MODULE SHLVL AS PREPROCESS.S COMPIZ_CONFIG_PROFILE COMPILE.p XDG_SESSION_ID USER FC LC_MONETARY .DEFAULT_GOAL XDG_CURRENT_DESKTOP %D GNOME_KEYRING_PID LC_TELEPHONE WEAVE MAKE_COMMAND LINK.cpp F77 OLDPWD .VARIABLES PC *F LANGUAGE XDG_SEAT_PATH COMPILE.def GNOME_KEYRING_CONTROL MAKEFLAGS MFLAGS *D LEX.l LEX.m +D COMPILE.r MAKE_TERMOUT LC_PAPER GTK2_MODULES QT_ACCESSIBILITY DEFAULTS_PATH MAKEFILES UPSTART_SESSION COMPILE.cc <F CXX LC_MEASUREMENT INSTANCE COFLAGS COMPILE.C QT4_IM_MODULE ^F COMPILE.S LINK.F SUFFIXES COMPILE.c COMPILE.s .INCLUDE_DIRS LC_IDENTIFICATION .RECIPEPREFIX MAKEINFO MAKE_TERMERR OBJC LC_ADDRESS LINK.f TEX LANG TERM F77FLAGS LINK.o

注意:

rm -f = $(RM)

8、小结

  • makefile提供了预定义变量供开发者使用
  • 预定义变量的使用能够使得makefile的开发更高效
  • 自动变量是makefile中最常见的元素
  • 使用**$(.VARIABLES)**能够获取所有的特殊变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值