在Makefile中,这两个命令有什么区别:
@echo "Hello World"
$(info Hello World)
看起来,echo
和 info
打印出了相同的输出,那么它们的区别在哪里?何时使用哪个?
嗯,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