makefile - 为生成的目标设置不同的变量值
问题描述
我正在尝试创建一个生成文件,为目录中的每个文件生成一个目标。每个文件都将包含一个 makefile 变量分配列表,然后生成的目标将使用这些变量分配。
我让它使用eval
. 我可以得到目标@echo
。当我尝试在文件中分配要在目标中使用的变量时,我没有得到我想要的。我希望它具有文件中的值。我只能弄清楚如何从最后一个文件或上一个文件中获取值。
这给出了前一个文件中东西的值:
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
stuff :=
-include $(1).txt
$(1): ; @echo target $$@ stuffs $(stuff)
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
这给了我最后一个文件的值:
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
stuff :=
-include $(1).txt
$(1): ; @echo target $$@ stuffs $$(stuff)
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
每个文本文件都有以下内容:
stuff += mytest<X>
<X>
每个文件在哪里是唯一的。请注意,我正在使用+=
,因为在某些情况下,包含的文本文件包含另一个文件,该文件也将内容添加到变量中。
有没有办法让生成的目标使用stuff
关联文本文件中的值?
我将代码更改为此,它似乎工作。这是我不应该做的事情吗?
myvar = $(sort $(basename $(wildcard *.txt)))
.PHONY: all $(myvar)
all: $(myvar)
define target_template =
$(1):
$(eval stuff = )
$(eval include $(1).txt)
@echo target1 $$@ stuffs $(stuff)
$(warning $(stuff))
endef
$(foreach v,$(myvar),$(eval $(call target_template,$(v))))
虽然我的解决方案有效,但我同意接受的解决方案更好。我将我的解决方案作为一个更糟糕的做事方式的例子。
解决方案
你没有说你正在使用什么版本的 Make,但试试这个:
define target_template =
stuff :=
-include $(1).txt
stuff_$(1):= $$(stuff)
$(1): ; @echo target $$@ stuffs $$(stuff_$(1))
endef
推荐阅读
- java - Java If 语句具有多个条件且 && 运算符不起作用
- angular - 如何以角度预览上传的任何类型的文件?
- c++ - 如何在 ubuntu 中停止对 geany for C++ 中未使用变量的警告?
- python - 下载带有 Content-Type': 'text/html 和 Content-Encoding': 'gzip' 的文件
- r - 如何从 R 中的两个栅格计算 r2?
- amazon-web-services - Step Function 中的嵌套 Step Function:未知错误:“...未授权创建托管规则”
- ios - iOS AVPlayer 在快退/快进后无法暂停
- python - 使用 Scrapy 高效循环数据
- android - AAPT:android 集成第三方库时出错
- laravel - Laravel 6 pathinfo() 期望参数 1 是字符串,给定对象