2013-02-05 113 views
0

我有這樣生成文件VPATH多個SRC目錄

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

的目錄結構和生成文件等

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 [email protected] 
endef 

define make-mobi 
$1/%.mobi: $1/%.epub 
    $(EBOOK_CONVERT) $$< [email protected] >/dev/null 
endef 

.PHONY: all epubs mobis checkdirs clean 

all: checkdirs mobis 

epubs: $(EPUB) 

mobis: $(MOBI) 

checkdirs: $(BUILD_DIR) 

$(BUILD_DIR): 
    @mkdir -p [email protected] 

clean: 
    @rm -rfv $(BUILD_DIR) 

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

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

(我還沒有添加條件語句以測試一個蓋和元數據或通過電子郵件發送加入通過mutt點燃,但這裏來的當前問題)

唯一的問題是如何每個目錄有一個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

您可以不用規則模板和foreach構造。請記住,通配符可以匹配大部分路徑:

build/%.epub: edited/%.md 
    $(PANDOC) $(PANDOC_OPTS) $< -o [email protected] 

build/%.mobi: build/%.epub 
    $(EBOOK_CONVERT) $< [email protected] >/dev/null 
+0

哇。猜猜我真的在推翻它。謝謝 – roguesith

相關問題