Использование make для перевода файлов reST - PullRequest
0 голосов
/ 09 января 2011

У меня есть куча текстовых файлов в каталоге help_pages/, все отформатированы в reST.Я пытаюсь добавить в свой GNU make Makefile пару правил, которые:

  1. Запускать каждый файл в каталоге help_pages (и его подкаталогах) с расширением '.rst'через приложение, которое выплевывает действительный HTML-файл (сейчас я просто использую rst2html).
  2. Скопируйте эти выходные HTML-файлы в целевой каталог, воспроизводя структуру каталога, существовавшую в help_pagesкаталог.

Так, например, help_pages/some/dir/foo.rst сначала будет переведен в help_pages/some/dir/foo.html, а затем скопирован в public/help/some/dir/foo.html.

Я провел весь день, пытаясь выучитьвнутри Makeciles, но в конце концов я сдался.Вот что у меня уже есть:

# 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 ]

2 голосов
/ 10 января 2011

«Я потратил весь день, пытаясь выучить внутрисредства 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.Вы обнаружите, что зависимости работают правильно.

1 голос
/ 10 января 2011

make имеет "умную" обработку имен путей с разделителями каталогов, что делает огромной болью писать правила, которые делают вещи в разных каталогах.

Одним из обходных путей является копирование в качестве побочного эффекта преобразования, например добавив что-то, это может работать как вторая команда:

echo $@ | cpio -pdl public/html

Кстати, .PHONY в столицах.

...