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

Makefile 使用make将文件从一个任意目录树处理到另一个目录树,makefile,gnu-make,Makefile,Gnu Make,我想使用make处理任意目录树(源)的内容,并创建另一个与源树具有相同结构的目录树(目标) 源目录树的子目录包含以.md结尾的文件(标记文本)。目标是使用pandoc在目标树中为源树中的每个文件创建一个.html文件 下面来自的代码转换同一棵树中的文件,但我不知道如何修改它,以便将生成的文件放在另一棵树中 markdown := $(shell find . -name '*.md') all: $(patsubst %.md, %.pdf, $(markdown)) %.pdf: %.md

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

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

下面来自的代码转换同一棵树中的文件,但我不知道如何修改它,以便将生成的文件放在另一棵树中

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

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

%.pdf: %.md
    pandoc -o $@ $<
markdown:=$(shell find.-name'*.md')
全部:$(patsubst%.md、%.pdf、$(降价))
%.pdf:%.md
潘多克-o$@$<
我编写了一个脚本,它使用bash实现了所需的功能,但我想使用make实现同样的功能

更新

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

  • 源目录/docs/包含几个(嵌套的)子目录 包含以.md结尾的文件

  • 目标目录/install/HTML/最初不存在,但它已存在 应根据制造过程的需要进行构造

例如,如果修改或添加了文件./docs/info/general/foo.md,则生成过程应在创建目录./install/HTML/info/general/foo.HTML后创建文件./install/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 $@ $<
SOURCE\u DIR:=docs
TARGET_DIR:=安装/HTML
#----获取所有源文件(.md)路径
标记:=$(shell查找$(源目录)-名称'*.md')
#----去除源目录和.md后缀
文件:=$(patsubst$(源目录)/%.md、%、$(标记))
#----创建指向目标.html文件的路径
html:=$(patsubst%,$(TARGET_DIR)/%.html,$(文件))
全部:$(html)
$(目标目录)/%.html:$(源目录)/%.md
@将$<转换为$@
dir=`dirname$@`\
mkdir——父$$dir\
潘多克-o$@$<

您没有给出太多细节,因此我只能建议您:

DESTDIR := newdir

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

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

%.pdf: $(DESTDIR)/%.md
        pandoc -o $@ $<
DESTDIR:=newdir
标记:=$(shell查找。-name'*.md')
全部:$(patsubst%.md、%.pdf、$(降价))
%.pdf:$(DESTDIR)/%.md
潘多克-o$@$<