Проблема в том, что эти правила не могут работать:
xhtml/*.html: tei/${MANUSCRIPTNAME}.xml
manifold/${MANUSCRIPTNAME}.zip: xhtml/*.html manifold/manifest.yml
Неправильно использовать подстановочные знаки для поиска target , которые должны быть собраны make, потому что при запуске make в первый раз нет файлов, которые соответствуют этим групповым символам, поэтому они не могут расширяться.
Причина, по которой это работает, заключается в том, что, подобно оболочке, если подстановочный знак не соответствует никакому значению, он возвращает сам подстановочный знак. Итак, если ни один файл не соответствует xhtml/*.html
, то результатом будет буквенная строка xhtml/*.html
. Если у вас есть три файла, которые соответствуют, то в результате получаются три файла, такие как xhtml/ONE.html xhtml/TWO.html xhtml/THREE.html
.
Так что при первом запуске этого файла сборки нет подходящих целей, и поэтому make хочет создать одну цель с именем, буквально, xhtml/*.html
и есть правило, которое соответствует этой цели, так что все работает.
Во второй раз, когда вы запускаете этот make-файл, есть три цели, которые make хочет создать, и есть правило, подобное этому:
xhtml/ONE.html xhtml/TWO.html xhtml/THREE.html: tei/${MANUSCRIPTNAME}.xml
...recipe...
Что это значит? Вы можете подумать, что это означает, что один вызов recipe создаст все три цели, но это не то, что значит сделать. Чтобы сделать, это точно так же, как написать это:
xhtml/ONE.html: tei/${MANUSCRIPTNAME}.xml
...recipe...
xhtml/TWO.html: tei/${MANUSCRIPTNAME}.xml
...recipe...
xhtml/THREE.html: tei/${MANUSCRIPTNAME}.xml
...recipe...
, то есть, он будет запускать рецепт один раз для каждой цели. Мне невозможно понять, что делает эта масса сценариев оболочки, поэтому я не могу сказать, почему она всегда перестраивается: должно быть, либо эти файлы на самом деле не созданы целью, либо время их модификации не установлено должным образом.
Если это правило действительно строит все html файлы одним вызовом, то вам нужно использовать псевдо-цель некоторого вида для отслеживания времени ее модификации, например:
xhtml/.buildhtml: tei/${MANUSCRIPTNAME}.xml
... recipe ...
@touch $@
manifold/${MANUSCRIPTNAME}.zip: xhtml/.buildhtml manifold/manifest.yml
В качестве альтернативы если вы знаете, что можете полагаться на последнюю версию GNU make 4.3, вы можете воспользоваться новой функцией «сгруппированные цели» , &:
и написать свой make-файл следующим образом:
ALLHTML = xhtml/ONE.html xhtml/TWO.html xhtml/THREE.html
$(ALLHTML) &: tei/${MANUSCRIPTNAME}.xml
...recipe...
manifold/${MANUSCRIPTNAME}.zip: $(ALLHTML) manifold/manifest.yml
(Вы по-прежнему не можете использовать *.html
по причинам, указанным выше).