Makefile扩展变量在内部定义

用户2331977
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)

每个makefile的内容:

cat test/a/component.mk
    NAME := AA

cat test/b/component.mk
    NAME := BB

cat test/c/component.mk
    NAME := CC

输出为

::::::: ::::::::::::::: 
:::::::AA ::::::::::::::: 
:::::::BB ::::::::::::::: 

NAME第一次是空的。

波波哥

让我们看一下$(foreach dir, ${INCLUDES}, $(eval $(call func1, ${dir}) ))痛苦细节的扩展

  • ${INCLUDES} 扩大,给 $(foreach dir,a b c,$(eval $(call func1,${dir})))
  • 下一步dir设置为a
  • $(call func1,a) 扩大了
    • 1 被设定为 a
    • func1 展开:
      include $(shell pwd)/test/$(strip $1)/component.mk
      $(info :::::::${NAME} ::::::::::::::: )
      • $(shell pwd)变成HERE,说(注意${CURDIR}改为使用
      • $(strip $1)$(strip a)a
      • ${NAME} 扩展为空
      • $(info ::::::: ::::::::::::::: ) 扩展为空
        • 作为副作用::::::: :::::::::::::::出现在标准输出
  • $(eval $(call func1,a))扩展为$(eval include HERE/test/a/component.mk),扩展为无
    • 副作用是,包含make处理
    • 大概HERE/test/a/component.mk存在并且包含有效的make语法,并且该变量NAME获取一个值。

1设置为b泡沫,冲洗,重复。

小费

要获得问题的暗示在这样的代码,始终运行化妆--warn

$ make --warn -Rr
Makefile:8: warning: undefined variable 'NAME'
::::::: :::::::::::::::
⋮

固定

为了得到一些见解,更换$(eval stuff)$(error [stuff])

$ make
::::::: :::::::::::::::
Makefile:8: *** [    include /cygdrive/c/Users/somewhere/a/component.mk
    ].  Stop.

在这里,我们看到$(info …)甚至在到达评估之前就已经消失了。天真的修补程序非常可怕。

define func1
  include $(shell pwd)/test/$(strip $1)/component.mk
  $$(info :::::::$${NAME} ::::::::::::::: )
endef

$(error …)在适当的位置运行该命令

$ make
Makefile:8: *** [    include /cygdrive/c/Users/somewhere/a/component.mk
    $(info :::::::${NAME} ::::::::::::::: )].  Stop.

[之间的内容]是有效的make语法。整理起来看起来像:

include /cygdrive/c/Users/somewhere/a/component.mk
$(info :::::::${NAME} ::::::::::::::: )

任务完成。有更清洁的方法,但是您首先需要了解痛苦!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

同步处理资料在内部类的静态变量

在内部类中访问局部变量(java)

C#在内部编辑只读变量

VueJS:变量未定义仅在内部计算

在内部类中访问for循环变量

在内部调用函数

如何在内部访问laravel .env变量

在内部类中访问for循环变量的最佳实践

在内部函数打字稿中访问外部变量

在内部单击后如何禁用关闭扩展材料的mde弹出窗口

在while循环之外定义的变量不在内部定义吗?

在内部渲染图标

Makefile,添加位于父目录中的标头(不允许在内部移动!)

在内部类的扩展函数中使用限定的条件访问外部范围

如何在内部类中定义常量?

括号内如何在内部设置变量?

如果Bash上的... fi有某种方法可以使别名扩展在内部工作?

如果在内部类中访问,则在方法中定义的内部类要求在该方法中声明的变量是最终变量。

PHP-类内部的全局变量-在内部函数中访问

PHP数组-如何在内部使用变量?

{}和+如何通过-execdir选项在内部进行扩展

如何在内部类Android中访问变量

Python:在内部方法内部修改方法局部变量

在内部扩展Microsoft Dynamics CRM 2016的试用版

外部范围中的已定义变量未在内部范围中定义

在内部函数中使用公共变量

为什么在内部调用中的这个 lapply 与内部调用中的这个变量赋值不同?

在内部组件内设置变量的状态

Python对变量的重新声明在内部是如何工作的?