Repository: reef Updated Branches: refs/heads/master 47568d78c -> 41e4be255
[REEF-1822] Create a script to analyze CLR Compliance This adds a script that analyzes the build artifacts for compliance of the various CLR runtimes JIRA: [REEF-1822](https://issues.apache.org/jira/browse/REEF-1822) Pull Request: This closes #1325 Project: http://git-wip-us.apache.org/repos/asf/reef/repo Commit: http://git-wip-us.apache.org/repos/asf/reef/commit/41e4be25 Tree: http://git-wip-us.apache.org/repos/asf/reef/tree/41e4be25 Diff: http://git-wip-us.apache.org/repos/asf/reef/diff/41e4be25 Branch: refs/heads/master Commit: 41e4be2550b5a4954cf38641210ba524d2cbbd17 Parents: 47568d7 Author: roganc <[email protected]> Authored: Tue Jul 11 12:25:07 2017 -0700 Committer: Markus Weimer <[email protected]> Committed: Tue Jul 11 21:30:26 2017 -0700 ---------------------------------------------------------------------- appveyor.yml | 3 + bin/AnalyzeClrCompatibility.ps1 | 134 +++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/reef/blob/41e4be25/appveyor.yml ---------------------------------------------------------------------- diff --git a/appveyor.yml b/appveyor.yml index 52cc158..ae56572 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -39,6 +39,9 @@ build_script: test_script: - cmd: msbuild .\lang\cs\TestRunner.proj /p:Configuration="Debug" /p:Platform="x64" +after_build: + - ps: .\bin\AnalyzeClrCompatibility.ps1 + notifications: - provider: Email on_build_success: false http://git-wip-us.apache.org/repos/asf/reef/blob/41e4be25/bin/AnalyzeClrCompatibility.ps1 ---------------------------------------------------------------------- diff --git a/bin/AnalyzeClrCompatibility.ps1 b/bin/AnalyzeClrCompatibility.ps1 new file mode 100644 index 0000000..99b1e4e --- /dev/null +++ b/bin/AnalyzeClrCompatibility.ps1 @@ -0,0 +1,134 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Input / Output Settings +$baseDir = ".\lang\cs\" +$buildDir="${baseDir}\bin\x64\Debug" +$outputDirectory = "${buildDir}\ClrCompatibility\" +$incompatibilityFile = "${outputDirectory}\incompatibilities.txt" + +# Compatibility Analyzer settings +$libraryDotNetTargets = @(".NET Standard, Version=2.0") +$exeDotNetTargets = @(".NET Core + Platform Extensions, Version=1.0", ".NET Framework, Version=4.5.1") + +# Set up the directory structure +If (Test-Path $outputDirectory) +{ + Remove-Item $outputDirectory -Force -Recurse +} +New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null + +# Install the API Portability Analyzer if it is not present +$portabilityAnalyzer = "${buildDir}\ApiPort\ApiPort.exe" +If (!(Test-Path $portabilityAnalyzer)) +{ + Write-Output "Downloading the DotNet API Portability Analyzer" + $analyzerUrl="https://github.com/Microsoft/dotnet-apiport/releases/download/v1.4.0.alpha.00175/ApiPort.zip" + $analyzerZip="${buildDir}\analyzer.zip" + Invoke-WebRequest $analyzerUrl -OutFile $analyzerZip + Add-Type -assembly "System.IO.Compression.Filesystem"; + # Now, external libraries don't understand relative paths + [IO.Compression.Zipfile]::ExtractToDirectory((Get-Item $analyzerZip).FullName,(Get-Item $buildDir).FullName); + Remove-Item $analyzerZip +} + +# Set up the counter +[int] $totalIncompatibilities = 0 + +# Start a unique list of dependencies +$missingDependencies = @{} + +# Get all the folders +Get-ChildItem $baseDir -dir -Filter "Org.Apache.*" | + ForEach-Object { + $projectName = $_.Name + + # Verify that the project is part of the .NET solution + $csProj = "${baseDir}\${projectName}\${projectName}.csproj" + If (!(Test-Path $csProj)) + { + Write-Output "Skipping ${projectName}: No csproj" + return + } + + # Determine the output type for the project + $outputType = $(Select-String -Path $csProj -Pattern "<OutputType>").Line -replace '^\s+<OutputType>(.+?)</OutputType>\s*$','$1' + + # Get the portability settings for this project + $objectSuffix = "" + $dotNetTargets = @() + If ($outputType -eq "Library") + { + $objectSuffix = "dll" + $dotNetTargets = $libraryDotNetTargets + } + ElseIf ($outputType -eq "Exe") + { + $objectSuffix = "exe" + $dotNetTargets = $exeDotNetTargets + } + Else + { + Write-Output "Skipping ${projectName}: OutputType is not 'Library','Exe'" + return + } + + # Define the object we want to explore + $objectPath = "${buildDir}\${projectName}\${projectName}.${objectSuffix}" + If(!(Test-Path $objectPath)) { + Write-Output "Warning: Could not find build object: ${objectPath}; Skipping ${projectName}" + return + } + + # Announce our intentions (there may be many slow loops) + Write-Output "Analyzing $projectName - $outputType" + + # Define the portability command + $outputFileName = "${outputDirectory}\${projectName}.${objectSuffix}.json" + $analyzeParams = "analyze", "-r", "Json", "-f", $objectPath, "-o", $outputFileName + ForEach ($target in $dotNetTargets) + { + $analyzeParams += "-t", $target + } + + # Run the command + & $portabilityAnalyzer $analyzeParams | Out-Null + + # Read in the resulting object + $compliance = Get-Content -Raw -Path $outputFileName | ConvertFrom-Json + + # Count the incompatibilities + $incompatibilities = $compliance.MissingDependencies.Count + $totalIncompatibilities += $incompatibilities + Write-Output "`tFound ${incompatibilities} incompatibilities" + + # Keep a unique list of the incompatible libraries + ForEach ($item in $compliance.MissingDependencies) + { + $assembly = $item.DefinedInAssemblyIdentity.split(',')[0] + $missingDependencies[$assembly] = 1 + } + } + +# Now report the status +Write-Output "Found ${totalIncompatibilities} total incompatibilities" +Write-Output "Missing Dependencies:" +$dependencyString = "`t" + ($missingDependencies.Keys -join "`n`t") +Write-Output "${dependencyString}" + +# And checkpoint it to a file +$totalIncompatibilities | Out-File $incompatibilityFile
