|
1 | 1 | { |
2 | 2 | lib, |
3 | 3 | stdenv, |
4 | | - rustPlatform, |
5 | | - pkg-config, |
6 | | - cargo-tauri, |
7 | 4 | bun, |
8 | 5 | nodejs, |
9 | | - cargo, |
10 | | - rustc, |
11 | | - jq, |
12 | | - wrapGAppsHook4, |
| 6 | + electron_41, |
13 | 7 | makeWrapper, |
14 | | - dbus, |
15 | | - glib, |
16 | | - gtk4, |
17 | | - libsoup_3, |
18 | | - librsvg, |
19 | | - libappindicator, |
20 | | - glib-networking, |
21 | | - openssl, |
22 | | - webkitgtk_4_1, |
23 | | - gst_all_1, |
| 8 | + writableTmpDirAsHomeHook, |
| 9 | + autoPatchelfHook, |
24 | 10 | opencode, |
25 | 11 | }: |
26 | | -rustPlatform.buildRustPackage (finalAttrs: { |
| 12 | +let |
| 13 | + electron = electron_41; |
| 14 | +in |
| 15 | +stdenv.mkDerivation (finalAttrs: { |
27 | 16 | pname = "opencode-desktop"; |
28 | | - inherit (opencode) |
29 | | - version |
30 | | - src |
31 | | - node_modules |
32 | | - patches |
33 | | - ; |
34 | | - |
35 | | - cargoRoot = "packages/desktop/src-tauri"; |
36 | | - cargoLock.lockFile = ../packages/desktop/src-tauri/Cargo.lock; |
37 | | - buildAndTestSubdir = finalAttrs.cargoRoot; |
| 17 | + inherit (opencode) version src node_modules; |
38 | 18 |
|
39 | 19 | nativeBuildInputs = [ |
40 | | - pkg-config |
41 | | - cargo-tauri.hook |
42 | 20 | bun |
43 | | - nodejs # for patchShebangs node_modules |
44 | | - cargo |
45 | | - rustc |
46 | | - jq |
| 21 | + nodejs |
47 | 22 | makeWrapper |
48 | | - ] ++ lib.optionals stdenv.hostPlatform.isLinux [ wrapGAppsHook4 ]; |
| 23 | + writableTmpDirAsHomeHook |
| 24 | + ] ++ lib.optionals stdenv.hostPlatform.isLinux [ |
| 25 | + autoPatchelfHook |
| 26 | + ]; |
49 | 27 |
|
50 | | - buildInputs = lib.optionals stdenv.isLinux [ |
51 | | - dbus |
52 | | - glib |
53 | | - gtk4 |
54 | | - libsoup_3 |
55 | | - librsvg |
56 | | - libappindicator |
57 | | - glib-networking |
58 | | - openssl |
59 | | - webkitgtk_4_1 |
60 | | - gst_all_1.gstreamer |
61 | | - gst_all_1.gst-plugins-base |
62 | | - gst_all_1.gst-plugins-good |
63 | | - gst_all_1.gst-plugins-bad |
| 28 | + buildInputs = lib.optionals stdenv.hostPlatform.isLinux [ |
| 29 | + (lib.getLib stdenv.cc.cc) |
64 | 30 | ]; |
65 | 31 |
|
66 | | - strictDeps = true; |
| 32 | + env = opencode.env // { |
| 33 | + ELECTRON_SKIP_BINARY_DOWNLOAD = "1"; |
| 34 | + }; |
| 35 | + |
| 36 | + # https://github.com/electron/electron/issues/31121 |
| 37 | + # mac builds use a .app bundle which doesnt have this issue |
| 38 | + postPatch = lib.optionalString stdenv.isLinux '' |
| 39 | + BASE_PATH=packages/desktop |
| 40 | + FILES=(src/main/windows.ts) |
| 41 | + for file in "''${FILES[@]}"; do |
| 42 | + substituteInPlace $BASE_PATH/$file \ |
| 43 | + --replace-fail "process.resourcesPath" "'$out/opt/opencode-desktop/resources'" |
| 44 | + done |
| 45 | + ''; |
67 | 46 |
|
68 | 47 | preBuild = '' |
69 | | - cp -a ${finalAttrs.node_modules}/{node_modules,packages} . |
70 | | - chmod -R u+w node_modules packages |
71 | | - patchShebangs node_modules |
72 | | - patchShebangs packages/desktop/node_modules |
| 48 | + cp -r "${electron.dist}" $HOME/.electron-dist |
| 49 | + chmod -R u+w $HOME/.electron-dist |
73 | 50 |
|
74 | | - mkdir -p packages/desktop/src-tauri/sidecars |
75 | | - cp ${opencode}/bin/opencode packages/desktop/src-tauri/sidecars/opencode-cli-${stdenv.hostPlatform.rust.rustcTarget} |
| 51 | + cp -R ${finalAttrs.node_modules}/. . |
| 52 | + patchShebangs node_modules |
| 53 | + patchShebangs packages/*/node_modules |
76 | 54 | ''; |
77 | 55 |
|
78 | | - # see publish-tauri job in .github/workflows/publish.yml |
79 | | - tauriBuildFlags = [ |
80 | | - "--config" |
81 | | - "tauri.prod.conf.json" |
82 | | - "--no-sign" # no code signing or auto updates |
83 | | - ]; |
| 56 | + buildPhase = '' |
| 57 | + runHook preBuild |
| 58 | +
|
| 59 | + cd packages/desktop |
| 60 | +
|
| 61 | + bun run build |
| 62 | + npx electron-builder --dir \ |
| 63 | + --config electron-builder.config.ts \ |
| 64 | + --config.mac.identity=null \ |
| 65 | + --config.electronDist="$HOME/.electron-dist" |
84 | 66 |
|
85 | | - # FIXME: workaround for concerns about case insensitive filesystems |
86 | | - # should be removed once binary is renamed or decided otherwise |
87 | | - # darwin output is a .app bundle so no conflict |
88 | | - postFixup = lib.optionalString stdenv.hostPlatform.isLinux '' |
89 | | - mv $out/bin/OpenCode $out/bin/opencode-desktop |
90 | | - sed -i 's|^Exec=OpenCode$|Exec=opencode-desktop|' $out/share/applications/OpenCode.desktop |
| 67 | + runHook postBuild |
91 | 68 | ''; |
92 | 69 |
|
| 70 | + installPhase = |
| 71 | + '' |
| 72 | + runHook preInstall |
| 73 | + '' |
| 74 | + + lib.optionalString stdenv.hostPlatform.isDarwin '' |
| 75 | + mkdir -p $out/Applications |
| 76 | + mv dist/mac*/*.app $out/Applications |
| 77 | + makeWrapper "$out/Applications/OpenCode.app/Contents/MacOS/OpenCode" $out/bin/opencode-desktop |
| 78 | + '' |
| 79 | + + lib.optionalString stdenv.hostPlatform.isLinux '' |
| 80 | + mkdir -p $out/opt/opencode-desktop |
| 81 | + cp -r dist/linux*-unpacked/{resources,LICENSE*} $out/opt/opencode-desktop |
| 82 | + makeWrapper ${lib.getExe electron} $out/bin/opencode-desktop \ |
| 83 | + --inherit-argv0 \ |
| 84 | + --set ELECTRON_FORCE_IS_PACKAGED 1 \ |
| 85 | + --add-flags $out/opt/opencode-desktop/resources/app.asar \ |
| 86 | + --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" |
| 87 | + '' |
| 88 | + + '' |
| 89 | + runHook postInstall |
| 90 | + ''; |
| 91 | + |
| 92 | + autoPatchelfIgnoreMissingDeps = [ |
| 93 | + "libc.musl-x86_64.so.1" |
| 94 | + ]; |
| 95 | + |
93 | 96 | meta = { |
94 | 97 | description = "OpenCode Desktop App"; |
95 | | - homepage = "https://opencode.ai"; |
96 | | - license = lib.licenses.mit; |
97 | 98 | mainProgram = "opencode-desktop"; |
98 | | - inherit (opencode.meta) platforms; |
| 99 | + inherit (opencode.meta) homepage license platforms; |
99 | 100 | }; |
100 | 101 | }) |
0 commit comments