Shell命令作为Makefile中的变量

时间:2013-01-28 16:18:12

标签: shell makefile

我有以下(非常简化)Makefile:

# Makefile

MAKESH=shell
USER=$($MAKESH logname)

旨在将我的登录名存储在USER变量中,就好像调用了$(shell logname)命令一样。然而,这不会发生。我怀疑这是由于make评估变量的方式。

有没有人对这个或可能的解决方法有更深入的了解,即明确告诉make $MAKESH实际上是shell命令?

感谢。

修改

考虑以下示例:

#parent.mk

...
include child.mk
...

-------------------
#child.mk

export $(shell logname)/path1
export $(shell logname)/path2

-------------------
#bash_script.sh

...
source child.mk
...

(在此示例中,采购child.mk失败)

基本上,我想要做的是创建一个根据当前用户导出路径名的文件。语法应该对makefile和bash脚本都有效,因为它可以从两个地方包含/来源。

我还想对这些文件进行细微的更改,因为它们是较大项目的一部分,并且互连有点令人困惑。

我终于决定采用这个:

#parent.mk

...
export logname=$(shell logname)
include child.mk
...

-------------------
#child.mk

export $(logname)/path1
export $(logname)/path2

-------------------
#bash_script.sh

...
source child.mk
...

这是非常hacky,有点危险,但有效。如果您知道更优雅的方式/方式,请告诉我。

最后,感谢您提供的解决方案(和您的警告),这些解决方案对预编辑的问题有效。

2 个答案:

答案 0 :(得分:5)

语法应为

USER = $(shell logname)

我不知道你为什么要把“shell”放在变量中并搞砸了函数语法,但如果你真的坚持,试试这个:

$(eval USER=$$($MAKESH logname))

$(eval ...)函数只会把它变成上面的第一个形式,所以这是浪费精力。 (除非你真的想做一些比你的例子更难的事情。)

答案 1 :(得分:2)

MAKESH=shell
$(eval USER=$$($(MAKESH) logname))
$(info USER is $(USER))

尽可能避免。