3

ラテックスファイルがたくさんありますが、それらすべてを便利にコンパイルできるようにしたいと思います。私のmakefileは現在次のとおりです。

targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex))
.PHONY: all

all: $(targets)

.SECONDEXPANSION:
%.pdf: %.tex $$(wildcard $$*_inc/*.*)
    pdflatex $<

このように、インクルードフォルダーが存在する場合、そのフォルダー内のすべてが依存関係として扱われます。

ただし、依存するPythonスクリプトの実行も自動化したいと思います。これらは、プロットの作成または含まれる値の計算である可能性があります。以下の変更を試みました。

targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex))

all: $(targets)
.PHONY: all run_%

.SECONDEXPANSION:
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py))
    pdflatex $<

run_%: %
    $<

ただし、これは私が期待するようには機能しません。私は次のフォルダ構造を持っています。

|
|-Makefile
|-paper.tex
|-paper_inc/
|---a.txt
|---b.py

私はこれが実行されることを期待しb.py、次に実行しますpdflatex paper.tex。ただし、b.pyは実行されません。作成された依存関係を見ると、paper_inc/a.txtpaper_inc/b.pyはの依存関係であることがわかりますがpaper.pdf、そうでrun_paper_inc/b.pyはありません。

うまくいくはずだと感じているので、これの問題が何であるかは完全にはわかりません。また、%.pdfルールとして以下の行も試してみました。

%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(addprefix run_,$$(wildcard $$*_inc/*.py))
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | sed 's/^/run/')
%.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | awk '{print "prefix "$0}')

ただし、これらの各ルールでは、エラーメッセージが表示されますmake: *** No rule to make target 'paper.pdf'. Stop.

このエラーを修正するにはどうすればよいですか、あるいは、代わりに何を使用すればよいmakeですか?

4

1 に答える 1

0

2つの問題があります。

初め:

run_%: %
    $<

マニュアルから:

ターゲットパターンにスラッシュが含まれていない場合(通常は含まれていません)、ファイル名のディレクトリ名は、ターゲットのプレフィックスおよびサフィックスと比較される前にファイル名から削除されます。ファイル名をターゲットパターンと比較した後、ディレクトリ名とそれらを終了するスラッシュが、パターンルールの前提条件パターンから生成された前提条件ファイル名とファイル名に追加されます。

これを理解するのは少し難しいですが、基本的にMakeがビルドしようとするとrun_paper_inc/b.py、に一致するパターンルールを探しますb.py。上記のルールは適合しません。しかし、これはします:

%.py:
    $(subst run_,,$@)

2番:

.SECONDEXPANSION:
%.pdf: ... $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py))
    ...

Makeの大きな欠点の1つは、ワイルドカードの処理が弱いことです。この場合%、パターンルールとpatsubstを同時に使用することはできません。しかし、方法があります:

.SECONDEXPANSION:
%.pdf: ... $$(addprefix run_,$$(wildcard %_inc/*.py))
    ...
于 2013-03-23T16:59:09.287 に答える