Makefile subst 变量不受影响?
Makefile subst variable not affected?
我想在我的 Makefile 中执行字符串替换。我可以像这样使用字符串文字轻松地做到这一点:
foo:
echo $(subst /,-,"hello/world")
产生预期的结果:
hello-world
但是当我切换到使用变量时,我似乎无法坚持替换:
foo:
x="hello/world" ; \
echo $(subst /,-,$$x)
我没有用破折号替换斜杠,而是打印回了原始字符串。有人可以解释这里发生了什么吗?变量是否需要显式转换为字符串文字或其他内容?
更新:
基于 MadScientist 的回答的修复——这将允许我将修改后的字符串作为变量引用。
foo:
x="hello/world" ; \
y=`echo $$x | tr / -` ; \
echo $$y
但这可能比 echo $$y
更有用。
您不能将 make 函数与 shell 变量结合使用...所有 make 函数都先展开 ,然后将生成的脚本传递给 shell 为 运行。当 shell 获取脚本时,其中不再有 make 函数(如果有,shell 将不知道如何处理它们!)
你的替换是 运行ning 在文字字符串 $x
上,它没有 /
,所以没有什么可替换的,结果是 $x
,[=26] =] 扩展为字符串 hello/world
.
如果您必须处理 shell 变量值,您必须使用 shell 命令,例如 sed
或 tr
,而不是 make 的 subst
函数:
foo:
x="hello/world" ; \
echo $$x | tr / -
您可以将 x
定义为 make
变量:
生成文件:
x = foo bar baz
t:
@echo $(subst bar,qux,$(x))
输出:
make
foo qux baz
版本:
make --version
GNU Make 3.81
我想在我的 Makefile 中执行字符串替换。我可以像这样使用字符串文字轻松地做到这一点:
foo:
echo $(subst /,-,"hello/world")
产生预期的结果:
hello-world
但是当我切换到使用变量时,我似乎无法坚持替换:
foo:
x="hello/world" ; \
echo $(subst /,-,$$x)
我没有用破折号替换斜杠,而是打印回了原始字符串。有人可以解释这里发生了什么吗?变量是否需要显式转换为字符串文字或其他内容?
更新:
基于 MadScientist 的回答的修复——这将允许我将修改后的字符串作为变量引用。
foo:
x="hello/world" ; \
y=`echo $$x | tr / -` ; \
echo $$y
但这可能比 echo $$y
更有用。
您不能将 make 函数与 shell 变量结合使用...所有 make 函数都先展开 ,然后将生成的脚本传递给 shell 为 运行。当 shell 获取脚本时,其中不再有 make 函数(如果有,shell 将不知道如何处理它们!)
你的替换是 运行ning 在文字字符串 $x
上,它没有 /
,所以没有什么可替换的,结果是 $x
,[=26] =] 扩展为字符串 hello/world
.
如果您必须处理 shell 变量值,您必须使用 shell 命令,例如 sed
或 tr
,而不是 make 的 subst
函数:
foo:
x="hello/world" ; \
echo $$x | tr / -
您可以将 x
定义为 make
变量:
生成文件:
x = foo bar baz
t:
@echo $(subst bar,qux,$(x))
输出:
make
foo qux baz
版本:
make --version
GNU Make 3.81