guix_mirror_bot pushed a commit to branch javascript-team in repository guix.
commit bfefe68013a4c0850bbbe5547de22f2bfabc20f7 Author: Jelle Licht <[email protected]> AuthorDate: Thu Oct 15 13:07:37 2026 +0200 build/node: Build native addons after install. * guix/build/node-build-system.scm (build-addon): New procedure. (%standard-phases): Add 'build-addon after 'install. * guix/build/tree-sitter-build-system.scm (%standard-phases): Delete 'build-addon. * gnu/packages/node-xyz.scm (node-sqlite3)[arguments]<#:phases>: Set npm_package_config_node_gyp_sqlite in 'npm-config-sqlite. Run 'patch-binding-path after 'build-addon. --- gnu/packages/node-xyz.scm | 5 +++-- guix/build/node-build-system.scm | 29 ++++++++++++++++++++++++++++- guix/build/tree-sitter-build-system.scm | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm index adf7689c15d..c81a97d8c0d 100644 --- a/gnu/packages/node-xyz.scm +++ b/gnu/packages/node-xyz.scm @@ -4053,8 +4053,9 @@ connection."))) ;; We need this step even if we do replace @mapbox/node-pre-gyp ;; because the package expects to build its bundled sqlite (lambda* (#:key inputs #:allow-other-keys) - (setenv "npm_config_sqlite" (assoc-ref inputs "sqlite")))) - (add-after 'install 'patch-binding-path + (setenv "npm_package_config_node_gyp_sqlite" + (assoc-ref inputs "sqlite")))) + (add-after 'build-addon 'patch-binding-path ;; We replace a file that dynamic searches for the addon using ;; node-pre-gyp (which we don't have) with a version that ;; simply uses the path to the addon we built directly. diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-system.scm index 3767ae68a39..67fc05d8e05 100644 --- a/guix/build/node-build-system.scm +++ b/guix/build/node-build-system.scm @@ -245,6 +245,32 @@ dependencies." "--install-links" "install" "../package.tgz"))) +(define* (build-addon #:key inputs outputs #:allow-other-keys) + "Build the native addon of the installed package, as 'npm install' would +when running scripts." + (let* ((node (assoc-ref inputs "node")) + (pkg-dir (string-append (assoc-ref outputs "out") "/lib/node_modules/" + (module-name "."))) + (pkg-meta (call-with-input-file + (string-append pkg-dir "/package.json") + json->scm))) + (define (delete-except dir keep?) + (for-each (lambda (file) + (unless (keep? file) + (delete-file-recursively (string-append dir "/" file)))) + (scandir dir (negate (cut member <> '("." "..")))))) + (when (and (file-exists? (string-append pkg-dir "/binding.gyp")) + (not (equal? (assoc "gypfile" pkg-meta) '("gypfile" . #f)))) + (with-directory-excursion pkg-dir + (invoke (string-append node "/bin/node") + (string-append node "/lib/node_modules/npm/node_modules" + "/node-gyp/bin/node-gyp.js") + "rebuild" + (string-append "--nodedir=" node)) + ;; Keep only the addons. + (delete-except "build" (cut string=? <> "Release")) + (delete-except "build/Release" (cut string-suffix? ".node" <>)))))) + (define* (avoid-node-gyp-rebuild #:key outputs #:allow-other-keys) "Adjust the installed 'package.json' to remove an 'install' script that would try to run 'node-gyp rebuild'." @@ -302,7 +328,8 @@ would try to run 'node-gyp rebuild'." (replace 'check check) (add-before 'install 'repack repack) (replace 'install install) - (add-after 'install 'avoid-node-gyp-rebuild avoid-node-gyp-rebuild))) + (add-after 'install 'build-addon build-addon) + (add-after 'build-addon 'avoid-node-gyp-rebuild avoid-node-gyp-rebuild))) (define* (node-build #:key inputs (phases %standard-phases) #:allow-other-keys #:rest args) diff --git a/guix/build/tree-sitter-build-system.scm b/guix/build/tree-sitter-build-system.scm index 81ff741f96c..f3e27e48053 100644 --- a/guix/build/tree-sitter-build-system.scm +++ b/guix/build/tree-sitter-build-system.scm @@ -146,6 +146,7 @@ and replace development dependencies with tree-sitter grammar node modules." (replace 'build build) (replace 'check check) (replace 'install install) + (delete 'build-addon) (add-after 'install 'install-js install-js))) (define* (tree-sitter-build #:key inputs (phases %standard-phases)
