预定义变量的使用
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)
**能够获取所有的特殊变量