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.102.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 # TODO: Write an update script to update all 4 hashes.
107 # nixpkgs-update: no auto update
108 hash =
109 {
110 "sdk-ia32" = "sha256-uzDbEq2vNC+fm95Co3lnQX7mrUXsIDWFoa0osWCn3EM=";
111 "sdk-x64" = "sha256-jWw5kXYGxu7oen8fK2Q58QPhiBRC6H2ibGXkeUFW2pI=";
112 "ia32" = "sha256-oODdSKNlOPSLD9vAqRwYcAgH6mumyOB5Fp6G9ifSgok=";
113 "x64" = "sha256-WhHV+xj2ngEz+i1ipBhwZD9b0EF/hdi8gMBZw5qYRGA=";
114 }
115 ."${flavor + bits}";
116 };
117
118 nativeBuildInputs = [
119 autoPatchelfHook
120 # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651
121 # 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.
122 (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; })
123 ];
124
125 buildInputs = [ nwEnv ];
126 appendRunpaths = map (pkg: (lib.getLib pkg) + "/lib") [
127 nwEnv
128 stdenv.cc.libc
129 stdenv.cc.cc
130 ];
131
132 preFixup = ''
133 gappsWrapperArgs+=(
134 --add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}"
135 )
136 '';
137
138 installPhase = ''
139 runHook preInstall
140
141 mkdir -p $out/share/nwjs
142 cp -R * $out/share/nwjs
143 find $out/share/nwjs
144
145 ln -s ${lib.getLib systemd}/lib/libudev.so $out/share/nwjs/libudev.so.0
146
147 mkdir -p $out/bin
148 ln -s $out/share/nwjs/nw $out/bin
149
150 mkdir $out/lib
151 ln -s $out/share/nwjs/lib/libnw.so $out/lib/libnw.so
152
153 runHook postInstall
154 '';
155
156 meta = {
157 description = "App runtime based on Chromium and node.js";
158 homepage = "https://nwjs.io/";
159 platforms = [
160 "i686-linux"
161 "x86_64-linux"
162 ];
163 sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
164 maintainers = [ lib.maintainers.mikaelfangel ];
165 mainProgram = "nw";
166 license = lib.licenses.mit;
167 };
168}