GNU make: «Ничего не нужно делать для« цели »» против «« цель »актуальна» - PullRequest
15 голосов
/ 20 апреля 2011

Как GNU принимает решение, какое из сообщений отправлять? Используемый мной Makefile приводит к тому, что ничего не делается для сообщений 'target' , которые отправляются при истечении срока действия цели. Но я думаю, что 'target' обновлен было бы более уместным.

1 Ответ

17 голосов
/ 20 апреля 2011

Главное отличие в том, есть ли у 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», а файл выглядит актуальным, вы получаете сообщение «is to date».

...