2016-08-12 6 views
1

序文:GNUのmake - 別のmakefile内の参照対象

はい、私のmakefileがひどく書かれています。
いいえ、私は書いていませんでした。私たちはこのコードベースを他社から継承しました。
書き換えなくても問題を解決できるかどうかを知りたい。別のメイクファイルからターゲットを参照し、前提条件として、それらを使用する方法は

質問

ありますか?

は、あなたが持っていると言う:

all: libs binary 

binary: # I need to add prereqs here 
    blah 
    blah2 
    blah3 

binaryのために、私はPREREQSなどの他のmakefileにターゲットにする必要があります。
これらのmakefileは同じ変数を定義していて異なる値を定義しているため、これらのmakefile、したがってそれらのターゲットはちょうどincludeできません。それはメイクファイルC:/mk1C:/mk2は、いくつかのトップを介して実行されているのと同じメイクファイルプロジェクトの一部である、はっきりしていない場合は

binary: C:/mk1:foo C:/mk2:bar 
    blah 
    blah2 
    blah3 

UPDATE

のような何かを行うことが可能です理論的にはすべてのmakefileを並行して作ることができます。

+1

短い回答:いいえ。長い答え:はい、しかし、あなたはターゲットを不必要に再構築する可能性があります。それは受け入れられますか? – Beta

+0

@Betaはい。主要な目的はmakefileの最小限の変更であり、明らかに妥協するでしょう。お進みください。 – Adrian

答えて

0

時々再帰的メイク [duhn-duhn-duhnnnn!]仕事のための適切なツールは次のとおりです。

binary: foo bar 
    blah 
    blah2 
    blah3 

.PHONY: foo bar 

foo: 
    $(MAKE) -f mk1 [email protected] 

bar: 
    $(MAKE) -f mk2 [email protected] 

PHONY軍はこれらのルールを実行し、(おそらく)このメイクファイルにはないので、彼らはすでに(存在する場合でもfoobarを再構築するために他のmakefileを呼び出すようにしてください何が前提条件であるかを知っている)。

+0

競合条件について:このmakefileの 'foo'のレシピが実行され、同時に' make 'が 'mk1'ファイルの' foo'を 'make'しているとどうなりますか? – Adrian

+0

@Adrian:再帰的なMakeを並列化しようとするのは賢明ではありません。 – Beta

+0

私は従いません。あなたは '--jobs'を使わないという意味ですか? – Adrian

0

継承されたメイクファイルを組み込むためにinclude makefile(またはsinclude)メカニズムを使用するとどうなりますか?これは、あなた自身のターゲットが異なる名前を持っている限り動作します。

複数の-f makefileオプションを指定してメイクファイルを連結することもできます。それらは順番に連結されています。

+0

しかし、私は約40のmakefileに同じ変数がありますが、異なる値を持っているので、それらを 'インクルードするときには"変数宣言 "\ n"ターゲット "\ n"同じ変数を再整理しました "上記と同じ名前です " – Adrian

+0

後の変数の再宣言は以前のものを上書きしませんか?これらのmakefileの多くは 'all 'のような同じターゲット名を持っているので、私は間違いなくエラーを出すでしょう。 – Adrian

+0

@Adrian同じ変数で、元のmakeプロセスを同時に呼び出すことも、行く。それでは試してはいけません。それらを書き直したくないので、設計通りに使う必要があります。たぶんあなたはスクリプトを書いて、そのスクリプトをレシピでコマンドと呼ぶことができますか?これはミニマリストの観点からは完璧ではないかもしれませんが、洗練されたハックリよりずっと簡単かもしれません。 – Jens