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

时间:2019-02-26 02:57:47

标签: makefile gnu-make

我正在尝试将模板与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周围搜索,但仍然无法弄清。

1 个答案:

答案 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 ...)以查看正在评估的内容。通常,这很容易在代码生成宏中查明错误和错别字。