tcl.tclRequiresCheckHook: init

Add a hook that checks that Tcl packages can be `require`d correctly,
like `pythonImportsCheck`.
This commit is contained in:
Francesco Gazzetta
2026-03-16 17:57:47 +01:00
parent 0699e4fcfe
commit 910bdbb033
5 changed files with 71 additions and 4 deletions

View File

@@ -52,3 +52,35 @@ Its use is documented in `pkgs/development/tcl-modules/by-name/README.md`.
All Tcl applications reside elsewhere.
In case a package is used as both a library and an application (for example `expect`), it should be defined in `tcl-packages.nix`, with an alias elsewhere.
### Using tclRequiresCheck {#using-tclrequirescheck}
Although unit tests are highly preferred to validate correctness of a package, not
all packages have test suites that can be run easily, and some have none at all.
To help ensure the package still works, [`tclRequiresCheck`](#using-tclrequirescheck) can attempt to `package require`
the listed modules.
```nix
{
tclRequiresCheck = [
"json"
"doctools"
];
}
```
roughly translates to:
```nix
{
preDist = ''
TCLLIBPATH="$out/lib $TCLLIBPATH"
tclsh <<<'exit [catch {package require json; package require doctools}]'
'';
}
```
However, this is done in its own phase, and not dependent on whether [`doCheck = true;`](#var-stdenv-doCheck).
This can also be useful in verifying that the package doesn't assume commonly
present packages (e.g. `tcllib`).

View File

@@ -752,6 +752,9 @@
"typst-package-scope-and-usage": [
"index.html#typst-package-scope-and-usage"
],
"using-tclrequirescheck": [
"index.html#using-tclrequirescheck"
],
"var-go-buildTestBinaries": [
"index.html#var-go-buildTestBinaries"
],

View File

@@ -142,6 +142,16 @@ let
};
} ./tcl-package-hook.sh
) { };
tclRequiresCheckHook = callPackage (
{ buildPackages }:
makeSetupHook {
name = "tcl-requires-check-hook";
propagatedBuildInputs = [ buildPackages.makeBinaryWrapper ];
meta = {
inherit (meta) maintainers platforms;
};
} ./tcl-requires-check-hook.sh
) { };
# verify that Tcl's clock library can access tzdata
tests.tzdata = runCommand "${pname}-test-tzdata" { } ''
${baseInterp}/bin/tclsh <(echo "set t [clock scan {2004-10-30 05:00:00} \

View File

@@ -51,10 +51,15 @@ let
// {
buildInputs = buildInputs ++ [ tcl.tclPackageHook ];
nativeBuildInputs = nativeBuildInputs ++ [
makeWrapper
tcl
];
nativeBuildInputs =
nativeBuildInputs
++ [
makeWrapper
tcl
]
++ lib.optionals (stdenv.buildPlatform.canExecute stdenv.hostPlatform) [
tcl.tclRequiresCheckHook
];
propagatedBuildInputs = propagatedBuildInputs ++ [ tcl ];
env = {

View File

@@ -0,0 +1,17 @@
# Setup hook for checking whether Tcl requires succeed
echo "Sourcing tcl-requires-check-hook.sh"
tclRequiresCheckPhase () {
echo "Executing tclRequiresCheckPhase"
if [ -n "$tclRequiresCheck" ]; then
echo "Check whether the following packages can be required: $tclRequiresCheck"
export TCLLIBPATH="$out/lib $TCLLIBPATH" # Redundant if tcl-package-hook is also used
tclsh <<<'exit [catch {foreach req $env(tclRequiresCheck) {package require $req}}]'
fi
}
if [ -z "${dontUseTclRequiresCheck-}" ]; then
echo "Using tclRequiresCheckPhase"
preDistPhases+=" tclRequiresCheckPhase"
fi