2017-02-20 1 views
0

私のMakefileは次のようになります。いくつかのターゲット

MODULES = core models pages admin 
CMXSFILES = $(patsubst %,%.cmxs,$(MODULES)) 

all : $(CMXSFILES) 

core.cmxs : core 
    make -C $< ../[email protected] 

models.cmxs : models core.cmxs 
    make -C $< ../[email protected] 

pages.cmxs : pages core.cmxs models.cmxs 
    make -C $< ../[email protected] 

admin.cmxs : admin core.cmxs models.cmxs 
    make -C $< ../[email protected] 

は、ビルドコマンドが正確であることを考えると、より簡潔な方法で最後の4つのルールを表現する方法ですが同じ?

このような何か:

core.cmxs: core 
models.cmxs: models core.cmxs 
pages.cmxs: pages core.cmxs models.cmxs 
admin.cmxs: admin core.cmxs models.cmxs 
    make -C $< ../[email protected] 

答えて

1

は、再帰的になりを呼び出すときに、あなたがmakeを使うべきではありません注意してください。常に$(MAKE)(または、同じことを好きな場合は${MAKE})を使用してください。

all: $(CMXFILES) 

$(CMXFILES): 
     $(MAKE) -C $< ../[email protected] 

core.cmxs: core 
models.cmxs: models core.cmxs 
pages.cmxs: pages core.cmxs models.cmxs 
admin.cmxs: admin core.cmxs models.cmxs 

をしかし、問題はここにあります

あなたはこれを行うことができます。まず、これらすべてのディレクトリを.PHONYと宣言する必要があります。そうでない場合、期待したときに構築されない可能性があります。あなたは、あなたが物事を簡単にするためにパターンルールを使用することができます(多くはバージョンが明示的なルールに$<を設定しない作るので、あなたは可能性がここにある)作るGNUを使用している場合も:

all: $(CMXFILES) 
.PHONY: $(CMXFILES:%.cmxs=%) 

%.cmxs: % 
     $(MAKE) -C $< ../[email protected] 

models.cmxs: core.cmxs 
pages.cmxs: core.cmxs models.cmxs 
admin.cmxs: core.cmxs models.cmxs 
+0

をああ素敵な、私は」didnの依存関係とルールを個別に指定できることはわかっています。私はディレクトリをPHONYとして置くことについてよく分かりませんが、ディレクトリを依存関係として置くので、少なくとも1つのファイルが変更されたときに、make再コンパイルモジュールが変更されます。私はとにかくそれを撃つだろう。 $(MAKE)のトリックに感謝します! :-) –

+1

ディレクトリのタイムスタンプは、ファイルが変更されても変更されません。これはよくある誤解です。ディレクトリのタイムスタンプは、_directoryの内容が変更されたときに変更されます。ファイルが追加、削除、または名前変更されたときはいつでも...ただし、既存のファイルが更新されたときは変更されません。そのディレクトリ内のファイルを更新するために使用するプロセスによって、常にディレクトリが副作用として変更される可能性があります。エディタは一時ファイルなどを作成します。しかし、既存の 'foo'ファイルに' echo hi >> foo'を使うだけで、ディレクトリの変更時刻は変わりません。 – MadScientist

+0

ありがとうございます。あなたは確かに今まで推測していたように、私はMakefileに慣れていません:D makeが '$(MAKE)-B -C $ <../[email protected] 'を使ってディレクトリを再帰的に通過するように強制するのは良い方法ですか?サブディレクトリの数は比較的少なく、ファイルをどこかに変更するたびに 'make clean && all 'を省くことができれば、そのような小さな時間の損失は気にしません。 –

関連する問題