2011-01-09 2 views
0

J'ai un tas de fichiers texte dans le répertoire help_pages/, tous formatés dans reST. Je suis en train d'ajouter à mon GNU make Makefile quelques règles:Utiliser make pour traduire les fichiers reST

  1. Exécutez chaque fichier dans le répertoire help_pages (et sous-répertoires) avec l'extension « .rst » à travers une application qui recrache une fichier html valide (en ce moment je n'utilise que rst2html).
  2. Copiez ces fichiers html de sortie dans un répertoire cible, en reproduisant la structure de répertoires qui existait dans le répertoire help_pages.

Ainsi, par exemple, help_pages/some/dir/foo.rst faudrait d'abord faire traduire à help_pages/some/dir/foo.html, puis copiés sur public/help/some/dir/foo.html.

J'ai passé toute la journée à essayer d'apprendre les intrications de Makefiles, mais à la fin j'ai abandonné. Voici ce que je l'ai déjà:

# 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 

Ce genre d'œuvres-- les fichiers .rst se traduit .html fichiers, mais je ne sais pas comment les installer dans la finale, le répertoire cible. Si j'ajoute une commande cp à la recette de construction principale, les fichiers ne sont pas réinstallés s'ils n'existent pas dans le répertoire cible.

Idéalement, je voudrais qu'une cible fasse les fichiers d'aide, et un pour les installer, et un troisième (appelé «aide») qui dépend de ces deux. Je pense que cela me donnera la plus grande flexibilité.

Quelqu'un peut-il me donner quelques conseils sur la façon d'y parvenir?

Cheers,

Répondre

2

"J'ai passé toute la journée à essayer d'apprendre les intrications de Makefiles, mais à la fin j'ai abandonné." Vous ne savez pas à quel point c'est drôle.

Cela devrait le faire:

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) 

Maintenant, si vous voulez tout faire, juste make install. Ou si vous voulez créer les fichiers html sans les copier dans public/, juste make help. Vous constaterez que les dépendances fonctionnent correctement.

1

make a un traitement « intelligent » des séparateurs de chemins avec l'annuaire qui en fait une douleur royale d'écrire des règles qui font des choses dans différents répertoires.

Une solution de contournement consiste à effectuer la copie en tant qu'effet secondaire de la conversion, par ex. ajouter quelque chose cela comme une deuxième commande pourrait fonctionner:

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

BTW, .PHONY est en majuscules.

Questions connexes