summarylogtreecommitdiffstats
path: root/PKGBUILD
blob: 5ab3c957d74e09e52a389c9381f122f69a3b0c06 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# Maintainer: Carl Smedstad <carl.smedstad at protonmail dot com>
# Maintainer: Rikarnto Bariampa <richard1996ba@gmail.com>
# Maintainer: Kyle Sferrazza <kyle.sferrazza@gmail.com>
# Contributor: Max Liebkies <mail@maxliebkies.de>

pkgname=powershell
pkgver=7.4.1
pkgrel=1
pkgdesc="A cross-platform automation and configuration tool/framework (latest release)"
arch=(x86_64)
url="https://github.com/PowerShell/PowerShell"
license=(MIT)
depends=(
  'dotnet-runtime>=8.0.0'
  'dotnet-runtime<9.0.0'
  gcc-libs
  glibc
)
makedepends=(
  dotnet-sdk
)
checkdepends=(
  xdg-utils
  iputils
  inetutils
)

_dotnet_version=8.0

source=(
  "$pkgname-$pkgver::$url/archive/refs/tags/v$pkgver.tar.gz"
  "Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets"
  "version-from-environment-variable.patch"
  "skip-distro-check.patch"
)
sha256sums=(
  '8f0f1908eea0f88e5e49dd51ebeaf52917eda2c07895416d06f08ab319ebe784'
  '0c81200e5211a2f63bc8d9941432cbf98b5988249f0ceeb1f118a14adddbaa8e'
  '50c7265492cd5cd87d81df29fa737d06dacd97586b0fafb3a0f3af8451b8c052'
  '1f25aa517b73d5d17c547757be8c6fb39e3d2f0fd128805ac42c4192348716ac'
)
install=powershell.install
options=(staticlibs)

_archive="PowerShell-$pkgver"

prepare() {
  cd "$_archive"

  printf '{"sdk": {"version": "%s"}}' "$_dotnet_version" > global.json

  patch --forward --strip=1 --input="$srcdir/version-from-environment-variable.patch"
  patch --forward --strip=1 --input="$srcdir/skip-distro-check.patch"
}

_publish_path="src/powershell-unix/bin/Release/net$_dotnet_version/linux-x64/publish"

build() {
  cd "$_archive"

  export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true
  export DOTNET_CLI_TELEMETRY_OPTOUT=true
  export DOTNET_NOLOGO=true
  export DOTNET_ROOT=/usr/share/dotnet

  export NUGET_PACKAGES="$PWD/nuget"
  export POWERSHELL_GIT_DESCRIBE_OUTPUT="v$pkgver-0-gxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

  # Replicating build.psm1:Start-PSBuild()

  ## Restore-PSPackage()
  local restore_args='--disable-parallel /property:SDKToUse=Microsoft.NET.Sdk'
  # shellcheck disable=2086
  {
    dotnet restore $restore_args src/powershell-unix
    dotnet restore $restore_args src/TypeCatalogGen
    dotnet restore $restore_args src/ResGen
    dotnet restore $restore_args src/Modules
    dotnet restore $restore_args src/Microsoft.PowerShell.GlobalTool.Shim
  }

  ## Start-ResGen()
  (
    cd src/ResGen
    dotnet run
  )

  ## Start-TypeGen()
  cp \
    "$srcdir/Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets" \
    "src/Microsoft.PowerShell.SDK/obj/Microsoft.PowerShell.SDK.csproj.TypeCatalog.targets"

  local inc_file="$PWD/src/TypeCatalogGen/powershell_linux-x64.inc"
  (
    cd src/Microsoft.PowerShell.SDK
    dotnet msbuild \
      ./Microsoft.PowerShell.SDK.csproj \
      /t:_GetDependencies "/property:DesignTimeBuild=true;_DependencyFile=$inc_file" \
      /nologo
  )

  (
    cd src/TypeCatalogGen
    dotnet run ../System.Management.Automation/CoreCLR/CorePsTypeCatalog.cs powershell_linux-x64.inc
  )

  ## Publish PowerShell
  dotnet publish \
    --configuration Release \
    --framework net$_dotnet_version \
    --no-self-contained \
    --runtime linux-x64 \
    /property:ErrorOnDuplicatePublishOutputFiles=false \
    /property:GenerateFullPaths=true \
    /property:IsWindows=false \
    /property:SDKToUse=Microsoft.NET.Sdk \
    /property:UseAppHost=true \
    src/powershell-unix/

  ## Publish reference assemblies
  mkdir -p "$_publish_path/ref"
  grep 'Microsoft.NETCore.App' "$inc_file" | sed 's/;//' | while read -r assembly; do
    cp "$assembly" "$_publish_path/ref"
  done

  ## Restore-PSModuleToBuild()
  cp -ar "$NUGET_PACKAGES/microsoft.powershell.archive/1.2.5/." "$_publish_path/Modules/Microsoft.PowerShell.Archive"
  cp -ar "$NUGET_PACKAGES/microsoft.powershell.psresourceget/1.0.1/." "$_publish_path/Modules/Microsoft.PowerShell.PSResourceGet"
  cp -ar "$NUGET_PACKAGES/packagemanagement/1.4.8.1/." "$_publish_path/Modules/PackageManagement"
  cp -ar "$NUGET_PACKAGES/powershellget/2.2.5/." "$_publish_path/Modules/PowerShellGet"
  cp -ar "$NUGET_PACKAGES/psreadline/2.3.4/." "$_publish_path/Modules/PSReadLine"
  cp -ar "$NUGET_PACKAGES/threadjob/2.0.3/." "$_publish_path/Modules/ThreadJob"

  ## Restore-PSPester()
  "$_publish_path/pwsh" -command "
    Save-Module -Name Pester -Path $_publish_path/Modules -Repository PSGallery -MaximumVersion 4.99
  "
}

check() {
  cd "$_archive"

  export LANG=en_US.UTF-8
  export LC_ALL=en_US.UTF-8

  # One failing test related to JSON & datetime, don't know why
  rm test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertTo-Json.Tests.ps1

  # Two failing tests, don't know why
  rm test/powershell/engine/Help/HelpSystem.Tests.ps1

  # Opens browser, skipping
  rm test/powershell/Language/Scripting/NativeExecution/NativeCommandProcessor.Tests.ps1
  rm test/powershell/Modules/Microsoft.PowerShell.Utility/Invoke-Item.Tests.ps1

  # Creates & leaves directories in $HOME, yikes.. Skipping
  rm test/powershell/Language/Parser/ParameterBinding.Tests.ps1
  rm test/powershell/Language/Scripting/ScriptHelp.Tests.ps1
  rm test/powershell/Modules/Microsoft.PowerShell.Utility/Add-Type.Tests.ps1
  rm test/powershell/Modules/Microsoft.PowerShell.Utility/Set-PSBreakpoint.Tests.ps1
  rm test/powershell/engine/Basic/Assembly.LoadFrom.Tests.ps1
  rm test/powershell/engine/Basic/Assembly.LoadNative.Tests.ps1

  # shellcheck disable=2016
  "$_publish_path/pwsh" -command "
    \$ErrorActionPreference = \"Stop\"
    Import-Module ./build.psm1 -ArgumentList \$true
    Start-PSPester -BinDir $_publish_path -ThrowOnFailure
  "
}

package() {
  cd "$_archive"

  local pkgnum=${pkgver:0:1}

  install -dm755 "$pkgdir/usr/lib/$pkgname-$pkgnum/"
  cp --archive --no-preserve=ownership "$_publish_path/." "$pkgdir/usr/lib/$pkgname-$pkgnum/"

  install -dm755 "$pkgdir/usr/bin"
  ln -s "/usr/lib/$pkgname-$pkgnum/pwsh" "$pkgdir/usr/bin/pwsh"

  install -Dm644 -t "$pkgdir/usr/share/licenses/$pkgname" LICENSE.txt
}