Makefile: цель с промежуточными предпосылками перестраивается каждый раз - PullRequest
0 голосов
/ 24 марта 2020

Я использую Pando c для вывода документа Word out.docx из нескольких исходных файлов Mardown file1.md file2.md .... Однако эти файлы Markdown необходимо предварительно обработать, прежде чем их можно будет объединить и преобразовать в Word. Я использую GNU make для этого:

SRC = $(wildcard *.md)
TMP := $(patsubst %.md,%.tmp, $(SRC))

.INTERMEDIATE : $(TMP)

out.docx : $(TMP)
        pandoc -o $@ file1.tmp file2.tmp ... -f markdown

%.tmp : %.md
        pandoc -o $@ $< --filter=...

Теперь я хочу, чтобы out.docx перестраивался только при изменении исходных файлов $(SRC). Однако, поскольку промежуточные файлы $(TMP) удаляются в конце каждой сборки, make считает, что out.docx необходимо перестраивать каждый раз. Использование $(SRC) вместо $(TMP) в предварительных условиях для out.docx, конечно, не будет работать, поскольку согласно документы :

make не будут учитываться нетерминальные правила с произвольным соответствием (т. е. «%:») при поиске правила для создания предпосылки неявного правила.

Так как я могу оптимизировать эту сборку и не запускать ее? когда не нужно?

1 Ответ

1 голос
/ 24 марта 2020

Пожалуйста, убедитесь, что приведенные вами примеры действительно показывают проблему. В вашей реальной ситуации должно быть что-то иное, чем то, что вы показываете здесь, потому что файл makefile, который вы показываете здесь, будет работать так, как вы ожидаете. У меня не установлено pandoc, поэтому я заменил touch, и он отлично работает:

SRC = $(wildcard *.md)
TMP := $(patsubst %.md,%.tmp,$(SRC))

.INTERMEDIATE: $(TMP)

out.docx: $(TMP)
        touch $@

%.tmp: %.md
        touch $@

Сейчас:

$ touch foo.md bar.md biz.md

$ make
touch bar.tmp
touch biz.tmp
touch foo.tmp
touch out.docx
rm foo.tmp bar.tmp biz.tmp

$ make
make: 'out.docx' is up to date.

$ touch biz.md

$ make
touch bar.tmp
touch biz.tmp
touch foo.tmp
touch out.docx
rm foo.tmp bar.tmp biz.tmp

Вы можете запустить make -d (перенаправить вывод для дальнейшего изучения), чтобы понять, почему make считает, что out.docx устарел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...