2025-05-16 00:52:05 +02:00

124 lines
3.2 KiB
Nix

{
lib,
fetchurl,
stdenv,
testers,
texinfo,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "quickjs";
version = "2025-04-26";
src = fetchurl {
url = "https://bellard.org/quickjs/quickjs-${finalAttrs.version}.tar.xz";
hash = "sha256-LyAHTCUWbvb3gfOBxQ1XtQLLhdRw1jmrzOu+95VMg78=";
};
outputs = [
"out"
"info"
];
nativeBuildInputs = [
texinfo
];
makeFlags = [ "PREFIX=$(out)" ];
doInstallCheck = true;
enableParallelBuilding = true;
strictDeps = true;
postPatch = lib.optionalString stdenv.hostPlatform.isDarwin ''
substituteInPlace Makefile \
--replace "CONFIG_LTO=y" ""
'';
postBuild = ''
make doc/version.texi
pushd doc
makeinfo *texi
popd
'';
postInstall = ''
pushd doc
install -Dm644 -t ''${!outputInfo}/share/info *info
popd
'';
installCheckPhase = lib.concatStringsSep "\n" [
''
runHook preInstallCheck
''
''
PATH="$out/bin:$PATH"
''
# Programs exit with code 1 when testing help, so grep for a string
''
set +o pipefail
qjs --help 2>&1 | grep "QuickJS version"
set -o pipefail
''
''
temp=$(mktemp).js
echo "console.log('Output from compiled program');" > "$temp"
set -o verbose
out=$(mktemp) && qjsc -o "$out" "$temp" && "$out" | grep -q "Output from compiled program"
out=$(mktemp) && qjsc -flto -o "$out" "$temp" && "$out" | grep -q "Output from compiled program"
''
''
runHook postInstallCheck
''
];
passthru.tests = {
version = testers.testVersion {
package = finalAttrs.finalPackage;
command = "qjs --help || true";
};
};
meta = {
homepage = "https://bellard.org/quickjs/";
description = "Small and embeddable Javascript engine";
longDescription = ''
QuickJS is a small and embeddable Javascript engine. It supports the
ES2023 specification including modules, asynchronous generators, proxies
and BigInt.
Main Features:
- Small and easily embeddable: just a few C files, no external
dependency, 210 KiB of x86 code for a simple hello world program.
- Fast interpreter with very low startup time: runs the 76000 tests of
the ECMAScript Test Suite in less than 2 minutes on a single core of a
desktop PC. The complete life cycle of a runtime instance completes in
less than 300 microseconds.
- Almost complete ES2023 support including modules, asynchronous
generators and full Annex B support (legacy web compatibility).
- Passes nearly 100% of the ECMAScript Test Suite tests when selecting
the ES2023 features. A summary is available at Test262 Report.
- Can compile Javascript sources to executables with no external dependency.
- Garbage collection using reference counting (to reduce memory usage and
have deterministic behavior) with cycle removal.
- Command line interpreter with contextual colorization implemented in
Javascript.
- Small built-in standard library with C library wrappers.
'';
license = lib.licenses.mit;
maintainers = with lib.maintainers; [
stesie
];
mainProgram = "qjs";
platforms = lib.platforms.all;
};
})