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 ...)
以准确查看正在评估的内容。这通常可以很容易地查明代码生成宏中的错误和拼写错误。
我正在尝试使用带有 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 ...)
以准确查看正在评估的内容。这通常可以很容易地查明代码生成宏中的错误和拼写错误。