2016-09-07 4 views
0

Ich versuche, ein Makefile zu erstellen, LaTeX-Dateien in Unterverzeichnissen zu kompilieren. Die gewünschte Verzeichnisstruktur sollte so aussehen, außer dass es anstelle von a, b und c beliebig viele Unterverzeichnisse unter dem latex-Ordner geben kann.Makefile kompilieren veränderte Latex-Dateien im Unterverzeichnis

├── latex 
│   ├── a 
│   │   ├── output 
│   │   │   └── stuff.pdf 
│   │   └── stuff.tex 
│   ├── b 
│   │   ├── blah.tex 
│   │   └── output 
│   │    └── blah.pdf 
│   └── c 
│    ├── asdf.tex 
│    └── output 
│     └── asdf.pdf 
└── makefile 

Ich möchte dies im Latex-Verzeichnis mit nur einem Make-Datei zu tun, die die tex-Dateien in jedem Unterverzeichnis automatisch kompilieren. Meine aktuelle Make-Datei sieht wie folgt aus:

TEX_COMMAND = pdflatex 

TEX_FILES = $(wildcard **/*.tex) 

OUTPUT_DIRECTORIES = $(addsuffix output/,$(wildcard */)) 
PDF_FILES = $(join $(dir $(TEX_FILES)),$(addprefix output/,$(notdir $(TEX_FILES:tex=pdf)))) 

all: mkdir $(PDF_FILES) 

mkdir: 
    @mkdir -p $(OUTPUT_DIRECTORIES) 

$(PDF_FILES): $(TEX_FILES) 
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected])) 
    @$(TEX_COMMAND) -file-line-error -halt-on-error -output-directory $(dir [email protected]) -aux_directory=$(dir [email protected]) $(subst output/,$(notdir $(@:pdf=tex)),$(dir [email protected])) 

clean: 
    @rm -rf $(OUTPUT_DIRECTORIES) 

Dies wird erzeugen korrekt die richtige pdf, aux, log, toc usw. Dateien im Verzeichnis output in jedem Unterverzeichnis. Wenn ich jedoch eine tex-Datei ändere, wird make dazu führen, dass alles neu kompiliert wird.

Ich habe schon viele andere ähnliche Fragen untersucht. Für andere Fragen ist die Anzahl der Unterverzeichnisse bekannt, so dass Sie sie im Makefile fest codieren können. Für diese Situation ändert sich die Anzahl der Unterverzeichnisse im Latex-Ordner ständig und wird hinzugefügt, usw., weshalb ich den Platzhalter verwende, um alle tex-Dateien zu erfassen. Ich würde es vorziehen, kein Makefile für jedes Unterverzeichnis zu erstellen und rekursives make zu verwenden.

+0

Mit GNU Make, können Sie ein Makefile pro Unterverzeichnis erstellen * automatisch * und 'include' es. Sie können auch 'eval()' verwenden. – reinierpost

Antwort

0

Einer der grundlegenden Mängel von Make ist seine grobe Handhabung von Wildcards.

In diesem Fall können Sie secondary expansion verwenden, um eine Musterregel zu schreiben, die das tun, was Sie wollen:

all: mkdir $(PDF_FILES) 

.SECONDEXPANSION: 
%.pdf: $$(subst /output/,/, $$(subst .pdf,.tex, [email protected])) 
    @echo buiding [email protected] from $< 
+0

Was ich getan habe, war eine makefile.template Datei zu erstellen, die das Makefile im latex/Ordner in jedes Unterverzeichnis kopieren und dann rekursiv ausführen würde. Ich denke, das könnte einfacher sein, aber ich werde deine Methode definitiv versuchen. – omgimanerd

Verwandte Themen