2017-08-08 19 views
0

私はGNU makeで構築する2つのプロジェクトを持っています。プロジェクトBは、プロジェクトAの出力の1つに依存します。それをOUTPUTとしましょう。だから、プロジェクトBのためのMakefileはこのようなものが含まれます。そのOUTPUTが最新であることを確認するにはGNU makeでプロジェクト間の依存関係を処理する

target: ../ProjectA/OUTPUT 
    do stuff 

を出力した場合、私はB、Aのためのメイクを起動してからのみ、「ものを行う」ことのためにMakefileを希望します再建された(またはすでに目標よりも新しい)。

私が最初にそれをこのようにやってみました:

../ProjectA/OUTPUT: 
    (cd ../ProjectA; $(MAKE) OUTPUT) 

をしかしOUTPUTに指定された依存関係が存在しないので、単にそれが存在する場合、それが最新であることを仮定しますと、サブのmakeを実行しません作ります。

.PHONY: ../ProjectA/OUTPUT 
../ProjectA/OUTPUT: 
    (cd ../ProjectA; $(MAKE) OUTPUT) 

を今OUTPUTに実際の日付を無視して、常にそれがターゲットより新しいと考えて、「ものを行う」を意味します作る:OUTPUTが偽であることを宣言

は、サブmakeが実行されることを保証します常に実行されます。

私が見つけた唯一のことは、BのMakefile内のOUTPUTの依存関係ツリー全体を複製することです。それは熟考するにはあまりにも恐ろしいです。 OUTPUTの依存関係ツリーを、別々のファイルに入れて、両方のプロジェクトのMakefilesに含めることはわずかに恐ろしいことです。

私がしたいことをやり遂げるためのより良い方法はありますか?

+0

、価値は十分読み取ります。http://aegis.sourceforge .net/auug97.pdf –

+0

あなたの依存関係を定義するのに全力を尽くしていないようです。 ProjectAが依存するProjectBの結果が見つかるか、まったく見つからない場合は、再構築しないというメイクの失敗ではありません。プロジェクト管理者が新しいタイムスタンプを取得したい場合は、明示的に指定し、ProjectAとBに依存させるようにします。 – Vroomfondel

答えて

1

偽のターゲットを追加して、他のプロジェクトを作成するレシピを作成して、何もしなくてもそれを作成してから、実際のターゲットを作るために2番目のサブメイクを開始することができます。

.PHONY: all 

all: 
    $(MAKE) -C ../ProjectA OUTPUT 
    $(MAKE) target 

target: ../ProjectA/OUTPUT 
    do stuff 

あまりエレガントではない、非常に効率的な、それはあなたが欲しいものを行う必要があります。

  1. は必ず../ProjectA/OUTPUTを再構築してみてください。
  2. ../ProjectA/OUTPUTが変更された場合は、targetも再構築してください。

あり、別の方法で、よりエレガントかつ効率的であるが、それはかなりあいまいなGNUが機能します使用しています。かなり珍しい方法で、ダブルコロンルール(this section of the manualを参照)、そしてそのために、それは確かに発明されていませんでした:

target: ../ProjectA/OUTPUT 
    do stuff 

../ProjectA/OUTPUT:: 
    $(MAKE) -C ../ProjectA OUTPUT 

したがって、あいまいさが気に入らない場合は、最初のものを優先してください。少なくとも、理解しやすいと誰も確かにタイプミスたこの余分コロンを削除することによってそれを破るんだろう...

0

まあ、私はダブルコロンルールを知りませんでしたが、そのように働いた。ですそれは本当に便利です。

を入手する方法があります。は、少し不明瞭(?)の度に../ProjectA/OUTPUTを再構築しようとします。基本的には、中間の.PHONYターゲットを使用します。

.PHONY: FORCE 
FORCE: ; 

../ProjectA/OUTPUT: FORCE 
    ${MAKE} -C ${@D} ${@F} 

によりFORCEに、OUTPUT古くなっている可能性が実現されますします。レシピが実行され、OUTPUTが実際に更新されたかどうかが確認されます。

(。FWIW私はダブルコロン製剤が好きな私にはたくさんのクリーナーを思われます。)プロジェクト間のmakeでの作業の難しさの古典的なエッセイがあります

関連する問題