Merge pull request #330634 from r-ryantm/auto-update/circumflex
[NixPkgs.git] / pkgs / servers / sunshine / default.nix
blob0f36c31169358f9bcbdf4d8c0d5c4f25d971435a
1 { lib
2 , stdenv
3 , fetchFromGitHub
4 , autoPatchelfHook
5 , autoAddDriverRunpath
6 , makeWrapper
7 , buildNpmPackage
8 , nixosTests
9 , cmake
10 , avahi
11 , libevdev
12 , libpulseaudio
13 , xorg
14 , libxcb
15 , openssl
16 , libopus
17 , boost
18 , pkg-config
19 , libdrm
20 , wayland
21 , libffi
22 , libcap
23 , mesa
24 , curl
25 , pcre
26 , pcre2
27 , python3
28 , libuuid
29 , libselinux
30 , libsepol
31 , libthai
32 , libdatrie
33 , libxkbcommon
34 , libepoxy
35 , libva
36 , libvdpau
37 , libglvnd
38 , numactl
39 , amf-headers
40 , intel-media-sdk
41 , svt-av1
42 , vulkan-loader
43 , libappindicator
44 , libnotify
45 , miniupnpc
46 , config
47 , cudaSupport ? config.cudaSupport
48 , cudaPackages ? { }
50 let
51   stdenv' = if cudaSupport then cudaPackages.backendStdenv else stdenv;
53 stdenv'.mkDerivation rec {
54   pname = "sunshine";
55   version = "0.23.1";
57   src = fetchFromGitHub {
58     owner = "LizardByte";
59     repo = "Sunshine";
60     rev = "v${version}";
61     hash = "sha256-D5ee5m2ZTKVqZDH07nzJuFEbZBQ4xW7m4nYnJQe0EaA=";
62     fetchSubmodules = true;
63   };
65   patches = [
66     # fix(upnp): support newer miniupnpc library (#2782)
67     # Manually cherry-picked on to 0.23.1.
68     ./0001-fix-upnp-support-newer-miniupnpc-library-2782.patch
69   ];
71   # build webui
72   ui = buildNpmPackage {
73     inherit src version;
74     pname = "sunshine-ui";
75     npmDepsHash = "sha256-9FuMtxTwrU9UIhZXQn/tmGN0IHZBdunV0cY/EElj4bA=";
77     # use generated package-lock.json as upstream does not provide one
78     postPatch = ''
79       cp ${./package-lock.json} ./package-lock.json
80     '';
82     installPhase = ''
83       mkdir -p $out
84       cp -r * $out/
85     '';
86   };
88   nativeBuildInputs = [
89     cmake
90     pkg-config
91     python3
92     makeWrapper
93     # Avoid fighting upstream's usage of vendored ffmpeg libraries
94     autoPatchelfHook
95   ] ++ lib.optionals cudaSupport [
96     autoAddDriverRunpath
97   ];
99   buildInputs = [
100     avahi
101     libevdev
102     libpulseaudio
103     xorg.libX11
104     libxcb
105     xorg.libXfixes
106     xorg.libXrandr
107     xorg.libXtst
108     xorg.libXi
109     openssl
110     libopus
111     boost
112     libdrm
113     wayland
114     libffi
115     libevdev
116     libcap
117     libdrm
118     curl
119     pcre
120     pcre2
121     libuuid
122     libselinux
123     libsepol
124     libthai
125     libdatrie
126     xorg.libXdmcp
127     libxkbcommon
128     libepoxy
129     libva
130     libvdpau
131     numactl
132     mesa
133     amf-headers
134     svt-av1
135     libappindicator
136     libnotify
137     miniupnpc
138   ] ++ lib.optionals cudaSupport [
139     cudaPackages.cudatoolkit
140   ] ++ lib.optionals stdenv.isx86_64 [
141     intel-media-sdk
142   ];
144   runtimeDependencies = [
145     avahi
146     mesa
147     xorg.libXrandr
148     libxcb
149     libglvnd
150   ];
152   cmakeFlags = [
153     "-Wno-dev"
154     # upstream tries to use systemd and udev packages to find these directories in FHS; set the paths explicitly instead
155     (lib.cmakeFeature "UDEV_RULES_INSTALL_DIR" "lib/udev/rules.d")
156     (lib.cmakeFeature "SYSTEMD_USER_UNIT_INSTALL_DIR" "lib/systemd/user")
157   ];
159   postPatch = ''
160     # remove upstream dependency on systemd and udev
161     substituteInPlace cmake/packaging/linux.cmake \
162       --replace-fail 'find_package(Systemd)' "" \
163       --replace-fail 'find_package(Udev)' ""
165     substituteInPlace packaging/linux/sunshine.desktop \
166       --subst-var-by PROJECT_NAME 'Sunshine' \
167       --subst-var-by PROJECT_DESCRIPTION 'Self-hosted game stream host for Moonlight' \
168       --replace-fail '/usr/bin/env systemctl start --u sunshine' 'sunshine'
170     substituteInPlace packaging/linux/sunshine.service.in \
171       --subst-var-by PROJECT_DESCRIPTION 'Self-hosted game stream host for Moonlight' \
172       --subst-var-by SUNSHINE_EXECUTABLE_PATH $out/bin/sunshine
173   '';
175   preBuild = ''
176     # copy webui where it can be picked up by build
177     cp -r ${ui}/build ../
178   '';
180   buildFlags = [
181     "sunshine"
182   ];
184   # allow Sunshine to find libvulkan
185   postFixup = lib.optionalString cudaSupport ''
186     wrapProgram $out/bin/sunshine \
187       --set LD_LIBRARY_PATH ${lib.makeLibraryPath [ vulkan-loader ]}
188   '';
190   # redefine installPhase to avoid attempt to build webui
191   installPhase = ''
192     runHook preInstall
193     cmake --install .
194     runHook postInstall
195   '';
197   postInstall = ''
198     install -Dm644 ../packaging/linux/${pname}.desktop $out/share/applications/${pname}.desktop
199   '';
201   passthru = {
202     tests.sunshine = nixosTests.sunshine;
203     updateScript = ./updater.sh;
204   };
206   meta = with lib; {
207     description = "Sunshine is a Game stream host for Moonlight";
208     homepage = "https://github.com/LizardByte/Sunshine";
209     license = licenses.gpl3Only;
210     mainProgram = "sunshine";
211     maintainers = with maintainers; [ devusb ];
212     platforms = platforms.linux;
213   };