Makefile 模板中定义的规则不起作用

rule defined in a Makefile template does not work

我正在尝试使用带有 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周围找了一圈,还是没弄明白。

尝试在生成的规则上使用 $(eval ...) 的典型错误:您的生成器没有生成最后一行结尾,因此 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 ...) 没有按预期工作,我总是将其更改为 $(info eval ...) 以准确查看正在评估的内容。这通常可以很容易地查明代码生成宏中的错误和拼写错误。