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 变量, 而又能对个别特殊的指定特定的取值.
阅读(1438) | 评论(0) | 转发(0) |