2016-10-05 2 views
1

make、ant、msbuild、...私が知っているすべてのビルドツールタイムスタンプは、再構築の必要性を判断するためのものです。ビルドシステムはバージョンコントロールを認識できますか?

Gitは、ビルドシステムに指示するために、バージョンをチェックアウトするときにソースファイルのタイムスタンプを 'now'にリセットします。これらのファイルに依存するアーティファクトは再構築する必要があります。しかし

$ git checkout old_version # retrieving [email protected]_version 
$ make # building a.out from a.cpp 
$ git checkout new_version # updating [email protected]_version 
$ git checkout - # resetting [email protected]_version 
$ make # ... 

のみ a.outがOLD_VERSIONで構築されていることを決定することができる作る場合は、no-opのと同等である可能性があります。

これを実現する方法はありますか?このように協力できるビルドシステム/バージョン管理システムについて知っていますか?

+0

'post-checkout'フックが役立つかもしれません。 – ElpieKay

答えて

1

タイムスタンプに対する排他的信頼は、実際にビルドシステムの欠点です。たとえば、次のような場合は失敗します。

  1. 異なるコンパイラフラグセットで再構築したい場合。
  2. ソースとビルド成果物は、非同期クロックによって異なるファイルシステムに存在します。
  3. タイムスタンプは、(あなたの場合と同様に)ビルドプロセスを最適化するために調整されますが、ソースのビューが矛盾するように行われます(つまり、再構築する必要があるものはすべて再構築されません)。

メイク、アリ、MSBuildの、...私の知っているすべてのビルドツールは、再構築の必要性を決定するためにアーチファクト タイムスタンプを比較します。

sconsをご覧ください。他のビルドツールとの大きな違いの1つは、MD5シグネチャを使用したビルド変更の信頼性の高い検出です。これは、MD5のソースとそのターゲットを構築するために使用されたコマンドラインのハッシュを各ターゲットごとに格納することを意味します。ターゲットを再構築する前に、MD5ハッシュを再計算し、再コンパイルが必要かどうかを認識します。もちろん、単にタイムスタンプを見るだけではなく、言及された問題がないよりも遅いです。しかし、sconsは従来のタイムスタンプに対して、オプションの構成可能なサポートを提供しています。

関連する問題