第五载:预定义变量的使用

    在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专题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值