Makefile中以。开头的目标的含义是什么,它与后缀规则有何不同/相似?

时间:2019-05-25 15:17:24

标签: makefile gnu-make

在Makefile中,我看到了:

all: .made

# ... some other code

.made: $(Program) bashbug
    @echo "$(Program) last made for a $(Machine) running $(OS)" >.made

.made规则是否为后缀规则,如:https://www.gnu.org/software/make/manual/make.html#Suffix-Rules

还有,所有规则的目标都在前后缀规则中带有.吗?

否则,以。开头的目标的意义是什么? https://www.gnu.org/software/make/manual/make.html#How-Make-Works中似乎有这样的意义:

  

默认情况下,make从第一个目标开始(而不是名称相同的目标   以“。”开头。

但是没有提到它的重要性。

此外,如果这是一个后缀规则,那么.made为何可以用作all规则的前提条件? (没有提到后缀规则的目标可以用作其他规则的先决条件。)

P.S .:此问题与what is the meaning for . (dot) before the target in makefile有关,但与之不同。该问题明确要求使用的目标之间的差异。和后缀规则的目标。

1 个答案:

答案 0 :(得分:1)

  

.made规则是后缀规则

否,因为.made不是“已知后缀”。

  

还有,所有规则的目标都在前后缀规则中带有.吗?

否,只有那些点后单词是“已知后缀”的人:

您的前两个问题由https://www.gnu.org/software/make/manual/make.html#Suffix-Rules回答:

  

后缀规则定义可以通过将每个规则的目标与已定义的已知后缀列表进行比较来识别。当make看到目标为已知后缀的规则时,该规则被视为单后缀规则。当make看到目标是两个已知后缀串联的规则时,该规则将被视为双后缀规则。

在您的示例中,.made是实际的文件名。您的Makefile有一个创建/更新文件的规则:

#vvvv
.made: $(Program) bashbug
        @echo "$(Program) last made for a $(Machine) running $(OS)" >.made
#                                                                    ^^^^^

一切都很正常;与任何其他名称相同的方式都可以使用。

前导点的唯一含义是按惯例使文件“隐藏”,即ls不会显示它(不指定-a),普通*会显示不匹配,等等。