预定义变量
makefile中有两种预定义变量
- 自动变量
- 特殊变量
自动变量
常用的自动变量如下
- $@ —— 当前规则中触发命令的目标
- $^ —— 当前规则中的所有依赖
- $< —— 当前规则中的第一个依赖
下面举一个例子来说明这三个自动变量所代表什么
all : first second third
@echo "\$$@ = $@"
@echo "\$$^ = $^"
@echo "\$$< = $<"
first :
second :
third :
.PHONY : all first second third
make all
的执行结果如下
$@ = all
$^ = first second third
$< = first
注意,makefile中的的$
有特殊含义,输出的时候前面需要再加上一个$
转义;
bash shell中的$@
有特殊含义,输出的时候前面需要加上一个\
转义。
特殊变量
特殊变量个数比较多,只列举几个常用的
- $(MAKE) —— 当前make解释器的名字
- $(MAKECMDGOALS) —— 命令行中指定的目标名字
- $(MAKEFILE_LIST) —— make所需要处理的makefile文件列表
- $(CURDIR) —— 当前make的工作目录
- $(.VARIABLES) —— 所有已经定义的变量名列表,包括预定义变量和自定义变量
下面举一个例子来打印这几个特殊变量所代表什么
madpenguin := richard
all : first second third
@echo "MAKE = $(MAKE)"
@echo "MAKECMDGOALS = $(MAKECMDGOALS)"
@echo "MAKEFILE_LIST = $(MAKEFILE_LIST)"
@echo "MAKE_VERSION = $(MAKE_VERSION)"
@echo "CURDIR = $(CURDIR)"
@echo ".VARIABLES = $(.VARIABLES)"
first :
second :
third :
.PHONY : all first second third
make -f makefile.2 all
的执行结果如下
MAKE = make
MAKECMDGOALS = all
MAKEFILE_LIST = makefile.2
MAKE_VERSION = 4.1
CURDIR = /media/richard/WORK/makefile/
.VARIABLES = <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 MAKECMDGOALS 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 madpenguin COMPILE.c COMPILE.s .INCLUDE_DIRS LC_IDENTIFICATION .RECIPEPREFIX MAKEINFO MAKE_TERMERR OBJC LC_ADDRESS LINK.f TEX LANG TERM F77FLAGS LINK.o
其中.VARIABLES
打印了所有的已经定义的变量名列表,包括前面打印的MAKECMDGOALS
和CURDIR
等,也包括了我定义的变量madpenguin
。
由于.VARIABLES
中的变量较多,使用的时候可以打印一下,对应到make手册中查询具体含义。