makefile的预定义变量

预定义变量

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打印了所有的已经定义的变量名列表,包括前面打印的MAKECMDGOALSCURDIR等,也包括了我定义的变量madpenguin

由于.VARIABLES中的变量较多,使用的时候可以打印一下,对应到make手册中查询具体含义。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容