我有一个像
这样的目录结构edited/
Betrayal/
index.md
Bloodlines/
cover.jpg
index.md
...
和像
这样的MakefilePANDOC := 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方法总是从第一个模块中提取索引
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。
答案 0 :(得分:0)
您可以完全不使用规则模板和foreach
构造。请记住,通配符可以匹配路径的大部分:
build/%.epub: edited/%.md
$(PANDOC) $(PANDOC_OPTS) $< -o $@
build/%.mobi: build/%.epub
$(EBOOK_CONVERT) $< $@ >/dev/null