2011-10-28 10 views
10

コメント(または空白)の変更が無視されるようにビルドチェーンを設定できますか?たとえば、ヘッダーファイルのコメントが変更されたときは、それを含むすべてのソースファイルが完全に不要な場合でも、再コンパイルされます。コメントの変更を無視するようにC++ビルドセットアップ

変更されたファイルからコメントを削除してプリプロセッサを終了すると、ビルドチェーンは最初に出力が実際に変更されたかどうかを確認できます。そうでない場合、ファイル自体が変更されなかったかのように動作するはずです。

私はVisual Studio 2010 btwを使用しています。

編集:@MikeSeymour、VSのcl.exeには最小の再構築のためのスイッチ/ Gmがあります。それは十分に文書化されていませんが、私はそれがちょっと私が求めていることをすると思います。 複数のコアを使用する場合は/ MPスイッチと互換性がありません。私のデュアルコア(ハイパースレッディング付き)では、/ Gmは平均4単位のうち〜3のコンパイルをスキップする必要があります。これが疑わしいと思うのですが、/ Gmが価値があるかどうかを評価する方法さえもわかりません。

+2

興味深い。基本的には、ターゲットを処理し、結果を既存のファイルと比較し、同じであれば上書きしない拡張ビルドシステムが必要です。次に、前処理ステージを別のターゲットに分けることで、それを組み合わせることになります。素敵な機能でしょうか? –

+1

私はVisual Studioがとにかくそれをやっているという曖昧な考え方をしています。私は "irrelavent changesを無視する"のようなメッセージを出すことを覚えていると思います。私は間違っている可能性があります。他のビルド・プラットフォームでは、[ccache](http://ccache.samba.org/)で必要なものを正確に行うことができます。 –

+0

@MikeSeymour:ccache _does not_はコメント外の空白の変更の再コンパイルを防ぎます。(そしてまさにIMO) – sehe

答えて

0

どのようにコンパイラがそれは、そのファイルをコンパイルするまで、あなたはファイルに加えた変更のみが、コメントにあったことを知ることができますか?

結果のバイナリが同じであっても、従属ファイルが変更されたため、その後のファイルを再コンパイルする必要があります。

+2

OPは、.hppファイルのコメントを変更すると、何百もの.cppファイルがヘッダに関連する変更を加えずに再コンパイルされる可能性があります。はい、変更があるかどうかを調べるには.hppを再度調べる必要がありますが、関連する変更が検出されなかった場合は、それらの.cppがすべて再コンパイルされるのを防ぐことができます。これが不可能な唯一の時間は、あなたが '/ *'で.hppを終わらせ、includeファイルに '* /'を置くような珍しいことをする時です。 (あなたもそうすることはできません!) – tenfour

+0

前処理だけでコンパイルしないでコメントの変更を無視することは可能です。それは[ccache](http://ccache.samba.org/)の機能です。私はVisual Studioが似たようなことをしているというあいまいな考え方をしています(「無関係な変更を無視する」という行に沿ってメッセージを出力することもあります)。 –

0

多くの相互依存関係を避けるための手法はたくさんあります。前方宣言を試してください。

フォワード宣言を使用すると、コードを実際に使用するコードをコンパイルするだけで済みます。スコット・マイヤーズの本はもっと教えてくれます。この件に関しては数少ないページがあります。

+2

質問には一切答えないので、コメントとしてはもっと適しているかもしれません。 –

+0

クリスチャン - 1つのファイルを変更するには、他のファイルをまとめてコンパイルする必要があることを暗示していたと私は推測していました。 –

+4

多分、実際の質問は、とにかく全く異なる性質のものです。確かに前方宣言は良い考えですが、彼の質問に対する答えではありません。 –

2

はい。ある述語が真であれば、ビルド・イベントを起動させるビルド・システムが必要です。あなたが望むのは、 "このファイルは意味的に面白いやり方で変わった"という述語です。

ソースコードの構造の深い知識(例えば、生産パーサー)を使用して、ソースコードファイルを比較するツール群の形式で、そのような述語の良好な近似が存在する。特に、SmartDifferencerは、言語構造(識別子、ステートメント、宣言、ブロックなど)や妥当な編集アクション(ブロックの挿入、置換、削除、移動、名前の変更、名前の変更など)の変更に関してソースコードの変更を表示します。 )。レイアウトやコメントには興味はありません(あなたが強制されない限り)。したがって、SmartDifferencerに、ソースコードファイルがコメントや空白以外のものを変更したかどうかを知ることは非常に簡単です。 SmartDifferencerは多種多様な言語に対応しています。

今、ビルドシステムをどのように連携させるのですか? Unix述部でトリガーを作成しますが、この種のトリガーは作成しません。実際には、対象と比較したファイル日付の最新性に基づいてエンティティのイベントを作成するトリガーです。 SmartDifferencerで興味深い違いが見られる場合は、このファイルを作成して、 "changed_signal"ファイルに依存させることで、これを偽造することができます。

+0

ニース、それは私が求めていたもの以上です。あまりにも多すぎるかもしれません。空の行を挿入するだけを想像してみてください。デバッガは、その行に続くすべてのブレークポイントが1つずれていることをどのように知っていると思いますか? このSmartDifferencerをVS 2010と統合することは可能ですか? –

+0

デバッガの場合、かなり簡単です。初期ファイルの行番号に対するブレークポイントのマッピングがあります。任意の行を挿入します。 IDEは「N行をレガシー行Mに挿入しました」という表を作成します。現在のレガシブレークポイントの行番号は、現代の行番号にマップできます。 IDEがこのテーブルを長期にわたって追跡できるかどうかは別の問題ですが、私はMS Visual Studioにかなり感心しています。 IDEの呼び出し全体でどれくらいうまく動作しているか覚えていない。 –

+0

「SmartDifferencerはVSStudioに統合されていますか...」ということはよくわかりませんが、私たちはそのステップに慣れていません。これは、コマンドラインから呼び出すことができ、エラーステータスコードを返すツールです。私はVSStudioがあなたにそのようなツールを実行させると信じています。あなたが記述した方法でビルドプロセスにそれを挿入できるかどうか...私は、MSVisual Studioが最近のビルドステップを実際どのように管理しているかを見たことはありません。前提の下では、メイクファイル(MSはNMakeと呼ばれるものをプッシュするのに使用しなかった)のようなものです。可能でなければならないようです。 –