.PHONY: foo bar baz
all: foo bar baz foo bar
# @=$@
# ?=$?
# <=$<
# ^=$^
# +=$+
以下是此输出:
# @=all
# ?=foo bar baz
# <=foo
# ^=foo bar baz
# +=foo bar baz foo bar
如果评论第一行为:
#.PHONY: foo bar baz
然后输出是:
make: *** No rule to make target `foo', needed by `all'. Stop.
我有两个问题:
1)为什么make在第一种情况下不会抱怨规则&#34; foo bar和baz&#34;宣布为PHONY。
2)我用磅(#)开始命令。为什么不将这些命令视为注释。
答案 0 :(得分:1)
Etan在评论中有正确的信息。只是为了更加冗长:
1)声明目标PHONY将其创建为make内部的目标。所以此后,如果你把它列为先决条件,那就知道它就像你把foo:
写成目标一样。可以说这是制作中的一个错误;我不确定,但这就是它的工作原理。
2)Etan回答的重要细节是,如果makefile [1]中有一行以TAB开头,make会将它发送到shell。 Make不会尝试解释这一行,甚至不知道它是否是注释(当然不是扩展变量/函数)。无论你写什么,都会发送到shell。
[1]“在目标环境中”,这很难具体描述......最好的办法是永远不要使用TAB,除非你试图写一个食谱线。