Packaging: Try to make New-Unix package more readable (#5625)
* refactor start-pspackage into functions * [Package] Added instrumentation * [Package] update change log * [Package] Fix distribution parameter in get-dependecies * [Package] fix dependencies * [Package] fix issues with validate script
This commit is contained in:
parent
15e609caf3
commit
c367a9def1
|
@ -6,6 +6,7 @@
|
||||||
- Remove Pester as a module include with the PowerShell Packages.
|
- Remove Pester as a module include with the PowerShell Packages.
|
||||||
In the future, you should be able to add it by running `Install-Module Pester`. (#5623, #5631)
|
In the future, you should be able to add it by running `Install-Module Pester`. (#5623, #5631)
|
||||||
- Make Travis CI use `libcurl+openssl+gssapi` (#5629, @markekraus)
|
- Make Travis CI use `libcurl+openssl+gssapi` (#5629, @markekraus)
|
||||||
|
- Refactor `New-UnixPackaging` into functions to make the large function more readable. (#5625)
|
||||||
|
|
||||||
## v6.0.0-rc - 2017-11-16
|
## v6.0.0-rc - 2017-11-16
|
||||||
|
|
||||||
|
|
|
@ -582,28 +582,8 @@ function New-UnixPackage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($Dependency in "fpm", "ronn") {
|
# Verify depenecies are installed and in the path
|
||||||
if (!(precheck $Dependency "Package dependency '$Dependency' not found. Run Start-PSBootstrap -Package")) {
|
Test-Dependencies
|
||||||
# These tools are not added to the path automatically on OpenSUSE 13.2
|
|
||||||
# try adding them to the path and re-tesing first
|
|
||||||
[string] $gemsPath = $null
|
|
||||||
[string] $depenencyPath = $null
|
|
||||||
$gemsPath = Get-ChildItem -Path /usr/lib64/ruby/gems | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName
|
|
||||||
if($gemsPath) {
|
|
||||||
$depenencyPath = Get-ChildItem -Path (Join-Path -Path $gemsPath -ChildPath "gems" -AdditionalChildPath $Dependency) -Recurse | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty DirectoryName
|
|
||||||
$originalPath = $env:PATH
|
|
||||||
$env:PATH = $ENV:PATH +":" + $depenencyPath
|
|
||||||
if((precheck $Dependency "Package dependency '$Dependency' not found. Run Start-PSBootstrap -Package")) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$env:PATH = $originalPath
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw "Dependency precheck failed!"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$Description = $packagingStrings.Description
|
$Description = $packagingStrings.Description
|
||||||
|
|
||||||
|
@ -633,31 +613,14 @@ function New-UnixPackage {
|
||||||
} elseif ($Environment.IsMacOS) {
|
} elseif ($Environment.IsMacOS) {
|
||||||
"/usr/local/bin"
|
"/usr/local/bin"
|
||||||
}
|
}
|
||||||
|
$linkSource = "/tmp/pwsh"
|
||||||
|
|
||||||
if($pscmdlet.ShouldProcess("Create package file system"))
|
if($pscmdlet.ShouldProcess("Create package file system"))
|
||||||
{
|
{
|
||||||
New-Item -Force -ItemType SymbolicLink -Path "/tmp/pwsh" -Target "$Destination/pwsh" >$null
|
New-Item -Force -ItemType SymbolicLink -Path $linkSource -Target "$Destination/pwsh" >$null
|
||||||
|
|
||||||
if ($Environment.IsRedHatFamily) {
|
|
||||||
# add two symbolic links to system shared libraries that libmi.so is dependent on to handle
|
|
||||||
# platform specific changes. This is the only set of platforms needed for this currently
|
|
||||||
# as Ubuntu has these specific library files in the platform and macOS builds for itself
|
|
||||||
# against the correct versions.
|
|
||||||
New-Item -Force -ItemType SymbolicLink -Target "/lib64/libssl.so.10" -Path "$Staging/libssl.so.1.0.0" >$null
|
|
||||||
New-Item -Force -ItemType SymbolicLink -Target "/lib64/libcrypto.so.10" -Path "$Staging/libcrypto.so.1.0.0" >$null
|
|
||||||
|
|
||||||
$AfterInstallScript = [io.path]::GetTempFileName()
|
|
||||||
$AfterRemoveScript = [io.path]::GetTempFileName()
|
|
||||||
$packagingStrings.RedHatAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii
|
|
||||||
$packagingStrings.RedHatAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii
|
|
||||||
}
|
|
||||||
elseif ($Environment.IsUbuntu -or $Environment.IsDebian) {
|
|
||||||
$AfterInstallScript = [io.path]::GetTempFileName()
|
|
||||||
$AfterRemoveScript = [io.path]::GetTempFileName()
|
|
||||||
$packagingStrings.UbuntuAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii
|
|
||||||
$packagingStrings.UbuntuAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# Generate After Install and After Remove scripts
|
||||||
|
$AfterScriptInfo = New-AfterScripts
|
||||||
|
|
||||||
# there is a weird bug in fpm
|
# there is a weird bug in fpm
|
||||||
# if the target of the powershell symlink exists, `fpm` aborts
|
# if the target of the powershell symlink exists, `fpm` aborts
|
||||||
|
@ -672,30 +635,259 @@ function New-UnixPackage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# run ronn to convert man page to roff
|
# Generate gzip of man file
|
||||||
$RonnFile = Join-Path $PSScriptRoot "/../../assets/pwsh.1.ronn"
|
$ManGzipInfo = New-ManGzip
|
||||||
$RoffFile = $RonnFile -replace "\.ronn$"
|
|
||||||
|
|
||||||
# Run ronn on assets file
|
|
||||||
# Run does not play well with files named powershell6.0.1, so we generate and then rename
|
|
||||||
Start-NativeExecution { ronn --roff $RonnFile }
|
|
||||||
|
|
||||||
# gzip in assets directory
|
|
||||||
$GzipFile = "$RoffFile.gz"
|
|
||||||
Start-NativeExecution { gzip -f $RoffFile }
|
|
||||||
|
|
||||||
$ManFile = Join-Path "/usr/local/share/man/man1" (Split-Path -Leaf $GzipFile)
|
|
||||||
|
|
||||||
# Change permissions for packaging
|
# Change permissions for packaging
|
||||||
Start-NativeExecution {
|
Start-NativeExecution {
|
||||||
find $Staging -type d | xargs chmod 755
|
find $Staging -type d | xargs chmod 755
|
||||||
find $Staging -type f | xargs chmod 644
|
find $Staging -type f | xargs chmod 644
|
||||||
chmod 644 $GzipFile
|
chmod 644 $ManGzipInfo.GzipFile
|
||||||
chmod 755 "$Staging/pwsh" # only the executable should be executable
|
chmod 755 "$Staging/pwsh" # only the executable should be executable
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Add macOS powershell launcher
|
||||||
|
if($Type -eq "osxpkg")
|
||||||
|
{
|
||||||
|
if($pscmdlet.ShouldProcess("Add macOS launch application"))
|
||||||
|
{
|
||||||
|
# Generate launcher app folder
|
||||||
|
$appsfolder = New-MacOSLauncher -Version $Version
|
||||||
|
$Arguments += "$appsfolder=/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$packageDependenciesParams = @{}
|
||||||
|
if($DebDistro)
|
||||||
|
{
|
||||||
|
$packageDependenciesParams['Distribution']=$DebDistro
|
||||||
|
}
|
||||||
|
|
||||||
# Setup package dependencies
|
# Setup package dependencies
|
||||||
|
$Dependencies = @(Get-PackageDependencies @packageDependenciesParams)
|
||||||
|
|
||||||
|
$Arguments = Get-FpmArguments `
|
||||||
|
-Name $Name `
|
||||||
|
-Version $Version `
|
||||||
|
-Iteration $Iteration `
|
||||||
|
-Description $Description `
|
||||||
|
-Type $Type `
|
||||||
|
-Dependencies $Dependencies `
|
||||||
|
-AfterInstallScript $AfterScriptInfo.AfterInstallScript `
|
||||||
|
-AfterRemoveScript $AfterScriptInfo.AfterRemoveScript `
|
||||||
|
-Staging $Staging `
|
||||||
|
-Destination $Destination `
|
||||||
|
-ManGzipFile $ManGzipInfo.GzipFile `
|
||||||
|
-ManDestination $ManGzipInfo.ManFile `
|
||||||
|
-LinkSource $LinkSource `
|
||||||
|
-LinkDestination $Link
|
||||||
|
|
||||||
|
# Build package
|
||||||
|
try {
|
||||||
|
if($pscmdlet.ShouldProcess("Create $type package")) {
|
||||||
|
$Output = Start-NativeExecution { fpm $Arguments }
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if ($Environment.IsMacOS) {
|
||||||
|
if($pscmdlet.ShouldProcess("Cleanup macOS launcher"))
|
||||||
|
{
|
||||||
|
Clear-MacOSLauncher
|
||||||
|
}
|
||||||
|
|
||||||
|
# this is continuation of a fpm hack for a weird bug
|
||||||
|
if (Test-Path $hack_dest) {
|
||||||
|
Write-Warning "Move $hack_dest to $symlink_dest (fpm utime bug)"
|
||||||
|
Move-Item $hack_dest $symlink_dest
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($AfterScriptInfo.AfterInstallScript) {
|
||||||
|
Remove-Item -erroraction 'silentlycontinue' $AfterScriptInfo.AfterInstallScript
|
||||||
|
}
|
||||||
|
if ($AfterScriptInfo.AfterRemoveScript) {
|
||||||
|
Remove-Item -erroraction 'silentlycontinue' $AfterScriptInfo.AfterRemoveScript
|
||||||
|
}
|
||||||
|
Remove-Item -Path $ManGzipInfo.GzipFile -Force -ErrorAction SilentlyContinue
|
||||||
|
}
|
||||||
|
|
||||||
|
# Magic to get path output
|
||||||
|
$createdPackage = Get-Item (Join-Path $PWD (($Output[-1] -split ":path=>")[-1] -replace '["{}]'))
|
||||||
|
|
||||||
|
if ($Environment.IsMacOS) {
|
||||||
|
if ($pscmdlet.ShouldProcess("Fix package name"))
|
||||||
|
{
|
||||||
|
# Add the OS information to the macOS package file name.
|
||||||
|
$packageExt = [System.IO.Path]::GetExtension($createdPackage.Name)
|
||||||
|
$packageNameWithoutExt = [System.IO.Path]::GetFileNameWithoutExtension($createdPackage.Name)
|
||||||
|
|
||||||
|
$newPackageName = "{0}-{1}{2}" -f $packageNameWithoutExt, $script:Options.Runtime, $packageExt
|
||||||
|
$newPackagePath = Join-Path $createdPackage.DirectoryName $newPackageName
|
||||||
|
|
||||||
|
# -Force is not deleting the NewName if it exists, so delete it if it does
|
||||||
|
if ($Force -and (Test-Path -Path $newPackagePath))
|
||||||
|
{
|
||||||
|
Remove-Item -Force $newPackagePath
|
||||||
|
}
|
||||||
|
|
||||||
|
$createdPackage = Rename-Item -Path $createdPackage.FullName -NewName $newPackagePath -PassThru -ErrorAction Stop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Test-Path $createdPackage)
|
||||||
|
{
|
||||||
|
Write-Verbose "Created package: $createdPackage" -Verbose
|
||||||
|
return $createdPackage
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw "Failed to create $createdPackage"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Get-FpmArguments
|
||||||
|
{
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory,HelpMessage='Package Name')]
|
||||||
|
[String]$Name,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Package Version')]
|
||||||
|
[String]$Version,
|
||||||
|
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[String]$Iteration,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Package description')]
|
||||||
|
[String]$Description,
|
||||||
|
|
||||||
|
# From start-PSPackage without modification, already validated
|
||||||
|
# Values: deb, rpm, osxpkg
|
||||||
|
[Parameter(Mandatory,HelpMessage='Installer Type')]
|
||||||
|
[String]$Type,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Staging folder for installation files')]
|
||||||
|
[String]$Staging,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Install path on target machine')]
|
||||||
|
[String]$Destination,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='The built and gzipped man file.')]
|
||||||
|
[String]$ManGzipFile,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='The destination of the man file')]
|
||||||
|
[String]$ManDestination,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Symlink to powershell executable')]
|
||||||
|
[String]$LinkSource,
|
||||||
|
|
||||||
|
[Parameter(Mandatory,HelpMessage='Destination for symlink to powershell executable')]
|
||||||
|
[String]$LinkDestination,
|
||||||
|
|
||||||
|
[Parameter(HelpMessage='Packages required to install this package. Not applicable for MacOS.')]
|
||||||
|
[ValidateScript({
|
||||||
|
if (!$Environment.IsMacOS -and $_.Count -eq 0)
|
||||||
|
{
|
||||||
|
throw "Must not be null or empty on this environment."
|
||||||
|
}
|
||||||
|
return $true
|
||||||
|
})]
|
||||||
|
[String[]]$Dependencies,
|
||||||
|
|
||||||
|
[Parameter(HelpMessage='Script to run after the package installation.')]
|
||||||
|
[AllowNull()]
|
||||||
|
[ValidateScript({
|
||||||
|
if (!$Environment.IsMacOS -and !$_)
|
||||||
|
{
|
||||||
|
throw "Must not be null on this environment."
|
||||||
|
}
|
||||||
|
return $true
|
||||||
|
})]
|
||||||
|
[String]$AfterInstallScript,
|
||||||
|
|
||||||
|
[Parameter(HelpMessage='Script to run after the package removal.')]
|
||||||
|
[AllowNull()]
|
||||||
|
[ValidateScript({
|
||||||
|
if (!$Environment.IsMacOS -and !$_)
|
||||||
|
{
|
||||||
|
throw "Must not be null on this environment."
|
||||||
|
}
|
||||||
|
return $true
|
||||||
|
})]
|
||||||
|
[String]$AfterRemoveScript
|
||||||
|
)
|
||||||
|
|
||||||
|
$Arguments = @(
|
||||||
|
"--force", "--verbose",
|
||||||
|
"--name", $Name,
|
||||||
|
"--version", $Version,
|
||||||
|
"--iteration", $Iteration,
|
||||||
|
"--maintainer", "PowerShell Team <PowerShellTeam@hotmail.com>",
|
||||||
|
"--vendor", "Microsoft Corporation",
|
||||||
|
"--url", "https://microsoft.com/powershell",
|
||||||
|
"--license", "MIT License",
|
||||||
|
"--description", $Description,
|
||||||
|
"--category", "shells",
|
||||||
|
"-t", $Type,
|
||||||
|
"-s", "dir"
|
||||||
|
)
|
||||||
|
if ($Environment.IsRedHatFamily) {
|
||||||
|
$Arguments += @("--rpm-dist", "rhel.7")
|
||||||
|
$Arguments += @("--rpm-os", "linux")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($Environment.IsMacOS) {
|
||||||
|
$Arguments += @("--osxpkg-identifier-prefix", "com.microsoft")
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($Dependency in $Dependencies) {
|
||||||
|
$Arguments += @("--depends", $Dependency)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($AfterInstallScript) {
|
||||||
|
$Arguments += @("--after-install", $AfterInstallScript)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($AfterRemoveScript) {
|
||||||
|
$Arguments += @("--after-remove", $AfterRemoveScript)
|
||||||
|
}
|
||||||
|
|
||||||
|
$Arguments += @(
|
||||||
|
"$Staging/=$Destination/",
|
||||||
|
"$ManGzipFile=$ManDestination",
|
||||||
|
"$LinkSource=$LinkDestination"
|
||||||
|
)
|
||||||
|
|
||||||
|
return $Arguments
|
||||||
|
}
|
||||||
|
|
||||||
|
function Test-Distribution
|
||||||
|
{
|
||||||
|
param(
|
||||||
|
[String]
|
||||||
|
$Distribution
|
||||||
|
)
|
||||||
|
|
||||||
|
if ( ($Environment.IsUbuntu -or $Environment.IsDebian) -and !$Distribution )
|
||||||
|
{
|
||||||
|
throw "$Distribution is required for a Debian based distribution."
|
||||||
|
}
|
||||||
|
|
||||||
|
if($Script:DebianDistributions -notcontains $Distribution)
|
||||||
|
{
|
||||||
|
throw "$Distribution should be one of the following: $Script:DebianDistributions"
|
||||||
|
}
|
||||||
|
return $true
|
||||||
|
}
|
||||||
|
function Get-PackageDependencies
|
||||||
|
{
|
||||||
|
param(
|
||||||
|
[String]
|
||||||
|
[ValidateScript({Test-Distribution -Distribution $_})]
|
||||||
|
$Distribution
|
||||||
|
)
|
||||||
|
|
||||||
|
End {
|
||||||
# These should match those in the Dockerfiles, but exclude tools like Git, which, and curl
|
# These should match those in the Dockerfiles, but exclude tools like Git, which, and curl
|
||||||
$Dependencies = @()
|
$Dependencies = @()
|
||||||
if ($Environment.IsUbuntu -or $Environment.IsDebian) {
|
if ($Environment.IsUbuntu -or $Environment.IsDebian) {
|
||||||
|
@ -711,13 +903,13 @@ function New-UnixPackage {
|
||||||
"zlib1g"
|
"zlib1g"
|
||||||
)
|
)
|
||||||
|
|
||||||
switch ($DebDistro) {
|
switch ($Distribution) {
|
||||||
"ubuntu.14.04" { $Dependencies += @("libssl1.0.0", "libicu52") }
|
"ubuntu.14.04" { $Dependencies += @("libssl1.0.0", "libicu52") }
|
||||||
"ubuntu.16.04" { $Dependencies += @("libssl1.0.0", "libicu55") }
|
"ubuntu.16.04" { $Dependencies += @("libssl1.0.0", "libicu55") }
|
||||||
"ubuntu.17.04" { $Dependencies += @("libssl1.0.0", "libicu57") }
|
"ubuntu.17.04" { $Dependencies += @("libssl1.0.0", "libicu57") }
|
||||||
"debian.8" { $Dependencies += @("libssl1.0.0", "libicu52") }
|
"debian.8" { $Dependencies += @("libssl1.0.0", "libicu52") }
|
||||||
"debian.9" { $Dependencies += @("libssl1.0.2", "libicu57") }
|
"debian.9" { $Dependencies += @("libssl1.0.2", "libicu57") }
|
||||||
default { throw "Debian distro '$DebDistro' is not supported." }
|
default { throw "Debian distro '$Distribution' is not supported." }
|
||||||
}
|
}
|
||||||
} elseif ($Environment.IsRedHatFamily) {
|
} elseif ($Environment.IsRedHatFamily) {
|
||||||
$Dependencies = @(
|
$Dependencies = @(
|
||||||
|
@ -728,157 +920,154 @@ function New-UnixPackage {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
$Arguments = @(
|
return $Dependencies
|
||||||
"--force", "--verbose",
|
}
|
||||||
"--name", $Name,
|
}
|
||||||
"--version", $Version,
|
|
||||||
"--iteration", $Iteration,
|
|
||||||
"--maintainer", "PowerShell Team <PowerShellTeam@hotmail.com>",
|
|
||||||
"--vendor", "Microsoft Corporation",
|
|
||||||
"--url", "https://microsoft.com/powershell",
|
|
||||||
"--license", "MIT License",
|
|
||||||
"--description", $Description,
|
|
||||||
"--category", "shells",
|
|
||||||
"-t", $Type,
|
|
||||||
"-s", "dir"
|
|
||||||
)
|
|
||||||
if ($Environment.IsRedHatFamily) {
|
|
||||||
$Arguments += @("--rpm-dist", "rhel.7")
|
|
||||||
$Arguments += @("--rpm-os", "linux")
|
|
||||||
}
|
|
||||||
if ($Environment.IsMacOS) {
|
|
||||||
$Arguments += @("--osxpkg-identifier-prefix", "com.microsoft")
|
|
||||||
}
|
|
||||||
foreach ($Dependency in $Dependencies) {
|
|
||||||
$Arguments += @("--depends", $Dependency)
|
|
||||||
}
|
|
||||||
if ($AfterInstallScript) {
|
|
||||||
$Arguments += @("--after-install", $AfterInstallScript)
|
|
||||||
}
|
|
||||||
if ($AfterRemoveScript) {
|
|
||||||
$Arguments += @("--after-remove", $AfterRemoveScript)
|
|
||||||
}
|
|
||||||
$Arguments += @(
|
|
||||||
"$Staging/=$Destination/",
|
|
||||||
"$GzipFile=$ManFile",
|
|
||||||
"/tmp/pwsh=$Link"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Add macOS powershell launcher
|
function Test-Dependencies
|
||||||
if($Type -eq "osxpkg")
|
{
|
||||||
{
|
foreach ($Dependency in "fpm", "ronn") {
|
||||||
if($pscmdlet.ShouldProcess("Add macOS launch application")) {
|
if (!(precheck $Dependency "Package dependency '$Dependency' not found. Run Start-PSBootstrap -Package")) {
|
||||||
# Define folder for launch application.
|
# These tools are not added to the path automatically on OpenSUSE 13.2
|
||||||
$macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app"
|
# try adding them to the path and re-tesing first
|
||||||
|
[string] $gemsPath = $null
|
||||||
# Update icns file.
|
[string] $depenencyPath = $null
|
||||||
$iconfile = "$PSScriptRoot/../../assets/Powershell.icns"
|
$gemsPath = Get-ChildItem -Path /usr/lib64/ruby/gems | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty FullName
|
||||||
$iconfilebase = (Get-Item -Path $iconfile).BaseName
|
if($gemsPath) {
|
||||||
|
$depenencyPath = Get-ChildItem -Path (Join-Path -Path $gemsPath -ChildPath "gems" -AdditionalChildPath $Dependency) -Recurse | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1 -ExpandProperty DirectoryName
|
||||||
# Create Resources folder, ignore error if exists.
|
$originalPath = $env:PATH
|
||||||
New-Item -Force -ItemType Directory -Path "$macosapp/Contents/Resources" | Out-Null
|
$env:PATH = $ENV:PATH +":" + $depenencyPath
|
||||||
Copy-Item -Force -Path $iconfile -Destination "$macosapp/Contents/Resources"
|
if((precheck $Dependency "Package dependency '$Dependency' not found. Run Start-PSBootstrap -Package")) {
|
||||||
|
continue
|
||||||
# Set values in plist.
|
|
||||||
$plist = "$macosapp/Contents/Info.plist"
|
|
||||||
Start-NativeExecution {
|
|
||||||
defaults write $plist CFBundleIdentifier com.microsoft.powershell
|
|
||||||
defaults write $plist CFBundleVersion $Version
|
|
||||||
defaults write $plist CFBundleShortVersionString $Version
|
|
||||||
defaults write $plist CFBundleGetInfoString $Version
|
|
||||||
defaults write $plist CFBundleIconFile $iconfilebase
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
# Convert to XML plist, needed because defaults native
|
$env:PATH = $originalPath
|
||||||
# app auto converts it to binary format when it modify
|
|
||||||
# the plist file.
|
|
||||||
Start-NativeExecution {
|
|
||||||
plutil -convert xml1 $plist
|
|
||||||
}
|
|
||||||
|
|
||||||
# Set permissions for plist and shell script. Note that
|
|
||||||
# defaults native app sets 700 when writing to the plist
|
|
||||||
# file from above. Both of these will be reset post fpm.
|
|
||||||
$shellscript = "$macosapp/Contents/MacOS/PowerShell.sh"
|
|
||||||
Start-NativeExecution {
|
|
||||||
chmod 644 $plist
|
|
||||||
chmod 755 $shellscript
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add app folder to fpm paths.
|
|
||||||
$appsfolder = (Resolve-Path -Path "$macosapp/..").Path
|
|
||||||
$Arguments += "$appsfolder=/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Build package
|
|
||||||
try {
|
|
||||||
if($pscmdlet.ShouldProcess("Create $type package")) {
|
|
||||||
$Output = Start-NativeExecution { fpm $Arguments }
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
if ($Environment.IsMacOS) {
|
|
||||||
if($pscmdlet.ShouldProcess("Cleanup macOS launcher"))
|
|
||||||
{
|
|
||||||
# This is needed to prevent installer from picking up
|
|
||||||
# the launcher app in the build structure and updating
|
|
||||||
# it which locks out subsequent package builds due to
|
|
||||||
# increase permissions.
|
|
||||||
$macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app"
|
|
||||||
$plist = "$macosapp/Contents/Info.plist"
|
|
||||||
$tempguid = (New-Guid).Guid
|
|
||||||
Start-NativeExecution {
|
|
||||||
defaults write $plist CFBundleIdentifier $tempguid
|
|
||||||
plutil -convert xml1 $plist
|
|
||||||
}
|
|
||||||
|
|
||||||
# Restore default permissions.
|
|
||||||
$shellscript = "$macosapp/Contents/MacOS/PowerShell.sh"
|
|
||||||
Start-NativeExecution {
|
|
||||||
chmod 644 $shellscript
|
|
||||||
chmod 644 $plist
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# this is continuation of a fpm hack for a weird bug
|
|
||||||
if (Test-Path $hack_dest) {
|
|
||||||
Write-Warning "Move $hack_dest to $symlink_dest (fpm utime bug)"
|
|
||||||
Move-Item $hack_dest $symlink_dest
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($AfterInstallScript) {
|
|
||||||
Remove-Item -erroraction 'silentlycontinue' $AfterInstallScript
|
|
||||||
}
|
|
||||||
if ($AfterRemoveScript) {
|
|
||||||
Remove-Item -erroraction 'silentlycontinue' $AfterRemoveScript
|
|
||||||
}
|
|
||||||
Remove-Item -Path $GzipFile -Force -ErrorAction SilentlyContinue
|
|
||||||
}
|
|
||||||
|
|
||||||
# Magic to get path output
|
throw "Dependency precheck failed!"
|
||||||
$createdPackage = Get-Item (Join-Path $PWD (($Output[-1] -split ":path=>")[-1] -replace '["{}]'))
|
|
||||||
|
|
||||||
if ($Environment.IsMacOS) {
|
|
||||||
if($pscmdlet.ShouldProcess("Fix package name"))
|
|
||||||
{
|
|
||||||
# Add the OS information to the macOS package file name.
|
|
||||||
$packageExt = [System.IO.Path]::GetExtension($createdPackage.Name)
|
|
||||||
$packageNameWithoutExt = [System.IO.Path]::GetFileNameWithoutExtension($createdPackage.Name)
|
|
||||||
|
|
||||||
$newPackageName = "{0}-{1}{2}" -f $packageNameWithoutExt, $script:Options.Runtime, $packageExt
|
|
||||||
$newPackagePath = Join-Path $createdPackage.DirectoryName $newPackageName
|
|
||||||
$createdPackage = Rename-Item $createdPackage.FullName $newPackagePath -PassThru -Force:$Force
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (Test-Path $createdPackage)
|
function New-AfterScripts
|
||||||
{
|
{
|
||||||
return $createdPackage
|
if ($Environment.IsRedHatFamily) {
|
||||||
}
|
# add two symbolic links to system shared libraries that libmi.so is dependent on to handle
|
||||||
else
|
# platform specific changes. This is the only set of platforms needed for this currently
|
||||||
{
|
# as Ubuntu has these specific library files in the platform and macOS builds for itself
|
||||||
throw "Failed to create $createdPackage"
|
# against the correct versions.
|
||||||
}
|
New-Item -Force -ItemType SymbolicLink -Target "/lib64/libssl.so.10" -Path "$Staging/libssl.so.1.0.0" >$null
|
||||||
|
New-Item -Force -ItemType SymbolicLink -Target "/lib64/libcrypto.so.10" -Path "$Staging/libcrypto.so.1.0.0" >$null
|
||||||
|
|
||||||
|
$AfterInstallScript = [io.path]::GetTempFileName()
|
||||||
|
$AfterRemoveScript = [io.path]::GetTempFileName()
|
||||||
|
$packagingStrings.RedHatAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii
|
||||||
|
$packagingStrings.RedHatAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii
|
||||||
|
}
|
||||||
|
elseif ($Environment.IsUbuntu -or $Environment.IsDebian) {
|
||||||
|
$AfterInstallScript = [io.path]::GetTempFileName()
|
||||||
|
$AfterRemoveScript = [io.path]::GetTempFileName()
|
||||||
|
$packagingStrings.UbuntuAfterInstallScript -f "$Link/pwsh" | Out-File -FilePath $AfterInstallScript -Encoding ascii
|
||||||
|
$packagingStrings.UbuntuAfterRemoveScript -f "$Link/pwsh" | Out-File -FilePath $AfterRemoveScript -Encoding ascii
|
||||||
|
}
|
||||||
|
|
||||||
|
return [PSCustomObject] @{
|
||||||
|
AfterInstallScript = $AfterInstallScript
|
||||||
|
AfterRemoveScript = $AfterRemoveScript
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function New-ManGzip
|
||||||
|
{
|
||||||
|
# run ronn to convert man page to roff
|
||||||
|
$RonnFile = Join-Path $PSScriptRoot "/../../assets/pwsh.1.ronn"
|
||||||
|
$RoffFile = $RonnFile -replace "\.ronn$"
|
||||||
|
|
||||||
|
# Run ronn on assets file
|
||||||
|
# Run does not play well with files named powershell6.0.1, so we generate and then rename
|
||||||
|
Start-NativeExecution { ronn --roff $RonnFile }
|
||||||
|
|
||||||
|
# gzip in assets directory
|
||||||
|
$GzipFile = "$RoffFile.gz"
|
||||||
|
Start-NativeExecution { gzip -f $RoffFile }
|
||||||
|
|
||||||
|
$ManFile = Join-Path "/usr/local/share/man/man1" (Split-Path -Leaf $GzipFile)
|
||||||
|
|
||||||
|
return [PSCustomObject ] @{
|
||||||
|
GZipFile = $GzipFile
|
||||||
|
ManFile = $ManFile
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function New-MacOSLauncher
|
||||||
|
{
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory)]
|
||||||
|
[String]$Version
|
||||||
|
)
|
||||||
|
|
||||||
|
# Define folder for launch application.
|
||||||
|
$macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app"
|
||||||
|
|
||||||
|
# Update icns file.
|
||||||
|
$iconfile = "$PSScriptRoot/../../assets/Powershell.icns"
|
||||||
|
$iconfilebase = (Get-Item -Path $iconfile).BaseName
|
||||||
|
|
||||||
|
# Create Resources folder, ignore error if exists.
|
||||||
|
New-Item -Force -ItemType Directory -Path "$macosapp/Contents/Resources" | Out-Null
|
||||||
|
Copy-Item -Force -Path $iconfile -Destination "$macosapp/Contents/Resources"
|
||||||
|
|
||||||
|
# Set values in plist.
|
||||||
|
$plist = "$macosapp/Contents/Info.plist"
|
||||||
|
Start-NativeExecution {
|
||||||
|
defaults write $plist CFBundleIdentifier com.microsoft.powershell
|
||||||
|
defaults write $plist CFBundleVersion $Version
|
||||||
|
defaults write $plist CFBundleShortVersionString $Version
|
||||||
|
defaults write $plist CFBundleGetInfoString $Version
|
||||||
|
defaults write $plist CFBundleIconFile $iconfilebase
|
||||||
|
}
|
||||||
|
|
||||||
|
# Convert to XML plist, needed because defaults native
|
||||||
|
# app auto converts it to binary format when it modify
|
||||||
|
# the plist file.
|
||||||
|
Start-NativeExecution {
|
||||||
|
plutil -convert xml1 $plist
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set permissions for plist and shell script. Note that
|
||||||
|
# defaults native app sets 700 when writing to the plist
|
||||||
|
# file from above. Both of these will be reset post fpm.
|
||||||
|
$shellscript = "$macosapp/Contents/MacOS/PowerShell.sh"
|
||||||
|
Start-NativeExecution {
|
||||||
|
chmod 644 $plist
|
||||||
|
chmod 755 $shellscript
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add app folder to fpm paths.
|
||||||
|
$appsfolder = (Resolve-Path -Path "$macosapp/..").Path
|
||||||
|
|
||||||
|
return $appsfolder
|
||||||
|
}
|
||||||
|
|
||||||
|
function Clear-MacOSLauncher
|
||||||
|
{
|
||||||
|
# This is needed to prevent installer from picking up
|
||||||
|
# the launcher app in the build structure and updating
|
||||||
|
# it which locks out subsequent package builds due to
|
||||||
|
# increase permissions.
|
||||||
|
$macosapp = "$PSScriptRoot/macos/launcher/ROOT/Applications/Powershell.app"
|
||||||
|
$plist = "$macosapp/Contents/Info.plist"
|
||||||
|
$tempguid = (New-Guid).Guid
|
||||||
|
Start-NativeExecution {
|
||||||
|
defaults write $plist CFBundleIdentifier $tempguid
|
||||||
|
plutil -convert xml1 $plist
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restore default permissions.
|
||||||
|
$shellscript = "$macosapp/Contents/MacOS/PowerShell.sh"
|
||||||
|
Start-NativeExecution {
|
||||||
|
chmod 644 $shellscript
|
||||||
|
chmod 644 $plist
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue