【问题标题】:Makefile Vpath multiple src DirectoriesMakefile Vpath 多个 src 目录
【发布时间】:2013-02-05 08:07:38
【问题描述】:

我有一个类似的目录结构

edited/
    Betrayal/
        index.md
    Bloodlines/
        cover.jpg
        index.md
    ...

和类似的 Makefile

PANDOC      := pandoc
PANDOC_OPTS := -t epub --smart --toc
EBOOK_CONVERT := ebook-convert

MODULES   := Betrayal Bloodlines Tempest Exile Sacrifice Inferno Fury Revelation Invincible
SRC_DIR   := $(addprefix edited/,$(MODULES))
BUILD_DIR := $(addprefix build/,$(MODULES))

SRC       := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.md))
EPUB      := $(patsubst edited/%.md,build/%.epub,$(SRC))
MOBI      := $(patsubst edited/%.md,build/%.mobi,$(SRC))

vpath %.md $(SRC_DIR)

define make-epub
$1/%.epub: %.md
    $(PANDOC) $(PANDOC_OPTS) $$< -o $$@
endef

define make-mobi
$1/%.mobi: $1/%.epub
    $(EBOOK_CONVERT) $$< $$@ >/dev/null
endef

.PHONY: all epubs mobis checkdirs clean

all: checkdirs mobis

epubs: $(EPUB)

mobis: $(MOBI)

checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    @mkdir -p $@

clean:
    @rm -rfv $(BUILD_DIR)

$(foreach bdir,$(BUILD_DIR),$(eval $(call make-epub,$(bdir))))

$(foreach bdir,$(BUILD_DIR),$(eval $(call make-mobi,$(bdir))))

(我还没有添加条件来测试封面和元数据,也没有添加通过 mutt 发送电子邮件到 kindle,但这是当前问题)

唯一的问题是每个目录都有一个 index.md 并且 VPATH 方法总是会从第一个模块 ex 中提取索引

pandoc -t epub --smart --toc edited/Betrayal/index.md -o build/Betrayal/index.epub
pandoc -t epub --smart --toc edited/Betrayal/index.md -o build/Bloodlines/index.epub
pandoc -t epub --smart --toc edited/Betrayal/index.md -o build/Tempest/index.epub
pandoc -t epub --smart --toc edited/Betrayal/index.md -o build/Exile/index.epub
...

我可以将每个 index.md 重命名为每个文件夹的唯一名称,例如 (for d in *; do echo "$d"; cd "$d"; mv index.md "$d".md; cd ..; done),一切都会正常工作,但我想学习 makefile 语法,并且必须有一种更优雅的方式来处理 src 目录,而无需大量递归生成文件。

【问题讨论】:

    标签: makefile subdirectory


    【解决方案1】:

    您可以完全不使用规则模板和foreach 构造。请记住,通配符可以匹配路径的大部分:

    build/%.epub: edited/%.md
        $(PANDOC) $(PANDOC_OPTS) $< -o $@
    
    build/%.mobi: build/%.epub
        $(EBOOK_CONVERT) $< $@ >/dev/null
    

    【讨论】:

    • 哇。估计我真的是想多了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2012-08-16
    • 2010-09-21
    相关资源
    最近更新 更多