定义内的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

每个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/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处理
    • 假定
      此处/test/a/component.mk
      存在并包含有效的make语法, 变量
      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} ::::::::::::::: )