C++Builder の不具合分析

コマンドラインから MSBuild で Win64 向けにプロジェクトをビルドすると、いつもプリコンパイル ヘッダーで参照したファイルが更新されたというエラーになる件について調べてみた。

まず Win64 向けの BCC64 は CLang ベースであるのはわかっているので、CLang のプリコンパイル済みヘッダーのフォーマットを調査して、llvm-bcanalyzer というツールで内容のダンプができることを確認した。

次に正常にビルドできる IDE で生成したプリコンパイル済みヘッダーと MSBuild で生成したものを GNU/Linux にコピーして llvm-bcanalyzer で内容を比較した。ファイルが更新されたというエラーが出ることから、そのファイル名を手がかりにタイムスタンプを探したところでビンゴ。MSBuild で生成したものは 1970 年 1 月 1 日 00:00 UTC からの秒数で正しく記録されているのに対し、IDE で生成したものは 1970 年 1 月 1 日 00:00 JST からの秒数になっていることが判明した。BCC64 は後者を期待していて、前者だと数値が大きくなるのでファイル更新と誤認する模様である。これが原因なら米国では (タイムスタンプの大小が逆転するので) 再現しないのも説明できる。

以上のように調査したので修正してほしいなあ。