{ stdenv, lib, mkDerivation, fetchFromGitHub, cargo, extra-cmake-modules, rustc, rustPlatform, # common deps karchive, qtwebsockets, # client deps qtbase, qtkeychain, qtmultimedia, qtsvg, qttools, libsecret, # optional client deps giflib, kdnssd, libvpx, miniupnpc, # optional server deps libmicrohttpd, libsodium, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd, systemd ? null, # options buildClient ? true, buildServer ? true, buildServerGui ? true, # if false builds a headless server buildExtraTools ? false, }: assert lib.assertMsg ( buildClient || buildServer || buildExtraTools ) "You must specify at least one of buildClient, buildServer, or buildExtraTools."; let clientDeps = [ qtbase qtkeychain qtmultimedia qtsvg qttools libsecret # optional: giflib # gif animation export support kdnssd # local server discovery with Zeroconf libvpx # WebM video export miniupnpc # automatic port forwarding ]; serverDeps = [ # optional: libmicrohttpd # HTTP admin api libsodium # ext-auth support ] ++ lib.optional withSystemd systemd; in mkDerivation rec { pname = "drawpile"; version = "2.2.1"; src = fetchFromGitHub { owner = "drawpile"; repo = "drawpile"; rev = version; sha256 = "sha256-NS1aQlWpn3f+SW0oUjlYwHtOS9ZgbjFTrE9grjK5REM="; }; cargoDeps = rustPlatform.fetchCargoTarball { inherit src; hash = "sha256-V36yiwraXK7qlJd1r8EtEA4ULxlgvMEmpn/ka3m9GjA="; }; nativeBuildInputs = [ cargo extra-cmake-modules rustc rustPlatform.cargoSetupHook ]; buildInputs = [ karchive qtwebsockets ] ++ lib.optionals buildClient clientDeps ++ lib.optionals buildServer serverDeps; cmakeFlags = [ (lib.cmakeFeature "INITSYS" (lib.optionalString withSystemd "systemd")) (lib.cmakeBool "CLIENT" buildClient) (lib.cmakeBool "SERVER" buildServer) (lib.cmakeBool "SERVERGUI" buildServerGui) (lib.cmakeBool "TOOLS" buildExtraTools) ]; meta = { description = "Collaborative drawing program that allows multiple users to sketch on the same canvas simultaneously"; homepage = "https://drawpile.net/"; downloadPage = "https://drawpile.net/download/"; license = lib.licenses.gpl3Plus; maintainers = with lib.maintainers; [ fgaz ]; platforms = lib.platforms.unix; broken = stdenv.hostPlatform.isDarwin; } // lib.optionalAttrs buildServer { mainProgram = "drawpile-srv"; } // lib.optionalAttrs buildClient { mainProgram = "drawpile"; }; }