GNU Make: файлы подстановочных знаков в каталоге основы в правиле статического шаблона - PullRequest
0 голосов
/ 06 ноября 2018

Искал кучу, надеюсь, я не пропустил что-то очевидное ...

У меня есть несколько книжных каталогов. Каждый из них имеет один файл * .ditamap (всегда именуемый для книги), в котором содержится несколько десятков сопровождающих файлов темы * .dita:

makefile

book1/
  book1.ditamap  intro.dita  topic1.dita  topic2.dita  glossary.dita

book2/
  book2.ditamap  about.dita  topicA.dita  topicB.dita  appendix.dita

book3/
  book3.ditamap  cmd1.dita  cmd2.dita cmd3.dita

Вывод XHTML (цель) для книги зависит от ее отдельного файла .ditamap плюс всех файлов * .dita в этом каталоге книги (предварительные условия). Makefile находится рядом с каталогами книг.

Сборка XHTML для книги создает выходной каталог XHTML внутри этого каталога книги с файлом index.html, который я использую в качестве цели:

book1/
  book1.ditamap  intro.dita  topic1.dita  topic2.dita  glossary.dita

  book1/book1_xhtml/
    index.html  ...more html and CSS files...

Следующее правило статического шаблона перестроит каталог XHTML внутри любого каталога книг, в котором был изменен файл * .ditamap:

ditamap_files := $(wildcard */*.ditamap)
xhtml_files := $(patsubst %.ditamap,%_xhtml/index.html,${ditamap_files})

all: dita xhtml
dita: ${ditamap_files}
xhtml: ${xhtml_files}

${xhtml_files}: %_xhtml/index.html: %.ditamap
        dita -i "${<}" -f xhtml -o "${*}_xhtml"

(Примечание: make прекрасно обрабатывает создание пути к цели index.html благодаря своим умным правилам обработки каталогов!)

Однако я не нашел способа расширить это правило, чтобы оно чувствительно к файлам * .dita. Всякий раз, когда .ditamap или .dita изменяется внутри каталога книги, XHTML-файл книги необходимо перестраивать.

Я пробовал что-то вроде

${xhtml_files}: %_xhtml/index.html: %.ditamap $(wildcard $(dir %)/*.dita)
#                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
        dita -i "${<}" -f xhtml -o "${*}_xhtml" 2>&1 | tee "${*}_xhtml.out"

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

1 Ответ

0 голосов
/ 06 ноября 2018

Вторичное расширение , возможно:

.SECONDEXPANSION:

$(xhtml_files): %_xhtml/index.html: %.ditamap $$(wildcard $$(dir $$*)/*.dita)
    dita -i "$<" -f xhtml -o "$*_xhtml"

Кстати, вы считали, что dita файлы могут изменяться, а также появляться или исчезать? Это возможно? Если это так, что вы хотите сделать? И вы уже знаете, как это обнаружить?

...