根据GNU make guide,“您编写的规则优先于内置的规则。但请注意,实际存在或提及先决条件的规则始终优先于必须具有先决条件的规则通过链接其他隐含规则来制作。“
所以我写了这个测试makefile来做一个小实验(GNUmakefile是这个测试makefile的名字):
% ::
@echo "last resort implicit rule is working"
.DEFAULT_GOAL = src/hello.o
src/hello.o :
GNUmakefile : ;#used to prevent remaking this makefile, although in this case it is unnecessary.
我的文件组织如下所示:
GNUmakefile(#ordinary file)
src(#directory)
----hello.c(#ordinary file)
我希望它输出"last resort implicit rule is working"
,因为src/hello.o
将匹配目标模式% ::
,这是一个终端匹配任何隐式规则。根据{{3}}中指定的隐式规则搜索算法,此规则应适用。
但是,当我运行make
时,会输出cc -c -o src/hello.o src/hello.c
。
我发现实际上src/hello.o
与内置的隐式规则相匹配。当我运行make -r
时,会输出"last resort implicit rule is working"
。 make -d
的输出证明了这一点。
但我认为这种行为与GUN制作指南中指定的内容相矛盾。 有人可以帮忙吗?
顺便说一下,我在GNU make guide中阅读了最后的规则,它说“所以这样的规则的配方用于所有目标和先决条件,没有自己的配方,没有其他隐含的规则适用“。这是我的问题的解决方案吗?我对此表示怀疑,因为我认为这取决于是否定义了最后手段规则以及定义了最后手段规则的位置,因为在使用GUN make guide中指定的算法搜索隐式规则时,顺序很重要。
答案 0 :(得分:1)
在我的工作场所使用一些古老的制作工作正常......
[teve@madar mktest]$ tree . ├── GNUmakefile └── src └── hello.c 1 directory, 2 files [teve@madar mktest]$ cat GNUmakefile % :: @echo "last resort implicit rule is working" .DEFAULT_GOAL = src/hello.o src/hello.o : GNUmakefile : ;#blablabla [teve@madar mktest]$ make last resort implicit rule is working [teve@madar mktest]$ make --version GNU Make 3.81 [...]
......它不适用于一步不那么古老的制作:
[teve@madar mktest]$ make cc -c -o src/hello.o src/hello.c [gergelyc@sauron mktest]$ make --version GNU Make 3.82 [...]
鉴于目前的版本是4.x,我觉得非常幸运的是这两个版本的行为改变
我试着查看以changelog结尾的implicit
,built
,order
,last
和match
,以3.82结尾,但我有没有发现任何明显的东西
顺便说一下,取消内置%o : %c
的内置规则。