GNU Make:在静态模式规则中的 stem 目录中使用通配符文件
GNU Make: wildcarding files in a stem's directory in a static pattern rule
搜索了一堆,希望我没有遗漏一些明显的东西...
我有多个图书目录。每个都有一个 *.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 目录 inside *.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"
但这完全不起作用,因为静态模式规则不支持通配符。我需要以某种方式在每个目标的主干目录中收集通配符文件,然后将它们作为该书的先决条件。
.SECONDEXPANSION:
$(xhtml_files): %_xhtml/index.html: %.ditamap $$(wildcard $$(dir $$*)/*.dita)
dita -i "$<" -f xhtml -o "$*_xhtml"
顺便问一下,您是否考虑过 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...
以下静态模式规则将重建 XHTML 目录 inside *.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"
但这完全不起作用,因为静态模式规则不支持通配符。我需要以某种方式在每个目标的主干目录中收集通配符文件,然后将它们作为该书的先决条件。
.SECONDEXPANSION:
$(xhtml_files): %_xhtml/index.html: %.ditamap $$(wildcard $$(dir $$*)/*.dita)
dita -i "$<" -f xhtml -o "$*_xhtml"
顺便问一下,您是否考虑过 dita
文件可以更改但也可以出现或消失?这可能吗?如果是,你想做什么?你知道如何检测吗?