定义内的Makefile扩展变量
每个makefile的内容:定义内的Makefile扩展变量,makefile,gnu-make,Makefile,Gnu Make,每个makefile的内容: define func1 include $(shell pwd)/test/$(strip $1)/component.mk $(info :::::::${NAME} ::::::::::::::: ) endef INCLUDES := a b c $(foreach dir, $(INCLUDES), $(eval $(call func1, $(dir)) )) all : $(objs) 输出为 cat test/a/compo
define func1
include $(shell pwd)/test/$(strip $1)/component.mk
$(info :::::::${NAME} ::::::::::::::: )
endef
INCLUDES := a b c
$(foreach dir, $(INCLUDES), $(eval $(call func1, $(dir)) ))
all : $(objs)
输出为
cat test/a/component.mk
NAME := AA
cat test/b/component.mk
NAME := BB
cat test/c/component.mk
NAME := CC
第一次使用的名称似乎为空 让我们详细了解一下
$(foreach dir,${INCLUDES},$(eval$(call func1,${dir}))
的扩展
展开,给出${INCLUDES}
$(foreach dir,a b c,$(eval$(call func1,${dir}))
- 下一个
设置为dir
a
已展开$(调用func1,a)
设置为1
a
已展开:func1
包括$(壳牌pwd)/test/$(剥离$1)/component.mk
$(信息:${NAME}:
在这里变成$(shell pwd)
,例如(注意:使用,
)${CURDIR}
变成$(条带$1)
变成$(条带a)
a
展开为零${NAME}
扩展为零$(信息::::::::::)
- 作为副作用
:出现在标准输出上:
- 作为副作用
展开为$(eval$(调用func1,a))
,展开为零$(eval include HERE/test/a/component.mk)
- 作为副作用,include由make处理
- 假定
存在并包含有效的make语法, 变量此处/test/a/component.mk
获取一个值NAME
1
设置为b
。起泡,冲洗,重复
提示
要获得类似代码中的问题提示,请始终运行make with--warn
:
::::::: :::::::::::::::
:::::::AA :::::::::::::::
:::::::BB :::::::::::::::
修理
要了解更多信息,请将$(eval stuff)
替换为$(error[stuff])
在这里,我们看到$(info…
甚至在到达评估之前就消失了。
这种幼稚的修正非常可怕
$ make
::::::: :::::::::::::::
Makefile:8: *** [ include /cygdrive/c/Users/somewhere/a/component.mk
]. Stop.
使用$(error…
运行此命令会
define func1
include $(shell pwd)/test/$(strip $1)/component.mk
$$(info :::::::$${NAME} ::::::::::::::: )
endef
[
和]
之间的东西是有效的make语法。
整理一下它看起来像:
$ make
Makefile:8: *** [ include /cygdrive/c/Users/somewhere/a/component.mk
$(info :::::::${NAME} ::::::::::::::: )]. Stop.
工作完成了。有更干净的方法,但你需要先了解痛苦
$ make
Makefile:8: *** [ include /cygdrive/c/Users/somewhere/a/component.mk
$(info :::::::${NAME} ::::::::::::::: )]. Stop.
include /cygdrive/c/Users/somewhere/a/component.mk
$(info :::::::${NAME} ::::::::::::::: )