2011-09-15 13 views
2

テーブルが.tblファイルで定義されたカスタムオブジェクトリレーショナルマッピングシステムを使用するC++プロジェクトがあります。これらは、.hと.cppファイルをそれぞれ作成するコードジェネレータを介して実行されます。複数の出力を持つVisual Studioのカスタムビルドルール

<?xml version="1.0" encoding="utf-8"?> 
<VisualStudioToolFile 
    Name="z_dbbld" 
    Version="8.00" 
    > 
    <Rules> 
     <CustomBuildRule 
      Name="z_dbbld" 
      DisplayName="z_dbbld" 
      CommandLine="$(SolutionDir)\tools\z_dbbld $(InputName)" 
      Outputs="$(InputName).cpp" 
      FileExtensions="*.tbl" 
      ExecutionDescription="z_dbbld $(InputName)" 
      > 
      <Properties> 
      </Properties> 
     </CustomBuildRule> 
    </Rules> 
</VisualStudioToolFile> 

問題は依存関係である:

私は、Visual Studio 2008と2010

これはで、このために働いてカスタムビルドルールを取得しようとしているが、私はこれまで、持っているものです。ファイルが存在しないクリーンなチェックアウトでビルドを実行すると、このルールによって生成された.hファイルに対して「ファイルを開くことができません」というエラーが表示されます。

出力を「$(InputName).h」に変更しようとしましたが、まだエラーが発生します。

ここで、コードジェネレータが実行されるときに、これらのファイルが作成されることです。私が再びコンパイルすると、すべてのファイルが最初のパスで作成されたため、エラーは発生しません。しかし、それはきれいな、自動化された、新鮮なチェックアウトからビルドを動作させることはありません。

アイデア?

答えて

0

私は、出力ファイルをビルドの主要部分(http://msdn.microsoft.com/en-us/library/hefydhhy.aspxの最後の文を見てください)に指定する必要があると思います。おそらく最も簡単な方法は、ファイルが存在するときにファイルへの参照を追加し、それらを削除し、codegenのステップが実行されるかどうかを確認することです。

+0

出力ファイルをビルドのメイン部分に追加します。私の問題は、.hと.cppをビルドに追加し、.tblから.hを生成できるというルールがあると、.cppを見つけることができないと不平を言います。それは.tblから.cppを生成することができるというルールでは、.htlを見つけることができないと言います。ルールでラップされたツールは両方を生成しますが、それを伝えるルールを設定する方法を見つけることはできません。 –

+0

'のドキュメントから、複数のファイルをセミコロンで区切ってリストすることができます。 – sblom

0

sblomで与えられた答えは正しいが、理由を説明していない。

ビルドルール(カスタムまたはネイティブ)ごとに、VSビルドシステムは、プロジェクトのどの部分をビルドする必要があるかを決定できるように、入出力の完全なリストを知る必要があります。

ビルドルールは生成された.cppファイルを出力として宣言します。そのため、VSはそれを認識して自動的にこのファイルをビルドします。ヘッダーファイルを省略したので、VSはそれについて知りません。したがって、このヘッダーを含むソースファイルは、どこから取得してビルドに失敗するか分かりません。この状況でビルドを動作させるための回避策は、この.hファイルがあるディレクトリをインクルードパスに追加してから、このファイルを#includeにすることです。基本的には、VSがこのファイルを別の方法で知ることができます。

逆に、ヘッダーファイルを出力として宣言するようにビルドルールを変更した場合、それを含むソースファイルはこのファイルをどこから取得するのかを知るでしょうが、VSは.cppファイルについて知りません。それを構築する。この場合の回避策は、生成された.cppファイルをプロジェクトにソースファイルとして明示的に追加することです。上記の場合と同様に、ビルドシステムに生成されたファイルを認識させるためのトリックを使用しています。

しかし、上記の回避策を実行すると、最良の解決策ではありませんが、ファイルについて知ることができないVSを補うだけであるためです。この問題を解決する最善の方法は、.cppファイルと.hファイルの両方をセミコロンで区切ってルールの出力として宣言することです。これにより、VSは両方のファイルに正しい動作を適用できます。

+0

申し訳ありませんが、これに戻るには時間がかかります。私は別のプロジェクトに引っ張られていた。 .hと.cppの両方を出力ファイルとして指定すると、VSはエラーにはなりませんが、依存関係を正しく接続しているようには見えません。つまり、まだビルドされていない.hファイルが#includeされた.cppファイルをコンパイルしようとします。 –