我正在尝试将模板与foreach一起使用以创建多个规则构造。以下是我的整个示例代码。
variable.mk:
echo 'variable.mk'
echo 'test variable.mk' > $@
FILES:=cpf dma
define generate_template
$(warning input is $(1) end)
$(1): variable.mk
echo [CC] $(1)
echo 'test $(1)' > $(1)
endef
$(foreach module,$(FILES),$(eval $(call generate_template,$(module))))
run.sh:cpf dma
echo [CC] run.sh
echo 'TEST run.sh' >$@
但是当我在命令行上运行make run.sh
时,它显示以下错误:
make: *** No rule to make target `cpf', needed by `run.sh'. Stop.
cpf
目标的规则应由第14行中的模板generate_template
创建,但不能按预期方式工作。
有人可以帮我解决这个问题吗?我在Google周围搜索,但仍然无法弄清。
答案 0 :(得分:-1)
尝试在生成的规则上使用checked.location
的典型错误:生成器未生成最终行尾,因此$(eval ...)
不会解析生成的规则,因为您认为它应该解析它们。 / p>
解决方案: 始终 结束多行宏,这些宏用空行定义规则。这样可以确保正确make
设置规则。
$(eval)
试运行:
variable.mk:
echo $@
echo 'test $@' > $@
FILES := cpf dma
# the empty line at the end of the macro is on purpose
define generate_template
$(warning input is $(1) end)
$(1): variable.mk
echo [CC] $$@
echo 'test $$@' > $$@
endef
$(foreach module,$(FILES),$(eval $(call generate_template,$(module))))
run.sh: cpf dma
echo [CC] $@
echo 'TEST $@' >$@
我还建议重写您的宏,使其仅执行一次评估,即
$ make run.sh
Makefile:14: input is cpf end
Makefile:14: input is dma end
echo variable.mk
variable.mk
echo 'test variable.mk' > variable.mk
echo [CC] cpf
[CC] cpf
echo 'test cpf' > cpf
echo [CC] dma
[CC] dma
echo 'test dma' > dma
echo [CC] run.sh
[CC] run.sh
echo 'TEST run.sh' >run.sh
$ cat variable.mk cpf dma run.sh
test variable.mk
test cpf
test dma
TEST run.sh
提示:如果$(eval $(foreach module,$(FILES),$(call generate_template,$(module))))
不能按预期工作,我总是将其更改为$(eval ...)
以查看正在评估的内容。通常,这很容易在代码生成宏中查明错误和错别字。