@@ -239,6 +239,7 @@ Consult previous versions of this document for older versions of Node.js:
239239
240240Installation via Linux package manager can be achieved with:
241241
242+ * Nix, NixOS: ` nix-shell `
242243* Ubuntu, Debian: ` sudo apt-get install python3 g++-12 gcc-12 make python3-pip `
243244* Fedora: ` sudo dnf install python3 gcc-c++ make python3-pip `
244245* CentOS and RHEL: ` sudo yum install python3 gcc-c++ make python3-pip `
@@ -259,6 +260,75 @@ installed, you can find them under the menu `Xcode -> Open Developer Tool ->
259260More Developer Tools...` . This step will install ` clang` , ` clang++`, and
260261` make ` .
261262
263+ #### Nix integration
264+
265+ If you are using Nix and direnv, you can use the following to get started:
266+
267+ ``` bash
268+ echo ' use_nix --arg sharedLibDeps {} --argstr icu small' > .envrc
269+ direnv allow .
270+ make build-ci -j12
271+ ```
272+
273+ The use of ` make build-ci ` is to ensure you are using the ` CONFIG_FLAGS `
274+ environment variable. You can also specify it manually:
275+
276+ ``` bash
277+ ./configure $CONFIG_FLAGS
278+ make -j12
279+ ```
280+
281+ Passing the ` --arg sharedLibDeps {} ` instructs direnv and Nix to generate an
282+ environment that uses the vendored-in native dependencies. Using the vendored-in
283+ dependencies result in a result closer to the official binaries, the tradeoff
284+ being the build will take longer to complete as you'd have to build those
285+ dependencies instead of using the cached ones from the Nix cache. You can omit
286+ that flag to use all the shared dependencies, or specify only some dependencies:
287+
288+ ``` bash
289+ cat -> .envrc << 'EOF '
290+ use nix --arg sharedLibDeps '{
291+ inherit (import <nixpkgs> {})
292+ openssl
293+ zlib
294+ ;
295+ }'
296+ EOF
297+ ```
298+
299+ Passing the ` --argstr icu small ` instructs direnv and Nix to pass ` --with-intl=small ` in
300+ the ` CONFIG_FLAGS ` environment variable. If you omit this, the prebuilt ICU from Nix cache
301+ will be used, which should speed up greatly compilation time.
302+
303+ The use of ` direnv ` is completely optional, you can also use ` nix-shell ` directly,
304+ e.g. here's a command you can use to build a binary for benchmarking purposes:
305+
306+ ``` bash
307+ # Passing `--arg loadJSBuiltinsDynamically false` to instruct the compiler to
308+ # embed the JS core files so it is no longer affected by local changes
309+ # (necessary for getting useful benchmark results).
310+ # Passing `--arg devTools '[]' --arg benchmarkTools '[]'` since we don't need
311+ # those to build node.
312+ nix-shell \
313+ --arg loadJSBuiltinsDynamically false \
314+ --arg devTools ' []' --arg benchmarkTools ' []' \
315+ --run ' make build-ci -j12'
316+
317+ mv out/Release/node ./node_old
318+
319+ # ...
320+ # Make your local changes, and re-build node
321+
322+ nix-shell \
323+ --arg loadJSBuiltinsDynamically false \
324+ --arg devTools ' []' --arg benchmarkTools ' []' \
325+ --run ' make build-ci -j12'
326+
327+ nix-shell --pure --run ' ./node benchmark/compare.js --old ./node_old --new ./node http | Rscript benchmark/compare.R'
328+ ```
329+
330+ There are additional attributes you can pass, see ` shell.nix ` file for more details.
331+
262332#### Building Node.js
263333
264334If the path to your build directory contains a space, the build will likely
@@ -267,7 +337,6 @@ fail.
267337To build Node.js:
268338
269339``` bash
270- export CXX=g++-12
271340./configure
272341make -j4
273342```
0 commit comments