複数の C++ プロジェクト (*.vcproj) のビルドに使用される msbuild プロジェクト ファイルがあります。以下は典型的なプロジェクト ファイルの一部で、ビルドのグローバル環境変数がプロパティとしてオーバーライドされます。
<PropertyGroup>
<MYBINDIR>d:\buildsysroot\bin</MYBINDIR>
<MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR>
...
</PrpertyGroup>
<ItemGroup>
<MyItems Include="d:\buildsysroot\myproject\myproject.vcproj"/>
</ItemGroup>
<Target Name="Release_x64">
<VCBuild Projects="@(MyItems)" Configuration="Release_dll|x64"/>
</Target>
これらの環境変数は、プロパティ シートを通じて、すべての vcproj ファイルで使用されます。vcproj の抜粋を次に示します。
<Configuration
Name="Release_dll|x64"
ConfigurationType="1"
InheritedPropertySheets="$(BUILDPROPSDIR)\defaults.vsprops;$(BUILDPROPSDIR)\build_dll.vsprops"
>
プロパティ シートは次のようになります。
<VisualStudioPropertySheet
Name="defaults"
OutputDirectory="$(MYBINDIR)\_$(ConfigurationName)_$(PlatformName)"
IntermediateDirectory="$(MYBUILDDIR)_$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
>
<Tool
Name="VCLinkerTool"
AdditionalLibraryDirectories=""$(MYLIBDIR)""
/>
<VisualStudioPropertySheet/>
問題は、ビルド時に、msbuild ファイル (MYBINDIR、MYLIBDIR) で宣言された環境変数の値がプロパティ シートに反映されず、msbuild ファイルに対してのみローカルであるように見えることです。msbuild プロジェクト内で MYBINDIR が展開されます。 "d:\buildsysroot\bin" ですが、VC プロジェクト内では MYBINDIR は "d:\projects\bin" に展開されます。それは、私のメインの開発環境がどのようにセットアップされているかによるものです。
msbuild ファイルに設定された環境を VCBuild タスクに渡すにはどうすればよいですか?
この問題は、msbuild ファイルではなく、バッチ ファイルを使用し、「set」を使用してそこで環境を宣言することで解決できることを知っています。それが私がそれを行っていた方法ですが、1つの引数を持つmsbuildへの1回の呼び出しであり、それだけであるため、上記の方法を好みます。
編集
私はすぐに解決策を必要とし、バッチ ファイルと同じ方法で環境を設定するカスタム タスクを思いつきましたが、msbuild 内でそれを行うという利点があります。タスクの Execute() メソッドは単に Environment.SetEnvironmentVariable( var 、 val )。これにはまだプロセスの環境を設定する必要があります。別の方法があれば教えていただければ幸いです。