make不需要虚假先决条件

时间:2015-07-09 17:02:18

标签: makefile

.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)我用磅(#)开始命令。为什么不将这些命令视为注释。

1 个答案:

答案 0 :(得分:1)

Etan在评论中有正确的信息。只是为了更加冗长:

1)声明目标PHONY将其创建为make内部的目标。所以此后,如果你把它列为先决条件,那就知道它就像你把foo:写成目标一样。可以说这是制作中的一个错误;我不确定,但这就是它的工作原理。

2)Etan回答的重要细节是,如果makefile [1]中有一行以TAB开头,make会将它发送到shell。 Make不会尝试解释这一行,甚至不知道它是否是注释(当然不是扩展变量/函数)。无论你写什么,都会发送到shell。

[1]“在目标环境中”,这很难具体描述......最好的办法是永远不要使用TAB,除非你试图写一个食谱线。