Использование make для перевода файлов reST
У меня есть куча текстовых файлов в help_pages/
каталог, все отформатированы в reST. Я пытаюсь добавить в мой GNU make Makefile
пара правил, которые:
- Запустите каждый файл в
help_pages
каталог (и подкаталоги) с расширением.rst через приложение, которое выкладывает действительный HTML-файл (сейчас я просто используюrst2html
). - Скопируйте эти выходные HTML-файлы в целевой каталог, воспроизводя структуру каталога, существовавшую в
help_pages
каталог.
Так, например, help_pages/some/dir/foo.rst
будет сначала переведен на help_pages/some/dir/foo.html
, а затем скопировать в public/help/some/dir/foo.html
,
Я провел весь день, пытаясь выучить внутрифреймы Makefiles, но в конце концов я сдался. Вот что у меня уже есть:
# Directory that the .rst files reside in:
HELP_DIR=help_pages
# use 'find' to locate all such files:
HELP_SRCS=$(shell find $(HELP_DIR) -name "*.rst")
# work out what path the intermediate files would be
HELP_TARGETS=$(HELP_SRCS:.rst=.html)
# do the translation.
$(HELP_TARGETS): %.html: %.rst
rst2html $< $@
help: $(HELP_TARGETS)
.phony:
help
Такого рода работы - файлы.rst переводятся в файлы.html, но я понятия не имею, как установить их в конечный целевой каталог. Если я добавлю cp
Команда к основному рецепту сборки, файлы не переустанавливаются, если они не существуют в целевом каталоге.
В идеале я хотел бы, чтобы цель создавала файлы справки, и одну для их установки, и третью (называемую "справкой"), которая зависит от этих двух. Я думаю, что это даст мне наибольшую гибкость.
Кто-нибудь может дать мне несколько советов о том, как этого добиться?
Ура,
2 ответа
"Я провел весь день, пытаясь выучить внутрифреймы Makefiles, но в итоге я сдался". Вы не знаете, как это смешно.
Это должно сделать это:
HELP_DIR=help_pages
# use 'find' to locate all such files:
HELP_SRCS=$(shell find $(HELP_DIR) -name "*.rst")
# work out what path the intermediate files would be
HELP_TARGETS=$(HELP_SRCS:.rst=.html)
# and the destinations
HELP_INSTALL = $(patsubst help_pages%,public%,$(HELP_TARGETS))
# do the translation.
$(HELP_TARGETS): %.html: %.rst
rst2html $< $@
# do the installation
$(HELP_INSTALL):public/%:help_pages/%
cp $< $@
.PHONY: help install
help: $(HELP_TARGETS)
install:$(HELP_INSTALL)
Теперь, если вы хотите сделать все, просто make install
, Или, если вы хотите создать HTML-файлы, не копируя их в public/
, просто make help
, Вы обнаружите, что зависимости работают правильно.
make
имеет "умную" обработку имен путей с разделителями каталогов, что создает огромную боль при написании правил, которые работают в разных каталогах.
Одним из обходных путей является копирование как побочный эффект преобразования, например, добавление чего-либо, что может сработать как вторая команда:
echo $@ | cpio -pdl public/html
КСТАТИ, .PHONY
в столицах.