使文件具有多个潜在依赖性

时间:2019-05-05 13:37:06

标签: makefile

我正在尝试为静态页面生成器制作make文件,到目前为止,我一直在使用jinjapandoc,其想法是拥有这样的文件结构

.
|-content
|-public
|-templates
|-Makefile
VPATH=public
TARGETS=$(find content -regex ".*(htm|md)" | sed -e "s/md$/htm/g;s/^content/public/g")

all: $(TARGETS)
   @echo fullbuild

public/%: content/%

content/%.md:
    # Pandoc script 
    pandoc -i $@ -o ${${@:.md=.htm}:content=public}

content/%.htm:
    # Jinja Script

我遇到的问题(至少我认为是这样)是根据我的语法

# For a final result
target: dependency
    commands

# A rule for dependency
dependency: 
    commands

我的依赖项位于content目录中,而我的 targets 位于public目录中,该目录可能存在或可能不存在,并且我生成的几乎所有文件都会htm个文件,在这种情况下,如果目标是public/some/route/to/file.htm,则依赖关系将是这两个content/some/route/to/file.(htm|md)中的任何一个。

我可以通过遍历内容目录并更改扩展名来轻松生成。

我应该如何正确编写规则,所以  -每次执行make时,都知道该在哪里“监视”更改,因为现在它指出每个文件都是最新的  -如何正确指出文件对其内容文件的依赖性。

1 个答案:

答案 0 :(得分:1)

此规则:

public/%: content/%

什么也不做,因为没有配方delete existing pattern rules的模式规则,它们没有定义新的模式规则。

这很简单,您应该编写两个规则,如下所示:

public/%.htm: content/%.md:
        # Pandoc script 
        pandoc -i $< -o $@

public/%.htm: content/%.htm
        # Jinja Script

这里有个提示:每当您编写makefile配方时,发现需要创建一个与完全$@完全不同,未修改的目标,请立即停止正在执行的操作并备份:转错了方向。