Использование make для перевода файлов reST

У меня есть куча текстовых файлов в 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,

Я провел весь день, пытаясь выучить внутрифреймы 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 в столицах.

Другие вопросы по тегам