-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTidyBuild.targets
100 lines (95 loc) · 5.52 KB
/
TidyBuild.targets
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Import Project="$(SolutionDir)TidyBuild.custom.targets" Condition="Exists('$(SolutionDir)TidyBuild.custom.targets')"/>
<PropertyGroup>
<!-- Version number -->
<TidyBuildGenerateVersion Condition="'$(TidyBuildGenerateVersion)'==''">true</TidyBuildGenerateVersion>
</PropertyGroup>
<!-- =================================================================== -->
<!-- Version -->
<!-- =================================================================== -->
<!-- C# generate version -->
<Target Name="GenerateVersion" Condition="$(TidyBuildGenerateVersion) And '$(MSBuildProjectExtension)' == '.csproj'" BeforeTargets="CoreCompile;BeforeCompile;RemoveAssemblyInfoVersion">
<ItemGroup>
<AssemblyAttributes Include="System.Reflection.AssemblyVersionAttribute">
<_Parameter1>$(FullVersion)</_Parameter1>
</AssemblyAttributes>
<AssemblyAttributes Include="System.Reflection.AssemblyInformationalVersionAttribute">
<_Parameter1>$(FullVersion)</_Parameter1>
</AssemblyAttributes>
<AssemblyAttributes Include="System.Reflection.AssemblyFileVersionAttribute">
<_Parameter1>$(FullVersion)</_Parameter1>
</AssemblyAttributes>
</ItemGroup>
<MakeDir Directories="$(IntermediateOutputPath)" Condition="!Exists('$(IntermediateOutputPath)')"/>
<WriteCodeFragment Language="C#" OutputFile="$(IntermediateOutputPath)\BuildVersion.cs" AssemblyAttributes="@(AssemblyAttributes)" />
</Target>
<ItemGroup Condition="$(TidyBuildGenerateVersion) And '$(MSBuildProjectExtension)' == '.csproj'">
<Compile Include="$(IntermediateOutputPath)\BuildVersion.cs">
<AutoGen>true</AutoGen>
<Link>Properties\BuildVersion.cs</Link>
</Compile>
</ItemGroup>
<!-- Remove duplicate version attributes from AssemblyInfo.cs -->
<Target Name="RemoveAssemblyInfoVersion" Condition="$(TidyBuildGenerateVersion) And '$(MSBuildProjectExtension)' == '.csproj' And Exists('$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs')" BeforeTargets="BeforeCompile">
<ReadLinesFromFile File="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs">
<Output TaskParameter="Lines" ItemName="AssemblyInfoLines"/>
</ReadLinesFromFile>
<ReplaceInLines InputLines="@(AssemblyInfoLines)" Expression="^\s*(\[.*\b(AssemblyVersion|AssemblyFileVersion|AssemblyInformationalVersion).*)" Replacement="// Commented out by TidyBuild: $1">
<Output TaskParameter="OutputLines" ItemName="AssemblyInfoLines1" />
</ReplaceInLines>
<WriteLinesToFile File="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs" Overwrite="true" Lines="@(AssemblyInfoLines1)"/>
</Target>
<!-- C++ generate version -->
<Target Name="GenerateVersionCpp" BeforeTargets="PrepareForBuild" Inputs="$(MSBuildThisFileDirectory)Version.in.rc" Outputs="$(IntDir)Version.rc" Condition="$(TidyBuildGenerateVersion) And '$(MSBuildProjectExtension)' == '.vcxproj'">
<ReadLinesFromFile File="$(MSBuildThisFileDirectory)Version.in.rc">
<Output TaskParameter="Lines" ItemName="VersionInputLines"/>
</ReadLinesFromFile>
<MakeDir Directories="$(IntDir)" Condition="!Exists('$(IntDir)')"/>
<WriteLinesToFile File="$(IntDir)\Version.rc" Overwrite="true" Lines="@(VersionInputLines->Replace('!MANUFACTURER!', '$(Manufacturer)')->Replace('!PROJECT_NAME!', '$(MSBuildProjectName)')->Replace('!COMMA_SEPARATED_FILE_VERSION!', '$(FullVersion.Replace('.', ','))')->Replace('!DOT_SEPARATED_FILE_VERSION!', '$(FullVersion)')->Replace('!DOT_SEPARATED_PRODUCT_VERSION!', '$(FullVersion)')->Replace('!COMMA_SEPARATED_PRODUCT_VERSION!', '$(FullVersion.Replace('.', ','))'))"/>
</Target>
<ItemGroup Condition="$(TidyBuildGenerateVersion) And '$(MSBuildProjectExtension)' == '.vcxproj'">
<ResourceCompile Include="$(IntDir)\Version.rc" />
</ItemGroup>
<Choose>
<When Condition=" $([System.Version]::Parse('$(MSBuildVersion)')) >= $([System.Version]::Parse('15.8'))">
<PropertyGroup>
<TaskFactory>RoslynCodeTaskFactory</TaskFactory>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<TaskFactory>CodeTaskFactory</TaskFactory>
</PropertyGroup>
</Otherwise>
</Choose>
<!-- Regex replace in lines -->
<UsingTask TaskName="ReplaceInLines" TaskFactory="$(TaskFactory)" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
<ParameterGroup>
<InputLines ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
<Expression ParameterType="System.String" Required="true" />
<Replacement ParameterType="System.String" Required="true" />
<OutputLines ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System"/>
<Using Namespace="System.Collections.Generic"/>
<Using Namespace="System.Text.RegularExpressions"/>
<Using Namespace="Microsoft.Build.Framework"/>
<Using Namespace="Microsoft.Build.Utilities"/>
<Code Type="Fragment" Language="cs">
<![CDATA[
List<ITaskItem> output = new List<ITaskItem>();
Regex regex = new Regex(this.Expression, RegexOptions.Compiled | RegexOptions.ECMAScript);
foreach (ITaskItem line in this.InputLines)
{
TaskItem ti = new TaskItem(line);
ti.ItemSpec = regex.Replace(line.ItemSpec, this.Replacement);
output.Add(ti);
}
this.OutputLines = (ITaskItem[])output.ToArray();
]]>
</Code>
</Task>
</UsingTask>
</Project>