2011-05-18 13 views
7

root in a directory layoutに​​3210と表示されているウィジェットがいくつかあります。メイクファイルの依存関係を見つける

私がここに持っているGNUmakefileはそれらをビルドすることができます。フォルダを更新しても、依存関係は追跡されません。明らかにきれいなターゲットに依存したくないので、どのように各フォルダの内容を追跡するのですか?

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $$wgtdir`.wgt; done) 
all: $(WGTS) 
%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
clean: 
    rm -f $(WGTS) 

私のようなものを望んだ:

%.wgt: $(shell find $* -type f) 

は動作しますが、それはしません。 Help

+0

だから、 'foo.wgt'が' foo/'のすべてに頼るようにしたいですか? – Beta

+0

そうです... – hendry

答えて

4

鉱山でBeta's ideaを組み合わせる:

 
WGTS := $(shell find -name config.xml) 
WGTS := $(WGTS:/config.xml=.wgt) 
WGTS_d := $(WGTS:.wgt=.wgt.d) 

all: $(WGTS) 
clean: 
    rm -f $(WGTS) $(WGTS_d) 

-include $(WGTS_d) 

define WGT_RULE 
$(1): $(shell find $(1:.wgt=)) 
$(1:.wgt=)/%: 
    @ 
endef 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 
%.wgt: 
    @echo Creating [email protected] 
    @(echo -n "[email protected]: "; find $* -type f | tr '\n' ' ') > [email protected] 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 

例:

 
$ mkdir -p foo bar/nested 
$ touch {foo,bar/nested}/config.xml 
$ make 
Creating bar/nested.wgt 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 
$ touch foo/a 
$ make 
Creating foo.wgt 
$ rm foo/a 
$ make 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 

ここでの唯一の潜在的な問題は、それが構築する方法を知っていないターゲットを無視することができますダミールールですそれらはディレクトリ内にネストされています。 (私の例ではfoo/aです。)それらがビルド方法を知る必要のある実際のターゲットである場合、重複したレシピ定義が問題になる可能性があります。

+0

私は、追加された新しいファイルについて説明する必要があります。それは私にはうんざりのように見えます。 config.xml内にconfig.xmlのケースはありません。 :) – hendry

+0

@hendry:依存関係ファイルを書き出すことで、すべての情報を再生成することなく後続の実行に単純に含めることができます。ほとんどの場合、うまく動作します(ヘッダーにCソースの依存関係を生成するためによく使用されます)。ファイルシステムの状態だけに依存するターゲットを持つファイルを追加することはできません。 –

+0

@thomasこのMakefileはファイルを追加するだけでなくファイルを削除することもできますが、任意のディレクトリ構造のアカウントに変更することはできません。私のウィジェットはhttp://tests.wacapps.net/?p=wac2tests;a=ブロブ; f =サンプル/メイクファイル;私たちがhttp://www.gnu.org/s/hello/manual/make/Secondary-Expansion.htmlを理解していれば、答えは – hendry

1

は、おそらくこれを行うための最善の方法は、事前に、明示的に前提条件のリストを作成することです:

define WGT_RULE 
$(1).wgt: $(wildcard $(1)/*) 
endef 

$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

(良いプログラマは警戒します句)非常に巧妙だ別の方法があります。数年前、私はディレクトリを前提条件として扱うための左利きのkludgeを考え出しました。上記が十分でない場合は、私が古いノートブックを掘ることができるかどうかがわかります。

編集:
申し訳ありませんが、サブディレクトリは考慮しませんでした。ここでは、トリックを行うべき完全なmakefile(私はcleanルールを省いた)です。

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $\ 
$wgtdir`.wgt; done) 
all: $(WGTS) 

# This constructs a rule without commands ("foo.wgt: foo/bar.txt foo/baz.dat..."). 
define WGT_RULE 
$(1).wgt: $(shell find $(1)) 
endef 

# This invokes the above to create a rule for each widget. 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
+0

私はちょうどサブディレクトリに新しいファイルを作成しようとしましたが、メークファイルはそれを受け取っていませんでした。このWGT_RULを避ける方法はありますか?少し不必要なようですが、私は '%.wgt:'の権利を好むでしょう。 – hendry

+0

これは機能しません: 'hendry @ x201 foo './bar.wgt ':そのようなファイルやディレクトリはありません 作成さbar.wgt ヘンドリー@ X201のfoo $作る$は、mkdirバー ヘンドリー@ X201のfoo $タッチバー/ config.xmlに ヘンドリー@ X201のfoo $ 検索します メイク:すべての 'のために行われることは何も ' ヘンドリー@ X201のfoo $ VIMのMakefileの ヘンドリー@ X201のfoo $タッチバー/ fooの ヘンドリー@ X201のfoo $ メイク作る:すべての'のためにやるべきことは何も'。 hendry @ x201 foo $ ' – hendry

関連する問題