2017-05-22 22 views
0

makefileには、すべてのオブジェクトとライブラリファイルをリンクして実行可能ファイル(.elfファイル)を作成するレシピが1つあります。副作用として、このステップは、マップファイルとIntelの.hexファイルを生成します:複数のターゲットを作成するレシピ

$(ELF_FILE) : <list of dependencies here> 
    <linker command line> 

今まで、私たちは実際に今までに別のターゲットのいずれかに依存$(MAP_FILE)または$(HEX_FILE)ターゲットを、持っていなかったので、 $(ELF_FILE)のサイドプロダクトは、そのターゲットのレシピが$(ELF_FILE)にアクセスしたくないとしても、単にそれが$(ELF_FILE)に依存すると宣言しました。例えば:この新しい発見の知識を用いて

$(MAP_FILE) $(HEX_FILE) $(ELF_FILE) : <list of dependencies here> 
    <linker command line> 

、我々は取り除くことができ考え出し:

# Target that needs map-file, which is a side product of the $(ELF_FILE) target. 
$(TARGET_THAT_NEEDS_MAP_FILE) : $(ELF_FILE) 
    <build-recipe> 

# Target that needs hex-file, which is also a side product of the $(ELF_FILE) target. 
$(TARGET_THAT_NEEDS_HEX_FILE) : $(ELF_FILE) 
    <build-recipe> 

我々はそうは次のようにレシピは、複数のターゲットのために使用することができることが最近判明しています

$(TARGET_THAT_NEEDS_MAP_FILE) : $(MAP_FILE) 
    <build-recipe> 

$(TARGET_THAT_NEEDS_HEX_FILE) : $(HEX_FILE) 
    <build-recipe> 

これらの変更を実装した、我々は今、私たちはどちらかの目を誤解してきたことを疑うになり奇妙な効果を観察する:「ハック」とだけ直接各ターゲットの直接の依存関係を述べる上記のmakeという複数ターゲットのレシピ機能であるか、正しく使用されていません。奇妙な効果は、.elf、.map、および.hexファイルを生成するレシピが2回実行されるように見えることです。これは直ちに問題を引き起こしたようではありませんが、ここでは何かが怪しいことを示すようです。だから私の質問は、私たちの新しいアプローチはまったく機能するのだろうか、私は上記のハックに固執すべきか?

編集:私たちはmakeをマルチスレッド方式(つまり-jを使用)で実行しています。

答えて

1

$(MAP_FILE)$(HEX_FILE)または$(ELF_FILE)であれば、レシピが別のターゲットも更新することは知られていないため、レシピも開始されることがあります。。それは同じだ場合は、-jオプションを使用している場合にのみ起こるでしょう。もちろん、

、(あなたがなしで試して可能性を持っていたのか?)

は説明するために:ここで

$(TARGET): $(ELF_FILE) $(MAP_FILE) 
    <update target> 

を作ります$(ELF_FILE)$(MAP_FILE)を更新し、レシピを2回発射しようとします。 (ターゲットが1回の実行で更新され、それらの間にボトルネックがない限り、依存関係が異なるターゲットにある場合も同様です。作るこれは同じレシピであることを知ることができるかもしれません。このanswerがあなたに使用であるかもしれない

======。 は、具体的に:複数のターゲットGNUとの暗黙のルールのため、不思議

%.foo %.bar %.baz : %.boz ; $(BUILDIT) 

:あなたの出力ファイルと入力ファイルを共有し、共通の基盤場合

しかし、 次のようなパターンルールを書くことができますmakeは とすれば、レシピを一回呼び出すだけですべてのターゲットが構築され、あなたが望むのと同じように動作します。

マッドサイエンティスト

それはメイクマニュアルのその部分を指し:

パターンルールは複数のターゲットを有することができます。通常のルールとは異なり、この は同じ前提条件を持つ多くの異なるルールと レシピを実行しません。パターンルールに複数のターゲットがある場合、makeは ルールのレシピがすべてのターゲットを作成する責任があることを認識します。レシピ は、すべてのターゲットを作成するために1回だけ実行されます。 パターンルールをターゲットと一致するように検索する場合、ルールのターゲットパターンと一致するパターン以外のルールのターゲットパターンは、付随的です。 現在、レシピと前提条件をファイルに与えることについてのみ心配しています 問題のただし、このファイルのレシピが実行されると、他のターゲットの は更新されたものとしてマークされます。

+1

このメッセージの冒頭にあるあなたのコメントは正しくありません。 'foo:bar baz'のようなルールは、すべての前提条件が構築された後、そのレシピを1回実行します。各前提条件は、それが前提条件として何回表示されても、1回構築されます。問題は、これは 'foo fab:bar baz'が実際に_TWO_ルールを定義していることです。これは、makeの観点から、 'foo:bar baz'と' fab:bar baz'を別々に書くことと同じです。これは明示的なルールにのみ当てはまります。メッセージの2番目の部分に表示されるパターンルールは、別の方法で処理されます。 – MadScientist

+1

私の定式化はあまり明確ではありませんでした。つまり、ルールは「foo:bar baz」、「bar baz:fab」(実際は2つのルール)、2番目のルール生成バー、効果は、バーのレシピが既に起動されているが、まだ終了していないことを知らずに、bazを再構築しようとする可能性があります(これはparrallelビルドのコンテキストでのみ発生します)。それは可能でしょうか? – VannTen

+1

はい、それは実際にはかなり可能性があります。 – MadScientist

関連する問題