diff options
Diffstat (limited to 'gnu/packages/node.scm')
-rw-r--r-- | gnu/packages/node.scm | 44 |
1 files changed, 36 insertions, 8 deletions
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm index 7695614b3a..6569422584 100644 --- a/gnu/packages/node.scm +++ b/gnu/packages/node.scm @@ -7,7 +7,7 @@ ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr> ;;; Copyright © 2018-2022 Marius Bakke <marius@gnu.org> ;;; Copyright © 2020, 2021 Pierre Langlois <pierre.langlois@gmx.com> -;;; Copyright © 2020 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2020, 2023 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com> ;;; Copyright © 2021 Guillaume Le Vaillant <glv@posteo.net> ;;; Copyright © 2021, 2022 Philip McGrath <philip@philipmcgrath.com> @@ -748,13 +748,12 @@ source files.") "0vcc132z7lkxnw5clmiz6sp6ccmw35pyb69hczphrig5frfmqkva")) (modules '((guix build utils))) (snippet - `(begin + '(begin ;; openssl.cnf is required for build. (for-each delete-file-recursively (find-files "deps/openssl" (lambda (file stat) - (if (string-contains file "nodejs-openssl.cnf") - #f #t)))) + (not (string-contains file "nodejs-openssl.cnf"))))) ;; Remove bundled software, where possible (for-each delete-file-recursively '("deps/cares" @@ -764,8 +763,7 @@ source files.") (substitute* "Makefile" ;; Remove references to bundled software. (("deps/uv/uv.gyp") "") - (("deps/zlib/zlib.gyp") "")) - #t)))) + (("deps/zlib/zlib.gyp") "")))))) (arguments (substitute-keyword-arguments (package-arguments node) ((#:configure-flags configure-flags) @@ -876,7 +874,36 @@ source files.") (copy-file (string-append llhttp "/src/http.c") "deps/llhttp/src/http.c") (copy-file (string-append llhttp "/include/llhttp.h") - "deps/llhttp/include/llhttp.h")))))))) + "deps/llhttp/include/llhttp.h")))) + ;; npm installs dependencies by copying their files over a tar + ;; stream. A file with more than one hardlink is marked as a + ;; "Link". pacote/lib/fetcher.js calls node-tar's extractor with a + ;; filter that ignores any "Link" entries. This means that + ;; dependending on the number of hardlinks on files in a node-* + ;; package *some* of its files may not be installed when generating + ;; another package's "node_modules" directory. The build output + ;; would differ depending on irrelevant file system state. + ;; + ;; To avoid this, we patch node-tar to treat files with hardlinks + ;; the same as any other file, so that node-tar has no choice but + ;; to extract all of them --- independent of pacote's filter. + ;; + ;; Why not patch pacote's filter instead? This has led to subtle + ;; differences in where the files are installed, so it's easier to + ;; just ensure that files with hardlinks are always treated as + ;; regular files. + ;; + ;; Discussion: + ;; https://lists.gnu.org/archive/html/guix-devel/2023-07/msg00040.html + ;; Upstream bug report: + ;; https://github.com/npm/pacote/issues/285 + (add-after 'install 'ignore-number-of-hardlinks + (lambda* (#:key outputs #:allow-other-keys) + (let ((file (string-append (assoc-ref outputs "out") + "/lib/node_modules/npm/node_modules" + "/tar/lib/write-entry.js"))) + (substitute* file + (("this.stat.nlink > 1") "false"))))))))) (native-inputs (list ;; Runtime dependencies for binaries used as a bootstrap. c-ares-for-node @@ -914,4 +941,5 @@ source files.") ((#:phases phases '%standard-phases) `(modify-phases ,phases (delete 'install-npmrc) - (delete 'patch-nested-shebangs))))))) + (delete 'patch-nested-shebangs) + (delete 'ignore-number-of-hardlinks))))))) |