guix_mirror_bot pushed a commit to branch javascript-team in repository guix.
commit 5eebcdd397f831d407d57fbf69155dec173f7c92 Author: Nicolas Graves <[email protected]> AuthorDate: Sat Jul 11 23:44:39 2026 +0200 node: Introduce a stripped-down build-system for bootstrap. * gnu/packages/node.scm (bootstrap-node-phases, delete-dependencies*): Add essential components of a stripped-down node-build-system for bootstrap. --- gnu/packages/node.scm | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm index b860124224..a1ca3b6ac1 100644 --- a/gnu/packages/node.scm +++ b/gnu/packages/node.scm @@ -52,6 +52,7 @@ #:use-module (guix derivations) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix gexp) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix utils) @@ -336,7 +337,65 @@ devices.") (cpe-name . "node.js") (hidden? . #t))))) -;; Duplicate of node-semver +;; Stripped down version of the node-build-system, avoids (json) and some +;; niceties, resulting in a simpler but brittle phases. This allows us to work +;; on node-build-system without recompiling node-lts for each edit. +(define bootstrap-node-phases + #~(modify-phases %standard-phases + (add-after 'unpack 'set-home + (lambda _ + (with-directory-excursion ".." + (let loop ((i 0)) + (let ((dir (string-append "npm-home-" (number->string i)))) + (if (directory-exists? dir) + (loop (1+ i)) + (begin + (mkdir dir) + (setenv "HOME" (string-append (getcwd) "/" dir)) + (format #t "set HOME to ~s~%" (getenv "HOME"))))))))) + (add-before 'configure 'delete-lockfiles + (lambda _ + (let ((lock "package-lock.json")) + (when (file-exists? lock) + (delete-file lock))))) + (replace 'configure + (lambda* (#:key inputs #:allow-other-keys) + (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm"))) + (invoke npm "--offline" + "--ignore-scripts" + "--install-links" + "--no-audit" + "install")))) + (add-before 'install 'repack + (lambda _ + (invoke "tar" + ;; Add options suggested by https://reproducible-builds.org/docs/archives/ + "--sort=name" + (string-append "--mtime=@" (getenv "SOURCE_DATE_EPOCH")) + "--owner=0" + "--group=0" + "--numeric-owner" + "-czf" "../package.tgz" "."))) + (delete 'build) + (replace 'install + (lambda* (#:key inputs outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out")) + (npm (string-append (assoc-ref inputs "node") "/bin/npm"))) + (invoke npm "--prefix" #$output + "--global" + "--offline" + "--loglevel" "info" + "--production" + "--install-links" + "install" "../package.tgz")))))) + +(define (delete-dependencies* dependencies) + #~(substitute* "package.json" + (((string-append " *\"(" + (string-join (list #$@dependencies) "|") + ")\": \".*")) + ""))) + (define-public node-semver-bootstrap (package (name "node-semver")
