Использование make для перевода файлов отдыха
-
08-10-2019 - |
Вопрос
У меня есть куча текстовых файлов в help_pages/
Каталог, все отформатирован в покое. Я пытаюсь добавить в мою GNU сделать 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
.
Я потратил весь день, пытаясь узнать внутривенные макияж, но в конце концов я сдался. Вот что я уже имею:
# 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
Команда на основной рецепт сборки, файлы не установлены, если они не существуют в целевом каталоге.
В идеале я хотел бы получить цель, чтобы сделать файлы справки, и ее устанавливать их, и третью (называемую «справку»), которое зависит от этих двух. Я думаю, что это даст мне наибольшую гибкость.
Кто-нибудь может дать мне несколько советов о том, как это достичь?
Ваше здоровье,
Решение
«Я потратил весь день, пытаясь выучить внутривение макиянов, но в конце концов я сдался». Вы не знаете, как это забавно.
Это должно сделать это:
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
находится в столицах.