2012-04-05 3 views
4

ターゲットがX.pdfであり、プリレクサイトがX/X.texであると仮定して、メイクファイルターゲットのプリクエイトで%記号を再利用する方法を知りたいと思います。詳述するとサブディレクトリ名としてMakefile prerequesiteを再利用パーセント

、私は現在のようなので、メイクファイルを持っている:

all: foo.pdf 

%.pdf: %.tex 
    pdflatex $*.tex 

私はさらにファイルfoo.texを持っている、と私はmakeを入力すると、それはpdflatex foo.texを実行してfoo.pdfを行います。私は制御することはできません様々な理由のために今

は、私のディレクトリ構造が変更されました:

my_dir 
|- Makefile 
|- foo 
    |- foo.tex 
私は、ファイル X/X.texことが X.pdfを作るしようとすると、それが見えるように、私のMakefileを修正したいと思います

私は(私は入れてみましたfoo/foo.texを探すために、それを伝えるために '%/%をTEX。')以下を試してみました:

all: foo.pdf 

%.pdf: %/%.tex 
    pdflatex $*/$*.tex 

しかし、この利回り:

No rule to make target `foo.pdf', needed by `all'. Stop. 

がそう%.pdf: $*/$*.tex

私はfoo/%.tex%/%.texを変更した場合は期待どおりに動作しますが、将来的には、私はall: foo.pdf bar.pdfをやると、それはfoo/foo.texbar/bar.texを探す必要がありますので、私は、そこにハードコードfooにしたくありません。

私はMakefile(自分のニーズに他の人を変更することに限られています)にはかなり新しく、誰かが私に助けとなるポインタを与えることができるなら絶対的に基本的なものを行ったことはありません有望なものは%$*だったが、私はうまく動作しなかった。)

+0

これは、これよりも困難です。ワイルドカードを扱うことは、Makeが著しく悪いことの一つです。それはできますが、それは醜いので、@ wisentの解決策があなたの目的には十分であれば、おそらくそれに付随するべきです。 – Beta

答えて

2

VPATHを使用して検索するディレクトリのリストを指定できます。

模範的なメイクファイル:

# Find all tex files 
tex := $(shell find -iname '*.tex') 

# Make targets out of them 
PDFS := $(notdir $(tex:%.tex=%.pdf)) 
# specify search folder 
VPATH := $(dir $(tex)) 

all : $(PDFS) 

%.pdf : %.tex 
     pdflatex $< 

またはより良いはVPATH(小文字)を使用することです:

vpath %.tex $(dir $(tex)) 

それだけでこれらのディレクトリ内の.texファイルを探します。

+0

'foo.tex'ではなく' foo/foo.tex'があれば十分です。 '。/ foo.tex'や' bar/baz/foo.tex'があると、問題が発生します。 – Beta

+0

幸運にも、私はその問題を抱えません(私の%.texはすべて%フォルダ内にあることが保証されています)。これは私の目的のために働いています(Makefileの前提条件で '$ *'などを使うことができないことに驚いていましたが、私の困難はMakefileの初心者によるものだと思いました)。乾杯! –

+1

十分に新しいバージョンのGNU makeを持っている '$ *' IFF(a)を使うことができます。SECONDEXPANSIONの特別なターゲットであり、(c)それらを '$$ *'としてエスケープします。セカンダリ展開のドキュメントについては、GNU makeマニュアルを参照してください。 @MadScientist; – MadScientist

関連する問題