1{
2 lib,
3 stdenv,
4 fetchFromGitHub,
5 makeWrapper,
6 copyDesktopItems,
7 electron_37,
8 nodejs,
9 pnpm_10,
10 makeDesktopItem,
11 darwin,
12 nix-update-script,
13 _experimental-update-script-combinators,
14 writeShellApplication,
15 nix,
16 jq,
17 gnugrep,
18}:
19
20let
21 electron = electron_37;
22in
23stdenv.mkDerivation (finalAttrs: {
24 pname = "podman-desktop";
25 version = "1.20.2";
26
27 passthru.updateScript = _experimental-update-script-combinators.sequence [
28 (nix-update-script { })
29 (lib.getExe (writeShellApplication {
30 name = "podman-desktop-dependencies-updater";
31 runtimeInputs = [
32 nix
33 jq
34 gnugrep
35 ];
36 runtimeEnv = {
37 PNAME = "podman-desktop";
38 PKG_FILE = builtins.toString ./package.nix;
39 };
40 text = ''
41 new_src="$(nix-build --attr "pkgs.$PNAME.src" --no-out-link)"
42 new_electron_major="$(jq '.devDependencies.electron' "$new_src/package.json" | grep --perl-regexp --only-matching '\d+' | head -n 1)"
43 new_pnpm_major="$(jq '.packageManager' "$new_src/package.json" | grep --perl-regexp --only-matching '\d+' | head -n 1)"
44 sed -i -E "s/electron_[0-9]+/electron_$new_electron_major/g" "$PKG_FILE"
45 sed -i -E "s/pnpm_[0-9]+/pnpm_$new_pnpm_major/g" "$PKG_FILE"
46 '';
47 }))
48 (nix-update-script {
49 # Changing the pnpm version requires updating `pnpmDeps.hash`.
50 extraArgs = [ "--version=skip" ];
51 })
52 ];
53
54 src = fetchFromGitHub {
55 owner = "containers";
56 repo = "podman-desktop";
57 tag = "v${finalAttrs.version}";
58 hash = "sha256-+UdVTTm528Q9TIZwznzseBn8JazvQJOxJyjdzBmVUaA=";
59 };
60
61 pnpmDeps = pnpm_10.fetchDeps {
62 inherit (finalAttrs) pname version src;
63 fetcherVersion = 1;
64 hash = "sha256-GX33PE534jWX7v9jCwZALuCT6gQClBXlOTPZC09EuC8=";
65 };
66
67 patches = [
68 # podman should be installed with nix; disable auto-installation
69 ./extension-no-download-podman.patch
70 ];
71
72 ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
73
74 nativeBuildInputs = [
75 nodejs
76 pnpm_10.configHook
77 ]
78 ++ lib.optionals (!stdenv.hostPlatform.isDarwin) [
79 copyDesktopItems
80 makeWrapper
81 ]
82 ++ lib.optionals stdenv.hostPlatform.isDarwin [
83 darwin.autoSignDarwinBinariesHook
84 ];
85
86 buildPhase = ''
87 runHook preBuild
88
89 cp -r ${electron.dist} electron-dist
90 chmod -R u+w electron-dist
91
92 pnpm build
93
94 # Explicitly set identity to null to avoid signing on arm64 macs with newer electron-builder.
95 # See: https://github.com/electron-userland/electron-builder/pull/9007
96 ./node_modules/.bin/electron-builder \
97 --dir \
98 --config .electron-builder.config.cjs \
99 -c.mac.identity=null \
100 -c.electronDist=electron-dist \
101 -c.electronVersion=${electron.version}
102
103 runHook postBuild
104 '';
105
106 installPhase = ''
107 runHook preInstall
108
109 ''
110 + lib.optionalString stdenv.hostPlatform.isDarwin ''
111 mkdir -p $out/Applications
112 mv dist/mac*/Podman\ Desktop.app $out/Applications
113 ''
114 + lib.optionalString (!stdenv.hostPlatform.isDarwin) ''
115 mkdir -p "$out/share/lib/podman-desktop"
116 cp -r dist/*-unpacked/{locales,resources{,.pak}} "$out/share/lib/podman-desktop"
117
118 install -Dm644 buildResources/icon.svg "$out/share/icons/hicolor/scalable/apps/podman-desktop.svg"
119
120 makeWrapper '${electron}/bin/electron' "$out/bin/podman-desktop" \
121 --add-flags "$out/share/lib/podman-desktop/resources/app.asar" \
122 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
123 --inherit-argv0
124 ''
125 + ''
126
127 runHook postInstall
128 '';
129
130 # see: https://github.com/containers/podman-desktop/blob/main/.flatpak.desktop
131 desktopItems = [
132 (makeDesktopItem {
133 name = "podman-desktop";
134 exec = "podman-desktop %U";
135 icon = "podman-desktop";
136 desktopName = "Podman Desktop";
137 genericName = "Desktop client for podman";
138 comment = finalAttrs.meta.description;
139 categories = [ "Utility" ];
140 startupWMClass = "Podman Desktop";
141 })
142 ];
143
144 meta = {
145 description = "Graphical tool for developing on containers and Kubernetes";
146 homepage = "https://podman-desktop.io";
147 changelog = "https://github.com/containers/podman-desktop/releases/tag/v${finalAttrs.version}";
148 license = lib.licenses.asl20;
149 maintainers = with lib.maintainers; [
150 booxter
151 panda2134
152 ];
153 inherit (electron.meta) platforms;
154 mainProgram = "podman-desktop";
155 };
156})