tcl.tclRequiresCheckHook: move tcl code from heredoc to a separate file

A heredoc piped into tclsh makes tclsh run in interactive mode, which
keeps running regardless of errors. This required us to `catch` the
error and `exit` manually. By using a standalone script we avoid this
hack and the error gets automatically printed out.

With a standalone file we also get better editor support.
This commit is contained in:
Francesco Gazzetta
2026-09-12 12:05:51 +02:00
parent 4276ad9330
commit af9977e4c5
3 changed files with 25 additions and 22 deletions

View File

@@ -226,7 +226,9 @@ stdenv.mkDerivation (finalAttrs: {
{ buildPackages }:
makeSetupHook {
name = "tcl-requires-check-hook";
propagatedBuildInputs = [ buildPackages.makeBinaryWrapper ];
substitutions = {
tcl_hook = ./tcl-requires-check-hook.tcl;
};
meta = {
inherit (finalAttrs.meta) maintainers platforms;
license = lib.licenses.mit;

View File

@@ -6,27 +6,8 @@ tclRequiresCheckPhase () {
if [ -n "$tclRequiresCheck" ]; then
export TCLLIBPATH="$out/lib $TCLLIBPATH" # Redundant if tcl-package-hook is also used
tclsh <<'EOF'
if {[info exists env(NIX_ATTRS_JSON_FILE)]} {
set nix_attrs_json_file [open $env(NIX_ATTRS_JSON_FILE)]
set nix_attrs_json [read $nix_attrs_json_file]
close $nix_attrs_json_file
# Normally we'd use one of tcllib/tdom/rl_json/yajl-tcl to parse JSON,
# however we don't want to introduce a circular dependency,
# so we rely on the JSON capabilities of the builtin sqlite package
# https://wiki.tcl-lang.org/page/SQLite+extension+JSON1
package require sqlite3
sqlite3 db :memory: -readonly 1
set packages_to_check [db eval {
select value from json_each(jsonb_extract($nix_attrs_json, '$.tclRequiresCheck'))
}]
db close
} else {
set packages_to_check $env(tclRequiresCheck)
}
puts "Check whether the following packages can be required: $packages_to_check"
exit [catch {foreach pkg $packages_to_check {package require $pkg}}]
EOF
# FIXME: For some reason the output gets swallowed unless we pipe it through cat‽
tclsh @tcl_hook@ 2>&1 | cat
fi
}

View File

@@ -0,0 +1,20 @@
#!/usr/bin/env tclsh
if {[info exists env(NIX_ATTRS_JSON_FILE)]} {
set nix_attrs_json_file [open $env(NIX_ATTRS_JSON_FILE)]
set nix_attrs_json [read $nix_attrs_json_file]
close $nix_attrs_json_file
# Normally we'd use one of tcllib/tdom/rl_json/yajl-tcl to parse JSON,
# however we don't want to introduce a circular dependency,
# so we rely on the JSON capabilities of the builtin sqlite package
# https://wiki.tcl-lang.org/page/SQLite+extension+JSON1
package require sqlite3
sqlite3 db :memory: -readonly 1
set packages_to_check [db eval {
select value from json_each(jsonb_extract($nix_attrs_json, '$.tclRequiresCheck'))
}]
db close
} else {
set packages_to_check $env(tclRequiresCheck)
}
puts "Check whether the following packages can be required: $packages_to_check"
foreach pkg $packages_to_check {package require $pkg}