在makefile中,存在一些预定义的变量,我们可以直接使用他们,预定义的变量可分为自动变量与特殊变量
1、 自动变量
$@ 表示目标
$^ 表示目标的所有依赖
$< 表示目标的第一个依赖
all : first second third
@echo "\$$@ => $@"
@echo "$$^ => $^"
@echo "$$< => $<"
first:
second:
third:
如上的makefile,分别打印$@ $^ @< 三个变量,需要注意的是,@与$属于特殊符号,打印是需要使用\或$来转义,执行make all后的结果如下:
/home/delphi>make all
$@ => all
$^ => first second third
$< => first
/home/delphi>
知道了这三个变量的意义,下边来改写一个makefile
改写前的makefile
.PHONY : clean rebuild all
target := hello.out
CC := gcc
$(target) : main.o func.o
$(CC) -o $(target) main.o func.o
main.o : main.c
gcc -o main.o -c main.c
func.o : func.c
gcc -o func.o -c func.c
all : $(target)
rebuild : clean all
clean :
rm -f *.o $(target)
使用自动变量后的makefile
.PHONY : clean rebuild all
target := hello.out
CC := gcc
$(target) : main.o func.o
$(CC) -o $@ $^
main.o : main.c
gcc -o $@ -c $^
func.o : func.c
gcc -o $@ -c $^
all : $(target)
rebuild : clean all
clean :
rm -f *.o $(target)
make rebuild执行一下
/home/delphi/myshare/makefile>make rebuild
rm -f *.o hello.out
gcc -o main.o -c main.c
gcc -o func.o -c func.c
gcc -o hello.out main.o func.o
/home/delphi/myshare/makefile>
从结果来看,使用自动变量得到的结果符合我们的预期,使用自动变量的好处是,当新增加一个依赖时,执行的命令不需要改变
2、特殊变量(只列出一些常见的)
- $(MAKE)
当前make解释器的文件名
-$(MAKECMDGLOALS)
make命令行参数的目标名
-$(MAKEFILE_LIST)
make所处理的makefile文件列表,中间以空格分隔,当前makefile的文件名总是位于列表的最后
-$(MAKE_VERSION)
当前make解释器的版本
-$(CURDIR)
当前make解释器的工作目录
-$(.VARIABLES)
所有已经定义的变量名列表
all : first second third
@echo "$(MAKE)"
@echo "$(MAKECMDGOALS)"
@echo "$(MAKEFILE_LIST)"
@echo "$(MAKE_VERSION)"
@echo "$(CURDIR)"
@echo "$(.VARIABLES)"
first:
second:
third:
执行一下 make all,输出如下
/home/delphi>make all
make
all
makefile
3.81
/home/delphi
<D ?F CWEAVE ?D @D @F CURDIR SHELL RM CO COMPILE.mod _ PREPROCESS.F LINK.o
OUTPUT_OPTION COMPILE.cpp MAKEFILE_LIST LINK.p CC CHECKOUT,v LESSOPEN CPP LINK.cc
SSH_CONNECTION PATH LD TEXI2DVI YACC C_INCLUDE_PATH SSH_TTY ARFLAGS LINK.r LINT
COMPILE.f LINT.c YACC.y AR .FEATURES TANGLE LS_COLORS GET %F COMPILE.F CTANGLE
.LIBPATTERNS LINK.C PWD LINK.S PREPROCESS.r *D LINK.c LINK.s HOME
LD_LIBRARY_PATH XDG_SESSION_COOKIE LOGNAME LESSCLOSE ^D MAKELEVEL MAKE
MAKECMDGOALS SHLVL AS PREPROCESS.S COMPILE.p MAKE_VERSION USER FC .DEFAULT_GOAL
%D WEAVE MAKE_COMMAND LINK.cpp F77 OLDPWD .VARIABLES PC *F LANGUAGE COMPILE.def
LEX MAKEFLAGS MFLAGS SSH_CLIENT MAIL LEX.l +D COMPILE.r +F M2C MAKEFILES
COMPILE.cc <F PS1 CXX COFLAGS COMPILE.C ^F COMPILE.S LINK.F SUFFIXES COMPILE.c
COMPILE.s .INCLUDE_DIRS QTDIR MAKEINFO TEX LANG TERM F77FLAGS LINK.f
/home/delphi>
说明使用的make解释器为make,参数为all,makefile文件名为makefile,make解释器版本为3.81,当前make工作路径为/home/delphi,以及一些预定义变量名,假如我们定义有自定义变量,那么也会在里边体现,合理使用这些预定义变量,可以使makefile的编写更加高效。
以上内容参考《狄泰软件学院》操作系统篇之 - makefile专题