首页 > 解决方案 > 为生成的目标设置不同的变量值

问题描述

我正在尝试创建一个生成文件,为目录中的每个文件生成一个目标。每个文件都将包含一个 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))))

虽然我的解决方案有效,但我同意接受的解决方案更好。我将我的解决方案作为一个更糟糕的做事方式的例子。

标签: makefilegnu-make

解决方案


你没有说你正在使用什么版本的 Make,但试试这个:

define target_template =
 stuff := 
 -include $(1).txt
 stuff_$(1):= $$(stuff)
 $(1): ; @echo target $$@ stuffs $$(stuff_$(1))
endef

推荐阅读