使用make将文件从一个任意目录树处理到另一个目录树

时间:2017-05-27 17:05:21

标签: makefile gnu-make

我想使用 make 来处理任意目录树(源)的内容,并创建另一个与源树结构相同的目录树(目标)。

源树的子目录包含以.md(降价文本)结尾的文件。目标是使用pandoc为源树中的每个文件在目标树中创建一个.html文件。

this thread中的以下代码转换同一树中的文件,但我不知道如何修改它,因此它将生成的文件放在另一个树中。

markdown := $(shell find . -name '*.md')

all: $(patsubst %.md, %.pdf, $(markdown))

%.pdf: %.md
    pandoc -o $@ $<

我编写了一个使用bash实现所需功能的脚本,但我想使用make来做同样的事情。

更新

在我的用例中,涉及的目录是。的子目录 当前目录:

  • 源目录./docs/包含多个(嵌套)子目录 包含以.md

  • 结尾的文件
  • 目标目录./install/HTML/最初不存在,但它 应该按照制作过程的要求构建。

例如,如果修改或添加了文件./docs/info/general/foo.md,则make进程应在创建目录后创建文件./install/HTML/info/general/foo.html ./安装/ HTML / info / general /如果它还不存在。

在@MadScientist的帖子之后,我能够构建以下解决方案:

SOURCE_DIR := docs
TARGET_DIR := install/HTML

# ----- Get all source file (.md) paths
markdown := $(shell find $(SOURCE_DIR) -name '*.md')

# ----- Strip the source directory and .md suffix
files := $(patsubst $(SOURCE_DIR)/%.md, %, $(markdown))

# ----- Create paths to the target .html files
html  := $(patsubst %, $(TARGET_DIR)/%.html, $(files))

all: $(html)

$(TARGET_DIR)/%.html: $(SOURCE_DIR)/%.md
    @echo Converting $< into $@
    dir=`dirname $@`; \
    mkdir --parents $$dir; \
    pandoc -o $@ $<

1 个答案:

答案 0 :(得分:0)

你没有提供太多细节,所以我可以建议的是:

DESTDIR := newdir

markdown := $(shell find . -name '*.md')

all: $(patsubst %.md, %.pdf, $(markdown))

%.pdf: $(DESTDIR)/%.md
        pandoc -o $@ $<