1{
2 alsa-lib,
3 at-spi2-core,
4 atk,
5 autoPatchelfHook,
6 buildEnv,
7 buildPackages,
8 cairo,
9 cups,
10 dbus,
11 expat,
12 fetchurl,
13 ffmpeg,
14 fontconfig,
15 freetype,
16 gdk-pixbuf,
17 glib,
18 gtk3,
19 lib,
20 libcap,
21 libdrm,
22 libGL,
23 libnotify,
24 libuuid,
25 libxcb,
26 libxkbcommon,
27 makeWrapper,
28 libgbm,
29 nspr,
30 nss,
31 pango,
32 sdk ? false,
33 sqlite,
34 stdenv,
35 systemd,
36 udev,
37 xorg,
38}:
39
40let
41 bits = if stdenv.hostPlatform.is64bit then "x64" else "ia32";
42
43 nwEnv = buildEnv {
44 name = "nwjs-env";
45 paths = [
46 alsa-lib
47 at-spi2-core
48 atk
49 cairo
50 cups
51 dbus
52 expat
53 fontconfig
54 freetype
55 gdk-pixbuf
56 glib
57 gtk3
58 libcap
59 libdrm
60 libGL
61 libnotify
62 libxkbcommon
63 libgbm
64 nspr
65 nss
66 pango
67 xorg.libX11
68 xorg.libXScrnSaver
69 xorg.libXcomposite
70 xorg.libXcursor
71 xorg.libXdamage
72 xorg.libXext
73 xorg.libXfixes
74 xorg.libXi
75 xorg.libXrandr
76 xorg.libXrender
77 xorg.libXtst
78 xorg.libxshmfence
79 # libnw-specific (not chromium dependencies)
80 ffmpeg
81 libxcb
82 # chromium runtime deps (dlopen’d)
83 libuuid
84 sqlite
85 udev
86 ];
87
88 extraOutputsToInstall = [
89 "lib"
90 "out"
91 ];
92 };
93
94 version = "0.100.1";
95in
96stdenv.mkDerivation {
97 pname = "nwjs";
98 inherit version;
99
100 src =
101 let
102 flavor = if sdk then "sdk-" else "";
103 in
104 fetchurl {
105 url = "https://dl.nwjs.io/v${version}/nwjs-${flavor}v${version}-linux-${bits}.tar.gz";
106 hash =
107 {
108 "sdk-ia32" = "sha256-8T3lyQi5tvXhThapng/l+wEbmXdUQBqPT7HHDBpEk5Y=";
109 "sdk-x64" = "sha256-nD1MYEm+4sq4MHkiOI46IgM6oDWpcyVWl3Yis0beEIg=";
110 "ia32" = "sha256-TfAw7+z/I3eYRn20DN0sR9moqD23UG7nvQbeXQDNDcg=";
111 "x64" = "sha256-EqLESL4zVdBzFvhPgXfcIwSVNNBVIMy1SdCu6eNU96Q=";
112 }
113 ."${flavor + bits}";
114 };
115
116 nativeBuildInputs = [
117 autoPatchelfHook
118 # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651
119 # Has to use `makeShellWrapper` from `buildPackages` even though `makeShellWrapper` from the inputs is spliced because `propagatedBuildInputs` would pick the wrong one because of a different offset.
120 (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; })
121 ];
122
123 buildInputs = [ nwEnv ];
124 appendRunpaths = map (pkg: (lib.getLib pkg) + "/lib") [
125 nwEnv
126 stdenv.cc.libc
127 stdenv.cc.cc
128 ];
129
130 preFixup = ''
131 gappsWrapperArgs+=(
132 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
133 )
134 '';
135
136 installPhase = ''
137 runHook preInstall
138
139 mkdir -p $out/share/nwjs
140 cp -R * $out/share/nwjs
141 find $out/share/nwjs
142
143 ln -s ${lib.getLib systemd}/lib/libudev.so $out/share/nwjs/libudev.so.0
144
145 mkdir -p $out/bin
146 ln -s $out/share/nwjs/nw $out/bin
147
148 mkdir $out/lib
149 ln -s $out/share/nwjs/lib/libnw.so $out/lib/libnw.so
150
151 runHook postInstall
152 '';
153
154 meta = {
155 description = "App runtime based on Chromium and node.js";
156 homepage = "https://nwjs.io/";
157 platforms = [
158 "i686-linux"
159 "x86_64-linux"
160 ];
161 sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
162 maintainers = [ lib.maintainers.mikaelfangel ];
163 mainProgram = "nw";
164 license = lib.licenses.mit;
165 };
166}