重命名GNU Makefile中的目标文件

时间:2014-09-17 00:26:30

标签: makefile pattern-matching substitution

下面的makefile处理与模式content/%.md匹配的文件,并输出html目录中的目标。源文件的命名方式是将前导数字放在前面,例如content/01.index.mdcontent/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

2 个答案:

答案 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 $<)