首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile Vpath多个源目录

Makefile Vpath多个源目录
EN

Stack Overflow用户
提问于 2013-02-05 16:07:38
回答 1查看 1.8K关注 0票数 0

我有一个目录结构,如

代码语言:javascript
复制
edited/
    Betrayal/
        index.md
    Bloodlines/
        cover.jpg
        index.md
    ...

以及像这样的Makefile

代码语言:javascript
复制
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中提取索引

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-05 22:51:42

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

代码语言:javascript
复制
build/%.epub: edited/%.md
    $(PANDOC) $(PANDOC_OPTS) $< -o $@

build/%.mobi: build/%.epub
    $(EBOOK_CONVERT) $< $@ >/dev/null
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14702740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档