【问题标题】:GNU Make: wildcarding files in a stem's directory in a static pattern ruleGNU Make:在静态模式规则中的茎目录中的通配符文件
【发布时间】:2019-04-10 00:03:38
【问题描述】:

搜索了一堆,希望我没有遗漏一些明显的东西......

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

但这完全不起作用,因为静态模式规则不支持通配符。不知何故,我需要在每个目标的词干目录中收集通配符文件,然后将它们作为该书的先决条件。

【问题讨论】:

    标签: makefile gnu-make dita


    【解决方案1】:

    Secondary expansion,也许:

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

    顺便问一下,您是否认为dita 文件可以更改但也可以出现或消失?这可能吗?如果是,你想做什么?您是否已经知道如何检测这一点?

    【讨论】:

    • 是的,这行得通,谢谢!我确实考虑过 DITA 文件的删除方面。幸运的是,*.dita 文件不会在不修改引用文件的情况下消失。如果引用文件也消失了,则重复此操作,直到顶级 *.ditamap 文件被修改(或书被完全删除!)。
    • 为了稍微简化,您可以将$$(dir $$*) 替换为$$(*D)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多