2020-04-29 10:57:27 +03:00
using module " ./builders/python-builder.psm1 "
class NixPythonBuilder : PythonBuilder {
<#
. SYNOPSIS
Base Python builder class for *Nix systems .
. DESCRIPTION
Contains methods that required to build Python artifact for *nix systems . Inherited from base PythonBuilder class .
. PARAMETER version
The version of Python that should be built .
. PARAMETER Platform
The type of platform for which Python should be built .
. PARAMETER PlatformVersion
The version of platform for which Python should be built .
. PARAMETER InstallationTemplateName
The name of template that will be used to create installation script for generated Python artifact .
. PARAMETER InstallationScriptName
The name of installation script that will be generated for Python artifact .
. PARAMETER OutputArtifactName
The name of archive with Python binaries that will be generated as part of Python artifact .
#>
[ string ] $InstallationTemplateName
[ string ] $InstallationScriptName
[ string ] $OutputArtifactName
NixPythonBuilder (
2020-07-15 13:13:21 +03:00
[ semver ] $version ,
2020-04-29 10:57:27 +03:00
[ string ] $architecture ,
[ string ] $platform
) : Base ( $version , $architecture , $platform ) {
$this . InstallationTemplateName = " nix-setup-template.sh "
$this . InstallationScriptName = " setup.sh "
$this . OutputArtifactName = " python- $Version - $Platform - $Architecture .tar.gz "
}
[ uri ] GetSourceUri ( ) {
<#
. SYNOPSIS
Get base Python URI and return complete URI for Python sources .
#>
$base = $this . GetBaseUri ( )
2020-07-15 13:13:21 +03:00
$versionName = $this . GetBaseVersion ( )
$nativeVersion = Convert-Version -version $this . Version
2020-04-29 10:57:27 +03:00
2020-07-15 13:13:21 +03:00
return " ${base} / ${versionName} /Python- ${nativeVersion} .tgz "
2020-04-29 10:57:27 +03:00
}
[ string ] GetPythonBinary ( ) {
<#
. SYNOPSIS
Return name of Python binary .
#>
if ( $this . Version . Major -eq 2 ) { $pythonBinary = " python " } else { $pythonBinary = " python3 " }
return $pythonBinary
}
[ string ] Download ( ) {
<#
. SYNOPSIS
Download Python sources and extract them at temporary work folder . Returns expanded archive location path .
#>
$sourceUri = $this . GetSourceUri ( )
Write-Host " Sources URI: $sourceUri "
$archiveFilepath = Download-File -Uri $sourceUri -OutputFolder $this . WorkFolderLocation
$expandedSourceLocation = Join-Path -Path $this . TempFolderLocation -ChildPath " SourceCode "
New-Item -Path $expandedSourceLocation -ItemType Directory
Extract-TarArchive -ArchivePath $archiveFilepath -OutputDirectory $expandedSourceLocation
Write-Debug " Done; Sources location: $expandedSourceLocation "
return $expandedSourceLocation
}
[ void ] CreateInstallationScript ( ) {
<#
. SYNOPSIS
Create Python artifact installation script based on template specified in InstallationTemplateName property .
#>
$installationScriptLocation = New-Item -Path $this . WorkFolderLocation -Name $this . InstallationScriptName -ItemType File
$installationTemplateLocation = Join-Path -Path $this . InstallationTemplatesLocation -ChildPath $this . InstallationTemplateName
$installationTemplateContent = Get-Content -Path $installationTemplateLocation -Raw
2020-05-05 09:44:58 +03:00
$variablesToReplace = @ {
2020-07-15 13:13:21 +03:00
" {{__VERSION_FULL__}} " = $this . Version ;
2020-05-05 09:44:58 +03:00
}
$variablesToReplace . keys | ForEach-Object { $installationTemplateContent = $installationTemplateContent . Replace ( $_ , $variablesToReplace [ $_ ] ) }
2020-04-29 10:57:27 +03:00
$installationTemplateContent | Out-File -FilePath $installationScriptLocation
Write-Debug " Done; Installation script location: $installationScriptLocation ) "
}
[ void ] Make ( ) {
<#
. SYNOPSIS
Executes "make" and "make install" commands for configured build sources . Make output will be writen in build_output . txt located in artifact location folder .
#>
Write-Debug " make Python $( $this . Version ) - $( $this . Architecture ) $( $this . Platform ) "
$buildOutputLocation = New-Item -Path $this . WorkFolderLocation -Name " build_output.txt " -ItemType File
Execute-Command -Command " make 2>&1 | tee $buildOutputLocation " -ErrorAction Continue
Execute-Command -Command " make install " -ErrorAction Continue
Write-Debug " Done; Make log location: $buildOutputLocation "
}
[ void ] CopyBuildResults ( ) {
$buildFolder = $this . GetFullPythonToolcacheLocation ( )
Move-Item -Path " $buildFolder /* " -Destination $this . WorkFolderLocation
}
[ void ] ArchiveArtifact ( ) {
$OutputPath = Join-Path $this . ArtifactFolderLocation $this . OutputArtifactName
Create-TarArchive -SourceFolder $this . WorkFolderLocation -ArchivePath $OutputPath
}
[ void ] Build ( ) {
<#
. SYNOPSIS
Build Python artifact from sources .
#>
Write-Host " Prepare Python Hostedtoolcache location... "
$this . PreparePythonToolcacheLocation ( )
Write-Host " Prepare system environment... "
$this . PrepareEnvironment ( )
Write-Host " Download Python $( $this . Version ) [ $( $this . Architecture ) ] sources... "
$sourcesLocation = $this . Download ( )
Push-Location -Path $sourcesLocation
Write-Host " Configure for $( $this . Platform ) ... "
$this . Configure ( )
Write-Host " Make for $( $this . Platform ) ... "
$this . Make ( )
Pop-Location
Write-Host " Generate structure dump "
New-ToolStructureDump -ToolPath $this . GetFullPythonToolcacheLocation ( ) -OutputFolder $this . WorkFolderLocation
Write-Host " Copying build results to destination location "
$this . CopyBuildResults ( )
Write-Host " Create installation script... "
$this . CreateInstallationScript ( )
Write-Host " Archive artifact... "
$this . ArchiveArtifact ( )
}
}