devo uno script MSBuild che ho scritto per compilare i file di Google Protocol Buffer: (! Yay)Come si può modificare un ItemDefinitionGroup da una destinazione MSBuild?
<ItemGroup>
<ProtocolBuffer Include="Whitelist.proto" />
<ProtocolBuffer Include="Whitelist2.proto" />
</ItemGroup>
<ItemDefinitionGroup>
<ProtocolBuffer>
<ProtoPath>$(ProjectDir)</ProtoPath>
</ProtocolBuffer>
</ItemDefinitionGroup>
<PropertyGroup>
<ProtoC>$([System.IO.Path]::GetFullPath($(ProjectDir)..\ThirdParty\protobuf-2.4.1\protoc.exe))</ProtoC>
<ProtoOutPath>$(IntDir)CompiledProtocolBuffers</ProtoOutPath>
</PropertyGroup>
<Target Name="CompileProtocolBuffers"
BeforeTargets="ClCompile"
Inputs="@(ProtocolBuffer)"
Outputs="@(ProtocolBuffer->'$(ProtoOutPath)\%(FileName).pb.cc');@(ProtocolBuffer->'$(ProtoOutPath)\%(FileName).pb.h')">
<MakeDir Directories="$(ProtoOutPath)" />
<Exec
Command=""$(ProtoC)" --proto_path="$([System.IO.Path]::GetDirectoryName(%(ProtocolBuffer.ProtoPath)))" --cpp_out="$(ProtoOutPath)" "%(ProtocolBuffer.FullPath)" --error_format=msvs"
/>
<ItemGroup>
<ClInclude Include="$(ProtoOutPath)\%(ProtocolBuffer.FileName).pb.h" />
<ClCompile Include="$(ProtoOutPath)\%(ProtocolBuffer.FileName).pb.cc">
<AdditionalIncludeDirectories>$(MSBuildThisDirectory)..\ThirdParty\protobuf-2.4.1\src</AdditionalIncludeDirectories>
<PrecompiledHeader></PrecompiledHeader>
<DisableSpecificWarnings>4244;4276;4018;4355;4800;4251;4996;4146;4305</DisableSpecificWarnings>
<PreprocessorDefinitions>GOOGLE_PROTOBUF_NO_RTTI</PreprocessorDefinitions>
<WarningLevel>Level3</WarningLevel>
</ClCompile>
</ItemGroup>
</Target>
Questo compila i file perfettamente i buffer di protocollo, e li aggiunge agli ingressi del compilatore. Tuttavia, i miei altri file sorgente che vogliono includere i file .pb.h
devono sapere dove questi file sono stati generati - quella posizione di generazione deve essere inserita nel percorso di inclusione.
Pertanto, se e solo se l'utente ha inserito un elemento <ProtocolBuffer
da qualche parte nel loro scritto, voglio aggiungere la posizione generazione (in questo caso $(ProtoOutPath)
a ClCompile di <AdditionalIncludeDirectories>
.
È quello possibile o ho bisogno per creare file .cpp che vogliono usare questi bit generati saltare attraverso i cerchi
mi trovai di fronte con lo stesso problema (anche se l'impostazione 'PreprocessorDefinitions' di programmazione invece di' AdditionalIncludeDirectories'). Sacra vacca, questa è magia, ma funziona sorprendentemente bene. Grazie! –