Вопрос

У меня есть куча текстовых файлов в help_pages/ Каталог, все отформатирован в покое. Я пытаюсь добавить в мою GNU сделать 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.

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

# 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 находится в столицах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top