雑記
コンパイルの話:止まらないビルド
最終更新:
匿名ユーザー
-
view
PCの日付には注意しましょう。
あるPCでビルドする際に、別のPCから持ってきたソースファイルをあわせてビルドしようとすると、いつまでたってもビルドが終わらないことがあったりしやがります。
んで、ビルドログを見てみると、どうやらず~~~~~~~~~~~~~~~っと同じところをコンパイル繰り返していたりするのです。
原因は、持ってきたソースファイルを編集したPCの時計が進んでいたから。
種明かしはMakefileにあります。
あるソースファイル、例えば<test.c>とオブジェクトファイル<test.o>がMakefileで以下のように依存関係を持っていたとします。
【例】
【例】
test.o :test.c cc test.c
すると、ビルドするときに<test.c>と<test.o(あるなら)>の日付をチェックして、<test.o>よりも<test.c>のファイルスタンプが新しければ前回コンパイル時から後進されていると判断してコンパイルしてくれます。
そう、ここにからくりがあるのです。
<test.c>が未来の日付だったら・・・?
当然、生成される<test.o>はその時点のタイムスタンプを持ちます。したがって、その時点ですでに<test.c>よりも古いファイルとみなされるわけです。
そういうわけで、再び同じファイルをコンパイルにかかります。あとはこの繰り返し。そのソースファイルが持っているタイムスタンプよりもPCの時計が進むまで、延々コンパイルを繰り返してしまうのです。
「ビルド時間かかるから」なんて、ちょっとコーヒー飲みに行ったりタバコ吸いに行ったりして、リフレッシュして帰ってきたのもつかの間、とてつもない疲労感にかられてしまう罠ともなりえます。
くれぐれも、時計はきちんと合わせましょう。