| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- {
- lib,
- stdenv,
- bun,
- nodejs,
- darwin,
- electron_41,
- makeWrapper,
- writableTmpDirAsHomeHook,
- autoPatchelfHook,
- copyDesktopItems,
- makeDesktopItem,
- opencode,
- }:
- let
- electron = electron_41;
- in
- stdenv.mkDerivation (finalAttrs: {
- pname = "opencode-desktop";
- inherit (opencode)
- version
- src
- node_modules
- patches
- ;
- nativeBuildInputs = [
- bun
- nodejs
- makeWrapper
- writableTmpDirAsHomeHook
- ]
- ++ lib.optionals stdenv.hostPlatform.isLinux [
- autoPatchelfHook
- copyDesktopItems
- ]
- ++ lib.optionals stdenv.hostPlatform.isDarwin [
- # Ad-hoc sign the .app: --config.mac.identity=null below skips signing.
- darwin.autoSignDarwinBinariesHook
- ];
- buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
- (lib.getLib stdenv.cc.cc)
- ];
- desktopItems = lib.optional stdenv.hostPlatform.isLinux (makeDesktopItem {
- name = "ai.opencode.desktop";
- desktopName = "OpenCode";
- exec = "opencode-desktop %U";
- icon = "ai.opencode.desktop";
- # Electron 41 derives X11 WM_CLASS from app.name.
- startupWMClass = "OpenCode";
- categories = [ "Development" ];
- });
- env = opencode.env // {
- ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
- };
- postPatch =
- # NOTE: Relax Bun version check to be a warning instead of an error
- ''
- substituteInPlace packages/script/src/index.ts \
- --replace-fail 'throw new Error(`This script requires bun@''${expectedBunVersionRange}' \
- 'console.warn(`Warning: This script requires bun@''${expectedBunVersionRange}'
- ''
- # https://github.com/electron/electron/issues/31121
- # mac builds use a .app bundle which doesnt have this issue
- + lib.optionalString stdenv.isLinux ''
- BASE_PATH=packages/desktop
- FILES=(src/main/windows.ts)
- for file in "''${FILES[@]}"; do
- substituteInPlace $BASE_PATH/$file \
- --replace-fail "process.resourcesPath" "'$out/opt/opencode-desktop/resources'"
- done
- '';
- preBuild = ''
- cp -r "${electron.dist}" $HOME/.electron-dist
- chmod -R u+w $HOME/.electron-dist
- cp -R ${finalAttrs.node_modules}/. .
- patchShebangs node_modules
- patchShebangs packages/*/node_modules
- '';
- buildPhase = ''
- runHook preBuild
- cd packages/desktop
- bun run build
- npx electron-builder --dir \
- --config electron-builder.config.ts \
- --config.mac.identity=null \
- --config.electronDist="$HOME/.electron-dist"
- runHook postBuild
- '';
- installPhase = ''
- runHook preInstall
- ''
- + lib.optionalString stdenv.hostPlatform.isDarwin ''
- mkdir -p $out/Applications
- mv dist/mac*/*.app $out/Applications
- makeWrapper "$out/Applications/OpenCode.app/Contents/MacOS/OpenCode" $out/bin/opencode-desktop
- ''
- + lib.optionalString stdenv.hostPlatform.isLinux ''
- mkdir -p $out/opt/opencode-desktop
- cp -r dist/linux*-unpacked/{resources,LICENSE*} $out/opt/opencode-desktop
- install -Dm644 resources/icons/32x32.png \
- "$out/share/icons/hicolor/32x32/apps/ai.opencode.desktop.png"
- install -Dm644 resources/icons/64x64.png \
- "$out/share/icons/hicolor/64x64/apps/ai.opencode.desktop.png"
- install -Dm644 resources/icons/128x128.png \
- "$out/share/icons/hicolor/128x128/apps/ai.opencode.desktop.png"
- install -Dm644 resources/icons/128x128@2x.png \
- "$out/share/icons/hicolor/256x256/apps/ai.opencode.desktop.png"
- install -Dm644 resources/icons/icon.png \
- "$out/share/icons/hicolor/512x512/apps/ai.opencode.desktop.png"
- install -Dm644 resources/ai.opencode.desktop.metainfo.xml \
- "$out/share/metainfo/ai.opencode.desktop.metainfo.xml"
- makeWrapper ${lib.getExe electron} $out/bin/opencode-desktop \
- --inherit-argv0 \
- --set ELECTRON_FORCE_IS_PACKAGED 1 \
- --add-flags $out/opt/opencode-desktop/resources/app.asar \
- --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
- ''
- + ''
- runHook postInstall
- '';
- autoPatchelfIgnoreMissingDeps = [
- "libc.musl-x86_64.so.1"
- ];
- meta = {
- description = "OpenCode Desktop App";
- mainProgram = "opencode-desktop";
- inherit (opencode.meta) homepage license platforms;
- };
- })
|