Samba 上で Visual C++ のコンパイルを行うためのパラメータ
KB番号 | J0115 |
最終更新日 | 2003/01/20 |
作成者 | はせがわようすけ |
最終更新者 | たかはしもとのぶ |
対象
この文書は、以下のプロダクトに付いて説明したものです。
- Samba 2.2 系列
- Samba 2.0 系列
説明
皆さんの中には、様々な理由で Samba の共有ディスク上で Visual Studio のプロジェクトをビルド(注1)する羽目(^^;に陥っている方もいらっしゃると思います。
注1: 「プロジェクト」や「ビルド」といってピンとこない方は、マイクロソフト用語を知らないという健康の証です(^_^)。
もちろん、普通の共有上で普通にビルドをすれば、普通に実行ファイルが作れますが、なにか変だと思ったことはないでしょうか?
アウトプットウインドウの「ビルド」タブを良く見ていると、本来コンパイルしなくてもよい筈のソースファイルまでコンパイルしていることがある筈です。とりあえず、以下の2つのパラメータをプロジェクトを置いてある共有の設定に追加してください。
dos filetime resolution = Yes fake directory create times = Yes
これで、問題の現象はなくなり必要なファイルだけがコンパイルされるようになるはずです。
答えを先に出してしまいましたが、以下パラメータのファイルを説明しながら問題の原因を説明しましょう。
時間の最小単位を DOS に合わせる dos filetime resolition
dos filetime resolition = yes にすると、Samba がクライアントに返却するファイルの最終更新時刻が2秒単位になります。従って、例えば12時0分0秒という時間はあっても、12時0分1秒といった時間を返却することはなくなります。
これが何故便利かというと、Visual C++(以下VC) がファイルが更新されたかどうかを調べる時に発行する関数に2秒単位でしか時間を計測できないものがある為です。下の図を見てください。
例えば、Samba の共有上のあるソースファイルが12時0分11秒に更新されたとしましょう。
VC はコンパイルの必要があるかを判断するのに2つの API を発行します。
1つは更新時刻をきちんと返却しますが、もう1つの API は更新時刻を2秒単位に丸め込んでしまいます。このため、VC はファイルが更新されていると判断して本来必要のないファイルを再コンパイルしてしまいます。これはもともと MS-DOS の FAT ファイルシステムの仕様に起因するものです(注2)。
[ファイル] 12:00:01 更新 (API1) (API2) ↓ ↓ 12:00:01 12:00:02 Visual C++
注2: マイクロソフト社の技術情報「JP402160: [NT NTFSからFATへのファイルのコピー時に日時が変わる]」に関連する情報があります。
ディレクトリの更新時刻の仕様の違いに対応する fake directory create times
VC では、コンパイル時にディレクトリの作成時刻を確認して、ディレクトリ中に存在するディレクトリより以前の時刻のファイルを再コンパイルします。
ところで、UNIX に詳しい方はご存知だと思いますが、UNIX には作成時刻という概念がないため、Samba は最終変更時刻(st_ctime)で代用しています。しかし、最終変更時刻はディレクトリ内のファイルが変更される度に更新されてしまう為、VC から見るとディレクトリの作成時刻がディレクトリ内のファイルよりも新しいことになってしまい、ディレクトリ内のファイルが再コンパイルされてしまいます。
これを防ぐために、ディレクトリの作成時刻として常に1980年1月1日午前0時を返却するようにするのがこのオプションです。
まとめ
今回は VC でのコンパイルに便利なパラメータを紹介しました。
Samba にはこうした特定の状態で発生する不具合を解消するためのパラメータが幾つかあります。VC を使わない人にとっては全く無用のパラメータですが、こうしたパラメータの存在によってSamba が「痒いところに手が届く」ようになっている訳です(注3)。
注3: それと同時にパラメータ数が増える一因にもなっているという話はありますね(^^;
この技術情報は「Linux Japan 2001年4月号」の草稿を元に作成されています。