GNU如何决定发出哪些消息?我正在使用的Makefile导致在目标启动日期时发出的“目标”消息无法完成。但我认为'target'是最新的会更合适。
答案 0 :(得分:17)
主要区别在于gmake是否有规则来构建目标。如果目标没有规则,但目标存在,那么gmake会说,“没什么可做的”,如“我不知道如何更新这个东西,但它已经存在,所以我猜有无计可施。”如果有规则,但目标已经是最新的,那么gmake会说,“是最新的”,如“我确实有更新这个东西的说明,但它似乎已经 - 到目前为止,所以我什么都不做。“
这是一个具体的例子:
$ echo "upToDate: older ; @echo done" > Makefile
$ touch older ; sleep 2 ; touch upToDate ; touch nothingToDo
$ ls --full-time -l older upToDate nothingToDo
-rw-r--r-- 1 ericm ericm 0 2011-04-20 11:13:04.970243002 -0700 nothingToDo
-rw-r--r-- 1 ericm ericm 0 2011-04-20 11:13:02.960243003 -0700 older
-rw-r--r-- 1 ericm ericm 0 2011-04-20 11:13:04.960243001 -0700 upToDate
$ gmake upToDate
gmake: `upToDate' is up to date.
$ gmake nothingToDo
gmake: Nothing to be done for `nothingToDo'.
由于gmake没有“nothingToDo”的规则,但该文件已经存在,因此您将收到“无所事事”消息。如果“nothingToDo”不存在,你会得到熟悉的“无规则”信息。
相比之下,由于gmake有“upToDate”规则,并且文件似乎是最新的,因此您会收到“是最新的”消息。
答案 1 :(得分:0)
我研究了这个问题,测试了很多场景,得到的结果是:
如果目标没有配方并且没有任何先决条件的配方被执行,那么将打印Nothing to be done for "top target"
如果目标有配方,但没有执行配方,则打印 is up to date
。
如果现有文件没有规则,并且将该现有文件作为目标也打印Nothing to be done for "xxx"