2012-01-11 14 views
10

私はGNU makeを使用して静的ライブラリのグループを作成しています。そのために暗黙のmakeルールを使用しています。これらのルールはar(1)コマンドを実行してライブラリ/アーカイブを更新します。ビルド中に並列ジョブを実行するために-jオプションを使用すると、プロファイリングによってビルド時間が短縮されることがわかりました。アーカイブファイルの並列ビルドにGNU makeを使用するときの並行性の問題を避けるにはどうすればよいですか?

残念なことに、GNU makeマニュアルには、ar(1)を実行するための並行処理ガードがなく、アーカイブを破損する可能性があります。このマニュアルでは、これが将来修正される可能性があることがさらに分かります。

http://code.google.com/p/ipcmdを使用することです。コマンドを実行する前に基本的にセマフォーロックを行い、アーカイブを構築するar(1)コマンドをシリアル化します。この特定の解決策は、Windows上でmingwベースのクロスコンパイルツールを使用して構築しているため、私にとってはあまり役に立ちません。

この問題の解決方法は簡単ですか?

答えて

2

ではなくインクリメンタルアーカイブを更新しようとするよりも、単一のステップとしてアーカイブを実行します。

libfoo.a: $(OBJS) 
     -rm -f [email protected] 
     $(AR) rc [email protected] $^ 
     $(RANLIB) [email protected] 
+1

私はあなたがアーカイブではなく、objsをranlibする必要があると思います。おそらく$ ^をルール内のオブジェクトファイルに使うこともできます。 – user1143888

2

は、以下のことを試してみてください -

AR := flock make.lock $(AR) 

clean:: 
    rm -f make.lock 

今AR(1)排他ロックを実行しますmake.lockファイルに書き込むことで、ライブラリへのアクセスをシリアライズします。

ranlibコマンドの後にmake.lockファイルを削除するコマンドを追加できます。

export ARを追加して、必要に応じて定義をサブメイクに伝播します。

+0

建設中のアーカイブを集めても意味がありますか?あるいは、 '群れ'は他の方法でアクセスを禁止していますか? –

関連する問題