首页 > 解决方案 > makefile 函数的奇怪行为

问题描述

我遇到了 $(foreach..) 和 echo 函数的问题。我试图迭代一个变量并将其附加到一个文件中。

这是我的代码:

vars = a b c d
all:
    @$(foreach var, $(vars), echo $(var) >> variables.txt)

生成的文件看起来像

a echo  b echo c echo d

我不知道为什么它还会打印“echo”这个词以及为什么它在同一行。

我在 Windows 上工作,在 linux 上结果符合预期。

我在这里想念什么?

谢谢。

标签: makefile

解决方案


关于输出重定向的有趣事情。您可以将其放在命令的末尾:

echo a b c >> filename

或者在命令中间

echo a b >> filename c

或在多个地方:

echo a >> filename b >> filename c >> filename

它做同样的事情。

在你的makefile中,这个:

$(foreach var, $(vars), echo $(var) >> variables.txt)

是一个Make迭代。(shell 没有这样的命令foreach),它扩展为:

echo a >> variables.txt echo b >> variables.txt echo c >> variables.txt echo d >> variables.txt

正如我们所见,这相当于:

echo a echo b echo c echo d >> variables.txt

因此,shell 尽职尽责地回应a echo b echo c echo d并将其重定向到variables.txt.

编辑:获得所需效果的最简单方法是添加分号:

vars = a b c d
all:
    @$(foreach var, $(vars), echo $(var) >> variables.txt;)

推荐阅读