diff options
author | Wes Haggard <Wes.Haggard@microsoft.com> | 2015-12-24 04:45:57 +0300 |
---|---|---|
committer | Wes Haggard <Wes.Haggard@microsoft.com> | 2016-01-03 10:50:25 +0300 |
commit | 0f65fa42dd7e3926d74911d688bd1607a4cc49ce (patch) | |
tree | 3cd9a52a5a700a6be4d77d3808e8cecc6192de65 /GenerateBuilds.ps1 | |
parent | 95efe37475916016a5fc6ee6f0ba584d990c4196 (diff) |
Add GenerateBuild.ps1 file which generates builds and csproj default configurations
Script used to manaully update/generate builds files based on configurations defined
in project files.
The script also has some other clean-up stuff for project updates.
Diffstat (limited to 'GenerateBuilds.ps1')
-rw-r--r-- | GenerateBuilds.ps1 | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/GenerateBuilds.ps1 b/GenerateBuilds.ps1 new file mode 100644 index 0000000000..ecfd6e6509 --- /dev/null +++ b/GenerateBuilds.ps1 @@ -0,0 +1,222 @@ + +$header = @" +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="`$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildThisFileDirectory), dir.props))\dir.props" /> + <ItemGroup> + +"@ + +$footer = @" + </ItemGroup> + <Import Project="`$([MSBuild]::GetDirectoryNameOfFileAbove(`$(MSBuildThisFileDirectory), dir.traversal.targets))\dir.traversal.targets" /> +</Project> + +"@ + +function WriteBuilds($allConfigs, $srcDir, $projName) +{ + $configs = ""; + + # Sort via Target then OS + $ac = $allConfigs | sort target, os + + foreach($c in $ac) + { + if ($c.relpath -eq $null) { continue } + + $config = " <Project Include=`"$($c.relPath)`"" + + if ($c.os -ne $null -or $c.target -ne $null) + { + $config += ">`r`n"; + if ($c.os -ne $null) { $config += " <OSGroup>$($c.os)</OSGroup>`r`n"; } + if ($c.target -ne $null) { $config += " <TargetGroup>$($c.target)</TargetGroup>`r`n"; } + $config += " </Project>`r`n" + } + else + { + $config += " />`r`n"; + } + + $configs += $config; + } + + #Write-Host $($srcDir.FullName +"\"+ $projName + ".builds") + sc $($srcDir.FullName +"\"+ $projName + ".builds") $($header+$configs+$footer) + #Write-Host $($header+$configs+$footer) +} + +function GetDefaultConfiguration($projectConfigs, $projName) +{ + if ($projectConfigs -eq $null -or $projectConfigs.Count -eq 0) + { + Write-Host "No configurations in $projName"; + return $null; + } + + $defaultConfig = $projectConfigs[0]; + + if ($defaultConfig.os -ne $null -or $defaultConfig.target -ne $null) + { + $windowsConfig = $projectConfigs | ? { $_.os -eq "Windows_NT" } + + if ($windowsConfig.Count -gt 0) + { + $defaultConfig = $windowsConfig[0]; + } + } + return $defaultConfig; +} + +function WriteDefaultConfiguration($defaultConfig, $proj, $pf) +{ + if ($defaultConfig.os -ne $null -or $defaultConfig.target -ne $null) + { + $dc = ""; + + if ($defaultConfig.os -ne $null) + { + if ($defaultConfig.os -eq "Windows_NT") + { + $dc += "Windows_"; + } + else + { + $dc += $defaultConfig.os + "_"; + } + } + if ($defaultConfig.target -ne $null) { $dc += $defaultConfig.target + "_"; } + + $dc += "Debug"; + + $projectConfigProperty = " <Configuration Condition=`"'`$(Configuration)'==''`">$dc</Configuration>"; + + $projectLines = $pf[0..1]; + + $pfContinue = 2; + if ($pf[2] -match "Import") + { + $projectLines += " <PropertyGroup>"; + $projectLines += $projectConfigProperty; + $projectLines += " </PropertyGroup>" + } + else + { + if ($pf[3] -match "Configuration") + { + $pf[3] = $projectConfigProperty; + } + elseif ($pf[3] -match "Setting default TargetGroup" -and $pf[4] -match "TargetGroup") + { + $projectLines += " <PropertyGroup>"; + $projectLines += $projectConfigProperty; + $projectLines += " </PropertyGroup>" + $pfContinue = 6; + } + else + { + Write-Host $($proj.FullName + " doesn't have a Configuration block!"); + s $proj.FullName + } + } + + $projectLines += $pf[$pfContinue..$pf.Length]; + + sc $proj.FullName $projectLines + } +} + +function CleanupProjects($proj, $pf) +{ + $writeFile = $false; + + $lineCount + + $filtered += $pf | ? { + $lineCount++; + if ($lineCount -gt 4 -and $_ -match "<Configuration ") { $writeFile = $true; return $false; } + if ($_ -match "<Platform ") { $writeFile = $true; return $false; } + if ($_ -match "<OutputType>Library</OutputType>") { $writeFile = $true; return $false; } + return $true; + }; + + if ($writeFile) + { + sc $proj.FullName $filtered + } +} + +function GetConfigurations($projs, $srcDir, $projName) +{ + $allConfigs = @(); + foreach($proj in $projs) + { + $pf = gc $proj; + $pfcs = @(); + + #CleanupProjects $proj $pf + + $pf | ? { $_ -match "'(?<osg>Windows|Linux|OSX|FreeBSD)?_?(?<tg>net\d\d\d?|netcore\d\d|netcore\d\daot|dnxcore\d\d|dotnet\d\d)?_?Debug\|AnyCPU'" } | % { + + $os = $matches["osg"]; + $target = $matches["tg"]; + $relPath = $proj.FullName.Replace($srcDir.FullName+"\", ""); + + if ($target -match "netcore.+") { $os = "Windows" } + + if ($os -eq "Windows") { $os = "Windows_NT" } + + $ht = new-object System.Object + $ht | Add-Member -type NoteProperty -name os -value $os + $ht | Add-Member -type NoteProperty -name target -value $target + $ht | Add-Member -type NoteProperty -name relPath -value $relPath + $ht | Add-Member -type NoteProperty -name projName -value $projName + $ht | Add-Member -type NoteProperty -name sortKey -value $($os+"-"+$target+"_"+$relPath) + $pfcs += $ht; + } + $defaultConfig = GetDefaultConfiguration $pfcs $proj.FullName + WriteDefaultConfiguration $defaultConfig $proj $pf + $allConfigs += $pfcs; + } + + return $allConfigs | sort target, os; +} + +$srcDirs = dir d:\git\corefx2\src\*\src + +foreach($srcDir in $srcDirs) +{ + #$srcDir.FullName + $projs = dir $srcDir -r -i *.csproj + + if($projs.Count -eq 0) { Write-Host "Skipping $srcDir because it has no csproj files."; continue; } + + $projName = $srcDir.Parent.Name; + + $allSrcConfigs = GetConfigurations $projs $srcDir $projName + $defaultConfig = GetDefaultConfiguration $allSrcConfigs $projName + + $testsDir = $srcDir.Parent.FullName + "\tests"; + if (Test-Path $testsDir) + { + $testProjs = dir $testsDir -r -i *.csproj + + if ($defaultConfig.os -eq "Windows_NT") + { + #$testProjs | % { WriteDefaultConfiguration $defaultConfig $_ $(gc $_) } + } + } + #$testConfigs = GetConfigurations $testProjs $testsDir $projName + + WriteBuilds $allSrcConfigs $srcDir $projName + + $bfs = dir $srcDir -r -i *.builds + + if ($bfs.Count -ne 1) + { + $projName + " contains " + $bfs.Count + " builds files!"; + } +} + + |