Usando make per tradurre i file riposo
-
08-10-2019 - |
Domanda
Ho un sacco di file di testo nella directory help_pages/
, tutti formattati in riposo. Sto cercando di aggiungere alla mia GNU make Makefile
un paio di regole che:
- Esegui ogni file nella directory
help_pages
(e sub-directory) con l'estensione '.rst' attraverso un app che sputa fuori un file HTML valido (in questo momento sto solo usandorst2html
). - Copiare i file html di output a una directory di destinazione, che riproduce la struttura di directory che esisteva nella directory
help_pages
.
Quindi, per esempio, help_pages/some/dir/foo.rst
dovrebbe prima ottenere tradotto in help_pages/some/dir/foo.html
, e poi copiato public/help/some/dir/foo.html
.
ho passato tutto il giorno cercando di imparare le intracacies di Makefile, ma alla fine ho rinunciato. Ecco quello che ho già:
# 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
Questo tipo-di opere - i file vengono .rst tradotto in file HTML, ma non ho idea di come installarli nella directory finale, di destinazione. Se posso aggiungere un comando cp
alla ricetta principale di compilazione, i file non sono ri-installato se non esistono nella directory di destinazione.
Idealmente mi piacerebbe un obiettivo di rendere i file di aiuto, e uno per installarli, e un terzo (denominato 'aiuto') che dipende da questi due. Penso che questo mi darà la massima flessibilità.
qualcuno può darmi alcuni consigli su come raggiungere questo obiettivo?
Saluti,
Soluzione
"Ho passato tutto il giorno cercando di imparare le intracacies di Makefile, ma alla fine ho rinunciato." Tu non sai quanto divertente che sia.
Questo dovrebbe farlo:
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)
Ora, se si vuole fare tutto, basta make install
. Oppure, se si desidera creare i file HTML senza copiarle in public/
, appena make help
. Troverete che le dipendenze funzionino correttamente.
Altri suggerimenti
make
ha trattamento "intelligente" dei percorsi con separatori di directory che lo rende un dolore reale a regole di scrittura che fanno cose attraverso diverse directory.
Una soluzione è fare la copia come effetto collaterale della conversione, ad esempio l'aggiunta di qualcosa di questo come una seconda opera di comando potenza:
echo $@ | cpio -pdl public/html
A proposito, .PHONY
è in maiuscolo.