| <# |
| |
| 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. |
| |
| #> |
| |
| <# |
| |
| .SYNOPSIS |
| Apache Ignite.NET build script. |
| |
| .DESCRIPTION |
| Builds all parts of Apache Ignite.NET: Java, .NET, NuGet. Copies results to 'bin' and 'nupkg' folders. |
| |
| Requirements: |
| * PowerShell 3 |
| * JDK 8+ |
| * MAVEN_HOME environment variable or mvn.bat in PATH |
| |
| .PARAMETER skipJava |
| Skip Java build. |
| |
| .PARAMETER skipDotNet |
| Skip .NET build. |
| |
| .PARAMETER skipDotNetCore |
| Skip .NET Core build. |
| |
| .PARAMETER skipNuGet |
| Skip NuGet packaging. |
| |
| .PARAMETER skipCodeAnalysis |
| Skip code analysis. |
| |
| .PARAMETER clean |
| Perform a clean rebuild. |
| |
| .PARAMETER platform |
| Build platform ("Any CPU", "x86", "x64"). |
| |
| .PARAMETER configuration |
| Build configuration ("Release", "Debug"). |
| |
| .PARAMETER mavenOpts |
| Custom Maven options, default is "-U -P-lgpl,-scala,-examples,-test,-benchmarks -Dmaven.javadoc.skip=true". |
| |
| .PARAMETER jarDirs |
| Java jar files source folders, default is "modules\indexing\target,modules\core\target,modules\spring\target" |
| |
| .PARAMETER asmDirs |
| .NET assembly directories to copy pre-build binaries from. Default is "", which means no copy. |
| |
| .PARAMETER nugetPath |
| Path to nuget.exe. |
| |
| .PARAMETER version |
| NuGet version override (normally inferred from assembly version). |
| |
| .EXAMPLE |
| .\build.ps1 -clean |
| # Full rebuild of Java, .NET and NuGet packages. |
| |
| .EXAMPLE |
| .\build.ps1 -skipJava -skipCodeAnalysis -skipNuGet -configuration Debug -platform x64 |
| # Quick build of .NET code only. |
| |
| #> |
| |
| param ( |
| [switch]$skipJava, |
| [switch]$skipDotNet, |
| [switch]$skipDotNetCore, |
| [switch]$skipNuGet, |
| [switch]$skipCodeAnalysis, |
| [switch]$clean, |
| [ValidateSet("Any CPU", "x64", "x86")] |
| [string]$platform="Any CPU", |
| [ValidateSet("Release", "Debug")] |
| [string]$configuration="Release", |
| [string]$mavenOpts="-U -P-lgpl,-scala,-all-scala,-spark-2.4,-examples,-test,-benchmarks -Dmaven.javadoc.skip=true", |
| [string]$jarDirs="modules\indexing\target,modules\core\target,modules\spring\target", |
| [string]$asmDirs="", |
| [string]$nugetPath="", |
| [string]$version="" |
| ) |
| |
| # 0) Functions |
| function Make-Dir([string]$dirPath) { |
| New-Item -Path $dirPath -ItemType "directory" -Force |
| Remove-Item -Force -Recurse $dirPath\*.* |
| } |
| |
| function Exec([string]$command) { |
| try { |
| iex "& $command" |
| } catch { |
| echo "Command failed: $command" |
| throw |
| exit -1 |
| } |
| } |
| |
| # 1) Build Java (Maven) |
| # Detect Ignite root directory |
| cd $PSScriptRoot\.. |
| |
| while (!((Test-Path bin) -and (Test-Path examples) -and ((Test-Path modules) -or (Test-Path platforms)))) { |
| cd .. |
| if ((Get-Location).Drive.Root -eq (Get-Location).Path) { |
| break |
| } |
| } |
| |
| echo "Ignite home detected at '$pwd'." |
| |
| if (!$skipJava) { |
| # Detect Maven |
| $mv = "mvn" |
| if ((Get-Command $mv -ErrorAction SilentlyContinue) -eq $null) { |
| $mvHome = ($env:MAVEN_HOME, $env:M2_HOME, $env:M3_HOME, $env:MVN_HOME -ne $null)[0] |
| |
| if ($mvHome -eq $null) { |
| echo "Maven not found. Make sure to update PATH variable or set MAVEN_HOME, M2_HOME, M3_HOME, or MVN_HOME." |
| exit -1 |
| } |
| |
| $mv = "`"" + (join-path $mvHome "bin\mvn.bat") + "`"" |
| echo "Maven detected at $mv." |
| } |
| |
| # Install Maven Wrapper |
| Exec "$mv --% -N io.takari:maven:wrapper -Dmaven=3.5.2" |
| $mv = If ($IsLinux) { "./mvnw" } else { ".\mvnw.cmd" } |
| |
| # Run Maven |
| echo "Starting Java (Maven) build..." |
| |
| $mvnTargets = if ($clean) { "clean package" } else { "package" } |
| Exec "$mv --% $mvnTargets -DskipTests $mavenOpts" |
| } |
| else { |
| echo "Java (Maven) build skipped." |
| } |
| |
| # Copy (relevant) jars |
| $libsDir = "$PSScriptRoot\bin\libs" |
| Make-Dir($libsDir) |
| |
| Get-ChildItem $jarDirs.Split(',') *.jar -recurse ` |
| -include "ignite-core*","ignite-indexing*","ignite-shmem*","ignite-spring*","lucene*","h2*","cache-api*","commons-*","spring*" ` |
| -exclude "*-sources*","*-javadoc*","*-tests*" ` |
| | ? { $_.FullName -inotmatch '[\\/]optional[\\/]' } ` |
| | % { Copy-Item -Force $_ $libsDir } |
| |
| # Restore directory |
| cd $PSScriptRoot |
| |
| |
| # 2) Build .NET |
| |
| # Detect NuGet |
| $ng = if ($nugetPath) { $nugetPath } else { "nuget" } |
| |
| if ((Get-Command $ng -ErrorAction SilentlyContinue) -eq $null) { |
| $ng = If ($IsLinux) { "mono $PSScriptRoot/nuget.exe" } else { "$PSScriptRoot\nuget.exe" } |
| |
| if (-not (Test-Path $ng)) { |
| echo "Downloading NuGet..." |
| (New-Object System.Net.WebClient).DownloadFile("https://dist.nuget.org/win-x86-commandline/v5.3.1/nuget.exe", "$PSScriptRoot/nuget.exe") |
| } |
| } |
| |
| echo "Using NuGet from: $ng" |
| |
| if (!$skipDotNet) { |
| $msBuild = "msbuild" |
| |
| if ((Get-Command $msBuild -ErrorAction SilentlyContinue) -eq $null) |
| { |
| # Detect MSBuild 4.0+ |
| for ($i = 20; $i -ge 4; $i--) { |
| $regKey = "HKLM:\software\Microsoft\MSBuild\ToolsVersions\$i.0" |
| if (Test-Path $regKey) |
| { |
| break |
| } |
| } |
| |
| if (!(Test-Path $regKey)) |
| { |
| echo "Failed to detect MSBuild path, exiting." |
| exit -1 |
| } |
| |
| $msBuild = (Join-Path -path (Get-ItemProperty $regKey)."MSBuildToolsPath" -childpath "msbuild.exe") |
| $msBuild = "`"$msBuild`"" # Put in quotes and escape to handle whitespace in path |
| } |
| |
| echo "MSBuild detected at '$msBuild'." |
| |
| # Restore NuGet packages |
| echo "Restoring NuGet..." |
| Exec "$ng restore Apache.Ignite.sln" |
| |
| # Build |
| $targets = if ($clean) {"Clean;Rebuild"} else {"Build"} |
| $codeAnalysis = if ($skipCodeAnalysis) {"/p:RunCodeAnalysis=false"} else {""} |
| $msBuildCommand = "$msBuild Apache.Ignite.sln /target:$targets /p:Configuration=$configuration /p:Platform=`"$platform`" $codeAnalysis /p:UseSharedCompilation=false" |
| echo "Starting MsBuild: '$msBuildCommand'" |
| Exec $msBuildCommand |
| } |
| |
| if(!$skipDotNetCore) { |
| |
| # Build core |
| $targetSolution = ".\Apache.Ignite\Apache.Ignite.DotNetCore.csproj" |
| if ($clean) { |
| $cleanCommand = "dotnet clean $targetSolution -c $configuration" |
| echo "Starting dotnet clean: '$cleanCommand'" |
| Exec $cleanCommand |
| } |
| |
| $publishCommand = "dotnet publish $targetSolution -c $configuration" |
| echo "Starting dotnet publish: '$publishCommand'" |
| Exec $publishCommand |
| } |
| |
| if ($asmDirs) { |
| Get-ChildItem $asmDirs.Split(',') | % ` |
| { |
| $projName = [System.IO.Path]::GetFileNameWithoutExtension($_.Name) |
| |
| if ($_.Name.EndsWith(".exe.config")) { |
| $projName = [System.IO.Path]::GetFileNameWithoutExtension($projName) |
| } |
| |
| if ($projName.StartsWith("Apache.Ignite")) { |
| $target = [IO.Path]::Combine($projName, "bin", $configuration) |
| New-Item -Path $target -ItemType "directory" -Force |
| |
| echo "Copying '$_' to '$target'" |
| Copy-Item -Force $_.FullName $target |
| } |
| } |
| } |
| |
| # Copy binaries |
| Make-Dir("bin") |
| |
| Get-ChildItem *.csproj -Recurse | where Name -NotLike "*Examples*" ` |
| | where Name -NotLike "*Tests*" ` |
| | where Name -NotLike "*DotNetCore*" ` |
| | where Name -NotLike "*Benchmark*" | % { |
| $projDir = split-path -parent $_.FullName |
| $dir = [IO.Path]::Combine($projDir, "bin", $configuration, "*") |
| echo "Copying files to bin from '$dir'" |
| Copy-Item -Force -Recurse $dir bin |
| } |
| |
| |
| # 3) Pack NuGet |
| if (!$skipNuGet) { |
| # Check parameters |
| if (($platform -ne "Any CPU") -or ($configuration -ne "Release")) { |
| echo "NuGet can only package 'Release' 'Any CPU' builds; you have specified '$configuration' '$platform'." |
| exit -1 |
| } |
| |
| $nupkgDir = "nupkg" |
| Make-Dir($nupkgDir) |
| |
| # Detect version |
| $ver = if ($version) { $version } else { (gi Apache.Ignite.Core\bin\Release\Apache.Ignite.Core.dll).VersionInfo.ProductVersion } |
| |
| # Find all nuspec files and run 'nuget pack' either directly, or on corresponding csproj files (if present) |
| Get-ChildItem *.nuspec -Recurse ` |
| | % { |
| Exec "$ng pack $_ -Prop Configuration=Release -Prop Platform=AnyCPU -Version $ver -OutputDirectory $nupkgDir" |
| } |
| |
| echo "NuGet packages created in '$pwd\$nupkgDir'." |
| } |