about summary refs log tree commit diff
path: root/nixpkgs/pkgs/servers/sunshine/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/servers/sunshine/default.nix')
-rw-r--r--nixpkgs/pkgs/servers/sunshine/default.nix194
1 files changed, 194 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/servers/sunshine/default.nix b/nixpkgs/pkgs/servers/sunshine/default.nix
new file mode 100644
index 000000000000..a401f318a911
--- /dev/null
+++ b/nixpkgs/pkgs/servers/sunshine/default.nix
@@ -0,0 +1,194 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoPatchelfHook
+, makeWrapper
+, buildNpmPackage
+, cmake
+, avahi
+, libevdev
+, libpulseaudio
+, xorg
+, libxcb
+, openssl
+, libopus
+, boost
+, pkg-config
+, libdrm
+, wayland
+, libffi
+, libcap
+, mesa
+, curl
+, pcre
+, pcre2
+, libuuid
+, libselinux
+, libsepol
+, libthai
+, libdatrie
+, libxkbcommon
+, libepoxy
+, libva
+, libvdpau
+, libglvnd
+, numactl
+, amf-headers
+, intel-media-sdk
+, svt-av1
+, vulkan-loader
+, libappindicator
+, libnotify
+, miniupnpc
+, config
+, cudaSupport ? config.cudaSupport
+, cudaPackages ? { }
+}:
+let
+  stdenv' = if cudaSupport then cudaPackages.backendStdenv else stdenv;
+in
+stdenv'.mkDerivation rec {
+  pname = "sunshine";
+  version = "0.22.2";
+
+  src = fetchFromGitHub {
+    owner = "LizardByte";
+    repo = "Sunshine";
+    rev = "v${version}";
+    sha256 = "sha256-So8fX0XQoW2cdTWWENoE07EU6e8vvjeTpizLoaDTjeg=";
+    fetchSubmodules = true;
+  };
+
+  patches = [
+    # remove npm install as it needs internet access -- handled separately below
+    ./dont-build-webui.patch
+  ];
+
+  # build webui
+  ui = buildNpmPackage {
+    inherit src version;
+    pname = "sunshine-ui";
+    npmDepsHash = "sha256-0487ntbJZ20MZHezQ+Z3EJkidF3Dgoh/mynYwR7k/+I=";
+
+    # use generated package-lock.json as upstream does not provide one
+    postPatch = ''
+      cp ${./package-lock.json} ./package-lock.json
+    '';
+
+    installPhase = ''
+      mkdir -p $out
+      cp -r * $out/
+    '';
+  };
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    autoPatchelfHook
+    makeWrapper
+  ] ++ lib.optionals cudaSupport [
+    cudaPackages.autoAddDriverRunpath
+  ];
+
+  buildInputs = [
+    avahi
+    libevdev
+    libpulseaudio
+    xorg.libX11
+    libxcb
+    xorg.libXfixes
+    xorg.libXrandr
+    xorg.libXtst
+    xorg.libXi
+    openssl
+    libopus
+    boost
+    libdrm
+    wayland
+    libffi
+    libevdev
+    libcap
+    libdrm
+    curl
+    pcre
+    pcre2
+    libuuid
+    libselinux
+    libsepol
+    libthai
+    libdatrie
+    xorg.libXdmcp
+    libxkbcommon
+    libepoxy
+    libva
+    libvdpau
+    numactl
+    mesa
+    amf-headers
+    svt-av1
+    libappindicator
+    libnotify
+    miniupnpc
+  ] ++ lib.optionals cudaSupport [
+    cudaPackages.cudatoolkit
+  ] ++ lib.optionals stdenv.isx86_64 [
+    intel-media-sdk
+  ];
+
+  runtimeDependencies = [
+    avahi
+    mesa
+    xorg.libXrandr
+    libxcb
+    libglvnd
+  ];
+
+  cmakeFlags = [
+    "-Wno-dev"
+    # upstream tries to use systemd and udev packages to find these directories in FHS; set the paths explicitly instead
+    (lib.cmakeFeature "UDEV_RULES_INSTALL_DIR" "lib/udev/rules.d")
+    (lib.cmakeFeature "SYSTEMD_USER_UNIT_INSTALL_DIR" "lib/systemd/user")
+  ];
+
+  postPatch = ''
+    # remove upstream dependency on systemd and udev
+    substituteInPlace cmake/packaging/linux.cmake \
+      --replace-fail 'find_package(Systemd)' "" \
+      --replace-fail 'find_package(Udev)' ""
+
+    substituteInPlace packaging/linux/sunshine.desktop \
+      --subst-var-by PROJECT_NAME 'Sunshine' \
+      --subst-var-by PROJECT_DESCRIPTION 'Self-hosted game stream host for Moonlight' \
+      --replace-fail '/usr/bin/env systemctl start --u sunshine' 'sunshine'
+
+    substituteInPlace packaging/linux/sunshine.service.in \
+      --subst-var-by PROJECT_DESCRIPTION 'Self-hosted game stream host for Moonlight' \
+      --subst-var-by SUNSHINE_EXECUTABLE_PATH $out/bin/sunshine
+  '';
+
+  preBuild = ''
+    # copy webui where it can be picked up by build
+    cp -r ${ui}/build ../
+  '';
+
+  # allow Sunshine to find libvulkan
+  postFixup = lib.optionalString cudaSupport ''
+    wrapProgram $out/bin/sunshine \
+      --set LD_LIBRARY_PATH ${lib.makeLibraryPath [ vulkan-loader ]}
+  '';
+
+  postInstall = ''
+    install -Dm644 ../packaging/linux/${pname}.desktop $out/share/applications/${pname}.desktop
+  '';
+
+  passthru.updateScript = ./updater.sh;
+
+  meta = with lib; {
+    description = "Sunshine is a Game stream host for Moonlight";
+    homepage = "https://github.com/LizardByte/Sunshine";
+    license = licenses.gpl3Only;
+    mainProgram = "sunshine";
+    maintainers = with maintainers; [ devusb ];
+    platforms = platforms.linux;
+  };
+}