1

単純なシェルスクリプトでデフォルトのVisual Studio C++コンパイラをオーバーライドしたいと思います。私が望むのは、ファイル名などの引数を取り込み、いくつかの統計を作成することです。しかし、私はコンパイルプロセスを完全にオーバーライドしたい、つまり私は自分のシェルスクリプトから元のコンパイルを呼び出したいと思う。Visual Studio 2017コミュニティのコンパイルコマンドをオーバーライドする方法

私は見つけましたが、プロジェクト内で実行されるプレビルドスクリプトとビルド後スクリプトをどうやって作成するかしかわかりませんでした。それは私が望むものではありません。

これをグローバルに変更したいと考えています。どうしたらいいですか?

+1

cl.exeファイルを見つけ、それを自分のファイルに置き換え、引数を記録します。オプションで元のcl.exeを引数で呼び出します。 –

+0

具体的にしてください。議論を取り、統計を作成したいとします。また、スクリプトでコンパイラをオーバーライドしたいとします。それら2つは相互に排他的ではありません。後者は最初の問題の唯一の解決策ではなく、私はあなたが本当に最初の問題を解決したいと思っていますか? – stijn

+0

@stijn私は質問を熱狂させた。私は本当にコンパイルを無効にしたい。議論を取り込むことは、私が成功すれば、私がすることができる多くの事の一つに過ぎません。 –

答えて

2

標準のC++プロジェクトファイルのコンパイルは、ClCompileという名前のMsBuild Targetを呼び出すことによって行われます。実際のC++ソースファイルの一覧を表示するClCompileという名前のMsBuild Itemもあります。これは、テキストエディタで.vcxprojを開くと簡単に表示されます。その結果、このClCompile ItemはClCompile Targetで使用され、CLTaskに渡され、実際のコンパイラ実行可能ファイルであるcl.exeが呼び出されます。このコードは、C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Communityの64ビットマシンにVS2017コミュニティのデフォルトインストール用に使用するツールセットのMicrosoft.CppCommon.targetsファイルにあります\ Common7 \ IDE \ VC \ VCTargets \ Microsoft.CppCommon.targetsをクリックします。

これらのうち3つはカスタムバージョンで上書きすることができますが、ディスク上のcl.exeを置き換えるだけでよいと考えているので、これは最善の方法ではありません。

しかし、CLはCLToolExeとCLToolPath propertiesをオーバーライドするだけで実行可能ファイルを使用できます。実際に:行がMicrosoft.Cpp.targetsをインポートした後、最後にすべての方法をご.vcxprojファイルを開き、

<PropertyGroup> 
    <CLToolExe>mycl.exe</CLToolExe> 
    <CLToolPath>c:\path\to\mycompilerstub\</CLToolPath> 
</PropertyGroup> 

を追加します。 cl.exeの代わりにmycl.exeが呼び出されます。同じエフェクトをマシン上でグローバルに実行したい場合は、そのPropertyGroupを別のmsbuildファイルに置き、C:¥Program Files(x86)¥Microsoft Visual Studio¥2017¥Community¥Common7¥IDE¥VCに保存します。 \ VCTargets \ Platforms \ x64 \ ImportAfter \ MyCustomImport.targetsに移動します。そのディレクトリ内のターゲットファイルは自動的にインポートされます。

代わりに、ClCompileターゲットまたはCLタスクをオーバーライドできます。しかし、それはもっと関わっている。 ClCompileの場合は、まずMicrosoft.CppCommon.targetsにある実装全体をコピーし、必要なロジックを追加します。アドバンテージは、たとえばソースファイルなどのコマンドラインを解析する必要はありません。たとえば、このClCompileと印刷元のファイルを上書きし、カスタム実行可能ファイルにそれらを渡します。

<Target Name="ClCompile" 
     Condition="'@(ClCompile)' != ''" 
     DependsOnTargets="SelectClCompile"> 

    <Message Text="All the sources = @(ClCompile)"/> 
    <Exec Command="mycustom.exe @(ClCompile)" /> 

    ... <!--rest of implementation copied from Microsoft.CppCommon.targets goes here--> 
</Target> 

はやはり、これはグローバルオーバーライドのためのプロジェクトファイルの末尾またはImportAfterディレクトリに置かれる必要があります。

+0

私は、 'ClCompile target'をオーバーライドすれば、ビルドのためにビジュアルスタジオでそのターゲットを選択することができることを正しく理解していますか?とにかく助けをありがとう、これはより多くの研究のための非常に良い出発点です! –

+1

ClCompileを上書きすると、デフォルトのClCompileターゲットの代わりに自動的に呼び出されます。あなたがビルドしたり、単一のファイルをコンパイルしたりしたとき。 – stijn

関連する問題