標準のC++プロジェクトファイルのコンパイルは、ClCompile
という名前のMsBuild Targetを呼び出すことによって行われます。実際のC++ソースファイルの一覧を表示するClCompileという名前のMsBuild Itemもあります。これは、テキストエディタで.vcxprojを開くと簡単に表示されます。その結果、このClCompile ItemはClCompile Targetで使用され、CL
Taskに渡され、実際のコンパイラ実行可能ファイルである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ディレクトリに置かれる必要があります。
cl.exeファイルを見つけ、それを自分のファイルに置き換え、引数を記録します。オプションで元のcl.exeを引数で呼び出します。 –
具体的にしてください。議論を取り、統計を作成したいとします。また、スクリプトでコンパイラをオーバーライドしたいとします。それら2つは相互に排他的ではありません。後者は最初の問題の唯一の解決策ではなく、私はあなたが本当に最初の問題を解決したいと思っていますか? – stijn
@stijn私は質問を熱狂させた。私は本当にコンパイルを無効にしたい。議論を取り込むことは、私が成功すれば、私がすることができる多くの事の一つに過ぎません。 –