如何在makefile目标中读取和打印文件内容(一些设置)?

0 人关注

我有这个配置文件(一个以.cfg结尾的纯文本文件)。

# The application name
learningErlangTesting
# The node name
mysql_testing

另外,我有这个Makefile。

APP=$(shell cat nodes.cfg | sed -n '2p') NODE=$(shell cat nodes.cfg | sed -n '5p') echo $(APP) echo $(NODE)

当我运行make ok时,我得到

APP=learningErlangTesting
NODE=mysql_testing

我的变量似乎是空的,我不能打印它们,也不能用它们来建立一个文件夹路径(我打算在拿到它们之后这样做)。

我做错了什么?

非常感谢。

linux
bash
makefile
adragomir
adragomir
发布于 2014-11-22
2 个回答
MadScientist
MadScientist
发布于 2014-11-23
已采纳
0 人赞同

你的问题是,makefile配方的每一行都在一个新的shell中被调用。 因此,第一行是在一个shell中调用的,其中shell变量 APP 被设置。 然后shell退出,失去shell变量的设置。 然后在另一个shell中运行下一行,等等。

你必须把所有这些放在一个配方行中,以便它们都在同一个外壳中运行。

另外,在你的echo命令中,你正在打印make变量,但你实际上是在设置shell变量。

另外,在配方中使用make的 shell 函数几乎总是一个坏主意。 在这种情况下,它不会造成伤害,但会导致很多混乱。

APP=$$(cat nodes.cfg | sed -n '2p'); \ NODE=$$(cat nodes.cfg | sed -n '5p'); \ echo $$APP; \ echo $$NODE

另外,如果配置文件是一个源文件(一直存在),你可以设置真正的make变量,但你必须在配方之外进行。

APP := $(shell cat nodes.cfg | sed -n '2p')
NODE := $(shell cat nodes.cfg | sed -n '5p')
        echo $(APP)
        echo $(NODE)
    
撤销了+1,因为 cat ... | sed ... 是个悲剧。 修正OP的文体错误,省略UUOC!
我试了一下第二个版本,它可以工作......。你能不能解释一下:什么是$$(...)。我知道$(......)是在子壳中执行的,但不知道$$(......)是什么。另外,是否需要在目标之外的make中声明变量?非常感谢,Desmond
你需要阅读makefile的语法。 Makefile不是shell脚本,makefile语法也不是shell语法。 makefile中的 $(...) 并不是指在子shell中执行东西,而是指一个变量引用。 关于makefile的混乱之处在于,它们 含有 shell脚本:规则的配方是shell脚本,使用shell语法。 为了转义美元符号,使其被传递给shell而不是被make解释,你要把它加倍,所以 $$ 扩展为一个 $ ,可以被传递给shell。 gnu.org/software/make/manual/html_node/Introduction.html
@MadScientist: 非常感谢你的帮助,祝你今天愉快 :)
l0b0
l0b0
发布于 2014-11-23
0 人赞同

除了 @MadScientist的回答 你可以选择创建一个 shell script 并从一个 Makefile 的目标中启动它。这样一来,你也可以将代码简化不少。

$ cat Makefile
        $(shell ./ok.sh)
$ cat ./ok.sh