Почему Make продолжает создавать каталог снова и снова?

219
gcb

у меня есть make-файл, который создает некоторые документы из моего источника:

/home/share/htdocs: #installs apache and make sure we have /htdocs...  /home/share/htdocs/doxjs: /home/share/htdocs mkdir -p $@ chgrp users $@ chmod g+w $@  /home/share/htdocs/dox: /home/share/htdocs mkdir -p $@ chgrp users $@ chmod g+w $@  .PHONY: dox dox: /home/share/htdocs/dox /home/share/htdocs/doxjs # runs doxygen cp -r dox/html/* /home/share/htdocs/dox/ cp -r doxjs/html/* /home/share/htdocs/doxjs/ 

Эти правила должны просто создавать и устанавливать разрешение на обслуживание файлов из htdocs, сборку документов и их перемещение.

но когда я бегу. он всегда будет пытаться создать/home/share/htdocs/dox

есть идеи почему?

даже если я использую:

.PHONY: setup setup: /home/share/htdocs/dox /home/share/htdocs/doxjs 

вот что я получаю:

$ sudo rm -fr /home/share/htdocs/dox* $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox mkdir -p /home/share/htdocs/doxjs chgrp users /home/share/htdocs/doxjs chmod g+w /home/share/htdocs/doxjs  $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox  $ sudo make setup mkdir -p /home/share/htdocs/dox chgrp users /home/share/htdocs/dox chmod g+w /home/share/htdocs/dox 

Зачем? Я предполагаю, что не вижу некоторого конфликта с измененными временами. Но я не могу себе представить, что.

0

2 ответа на вопрос

1
QMaster

Ты пробовал бегать make -d? Согласно справочной странице, это обеспечивает:

Отладка информации в дополнение к обычной обработке. Отладочная информация говорит о том, какие файлы рассматриваются для переделывания, какое время файла сравнивается и с какими результатами, какие файлы действительно нужно переделать, какие неявные правила рассматриваются и какие применяются - все интересное о том, как решает make что делать.

1
dirkt

Я смоделировал вашу структуру и использовал там make -r -d setup, где -dпоказывает отладочный вывод, и -rигнорирует встроенные правила, так что меньше выводится. Соответствующая часть

Considering target file 'setup'. File 'setup' does not exist. Considering target file 'htdocs/dox'. Considering target file 'htdocs'. Finished prerequisites of target file 'htdocs'. No need to remake target 'htdocs'. Finished prerequisites of target file 'htdocs/dox'. Prerequisite 'htdocs' is newer than target 'htdocs/dox'. Must remake target 'htdocs/dox'. 

Таким образом, после спуска в htdocsэтот каталог получает более новое время доступа, чем htdocs/dox, и, следовательно, makeприходит к выводу, что он должен быть переделан.

Решение: не используйте родительский каталог в качестве предварительного условия.

На самом деле, вся установка для создания каталогов, а затем запуска в них make, немного сложна; все, что вы хотите достичь, вы должны быть в состоянии достичь этого с помощью статической структуры каталогов.

что именно означает, что под htdocs новее? это только проверило правило. по этой логике каждая отдельная зависимость будет новее, если их сначала проверить, и вот что происходит с зависимостью по desig gcb 7 лет назад 0

Похожие вопросы