guix_mirror_bot pushed a commit to branch master
in repository guix.
commit 306cb24de1b48627c349754bd9d291f0c9c7e61d
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.
Change-Id: I844da3e30bc5f0fc18f135f0e216f2e11b6646b1
Signed-off-by: Jelle Licht <[email protected]>
---
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 b8601242246..a1ca3b6ac12 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")