There are ways to do this more succinctly in 4.0+ using property functions.
<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ClCompile Include="1" /> <ClCompile Include="2"> <AdditionalIncludeDirectories>2.1;2.2;2.3</AdditionalIncludeDirectories> </ClCompile> </ItemGroup> <Target Name="Build" > <Message Text="compile %(ClCompile.Identity)" Condition="'%(ClCompile.AdditionalIncludeDirectories)' ==''"/> <Message Text="compile %(ClCompile.Identity) /I $([System.String]::Join(' /I ', $([System.Text.RegularExpressions.Regex]::Split('%(ClCompile.AdditionalIncludeDirectories)', ';'))))" Condition="'%(ClCompile.AdditionalIncludeDirectories)' !=''"/> </Target> </Project>
Output
compile 1 compile 2 /I 2.1 /I 2.2 /I 2.3
It's not very cute, but it's a little better, I think. Instead of String.Split, you should use Regex.Split, because the latter needs an array of splitters, and it's a little difficult to do.
MSBuild middleware needs some improvements, I think.
Dan (msbuild)
source share