下面的makefile处理与模式content/%.md
匹配的文件,并输出html
目录中的目标。源文件的命名方式是将前导数字放在前面,例如content/01.index.md
或content/O2.second-page.md
等等。我想删除目标文件中的前导0x.
数字序列。例如,content/01.index.html
会生成html/index.html
。
我该怎么做?
由于
MD_FILES = $(shell find content/ -type f -name '*.md')
HTML_FILES = $(patsubst content/%.md, html/%.html, $(MD_FILES))
all: $(HTML_FILES) html/static
html/%.html : content/%.md
mkdir -p $(@D)
python generator/generate.py $< $@
.PHONY: html/static
html/static :
rsync -rupE generator/static html/
.PHONY: clean
clean:
rm -fr html
答案 0 :(得分:0)
替换:
html/%.html : content/%.md
mkdir -p $(@D)
python generator/generate.py $< $@
使用:
html/%.html : content/%.md
mkdir -p $(@D)
file='$(@F)'; python generator/generate.py $< "$(@D)/${file#*.}"
不幸的是,我无法想到在制作本身时这样做的好方法。我可以想到一种方法,但它并不像转义那么简单,对于带有空格的文件来说是不安全的(这里不重要,因为make已经无法处理)。
答案 1 :(得分:0)
恕我直言,使用find
或通配符列出makefile中的文件是个坏主意。这是因为开发人员有时会有临时或调试文件。最好明确列出文件。这样,它就会迫使开发人员考虑他们的意图。
如果您同意明确列出文件,那么在这种情况下最好列出目标文件,而不是源文件,这是您的答案:
HTML_FILES := html/index.html html/second-page.html
.SECONDEXPANSION:
$(HTML_FILES): html/%.html : $$(wildcard content/*.$$*.md)
(put recipe here, using $@ and $<)