Commit 4d8e51f9 authored by eljamm's avatar eljamm
Browse files

sylk: 3.7.0 -> 3.8.0; build from source

parent fecb2062
Loading
Loading
Loading
Loading
+113 −24
Original line number Diff line number Diff line
{
  appimageTools,
  fetchurl,
  lib,
  libxshmfence,
  stdenv,
  fetchFromGitHub,
  fetchYarnDeps,
  copyDesktopItems,
  electron,
  fixup-yarn-lock,
  imagemagick,
  makeDesktopItem,
  node-gyp-build,
  nodejs,
  writableTmpDirAsHomeHook,
  yarnBuildHook,
  yarnConfigHook,
  yarnInstallHook,
}:

appimageTools.wrapType2 rec {
stdenv.mkDerivation (finalAttrs: {
  pname = "sylk";
  version = "3.7.0";
  version = "3.8.0";

  src = fetchurl {
    url = "https://download.ag-projects.com/Sylk/Sylk-${version}-x86_64.AppImage";
    hash = "sha256-3lWWc3aSn+aKM/gX4v2suVbj5sZPKl1r36eQP3a2pNg=";
  src = fetchFromGitHub {
    owner = "AGProjects";
    repo = "sylk-webrtc";
    tag = finalAttrs.version;
    hash = "sha256-AJbZDAEqGfVPuo+My8wxfFWVPelO6XK2pKsglmLyRTw=";
  };

  extraPkgs = pkgs: [
    libxshmfence
  yarnOfflineCache = fetchYarnDeps {
    yarnLock = finalAttrs.src + "/yarn.lock";
    hash = "sha256-VY97NPnT1225l6SLyTI3qITBGF7rqE5xz6UVVucblcU=";
  };

  # required for electron
  passthru.appOfflineCache = fetchYarnDeps {
    yarnLock = finalAttrs.src + "/app/yarn.lock";
    hash = "sha256-S9L/rveTuXF2vSqSDu+NlV5vP5f28lda/KMGU8iS1Zo=";
  };

  outputs = [
    "out"
    "deps"
    "electronDeps"
  ];

  nativeBuildInputs = [
    copyDesktopItems
    fixup-yarn-lock
    imagemagick
    node-gyp-build
    nodejs # needed for executing package.json scripts
    writableTmpDirAsHomeHook
    yarnBuildHook
    yarnConfigHook
    yarnInstallHook
  ];

  appimageContents = appimageTools.extractType2 { inherit pname version src; };
  dontConfigure = true;
  yarnBuildScript = "electron";

  preBuild = ''
    originalOfflineMirror=$(yarn config --offline get yarn-offline-mirror)

    installDeps() {
      local cache="$1"
      local output="$2"
      fixup-yarn-lock yarn.lock
      yarn config --offline set yarn-offline-mirror "$cache"
      yarn install --offline --frozen-lockfile --ignore-engines --ignore-scripts
      patchShebangs node_modules/
      mkdir -p $output
      cp -R node_modules $output
    }

    installDeps $yarnOfflineCache $deps

  extraInstallCommands = ''
    install -Dm444 ${appimageContents}/sylk-electron.desktop -t $out/share/applications/
    install -Dm444 ${appimageContents}/sylk-electron.png -t $out/share/icons/hicolor/512x512/apps/
    pushd app
    installDeps ${finalAttrs.passthru.appOfflineCache} $electronDeps
    popd

    substituteInPlace $out/share/applications/sylk-electron.desktop \
      --replace-fail 'Exec=AppRun --no-sandbox' 'Exec=${pname}'
    yarn config --offline set yarn-offline-mirror $originalOfflineMirror
  '';

  profile = ''
    export LC_ALL=C.UTF-8
  postFixup = ''
    mkdir -p $out/share
    mv $out/lib/node_modules/Sylk $out/share/Sylk

    rm -rf $out/lib
    rm -rf $out/share/Sylk/.parcel-cache
    rm -rf $out/share/Sylk/node_modules

    ln -s $electronDeps/node_modules $out/share/Sylk/app/node_modules
    ln -s $deps/node_modules $out/share/Sylk/node_modules

    makeWrapper ${lib.getExe electron} $out/bin/sylk \
      --add-flags $out/share/Sylk/app \
      --inherit-argv0

    # Convert the .ico file to PNGs, which are used by the desktop file
    for size in 16 24 32 48 64 128 256; do
      mkdir -p $out/share/icons/hicolor/"$size"x"$size"/apps
      magick "$out/share/Sylk/build/icon.ico" -delete 1--1 \
        -background none \
        -thumbnail "$size"x"$size" \
        $out/share/icons/hicolor/"$size"x"$size"/apps/sylk-electron.png
    done;
  '';

  desktopItems = [
    (makeDesktopItem {
      name = "sylk";
      exec = "sylk";
      desktopName = "Sylk";
      comment = "WebRTC client";
      icon = "sylk-electron";
      startupWMClass = "Sylk";
      terminal = false;
      categories = [
        "Audio"
        "Video"
        "AudioVideo"
      ];
    })
  ];

  meta = {
    description = "Desktop client for SylkServer, a multiparty conferencing tool";
    homepage = "https://sylkserver.com/";
    license = lib.licenses.agpl3Plus;
    changelog = "https://github.com/AGProjects/sylk-webrtc/blob/${finalAttrs.src.rev}/changelog.txt";
    mainProgram = "sylk";
    maintainers = with lib.maintainers; [ zimbatm ];
    teams = with lib.teams; [ ngi ];
    platforms = [
      "i386-linux"
      "x86_64-linux"
    ];
    sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
    platforms = electron.meta.platforms;
  };
}
})