2016-02-24 00:21:00 +00:00
# Use the .NET Core APIs to determine the current platform; if a runtime
# exception is thrown, we are on FullCLR, not .NET Core.
#
2016-03-04 20:11:01 +00:00
# TODO: import Microsoft.PowerShell.Platform instead
2016-02-22 01:23:43 +00:00
try {
$Runtime = [ System.Runtime.InteropServices.RuntimeInformation ]
$OSPlatform = [ System.Runtime.InteropServices.OSPlatform ]
2016-03-04 20:11:01 +00:00
$IsCore = $true
$IsLinux = $Runtime :: IsOSPlatform ( $OSPlatform :: Linux )
$IsOSX = $Runtime :: IsOSPlatform ( $OSPlatform :: OSX )
$IsWindows = $Runtime :: IsOSPlatform ( $OSPlatform :: Windows )
2016-02-22 01:23:43 +00:00
} catch [ System.Management.Automation.RuntimeException ] {
2016-03-04 20:11:01 +00:00
$IsCore = $false
$IsLinux = $false
$IsOSX = $false
$IsWindows = $true
2016-02-22 01:23:43 +00:00
}
2016-02-22 00:21:04 +00:00
2016-02-21 23:06:39 +00:00
function Start-PSBuild
{
param (
2016-02-24 00:21:00 +00:00
[ switch ] $Restore ,
2016-02-27 02:49:51 +00:00
[ string ] $Output = " $PSScriptRoot /bin " ,
[ string ] $Runtime
2016-02-24 00:21:00 +00:00
)
2016-02-21 23:06:39 +00:00
if ( -Not ( Get-Command " dotnet " -ErrorAction SilentlyContinue ) ) {
throw " Build dependency 'dotnet' not found in PATH! See: https://dotnet.github.io/getting-started/ "
}
2016-02-22 00:21:04 +00:00
New-Item -Force -Type Directory $Output | Out-Null
2016-02-21 23:06:39 +00:00
$Top = " $PSScriptRoot /src/Microsoft.PowerShell.Linux.Host "
if ( $Restore -Or -Not ( Test-Path " $Top /project.lock.json " ) ) {
2016-02-24 00:21:00 +00:00
dotnet restore $PSScriptRoot
2016-02-21 23:06:39 +00:00
}
2016-03-04 20:11:01 +00:00
if ( $IsLinux -Or $IsOSX ) {
$InstallCommand = if ( $IsLinux ) { " apt-get " } elseif ( $IsOSX ) { " brew " }
2016-02-21 23:06:39 +00:00
foreach ( $Dependency in " cmake " , " g++ " ) {
if ( -Not ( Get-Command $Dependency -ErrorAction SilentlyContinue ) ) {
throw " Build dependency ' $Dependency ' not found in PATH! Run ' $InstallCommand install $Dependency ' "
}
}
2016-03-04 20:11:01 +00:00
$Ext = if ( $IsLinux ) { " so " } elseif ( $IsOSX ) { " dylib " }
2016-02-24 00:21:00 +00:00
$Native = " $PSScriptRoot /src/libpsl-native "
$Lib = " $Native /src/libpsl-native. $Ext "
2016-02-21 23:06:39 +00:00
Write-Host " Building $Lib "
2016-02-24 19:50:56 +00:00
try {
pushd $Native
cmake -DCMAKE_BUILD_TYPE = Debug .
make -j
make test
} finally {
popd
}
2016-02-21 23:06:39 +00:00
if ( -Not ( Test-Path $Lib ) ) { throw " Compilation of $Lib failed " }
cp $Lib $Output
}
Write-Host " Building PowerShell "
2016-02-27 02:49:51 +00:00
$Arguments = " --framework " , " netstandardapp1.5 " , " --output " , $Output
2016-02-21 23:06:39 +00:00
2016-02-27 02:49:51 +00:00
if ( $IsLinux -Or $IsOSX ) { $Arguments + = " --configuration " , " Linux " }
if ( $Runtime ) { $Arguments + = " --runtime " , $Runtime }
$Arguments + = $Top
dotnet publish $Arguments
2016-02-21 23:06:39 +00:00
}
2016-02-22 00:21:04 +00:00
function Start-PSPackage
{
2016-02-24 00:21:00 +00:00
# PowerShell packages use Semantic Versioning http://semver.org/
#
# Ubuntu and OS X packages are supported.
2016-02-22 00:21:04 +00:00
param (
2016-02-24 00:21:00 +00:00
[ string ] $Version ,
[ int ] $Iteration = 1
)
2016-02-22 00:21:04 +00:00
2016-03-04 20:11:01 +00:00
if ( $IsWindows ) { throw " Building Windows packages is not yet supported! " }
2016-02-22 00:21:04 +00:00
if ( -Not ( Get-Command " fpm " -ErrorAction SilentlyContinue ) ) {
throw " Build dependency 'fpm' not found in PATH! See: https://github.com/jordansissel/fpm "
}
2016-02-24 00:21:00 +00:00
if ( -Not ( Test-Path " $PSScriptRoot /bin/powershell " ) ) {
throw " Please Start-PSBuild to publish PowerShell "
}
2016-02-22 00:21:04 +00:00
2016-02-24 00:21:00 +00:00
# Change permissions for packaging
chmod -R go = u " $PSScriptRoot /bin "
2016-02-22 00:21:04 +00:00
2016-02-24 00:21:00 +00:00
# Decide package output type
2016-03-04 20:11:01 +00:00
$Output = if ( $IsLinux ) { " deb " } elseif ( $IsOSX ) { " osxpkg " }
2016-02-22 00:21:04 +00:00
2016-02-24 00:21:00 +00:00
# Use Git tag if not given a version
if ( -Not ( $Version ) ) {
$Version = ( git - -git -dir = " $PSScriptRoot /.git " describe ) -Replace '^v'
}
# Build package
2016-02-22 00:21:04 +00:00
fpm - -force - -verbose `
- -name " powershell " `
- -version $Version `
- -iteration $Iteration `
- -maintainer " Andrew Schwartzmeyer <andschwa@microsoft.com> " `
- -vendor " Microsoft <mageng@microsoft.com> " `
- -url " https://github.com/PowerShell/PowerShell " `
- -license " Unlicensed " `
- -description " Open PowerShell on .NET Core\nPowerShell is an open-source, cross-platform, scripting language and rich object shell. Built upon .NET Core, it is also a C# REPL.\n " `
- -category " shells " `
- -depends " libunwind8 " `
- -depends " libicu52 " `
- -deb -build -depends " dotnet " `
- -deb -build -depends " cmake " `
- -deb -build -depends " g++ " `
-t $Output `
-s dir `
2016-02-24 00:21:00 +00:00
" $PSScriptRoot /bin/=/usr/local/share/powershell/ " `
" $PSScriptRoot /package/powershell=/usr/local/bin "
2016-02-22 00:21:04 +00:00
}
2016-02-20 22:35:46 +00:00
function Start-DevPSGitHub
2016-02-03 18:53:43 +00:00
{
param (
[ switch ] $ZapDisable ,
[ string[] ] $ArgumentList = '' ,
[ switch ] $LoadProfile ,
2016-02-04 01:25:51 +00:00
[ string ] $binDir = " $PSScriptRoot \binFull " ,
[ switch ] $NoNewWindow
2016-02-03 18:53:43 +00:00
)
try
{
if ( $LoadProfile -eq $false )
{
2016-02-04 01:25:51 +00:00
$ArgumentList = @ ( '-noprofile' ) + $ArgumentList
2016-02-03 18:53:43 +00:00
}
$env:DEVPATH = $binDir
if ( $ZapDisable )
{
2016-02-21 23:06:39 +00:00
$env:COMPLUS_ZapDisable = 1
2016-02-03 18:53:43 +00:00
}
2016-02-21 23:06:39 +00:00
if ( -Not ( Test-Path $binDir \ powershell . exe . config ) )
2016-02-03 18:53:43 +00:00
{
$configContents = @"
2016-02-21 23:06:39 +00:00
< ? xml version = " 1.0 " encoding = " utf-8 " ? >
< configuration >
2016-02-03 18:53:43 +00:00
< runtime >
< developmentMode developerInstallation = " true " / >
< / runtime >
< / configuration >
" @
$configContents | Out-File -Encoding Ascii $binDir \ powershell . exe . config
}
2016-02-21 23:06:39 +00:00
# splatting for the win
2016-02-04 01:25:51 +00:00
$startProcessArgs = @ {
FilePath = " $binDir \powershell.exe "
ArgumentList = " $ArgumentList "
2016-02-21 23:06:39 +00:00
}
2016-02-04 21:19:24 +00:00
if ( $NoNewWindow ) {
$startProcessArgs . NoNewWindow = $true
$startProcessArgs . Wait = $true
}
2016-02-21 23:06:39 +00:00
2016-02-04 01:25:51 +00:00
Start-Process @startProcessArgs
2016-02-03 18:53:43 +00:00
}
finally
{
ri env : DEVPATH
if ( $ZapDisable )
{
ri env : COMPLUS_ZapDisable
}
}
2016-02-20 22:35:46 +00:00
}