Ответ 1
Главное отличие заключается в том, имеет ли 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" не существует, вместо этого вы получите знакомое сообщение "No rule to make".
В отличие от этого, поскольку gmake имеет правило для "upToDate", и файл кажется обновленным, вы получаете сообщение "актуально".