2011-10-17 13 views
0

学習make、次のMakefileで、%.tar.bz2の依存関係をどのようにしてsomefile.tar.bz2と定義できますか?make:依存関係のテキスト関数

それはのようになります。 %.tar.bz2: $(function_to_cut_from_end_till_/ %.tar.bz2) しかし、私はman makeでそれを行う方法を見つけることができませんでした。

私は間違った側からこれに近づいていますか?

source=http://example.net/somefile.tar.bz2 
source:=$(subst :,\:,$(source)) 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "[email protected]" 
+1

などのダウンロードURLを格納するtarget-specific variable、 * '%'プレースホルダは他のものに置き換えられます。2.それを無視しても、 '%.tar.bz2:$(function_to_cut_from_end_till_ /%.tar.bz2)'が便利なこと。あなたが達成しようとしている結果を説明できますか? – slowdog

+0

ちょうどファイル名を取得するためにシェルの代わりにmakeを使いたかったのですが、それは依存関係として置いても意味がありません。私は規則の中で 'notdir'を使います。 私はそれを受け入れることができるように答えとして投稿してもよろしいですか? –

答えて

1

からスラッシュ、あなたはthe notdir function、またはthe $(@D) variableを使用することができます。

実際には、ターゲットファイル名を出力ファイルと一致させる必要があります。makeはファイルの存在を確認でき、実行するたびに新しいファイルをダウンロードしようとはしません。その

source=somefile.tar.bz2 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "http://example.net/[email protected]" 

か、あなたは別の場所からダウンロードして別のソースアーカイブを持っている場合だろう(私はあなたが想像し、そうでない場合は、なぜすべてのテンプレートルールを気に?)、あなたが使用することができますを行うための簡単な方法前1.あなたはパターンルールの前提条件で使用するすべての関数は一度だけ評価され、*:「function_to_cut_from_end_till_は/」が存在し、「notdir」と呼ばれているが、この

source=somefile.tar.bz2 some-other-file.tar.bz2 
somefile.tar.bz2: URL=http://example.net 
some-other-file.tar.bz2: URL=http://example.org/foobar 

.PHONY: download 

download: $(source) 

%.tar.bz2: 
     @wget "$(URL)/[email protected]" 
0

まあ、あまりにも複雑にする理由 - これを行うにははるかに読みやすいではないでしょう、それを行うことが可能かもしれませんが:

domain=http://example.net/ 
filename=somefile.tar.bz2 
source=$(DOMAIN)$(FILENAME) 

はその後、ファイル名が右ありません

を使用するには、また、最後の前方にすべてを削除する必要があり

$(patsubst %/,,$(source)) 

を試みることができます%.tar.bz2ルールのコマンド内のターゲット名のファイル名部分を取得するには$(source)