makefile变量的使用进阶(2)

多行变量

多行变量使用define关键字在makefile中定义,endef关键字标志着多行标量的定义结束。
define定义的变量等价于=定义的变量。

使用的方法如下

define richard
I am richard.
endef

override define cmd_pwd
    @echo "run pwd cmd..."
    @pwd
endef

all :
    @echo "richard = $(richard)"
    $(cmd_pwd)

运行结果如下

richard = I am richard.
run pwd cmd...
/media/richard/WORK/makefile/code/

环境变量

make在运行时,系统中的所有环境变量对它都是可见的。在makefile中,可以引用任何已定义的环境变量。

  • 若makefile中定义了和环境变量同名的变量,环境变量的值将被覆盖。
  • 运行make时,加上-e选项,会优先使用环境变量。

PWD是环境变量,代表当前目录的绝对位置。以此变量举例如下

PWD := /tmp

test :
    @echo $(PWD)

.PHONY : test

执行make test的结果是:/tmp
执行make -e test的结果是:/media/richard/WORK/makefile/code/

变量的传递

变量在不同的makefile之间传递有三种方式

  • 直接在外部定义环境变量进行传递
  • 使用export定义变量进行传递
  • 使用make命令行方式进行传递

创建两个makefile文件makefile.3以及makefile.4,makefile.3如下

PWD := /tmp
export madpenguin := richard
var := boy

test :
    @echo "PWD = $(PWD)"
    @echo "make -f makefile.4"
    @$(MAKE) -f makefile.4
    @$(MAKE) -f makefile.4 var:=$(var)
    
.PHONY : test

makefile.4如下

test:
    @echo "PWD = $(PWD)"
    @echo "madpenguin = $(madpenguin)"
    @echo "var = $(var)"

.PHONY : test

执行make -f makefile.3结果如下

PWD = /tmp
make -f makefile.4
make[1]: Entering directory '/media/richard/WORK/makefile/code/'
PWD = /tmp
madpenguin = richard
var = 
make[1]: Leaving directory '/media/richard/WORK/makefile/code/'
make[1]: Entering directory '/media/richard/WORK/makefile/code/'
PWD = /tmp
madpenguin = richard
var = boy
make[1]: Leaving directory '/media/richard/WORK/makefile/code/'

通过执行结果可以看到,环境变量PWD被覆盖,在两个makefile文件中打印都是/tmp
使用export定义的变量madpenguin的值可以传入到makefile.4中;
在执行make时定义的变量var,也可以被传入到makefile.4中。

目标(指定)变量

目标指定变量的值只在指定它的目标的上下文中有效,对于其他的目标没有影响。此变量被定义在某个具体目标和由它所引发的规则的目标上。

var := madpenguin
new := boy

test : var := richard

test : next
    @echo "test :"
    @echo "var = $(var)"
    @echo "new = $(new)"

next :
    @echo "next :"
    @echo "var = $(var)"
    @echo "new = $(new)"

.PHONY : test next

当执行next目标时,make next输出结果为

next :
var = madpenguin
new = boy

当执行test目标时,make test输出结果为

next :
var = richard
new = boy
test :
var = richard
new = boy

看变量var的的值在两次执行的时候不同,因为vartest目标下定义的值为richard,所以这个值在test目标以及它所依赖的目标下都是有效的。
而执行next目标时,var只在文件开始的时候定义,并没有在next目标下定义,所以输出的是文件变量的值。

模式(指定)变量

模式变量是对目标变量的扩展,模式指定变量定义是将一个变量值指定到所有符合此模式的目标以及其连带的规则中。

var := madpenguin
new := boy
%st : override new := girl

test :
    @echo "test :"
    @echo "var = $(var)"
    @echo "new = $(new)"

next :
    @echo "next :"
    @echo "var = $(var)"
    @echo "new = $(new)"

.PHONY : test next

当执行next目标时,make next输出结果为

next :
var = madpenguin
new = boy

当执行test目标时,make test输出结果为

test :
var = madpenguin
new = girl

目标test符合%st模式,所以test规则中的new变量的值变成girl,而目标next不符合%st模式,所以next规则中的new变量的值还是boy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,694评论 0 17
  • 1 前言 在Makefile中,变量的使用类似于C语言中的宏,在 Makefile 的目标、依赖、命令中引用变量的...
    tianyl阅读 3,042评论 0 0
  • 使用变量 在Makefile中的定义的变量,就像是C/C++语言中的宏一样,他代表了一个文本字串,在Makefil...
    Stan_Z阅读 2,127评论 0 11
  • 1.Makefile规范 target 这 一 个 或 多 个 的 目 标 文 件 依 赖 于prerequisi...
    G风阅读 1,885评论 0 3
  • 我意愿宽恕我的父母,也意愿宽恕世上的所有父母。
    霄世阅读 85评论 0 0