Makefile中的Echo命令

10

尝试寻找在makefile中打印信息的简单方法。以下是我的简单makefile

$(info aaa) 可以正确打印出aaa。 但是,行echo 'aaa'会创建错误*** missing separator

是否有可能在makefile中使用echo来打印信息?

CC=gcc
CFLAGS=-I.
DEPS = f1.h,hellomake.h

echo 'aaa'
$(info aaa)

%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

hellomake: hellomake.o hellofunc.o f1.o 
        gcc -o hellomake hellomake.o hellofunc.o f1.o -I.

据我所知 - echo 必须在规则内。 - Nim
同意Matthias的观点,你的makefile不是逐行解释的。rule定义了makefile的流程。 - Fahad Siddiqui
3个回答

15

Makefile 不是按照每一行执行,而是依据规则的依赖执行。你的 echo 语句不属于任何规则,但 make 认为它应该,因此出现了错误信息。

如果你想要生成独立于任何依赖的通用输出,$(info ...)(或 $(warning ...))就是正确的方法。


此外,此建议无需使用引号/双引号。 请参阅https://www.oreilly.com/library/view/managing-projects-with/0596006101/ch12.html以获取更详细的`make`调试表达式概述。 - Gwyneth Llewelyn
我会重新表达第二个选项 $(info ...) 等可以在顶层使用,也可以在接收中使用,在后一种情况下,输出结果会有所不同。 - Wolf

12
你可以在你的 Makefile 中使用这样的技巧:
a = $(shell echo abc)
$(info $(a))

为什么使用$(info)而不直接使用字符串文字会更有用呢?可以在消息中打印shell变量或特定命令的输出,例如:
msg = $(shell echo "PATH in shell: $${PATH}, timestamp: `date`")
$(info "PATH in Makefile: $(PATH), $(msg)")

为什么不直接使用$(info abc)呢? - Wolf
例如,如果您想将shell变量添加到消息中或者使用某个命令的输出(例如time)作为要打印的字符串的一部分。 - Andrey Starodubtsev
在你的回答中加入一个使用案例的示例会不好吗?我的意思是,虽然它有点老旧,但如果你认为这仍然是一种有效的方法,为什么不解释一下呢?在我看来,“技巧”什么也解释不了。 - Wolf
这个问题是由另一个人提出的,但我可以提供使用echo的必要性背后的原因,并编辑了我的答案以提供一个例子。 - Andrey Starodubtsev
不管怎样,我觉得现在好多了。我真的不喜欢谈论“把戏”,而更喜欢实实在在的技术。 - Wolf

5
你可以创建一个sayhello目标:
.PHONY: sayhello
sayhello:
        echo 'aaa'

现在您可以运行make sayhello来执行echo 'aaa'命令。
虚假目标不是文件的名称,而只是一个名称,用于在明确请求时执行配方。更多信息请参见:https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html sayhello目标也可以作为hellomake目标的子例程:
hellomake: hellomake.o hellofunc.o f1.o sayhello
        gcc -o hellomake hellomake.o hellofunc.o f1.o -I.

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