2016-09-07 7 views
0

LaTeXファイルをサブディレクトリにコンパイルするためにmakefileを作成しようとしています。希望するディレクトリ構造は、a、b、cの代わりにlatexフォルダの下にいくつでもサブディレクトリが存在することを除けば、このようになります。makefileサブディレクトリに変更されたlatexファイルをコンパイルします

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

これは、すべてのサブディレクトリ内のtexファイルを自動的にコンパイルするlatexディレクトリ内の1つのメイクファイルで行います。 私の現在のメイクファイルは、次のようになります。

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) 

これは正しくなど、各サブディレクトリ内のoutputディレクトリ内のファイルを適切pdfauxlogtocを生成します。しかし、1つのtexファイルを変更すると、makeはすべてのファイルを再コンパイルします。

私は既に他の多くの同様の質問を検討しています。他の質問については、サブディレクトリの数が分かっているので、それらをmakefileにハードコードすることができます。このような状況では、latexフォルダ内のサブディレクトリの数が常に変化していて、etcに追加されています。そのため、ワイルドカードを使ってすべてのtexファイルを取得しています。私は、サブディレクトリごとにメイクファイルを作成する必要はなく、再帰的なmakeを使用する方が好きです。

+0

GNU Makeを使用すると、*自動的に*サブディレクトリごとのMakefileを作成し 'それをinclude'することができます。 'eval()'を使うこともできます。 – reinierpost

答えて

0

Makeの根本的な欠点の1つは、ワイルドカードの粗い取り扱いです。この場合

、あなたがやりたいだろうパターンルールを記述するためにsecondary expansionを使用することができます。

all: mkdir $(PDF_FILES) 

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

私がやったことは、makefile.templateファイルを作成して、latex /フォルダ内のmakefileが各サブディレクトリにコピーして再帰的に実行することでした。私はそれがより簡単かもしれないと思いますが、私は間違いなくあなたのメソッドを試してみます。 – omgimanerd

関連する問題