переименовать целевые файлы в GNU Makefile

приведенный ниже make-файл обрабатывает файлы, соответствующие шаблону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

person Alex    schedule 17.09.2014    source источник


Ответы (2)


Заменять:

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. Я могу придумать один способ, но он не так прост, как экранирование, и небезопасен для файлов с пробелами (не то, чтобы это имело большое значение здесь, поскольку make уже не может их обрабатывать).

person Etan Reisner    schedule 17.09.2014

ИМХО, использовать find или подстановочные знаки для перечисления файлов в make-файлах - плохая идея. Это связано с тем, что у разработчиков иногда есть временные или отладочные файлы. Лучше всего указывать файлы явно. Таким образом, это заставляет разработчика думать о своих намерениях.

Если вы согласны перечислять файлы явно, то в этом случае лучше всего перечислять целевые файлы, а не исходные файлы, и вот ваш ответ:

HTML_FILES := html/index.html html/second-page.html

.SECONDEXPANSION:
$(HTML_FILES): html/%.html : $$(wildcard content/*.$$*.md)
    (put recipe here, using $@ and $<)
person Mark Galeck    schedule 17.09.2014