2017-07-04 4 views
0

私はmakeで非常に新しいです。私は3つのラテックスファイルを生成するperlスクリプトを持っています。私は、perlスクリプトを実行するメイクファイルを作成し、新しく生成されたtexファイルに対してlualatexを実行したいと考えています。ルールはgnumakeで新しく生成されたファイルに対してコマンドを実行する

make: 
    perl diff.pl 
pdf: 
    make 
    $(eval LIST := $(shell ls *.tex)) 
    lualatex $(LIST).tex 
    make clean 

clean: 
    rm -rf *.log *.aux 

出力:これまでのところ、私は以下の持っている

lualatex FLAT_FLAT_AVDD.tex FLAT_FLAT_VDD.tex FLAT_FLAT_VSS.tex.tex 

をそして、私は唯一の1つのPDF FLAT_FLAT_AVDD.pdfを取得します。 すべてのファイルでlualatexを実行するにはどうしたらいいですか? 私は3つの変数を宣言してmakeを実行できます。しかし、どうすればこれを自動化できますか? makeにループの概念はありますか?ファイル名を「ハードコーディング」することでこれを達成するより良い方法は何ですか?

ありがとうございました。 編集: foreachを組み込みました。 make pdf

make: 
    perl diff.pl 

list: 
    $(eval LIST := $(shell ls *.tex)) 

pdf: 
    make list 
    $(foreach tex,$(LIST),$(lualatex $(tex))) 
    make clean 

clean: 
    rm -rf *.log *.aux 

、その後、私が走ったが、私は、ターミナルで次の出力を得ました。

dedehog01:tislam1:243 > make pdf 
make list 
make[1]: Entering directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
make[1]: `list' is up to date. 
make[1]: Leaving directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
make clean 
make[1]: Entering directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 
rm -rf *.log *.aux 
make[1]: Leaving directory `/home/tislam1/Documents/THESIS/Script_v0.1/BOX_approach/Modified_Layout_mesh/IR_Report_mesh/flat_flat/make' 

答えて

0

各make呼び出しでperlスクリプトを実行したい場合、makeはあまり役に立ちません。シェルスクリプトも同じことができます。しかし、あなたが本当にこのすべてをメイクファイルにしたいのなら、LaTeXソースのリストを事前に知っていなければなりません。

LATEXSOURCES := foo.tex bar.tex ... cuz.tex 
PDFS := $(patsubst %.tex,%.pdf,$(LATEXSOURCES)) 

all: $(PDFS) 

$(LATEXSOURCES): diff.pl 
    perl diff.pl 

$(PDFS): %.pdf: %.tex 
    lualatex $< 

clean: 
    rm -rf *.log *.aux 

しかし、bobbogoが気づいたように、この第2のオプションで、perlスクリプトが実行されるように、何度:そして、あなたはおそらく、すべての依存関係と対応するレシピを表現する、つまり、メイクターゲットの前提条件の理念を堅持すべきですLaTeXのソースファイルがあるためです。

LATEXSOURCES := foo.tex bar.tex ... cuz.tex 
PDFS := $(patsubst %.tex,%.pdf,$(LATEXSOURCES)) 

all: $(PDFS) 

$(LATEXSOURCES): %.tex: diff.pl 
    @echo "Rebuilding $(LATEXSOURCES)" 
    perl diff.pl 

$(PDFS): %.pdf: %.tex 
    lualatex $< 

clean: 
    rm -rf *.log *.aux 

今、私たちは真の解決策があります:不足している唯一の場合は、彼らが最後に建設されたため、perlスクリプトが変更された場合

  • は、LaTeXのソースファイルを再構築し、
  • パターンルールは、この解決します
  • は、すべてのLaTeXソースファイルをビルドするためにperlスクリプトを1回実行します。
  • は、さまざまなファイル間のすべての依存関係を表します。

LaTeXソースファイルが1つしかなく、他のものが最新のものであれば、perlスクリプトが実行され、すべてのLaTeXソースファイルが再構築され、最後の変更が行われます時間が変更されます。欠けているものだけがコンパイルされますが、次のmakeの呼び出しで、他のものも再コンパイルされますが、これは無駄です。中間のLaTeXソースを使用する提案はこれを解決します。

+0

あなたが描いたスケッチは_perl_を複数回実行します。 3つの '.tex'ファイルを作成するために一度だけ実行する必要があります。 – bobbogo

0

あなたが事前に3つの.texファイルの名前を知っていると仮定すると、あなたは無条件に新しいものが実際に古いものと異なる場合にのみ、.texファイルを更新し、perlのを実行することができます。はこの罰金を処理します。

tex := 1.tex 2.tex 3.tex 
intermediates := ${tex:%.tex=%-new.tex}# 1-new.tex 2-new.tex 3-new.tex 
pdfs := ${intermediates:%.tex=%.pdf}# 1-new.pdf etc. 

.PHONY: perl 
perl: ; perl diff.pl 

${intermediates}: %-new.tex: %.tex | perl 
    cmp -s $< [email protected] || mv $< [email protected] 

${pdfs}: %.pdf: %.tex 
    lualatex $< 

.PHONY: all 
all: ${pdfs} 
    : [email protected] Success 

のは、perlは我々が無条件でこの3つのファイルの新しいコピーを生成するPerlを実行1.tex2.tex3.tex

  • を生産するとしましょう。
  • 1-new.tex1.texから更新しますが、は2つのファイルが異なる場合のみ更新します。
  • には、変更されて実行されたファイルがあります。lualatexが必要です。

これは並行して安全です(メークファイルの優れたテストです)。 -j3を実行して、lualatexの3つのコピーを一度に実行してください。あなたは4つのCPUを持っていますか?

+0

これは 'diff.pl'が変更されたときにLaTeXソースを再構築するのではなく、すべてのmake呼び出しで;-)起動します。 –

+0

正しい。毎回LaTeXソースを再構築しますが、ソースファイルが変更されたときにのみpdfを再構築します。私は、lualatexよりperlを動かす方がはるかに速いと思っていました。このスキームは 'diff.pl'に変更が加えられた場合に適用されます。変更がLaTeXに影響を与えない場合、pdfsはすでに最新の状態です。 – bobbogo

関連する問題