{ lib , stdenv , fetchurl , less , makeWrapper , autoPatchelfHook , curl , icu , libuuid , libunwind , openssl , darwin , lttng-ust , pam , testers , powershell , writeShellScript , common-updater-scripts , gnused , jq }: let ext = stdenv.hostPlatform.extensions.sharedLibrary; platformLdLibraryPath = { darwin = "DYLD_FALLBACK_LIBRARY_PATH"; linux = "LD_LIBRARY_PATH"; }.${stdenv.hostPlatform.parsed.kernel.name} or (throw "unsupported platform"); in stdenv.mkDerivation rec { pname = "powershell"; version = "7.4.0"; src = passthru.sources.${stdenv.hostPlatform.system} or (throw "Unsupported system: ${stdenv.hostPlatform.system}"); sourceRoot = "."; strictDeps = true; nativeBuildInputs = [ less makeWrapper ] ++ lib.optionals stdenv.isLinux [ autoPatchelfHook ]; buildInputs = [ curl icu libuuid libunwind openssl ] ++ lib.optionals stdenv.isDarwin [ darwin.Libsystem ] ++ lib.optionals stdenv.isLinux [ lttng-ust pam ]; installPhase = '' runHook preInstall mkdir -p $out/{bin,share/powershell} cp -R * $out/share/powershell chmod +x $out/share/powershell/pwsh makeWrapper $out/share/powershell/pwsh $out/bin/pwsh \ --prefix ${platformLdLibraryPath} : "${lib.makeLibraryPath buildInputs}" \ --set TERM xterm \ --set POWERSHELL_TELEMETRY_OPTOUT 1 \ --set DOTNET_CLI_TELEMETRY_OPTOUT 1 '' + lib.optionalString stdenv.isLinux '' patchelf --replace-needed liblttng-ust${ext}.0 liblttng-ust${ext}.1 $out/share/powershell/libcoreclrtraceptprovider.so '' + '' runHook postInstall ''; dontStrip = true; passthru = { shellPath = "/bin/pwsh"; sources = { aarch64-darwin = fetchurl { url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-osx-arm64.tar.gz"; hash = "sha256-FnT91XGMr7gE7/dYX+i3BBNiMiqpRODS+BbKHXXmNR8="; }; aarch64-linux = fetchurl { url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-linux-arm64.tar.gz"; hash = "sha256-E9MXYQuhM8ACmQxAYiqIaYk2hGBFGAmGHzeMJXMJifQ="; }; x86_64-darwin = fetchurl { url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-osx-x64.tar.gz"; hash = "sha256-i2vQtNp6wgU2g+0pizlviSn/XKO4AwZcc29TIJ6BXBM="; }; x86_64-linux = fetchurl { url = "https://github.com/PowerShell/PowerShell/releases/download/v${version}/powershell-${version}-linux-x64.tar.gz"; hash = "sha256-qoLD6SQVA7UtsYJ+P9f8CZ2nT4KLoDLptyblDHK0vuU="; }; }; tests.version = testers.testVersion { package = powershell; command = "HOME=$(mktemp -d) pwsh --version"; }; updateScript = writeShellScript "update-powershell" '' set -o errexit export PATH="${lib.makeBinPath [ common-updater-scripts curl gnused jq ]}" NEW_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest | jq .tag_name --raw-output | sed -e 's/v//') if [[ "${version}" = "$NEW_VERSION" ]]; then echo "The new version same as the old version." exit 0 fi for platform in ${lib.escapeShellArgs meta.platforms}; do update-source-version "powershell" "0" "${lib.fakeHash}" --source-key="sources.$platform" update-source-version "powershell" "$NEW_VERSION" --source-key="sources.$platform" done ''; }; meta = with lib; { description = "Powerful cross-platform (Windows, Linux, and macOS) shell and scripting language based on .NET"; homepage = "https://microsoft.com/PowerShell"; license = licenses.mit; mainProgram = "pwsh"; maintainers = with maintainers; [ wegank ]; platforms = builtins.attrNames passthru.sources; sourceProvenance = with sourceTypes; [ binaryBytecode binaryNativeCode ]; }; }