この記事は、C++ Advent Calendar 2013 17日目です。


この話は、Boost 1.43.0という伝記に残るバージョンを使っていたときのことです。1.43.0がどれくらい昔のものかというと、解析した結果constexprの文様がごく僅かしか発見できなかったことから、縄文時代がこれから成立していく時期であろうと推測されるというものです。

それはさておき、こういう感じのMakefileを書いていました。

boost: boost_x86 boost_x64
 
boost-32: ……
	./bjam address=model=32 …… > boost-32.log
 
boost-64: ……
	./bjam address=model=64 …… > boost-64.log
 
.PHONY: boost boost-32 boost-64

これをビルドサーバーに放り込むと、不定期にビルドが失敗する事態に遭遇しました。最初は誰も気にしていなかったのですが、これで時間を無意味に消費したくないので、最終的に調査することになりました。

結論を言うと、どうやら2つのbjamの同時実行がいけなかったようです。ログを見ると、なんだかbin.v2配下のディレクトリ(毎回異なる)の作成で失敗していました。しかも、ディレクトリがすでに存在する旨のエラーメッセージが添えられていたのです。これは同時にbjamを走らせているのが悪いと考えるのが自然でしょう。

そのため、次のように直しました。

boost:
	./bjam address=model=32 …… > boost-32.log
	./bjam address=model=64 …… > boost-64.log

もとよりbjamにも-jで並列数を指定していたので、ビルド時間が単純に倍になるということはないはずなのでした。これで一件落着としています。

というわけで、bjamを同時に走らせないほうが良さそうという話でした。なお、現時点で最新のBoost 1.55だとどうであるかは調べていません、あしからず。

スポンサード リンク

この記事のカテゴリ

  • ⇒ bjamを同時に走らせてはいけないようだ