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:

  1. 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 usando rst2html).
  2. 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,

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top