2011-01-09 8 views
0

Ich habe eine Reihe von Textdateien im Verzeichnis help_pages/, alle in ReST formatiert. Ich versuche, mein GNU machen Makefile ein paar Regeln hinzufügen, dass:Verwenden von make, um reST-Dateien zu übersetzen

  1. Run jede Datei im help_pages Verzeichnis (und Unterverzeichnisse) mit der Endung ‚.rst‘ durch eine App, die ein ausspuckt gültige HTML-Datei (im Moment verwende ich nur rst2html).
  2. Kopieren Sie diese HTML-Ausgabedateien in ein Zielverzeichnis und reproduzieren Sie die Verzeichnisstruktur, die im Verzeichnis help_pages vorhanden war.

So würde zum Beispiel help_pages/some/dir/foo.rst zuerst help_pages/some/dir/foo.html übersetzt werden, und dann zu public/help/some/dir/foo.html kopiert.

Ich habe den ganzen Tag versucht, die intracacies von Makefiles zu lernen, aber am Ende gab ich auf. Hier ist, was ich bereits:

# 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 $< [email protected] 

help: $(HELP_TARGETS) 

.phony: 
     help 

Diese Art-Werke - die .rst Dateien werden übersetzt, um Dateien .html, aber ich habe keine Ahnung, wie sie installieren ins Finale, Zielverzeichnis. Wenn ich einen Befehl cp zu dem Hauptbuild-Rezept hinzufüge, werden die Dateien nicht neu installiert, wenn sie in dem Zielverzeichnis nicht vorhanden sind.

Im Idealfall möchte ich, dass ein Ziel die Hilfedateien erstellt, und eines, um sie zu installieren, und ein drittes (genannt "Hilfe"), das von diesen beiden abhängt. Ich denke, das wird mir die größte Flexibilität geben.

Kann mir jemand Tipps geben, wie das geht?

Cheers,

Antwort

2

"Ich habe den ganzen Tag damit verbracht, die Intracies von Makefiles zu lernen, aber am Ende habe ich aufgegeben." Sie wissen nicht, wie lustig das ist.

Dies sollte es tun:

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 $< [email protected]   

# do the installation 
$(HELP_INSTALL):public/%:help_pages/% 
    cp $< [email protected] 

.PHONY: help install 

help: $(HELP_TARGETS) 

install:$(HELP_INSTALL) 

Nun, wenn Sie alles tun wollen, nur make install. Oder wenn Sie die HTML-Dateien erstellen möchten, ohne sie in public/ zu kopieren, nur make help. Sie werden feststellen, dass die Abhängigkeiten ordnungsgemäß funktionieren.

1

make hat „intelligente“ Behandlung von Pfadnamen mit Verzeichnis Separatoren, die es ein königlicher Schmerz machen Regeln zu schreiben, die Dinge über verschiedene Verzeichnisse tun.

Eine Umgehungslösung besteht darin, das Kopieren als Nebeneffekt der Umwandlung durchzuführen, z. etwas diese als zweiter Befehl hinzufügen könnte funktionieren:

echo [email protected] | cpio -pdl public/html 

BTW, .PHONY in Großbuchstaben ist.

Verwandte Themen