2016-02-24 08:21:00 +08: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-02-22 08:21:04 +08:00
# TODO: use PowerShell to check OS when available
2016-02-22 09:23:43 +08:00
try {
$Runtime = [ System.Runtime.InteropServices.RuntimeInformation ]
$OSPlatform = [ System.Runtime.InteropServices.OSPlatform ]
$Linux = $Runtime :: IsOSPlatform ( $OSPlatform :: Linux )
$OSX = $Runtime :: IsOSPlatform ( $OSPlatform :: OSX )
$Windows = $Runtime :: IsOSPlatform ( $OSPlatform :: Windows )
} catch [ System.Management.Automation.RuntimeException ] {
$Linux = $false
$OSX = $false
$Windows = $true
}
2016-02-22 08:21:04 +08:00
2016-02-22 07:06:39 +08:00
function Start-PSBuild
{
param (
2016-02-24 08:21:00 +08:00
[ switch ] $Restore ,
[ string ] $Output = " $PSScriptRoot /bin "
)
2016-02-22 07:06:39 +08: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 08:21:04 +08:00
New-Item -Force -Type Directory $Output | Out-Null
2016-02-22 07:06:39 +08:00
$Top = " $PSScriptRoot /src/Microsoft.PowerShell.Linux.Host "
if ( $Restore -Or -Not ( Test-Path " $Top /project.lock.json " ) ) {
2016-02-24 08:21:00 +08:00
dotnet restore $PSScriptRoot
2016-02-22 07:06:39 +08:00
}
if ( $Linux -Or $OSX ) {
$InstallCommand = if ( $Linux ) { " apt-get " } elseif ( $OSX ) { " brew " }
foreach ( $Dependency in " cmake " , " g++ " ) {
if ( -Not ( Get-Command $Dependency -ErrorAction SilentlyContinue ) ) {
throw " Build dependency ' $Dependency ' not found in PATH! Run ' $InstallCommand install $Dependency ' "
}
}
$Ext = if ( $Linux ) { " so " } elseif ( $OSX ) { " dylib " }
2016-02-24 08:21:00 +08:00
$Native = " $PSScriptRoot /src/libpsl-native "
$Lib = " $Native /src/libpsl-native. $Ext "
2016-02-22 07:06:39 +08:00
Write-Host " Building $Lib "
2016-02-25 03:50:56 +08:00
try {
pushd $Native
cmake -DCMAKE_BUILD_TYPE = Debug .
make -j
make test
} finally {
popd
}
2016-02-22 07:06:39 +08:00
if ( -Not ( Test-Path $Lib ) ) { throw " Compilation of $Lib failed " }
cp $Lib $Output
}
Write-Host " Building PowerShell "
$Configuration =
if ( $Linux -Or $OSX ) { " Linux " }
elseif ( $Windows ) { " Debug " }
dotnet publish -o $Output -c $Configuration -f " netstandardapp1.5 " $Top
}
2016-02-22 08:21:04 +08:00
function Start-PSPackage
{
2016-02-24 08:21:00 +08:00
# PowerShell packages use Semantic Versioning http://semver.org/
#
# Ubuntu and OS X packages are supported.
2016-02-22 08:21:04 +08:00
param (
2016-02-24 08:21:00 +08:00
[ string ] $Version ,
[ int ] $Iteration = 1
)
2016-02-22 08:21:04 +08:00
if ( $Windows ) { throw " Building Windows packages is not yet supported! " }
if ( -Not ( Get-Command " fpm " -ErrorAction SilentlyContinue ) ) {
throw " Build dependency 'fpm' not found in PATH! See: https://github.com/jordansissel/fpm "
}
2016-02-24 08:21:00 +08:00
if ( -Not ( Test-Path " $PSScriptRoot /bin/powershell " ) ) {
throw " Please Start-PSBuild to publish PowerShell "
}
2016-02-22 08:21:04 +08:00
2016-02-24 08:21:00 +08:00
# Change permissions for packaging
chmod -R go = u " $PSScriptRoot /bin "
2016-02-22 08:21:04 +08:00
2016-02-24 08:21:00 +08:00
# Decide package output type
2016-02-22 08:21:04 +08:00
$Output = if ( $Linux ) { " deb " } elseif ( $OSX ) { " osxpkg " }
2016-02-24 08:21:00 +08: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 08:21:04 +08: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 08:21:00 +08:00
" $PSScriptRoot /bin/=/usr/local/share/powershell/ " `
" $PSScriptRoot /package/powershell=/usr/local/bin "
2016-02-22 08:21:04 +08:00
}
2016-02-21 06:35:46 +08:00
function Start-DevPSGitHub
2016-02-04 02:53:43 +08:00
{
param (
[ switch ] $ZapDisable ,
[ string[] ] $ArgumentList = '' ,
[ switch ] $LoadProfile ,
2016-02-04 09:25:51 +08:00
[ string ] $binDir = " $PSScriptRoot \binFull " ,
[ switch ] $NoNewWindow
2016-02-04 02:53:43 +08:00
)
try
{
if ( $LoadProfile -eq $false )
{
2016-02-04 09:25:51 +08:00
$ArgumentList = @ ( '-noprofile' ) + $ArgumentList
2016-02-04 02:53:43 +08:00
}
$env:DEVPATH = $binDir
if ( $ZapDisable )
{
2016-02-22 07:06:39 +08:00
$env:COMPLUS_ZapDisable = 1
2016-02-04 02:53:43 +08:00
}
2016-02-22 07:06:39 +08:00
if ( -Not ( Test-Path $binDir \ powershell . exe . config ) )
2016-02-04 02:53:43 +08:00
{
$configContents = @"
2016-02-22 07:06:39 +08:00
< ? xml version = " 1.0 " encoding = " utf-8 " ? >
< configuration >
2016-02-04 02:53:43 +08:00
< runtime >
< developmentMode developerInstallation = " true " / >
< / runtime >
< / configuration >
" @
$configContents | Out-File -Encoding Ascii $binDir \ powershell . exe . config
}
2016-02-22 07:06:39 +08:00
# splatting for the win
2016-02-04 09:25:51 +08:00
$startProcessArgs = @ {
FilePath = " $binDir \powershell.exe "
ArgumentList = " $ArgumentList "
2016-02-22 07:06:39 +08:00
}
2016-02-05 05:19:24 +08:00
if ( $NoNewWindow ) {
$startProcessArgs . NoNewWindow = $true
$startProcessArgs . Wait = $true
}
2016-02-22 07:06:39 +08:00
2016-02-04 09:25:51 +08:00
Start-Process @startProcessArgs
2016-02-04 02:53:43 +08:00
}
finally
{
ri env : DEVPATH
if ( $ZapDisable )
{
ri env : COMPLUS_ZapDisable
}
}
2016-02-21 06:35:46 +08:00
}