desktop.nix 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. {
  2. lib,
  3. stdenv,
  4. bun,
  5. nodejs,
  6. electron_41,
  7. makeWrapper,
  8. writableTmpDirAsHomeHook,
  9. autoPatchelfHook,
  10. opencode,
  11. }:
  12. let
  13. electron = electron_41;
  14. in
  15. stdenv.mkDerivation (finalAttrs: {
  16. pname = "opencode-desktop";
  17. inherit (opencode) version src node_modules;
  18. nativeBuildInputs = [
  19. bun
  20. nodejs
  21. makeWrapper
  22. writableTmpDirAsHomeHook
  23. ] ++ lib.optionals stdenv.hostPlatform.isLinux [
  24. autoPatchelfHook
  25. ];
  26. buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
  27. (lib.getLib stdenv.cc.cc)
  28. ];
  29. env = opencode.env // {
  30. ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
  31. };
  32. # https://github.com/electron/electron/issues/31121
  33. # mac builds use a .app bundle which doesnt have this issue
  34. postPatch = lib.optionalString stdenv.isLinux ''
  35. BASE_PATH=packages/desktop
  36. FILES=(src/main/windows.ts)
  37. for file in "''${FILES[@]}"; do
  38. substituteInPlace $BASE_PATH/$file \
  39. --replace-fail "process.resourcesPath" "'$out/opt/opencode-desktop/resources'"
  40. done
  41. '';
  42. preBuild = ''
  43. cp -r "${electron.dist}" $HOME/.electron-dist
  44. chmod -R u+w $HOME/.electron-dist
  45. cp -R ${finalAttrs.node_modules}/. .
  46. patchShebangs node_modules
  47. patchShebangs packages/*/node_modules
  48. '';
  49. buildPhase = ''
  50. runHook preBuild
  51. cd packages/desktop
  52. bun run build
  53. npx electron-builder --dir \
  54. --config electron-builder.config.ts \
  55. --config.mac.identity=null \
  56. --config.electronDist="$HOME/.electron-dist"
  57. runHook postBuild
  58. '';
  59. installPhase =
  60. ''
  61. runHook preInstall
  62. ''
  63. + lib.optionalString stdenv.hostPlatform.isDarwin ''
  64. mkdir -p $out/Applications
  65. mv dist/mac*/*.app $out/Applications
  66. makeWrapper "$out/Applications/OpenCode.app/Contents/MacOS/OpenCode" $out/bin/opencode-desktop
  67. ''
  68. + lib.optionalString stdenv.hostPlatform.isLinux ''
  69. mkdir -p $out/opt/opencode-desktop
  70. cp -r dist/linux*-unpacked/{resources,LICENSE*} $out/opt/opencode-desktop
  71. makeWrapper ${lib.getExe electron} $out/bin/opencode-desktop \
  72. --inherit-argv0 \
  73. --set ELECTRON_FORCE_IS_PACKAGED 1 \
  74. --add-flags $out/opt/opencode-desktop/resources/app.asar \
  75. --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
  76. ''
  77. + ''
  78. runHook postInstall
  79. '';
  80. autoPatchelfIgnoreMissingDeps = [
  81. "libc.musl-x86_64.so.1"
  82. ];
  83. meta = {
  84. description = "OpenCode Desktop App";
  85. mainProgram = "opencode-desktop";
  86. inherit (opencode.meta) homepage license platforms;
  87. };
  88. })