|
10 | 10 | , lz4 |
11 | 11 | , pkgconfig |
12 | 12 | , systemd |
13 | | -, writeShellScriptBin |
| 13 | +, writeShellScript |
14 | 14 | , xz |
15 | 15 | , nodePackages |
16 | 16 | , zlib |
|
35 | 35 | main = "main/index.js"; |
36 | 36 | }; |
37 | 37 | newPackagePath = builtins.toFile "package.json" (builtins.toJSON newPackage); |
38 | | - windowsElectronVersion = "13.6.3"; |
39 | | - electronPath = "https://github.com/electron/electron/releases/download/v${windowsElectronVersion}"; |
| 38 | + electronVersion = origPackage.dependencies.electron; |
| 39 | + electronPath = "https://github.com/electron/electron/releases/download/v${electronVersion}"; |
40 | 40 | windowsElectron = fetchurl { |
41 | | - url = "${electronPath}/electron-v${windowsElectronVersion}-win32-x64.zip"; |
| 41 | + url = "${electronPath}/electron-v${electronVersion}-win32-x64.zip"; |
42 | 42 | sha256 = "18085a2509447fef8896daeee96a12f48f8e60a4d5ec4cfab44d8d59b9d89a72"; |
43 | 43 | }; |
44 | 44 | electronPathHash = builtins.hashString "sha256" electronPath; |
45 | 45 | electron-cache = runCommand "electron-cache" {} '' |
46 | 46 | # newer style |
47 | 47 | mkdir -p $out/${electronPathHash}/ |
48 | | - ln -sv ${windowsElectron} $out/${electronPathHash}/electron-v${windowsElectronVersion}-win32-x64.zip |
49 | | - mkdir $out/httpsgithub.comelectronelectronreleasesdownloadv${windowsElectronVersion}electron-v${windowsElectronVersion}-win32-x64.zip |
50 | | - ln -s ${windowsElectron} $out/httpsgithub.comelectronelectronreleasesdownloadv${windowsElectronVersion}electron-v${windowsElectronVersion}-win32-x64.zip/electron-v${windowsElectronVersion}-win32-x64.zip |
| 48 | + ln -sv ${windowsElectron} $out/${electronPathHash}/electron-v${electronVersion}-win32-x64.zip |
| 49 | + mkdir $out/httpsgithub.comelectronelectronreleasesdownloadv${electronVersion}electron-v${electronVersion}-win32-x64.zip |
| 50 | + ln -s ${windowsElectron} $out/httpsgithub.comelectronelectronreleasesdownloadv${electronVersion}electron-v${electronVersion}-win32-x64.zip/electron-v${electronVersion}-win32-x64.zip |
51 | 51 | ''; |
52 | | - electron-gyp = fetchurl { |
53 | | - url = "https://www.electronjs.org/headers/v${windowsElectronVersion}/node-v${windowsElectronVersion}-headers.tar.gz"; |
| 52 | + electron-node-headers = fetchurl { |
| 53 | + url = "https://www.electronjs.org/headers/v${electronVersion}/node-v${electronVersion}-headers.tar.gz"; |
54 | 54 | sha256 = "f8567511857ab62659505ba5158b6ad69afceb512105a3251d180fe47f44366c"; |
55 | 55 | }; |
| 56 | + electron-node-headers-unpacked = runCommand "electron-node-headers-${electronVersion}-unpacked" {} '' |
| 57 | + tar -xf ${electron-node-headers} |
| 58 | + mkdir -p $out |
| 59 | + mv node_headers/* $out/ |
| 60 | + ''; |
56 | 61 | filter = name: type: let |
57 | 62 | baseName = baseNameOf (toString name); |
58 | 63 | sansPrefix = lib.removePrefix (toString ./.) name; |
|
74 | 79 | pkgconfig |
75 | 80 | libusb |
76 | 81 | ]; |
| 82 | + |
| 83 | + # We patch `node_modules/electron-rebuild` to force specific Node.js |
| 84 | + # headers to be used when building native extensions for |
| 85 | + # Electron. Electron’s Node.js ABI differs from the same version of |
| 86 | + # Node.js, because different libraries are used in Electon, |
| 87 | + # e.g. BoringSSL instead of OpenSSL, |
| 88 | + # cf. <https://www.electronjs.org/docs/latest/tutorial/using-native-node-modules> |
| 89 | + # |
| 90 | + # We also use this same code in `shell.nix`, since for some reason |
| 91 | + # `electron-rebuild` there determines incorrect headers to use |
| 92 | + # automatically, and we keep getting ABI errors. TODO: investigate |
| 93 | + # why… |
| 94 | + # |
| 95 | + # TODO: That `sed` is rather awful… Can it be done better? – @michalrus |
| 96 | + patchElectronRebuild = writeShellScript "patch-electron-rebuild" '' |
| 97 | + echo 'Patching electron-rebuild to force our Node.js headers…' |
| 98 | +
|
| 99 | + nodeGypJs=lib/src/module-type/node-gyp.js |
| 100 | + if [ ! -e $nodeGypJs ] ; then |
| 101 | + # makes it work both here, and in shell.nix: |
| 102 | + nodeGypJs="node_modules/electron-rebuild/$nodeGypJs" |
| 103 | + fi |
| 104 | + if [ ! -e $nodeGypJs ] ; then |
| 105 | + echo >&2 'fatal: shouldn’t happen unless electron-rebuild changes' |
| 106 | + exit 1 |
| 107 | + fi |
| 108 | +
|
| 109 | + # Patch idempotently (matters in repetitive shell.nix): |
| 110 | + if ! grep -qF ${electron-node-headers} $nodeGypJs ; then |
| 111 | + sed -r 's|const extraNodeGypArgs.*|\0 extraNodeGypArgs.push("--tarball", "${electron-node-headers}", "--nodedir", "${electron-node-headers-unpacked}");|' -i $nodeGypJs |
| 112 | + fi |
| 113 | + ''; |
77 | 114 | in |
78 | 115 | yarn2nix.mkYarnPackage { |
79 | 116 | name = "daedalus-js"; |
@@ -141,12 +178,6 @@ yarn2nix.mkYarnPackage { |
141 | 178 | export HOME=$(realpath home) |
142 | 179 | yarn --offline run build |
143 | 180 |
|
144 | | - mkdir -pv $HOME/.electron-gyp/ |
145 | | - tar -xvf ${electron-gyp} -C $HOME/.electron-gyp |
146 | | - mv -vi $HOME/.electron-gyp/node_headers $HOME/.electron-gyp/${windowsElectronVersion}/ |
147 | | -
|
148 | | - ln -sv $HOME/.electron-gyp $HOME/.node-gyp |
149 | | -
|
150 | 181 | #export DEBUG=electron-rebuild |
151 | 182 |
|
152 | 183 | ls -ltrha $NIX_BUILD_TOP/daedalus/node_modules/ |
@@ -206,25 +237,24 @@ yarn2nix.mkYarnPackage { |
206 | 237 | # libunistring |
207 | 238 | # libusb1 |
208 | 239 | #] ++ stdenv.cc.libc.buildInputs; |
| 240 | + |
| 241 | + # `yarnPreBuild` is only used in `yarn2nix.mkYarnModules`, not `yarn2nix.mkYarnPackage`: |
209 | 242 | yarnPreBuild = '' |
210 | 243 | mkdir -p $HOME/.node-gyp/${nodejs.version} |
211 | 244 | echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion |
212 | 245 | ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version} |
213 | 246 | ''; |
| 247 | + |
| 248 | + inherit patchElectronRebuild; # for use in shell.nix |
| 249 | + |
214 | 250 | pkgConfig = { |
215 | 251 | electron-rebuild = { |
216 | | - # TODO: That is rather awful… Can it be done better? – @michalrus |
217 | 252 | postInstall = '' |
218 | | - nodeGypJs=lib/src/module-type/node-gyp.js |
219 | | - if [ ! -e $nodeGypJs ] ; then |
220 | | - echo >&2 'shouldn’t happen unless electron-rebuild changes' |
221 | | - exit 1 |
222 | | - fi |
223 | | -
|
224 | | - sed -r 's|const extraNodeGypArgs.*|\0 extraNodeGypArgs.push("--tarball", "${electron-gyp}", "--nodedir", process.env["HOME"] + "/.node-gyp/${windowsElectronVersion}");|' -i $nodeGypJs |
| 253 | + ${patchElectronRebuild} |
225 | 254 | ''; |
226 | 255 | }; |
227 | 256 | }; |
| 257 | + |
228 | 258 | # work around some purity problems in nix |
229 | 259 | yarnLock = ./yarn.lock; |
230 | 260 | packageJSON = ./package.json; |
|
0 commit comments