我正在尝试为静态页面生成器制作make文件,到目前为止,我一直在使用jinja
和pandoc
,其想法是拥有这样的文件结构>
.
|-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
时,都知道该在哪里“监视”更改,因为现在它指出每个文件都是最新的
-如何正确指出文件对其内容文件的依赖性。
答案 0 :(得分:1)
此规则:
public/%: content/%
什么也不做,因为没有配方delete existing pattern rules的模式规则,它们没有定义新的模式规则。
这很简单,您应该编写两个规则,如下所示:
public/%.htm: content/%.md:
# Pandoc script
pandoc -i $< -o $@
public/%.htm: content/%.htm
# Jinja Script
这里有个提示:每当您编写makefile配方时,发现需要创建一个与完全$@
完全不同,未修改的目标,请立即停止正在执行的操作并备份:转错了方向。