gpt4 book ai didi

makefile - makefile 函数中的变量未正确扩展?

转载 作者:行者123 更新时间:2023-12-01 22:19:39 25 4
gpt4 key购买 nike

这是一个玩具 Makefile。我想创建文件“a”、“b”、“c”以及“a.out”、“b.out”、“c.out”。

LIST=a b c
all: $(addsuffix .out,$(LIST))

define FUN
in := $(1)
out := $(1).out
$$(in) :
echo $(1) > $$(in)
$$(out) : $$(in)
echo $$(in) > $$(out)
endef
$(foreach p,$(LIST),\
$(eval $(call FUN,$(p))))

当我使用“make -n”测试运行它时,GNU Make 4.1 版本,真正执行的命令是:

echo a > c
echo c > c.out
echo b > c
echo c > c.out
echo c > c
echo c > c.out

然而,预期的结果是:

echo a > a
echo a > a.out
echo b > b
echo b > b.out
echo c > c
echo c > c.out

有人可以帮助解释 Makefile 的行为或如何修复此脚本吗?谢谢。

最佳答案

你为什么不直接使用 $1到处都是变量而不是创建新变量?没有规定必须在扩展中使用变量。你可以把它写成:

define FUN
$1 :
echo $1 > $1
$1.out : $1
echo $1 > $1.out
endef

如果你不想这样做,你可以使用 automatic variables像这样:

define FUN
$1 :
echo $$@ > $$@
$1.out : $1
echo $$< > $$@
endef

编辑

如果没有看到某种现实的例子,就很难判断。对您的问题的简短回答是否定的,没有神奇的方法可以在 makefile 中创建“可变范围”。

您应该始终使用 $@ , $< , 和其他自动变量。这就是他们的目的。如果你有其他需要的变量赋值,并且你想将它们设置为变量而不是直接使用调用参数,你只有两个选择:目标特定变量或constructed macro names。 .

但我并没有真正看到“目标特定变量的长列表”的问题。为什么要在全局范围内设置变量然后再次将它们设置为特定于目标的?如果您只是将它们直接设置为特定于目标的变量,则只需编写一次。目前尚不清楚您对它们的使用有何“尴尬”之处,所以我不能说这是否足够。

此外,您应该在主要目标上设置特定于目标的变量,而不是先决条件,因为特定于目标的变量是通过先决条件列表“继承”的。

所以,像这样:

define FUN
$1.out : FOO = $(some complex thing)

$1 :
echo $$(FOO) > $$@
$1.out : $1
echo $$(FOO) from $$< > $$@
endef

关于makefile - makefile 函数中的变量未正确扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41113878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com