about summary refs log tree commit diff
path: root/pkgs/applications/graphics/drawio
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-04-29 11:46:11 +0000
committerAlyssa Ross <hi@alyssa.is>2023-04-30 08:53:40 +0000
commit007907fc5042cb23a6ca03c49c1dfa3b491fc7e7 (patch)
treec4879470a93235c4deaa0876131bafe0178a1370 /pkgs/applications/graphics/drawio
parent4cf4f33e33684cf90ef6adb9166925f6aec67047 (diff)
drawio: build from source
This allows using drawio on other architectures, and on Darwin.
The implementation is adapted from the podman-desktop package.
Diffstat (limited to 'pkgs/applications/graphics/drawio')
-rw-r--r--pkgs/applications/graphics/drawio/default.nix149
1 files changed, 74 insertions, 75 deletions
diff --git a/pkgs/applications/graphics/drawio/default.nix b/pkgs/applications/graphics/drawio/default.nix
index 28ce1cbc3dc3b..4a793e1adc8a9 100644
--- a/pkgs/applications/graphics/drawio/default.nix
+++ b/pkgs/applications/graphics/drawio/default.nix
@@ -1,104 +1,103 @@
-{ stdenv, lib, fetchurl, rpmextract, autoPatchelfHook, wrapGAppsHook
-
-# Dynamic libraries
-, alsa-lib, atk, at-spi2-atk, at-spi2-core, cairo, dbus, cups, expat
-, gdk-pixbuf, glib, gtk3, libX11, libXScrnSaver, libXcomposite, libXcursor
-, libXdamage, libXext, libXfixes, libXi, libXrandr, libXrender, libXtst
-, libxcb, libuuid, libxshmfence, nspr, nss, pango, mesa
-
-, systemd
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchYarnDeps
+, makeDesktopItem
+, copyDesktopItems
+, desktopToDarwinBundle
+, fixup_yarn_lock
+, makeWrapper
+, nodejs
+, yarn
+, electron
 }:
 
 stdenv.mkDerivation rec {
   pname = "drawio";
   version = "21.2.1";
 
-  src = fetchurl {
-    url = "https://github.com/jgraph/drawio-desktop/releases/download/v${version}/drawio-x86_64-${version}.rpm";
-    sha256 = "sha256-269kMXKGlGig4Dt7cvCTRDGFsBZE5RBoi1ajqT3rIVc=";
+  src = fetchFromGitHub {
+    owner = "jgraph";
+    repo = "drawio-desktop";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-sjJZwVQdFAMWdaGUyQbv1qfdJWE2tN90z7eFYyAW9ko=";
+  };
+
+  offlineCache = fetchYarnDeps {
+    yarnLock = src + "/yarn.lock";
+    hash = "sha256-YlJ84psoEgeDnCX+O8TvwqhTthm5voJ6dfTvTiZlkuk=";
   };
 
   nativeBuildInputs = [
-    autoPatchelfHook
-    rpmextract
-    wrapGAppsHook
-  ];
+    copyDesktopItems
+    fixup_yarn_lock
+    makeWrapper
+    nodejs
+    yarn
+  ] ++ lib.optional stdenv.isDarwin desktopToDarwinBundle;
 
-  buildInputs = [
-    alsa-lib
-    atk
-    at-spi2-atk
-    at-spi2-core
-    cairo
-    cups
-    dbus
-    expat
-    gdk-pixbuf
-    glib
-    gtk3
-    libX11
-    libXScrnSaver
-    libXcomposite
-    libXcursor
-    libXdamage
-    libXext
-    libXfixes
-    libXi
-    libXrandr
-    libXrender
-    libxshmfence
-    libXtst
-    libxcb
-    libuuid
-    mesa # for libgbm
-    nspr
-    nss
-    pango
-    systemd
-  ];
+  ELECTRON_SKIP_BINARY_DOWNLOAD = true;
 
-  runtimeDependencies = [
-    (lib.getLib systemd)
-  ];
+  configurePhase = ''
+    runHook preConfigure
 
-  dontBuild = true;
-  dontConfigure = true;
+    export HOME="$TMPDIR"
+    yarn config --offline set yarn-offline-mirror "$offlineCache"
+    fixup_yarn_lock yarn.lock
+    yarn install --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive
+    patchShebangs node_modules/
 
-  unpackPhase = "rpmextract ${src}";
+    runHook postConfigure
+  '';
 
-  installPhase = ''
-    mkdir -p $out/share
-    cp -r opt/drawio $out/share/
+  buildPhase = ''
+    runHook preBuild
 
-    # Application icon
-    mkdir -p $out/share/icons/hicolor
-    cp -r usr/share/icons/hicolor/* $out/share/icons/hicolor/
+    yarn --offline run electron-builder --dir \
+      --config electron-builder-linux-mac.json \
+      -c.electronDist=${electron}/lib/electron \
+      -c.electronVersion=${electron.version}
 
-    # XDG desktop item
-    cp -r usr/share/applications $out/share/applications
+    runHook postBuild
+  '';
 
-    # Symlink wrapper
-    mkdir -p $out/bin
-    ln -s $out/share/drawio/drawio $out/bin/drawio
+  installPhase = ''
+    runHook preInstall
 
-    # Update binary path
-    substituteInPlace $out/share/applications/drawio.desktop \
-      --replace /opt/drawio/drawio $out/bin/drawio
-  '';
+    mkdir -p "$out/share/lib/drawio"
+    cp -r dist/*-unpacked/{locales,resources{,.pak}} "$out/share/lib/drawio"
 
-  doInstallCheckPhase = true;
+    install -Dm644 build/icon.svg "$out/share/icons/hicolor/scalable/apps/drawio.svg"
 
-  installCheckPhase = ''
-    $out/bin/drawio --help > /dev/null
+    makeWrapper '${electron}/bin/electron' "$out/bin/drawio" \
+      --add-flags "$out/share/lib/drawio/resources/app.asar" \
+      --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}" \
+      --inherit-argv0
+
+    runHook postInstall
   '';
 
+  desktopItems = [
+    (makeDesktopItem {
+      name = "drawio";
+      exec = "drawio %U";
+      icon = "drawio";
+      desktopName = "drawio";
+      comment = "draw.io desktop";
+      mimeTypes = [ "application/vnd.jgraph.mxfile" "application/vnd.visio" ];
+      categories = [ "Graphics" ];
+      startupWMClass = "drawio";
+    })
+  ];
+
   meta = with lib; {
     description = "A desktop application for creating diagrams";
     homepage = "https://about.draw.io/";
-    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
     license = licenses.asl20;
     changelog = "https://github.com/jgraph/drawio-desktop/releases/tag/v${version}";
-    maintainers = with maintainers; [ darkonion0 ];
-    platforms = [ "x86_64-linux" ];
+    maintainers = with maintainers; [ qyliss darkonion0 ];
+    platforms = platforms.darwin ++ platforms.linux;
+    broken = stdenv.isDarwin;
   };
 }