nixpkgs/pkgs/development/web/nodejs/nodejs.nix
Guillaume Girol 33afbf39f6 treewide: switch to nativeCheckInputs
checkInputs used to be added to nativeBuildInputs. Now we have
nativeCheckInputs to do that instead. Doing this treewide change allows
to keep hashes identical to before the introduction of
nativeCheckInputs.
2023-01-21 12:00:00 +00:00

199 lines
7 KiB
Nix

{ lib, stdenv, fetchurl, openssl, python, zlib, libuv, util-linux, http-parser
, pkg-config, which, buildPackages
# for `.pkgs` attribute
, callPackage
# Updater dependencies
, writeScript, coreutils, gnugrep, jq, curl, common-updater-scripts, nix, runtimeShell
, gnupg
, darwin, xcbuild
, procps, icu
}:
with lib;
{ enableNpm ? true, version, sha256, patches ? [] } @args:
let
inherit (darwin.apple_sdk.frameworks) CoreServices ApplicationServices;
majorVersion = versions.major version;
minorVersion = versions.minor version;
pname = if enableNpm then "nodejs" else "nodejs-slim";
useSharedHttpParser = !stdenv.isDarwin && versionOlder "${majorVersion}.${minorVersion}" "11.4";
sharedLibDeps = { inherit openssl zlib libuv; } // (optionalAttrs useSharedHttpParser { inherit http-parser; });
sharedConfigureFlags = concatMap (name: [
"--shared-${name}"
"--shared-${name}-libpath=${getLib sharedLibDeps.${name}}/lib"
/** Closure notes: we explicitly avoid specifying --shared-*-includes,
* as that would put the paths into bin/nodejs.
* Including pkg-config in build inputs would also have the same effect!
*/
]) (builtins.attrNames sharedLibDeps) ++ [
"--with-intl=system-icu"
];
copyLibHeaders =
map
(name: "${getDev sharedLibDeps.${name}}/include/*")
(builtins.attrNames sharedLibDeps);
extraConfigFlags = optionals (!enableNpm) [ "--without-npm" ];
self = stdenv.mkDerivation {
inherit pname version;
src = fetchurl {
url = "https://nodejs.org/dist/v${version}/node-v${version}.tar.xz";
inherit sha256;
};
CC_host = "cc";
CXX_host = "c++";
depsBuildBuild = [ buildPackages.stdenv.cc openssl libuv zlib ];
buildInputs = optionals stdenv.isDarwin [ CoreServices ApplicationServices ]
++ [ zlib libuv openssl http-parser icu ];
nativeBuildInputs = [ which pkg-config python ]
++ optionals stdenv.isDarwin [ xcbuild ];
outputs = [ "out" "libv8" ];
setOutputFlags = false;
moveToDev = false;
configureFlags = let
isCross = stdenv.hostPlatform != stdenv.buildPlatform;
inherit (stdenv.hostPlatform) gcc isAarch32;
in sharedConfigureFlags ++ optionals (versionOlder version "19") [
"--without-dtrace"
] ++ (optionals isCross [
"--cross-compiling"
"--without-intl"
"--without-snapshot"
"--dest-cpu=${let platform = stdenv.hostPlatform; in
if platform.isAarch32 then "arm"
else if platform.isAarch64 then "arm64"
else if platform.isMips32 && platform.isLittleEndian then "mipsel"
else if platform.isMips32 && !platform.isLittleEndian then "mips"
else if platform.isMips64 && platform.isLittleEndian then "mips64el"
else if platform.isPower && platform.is32bit then "ppc"
else if platform.isPower && platform.is64bit then "ppc64"
else if platform.isx86_64 then "x86_64"
else if platform.isx86_32 then "x86"
else if platform.isS390 && platform.is64bit then "s390x"
else if platform.isRiscV && platform.is64bit then "riscv64"
else throw "unsupported cpu ${stdenv.hostPlatform.uname.processor}"}"
]) ++ (optionals (isCross && isAarch32 && hasAttr "fpu" gcc) [
"--with-arm-fpu=${gcc.fpu}"
]) ++ (optionals (isCross && isAarch32 && hasAttr "float-abi" gcc) [
"--with-arm-float-abi=${gcc.float-abi}"
]) ++ extraConfigFlags;
configurePlatforms = [];
dontDisableStatic = true;
enableParallelBuilding = true;
passthru.interpreterName = "nodejs";
passthru.pkgs = callPackage ../../node-packages/default.nix {
nodejs = self;
};
setupHook = ./setup-hook.sh;
pos = builtins.unsafeGetAttrPos "version" args;
inherit patches;
postPatch = ''
patchShebangs .
# fix tests
for a in test/parallel/test-child-process-env.js \
test/parallel/test-child-process-exec-env.js \
test/parallel/test-child-process-default-options.js \
test/fixtures/syntax/good_syntax_shebang.js \
test/fixtures/syntax/bad_syntax_shebang.js ; do
substituteInPlace $a \
--replace "/usr/bin/env" "${coreutils}/bin/env"
done
'' + optionalString stdenv.isDarwin ''
sed -i -e "s|tr1/type_traits|type_traits|g" \
-e "s|std::tr1|std|" src/util.h
'';
nativeCheckInputs = [ procps ];
doCheck = false; # fails 4 out of 1453 tests
postInstall = ''
PATH=$out/bin:$PATH patchShebangs $out
${optionalString (enableNpm && stdenv.hostPlatform == stdenv.buildPlatform) ''
mkdir -p $out/share/bash-completion/completions/
HOME=$TMPDIR $out/bin/npm completion > $out/share/bash-completion/completions/npm
for dir in "$out/lib/node_modules/npm/man/"*; do
mkdir -p $out/share/man/$(basename "$dir")
for page in "$dir"/*; do
ln -rs $page $out/share/man/$(basename "$dir")
done
done
''}
# install the missing headers for node-gyp
cp -r ${concatStringsSep " " copyLibHeaders} $out/include/node
# assemble a static v8 library and put it in the 'libv8' output
mkdir -p $libv8/lib
pushd out/Release/obj.target
find . -path "./torque_*/**/*.o" -or -path "./v8*/**/*.o" | sort -u >files
${if stdenv.buildPlatform.isGnu then ''
ar -cqs $libv8/lib/libv8.a @files
'' else ''
cat files | while read -r file; do
ar -cqS $libv8/lib/libv8.a $file
done
''}
popd
# copy v8 headers
cp -r deps/v8/include $libv8/
# create a pkgconfig file for v8
major=$(grep V8_MAJOR_VERSION deps/v8/include/v8-version.h | cut -d ' ' -f 3)
minor=$(grep V8_MINOR_VERSION deps/v8/include/v8-version.h | cut -d ' ' -f 3)
patch=$(grep V8_PATCH_LEVEL deps/v8/include/v8-version.h | cut -d ' ' -f 3)
mkdir -p $libv8/lib/pkgconfig
cat > $libv8/lib/pkgconfig/v8.pc << EOF
Name: v8
Description: V8 JavaScript Engine
Version: $major.$minor.$patch
Libs: -L$libv8/lib -lv8 -pthread -licui18n
Cflags: -I$libv8/include
EOF
'';
passthru.updateScript = import ./update.nix {
inherit writeScript coreutils gnugrep jq curl common-updater-scripts gnupg nix runtimeShell;
inherit lib;
inherit majorVersion;
};
meta = {
description = "Event-driven I/O framework for the V8 JavaScript engine";
homepage = "https://nodejs.org";
changelog = "https://github.com/nodejs/node/releases/tag/v${version}";
license = licenses.mit;
maintainers = with maintainers; [ goibhniu gilligan cko marsam ];
platforms = platforms.linux ++ platforms.darwin;
mainProgram = "node";
knownVulnerabilities = optional (versionOlder version "14") "This NodeJS release has reached its end of life. See https://nodejs.org/en/about/releases/.";
};
passthru.python = python; # to ensure nodeEnv uses the same version
};
in self