在Makefile中打印信息:@echo与$(info)的区别

21

在Makefile中,这两个命令有什么区别:

@echo "Hello World"
$(info Hello World)

看起来,echoinfo 打印出了相同的输出,那么它们的区别在哪里?何时使用哪个?


如果你的收据上有两者,回音会放在最后。 - Wolf
1个回答

27

嗯,echo 是一个Shell命令。所以如果你将它放在一个配方中,那么会调用一个shell来运行它,这个Shell命令将生成输出:

foo: ; @echo "Hello World"

运行 /bin/sh -c 'echo "Hello World"'。它只能在配方中使用,可以在任何版本的make和任何POSIX shell中工作。因为它调用了一个 shell,所以你可能需要关注引号等问题(当然,在这个简单的例子中不需要)。

info 是GNU make的一个函数。它直接由make处理,不会调用shell。它可以出现在makefile的任何位置,而不仅仅是在配方中。它不能移植到其他版本的make中。因为没有调用shell,所以不存在引用问题。

但是,由于info是一个make函数,在调用shell之前,它会被make解析,这意味着它无法显示在配方内设置的shell变量,例如:

foo: ; @for i in a b c d; do $(info $$i); done

无法工作,请在此处使用echo


我认为它也以不同的顺序执行 @echo ...\n$(info ...)\n 会先打印 info。(这里的 \n 是字面意思) - undefined
是的,这是我所说的“在shell被调用之前,它会被make解析”的一部分。我应该在这里说“展开”而不是“解析”,因为“展开”是make使用的术语。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接