GNU Make:以静态模式规则对茎目录中的文件进行通配符

时间:2018-11-06 15:04:32

标签: makefile gnu-make dita

搜索了一堆,希望我不会错过明显的事情...

我有多个书籍目录。每个文件都有一个* .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...

以下静态模式规则将在* .ditamap文件已更改的任何书籍目录中的 内部重建XHTML目录:

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在book目录中更改时,都必须重建book XHTML文件。

我尝试过类似的东西

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

,但这完全无法正常工作,因为静态模式规则不支持通配符。我需要以某种方式在每个目标词干的目录中收集通配符文件,然后将其作为该书的前提条件。

1 个答案:

答案 0 :(得分:1)

Secondary expansion,也许:

.SECONDEXPANSION:

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

顺便说一句,您是否认为dita文件可以更改,但也可以显示或消失?这可能吗?如果是,您想做什么?而且您已经知道如何检测到这一点吗?