Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2315352
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: LINUX

2010-05-06 22:03:57

CFLAGS=global value

all: CFLAGS=all-private
all: other
        @echo $(CFLAGS)

other:
        @echo $(CFLAGS)

.PHONY: all other


以上这段文件,
make all 时, 会显示 all-private 两次, 第一次因为other, 第二次是all自己.

而make other时, 会显示 global value一次, 因为不需要执行all 这个target.

make all再次显示同样的all-private可以看出, 第一行的
all: CFLAGS=all-private先于目标的执行. 而完成other这个子目录时, 上层的赋值仍然生效. 因为other是嵌套在all的任务内部.

改为:
CFLAGS=global value

all: CFLAGS=all-private
all: other
        @echo $(CFLAGS)

other:
        @echo $(CFLAGS)

other2:
        @echo $(CFLAGS)
.PHONY: all other other2

再make all other2
结果是:
all-private
all-private
global value

这说明, 对该变量的赋值并不象是一个全局变量的性质, 而是一个动态作用域.

语法要求:
all: CFLAGS=all-private
不能再跟其它内容, =号后面都视为赋值的内容
也不能跟一行命令

可以有多行这样的内容, 效果以最后一行为准
all: CFLAGS=1
all: CFLAGS=2
all: CFLAGS=3
all:
     echo $(CFLAGS)
结果当然是3
可以用:=号

使用=时, 递归是不允许的:
all: CFLAGS=1
all: CFLAGS:=$(shell echo $(CFLAGS) $(CFLAGS))
all: CFLAGS:=$(shell echo $(CFLAGS) $(CFLAGS))
all:
        @echo $(CFLAGS)
错误是
test_make:5: *** Recursive variable `CFLAGS' references itself (eventually).  Stop.

使用上面的:=则可以

使用这一办法, 可以对一个makefile中管理的绝大多数文件使用相同的CFLAGS 变量, 而又能对个别特殊的指定特定的取值.
阅读(1389) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~