diff options
author | Domen Kožar <domen@dev.si> | 2015-03-17 08:53:33 +0100 |
---|---|---|
committer | Domen Kožar <domen@dev.si> | 2015-03-17 08:55:03 +0100 |
commit | 1e4ba025c260fa6852765e9f5c59e985f10c6a43 (patch) | |
tree | 1e10b538644f36e836abeb3641bee987d9cb5512 /pkgs/development/web | |
parent | 92501d62f4218da6ea9a215e8b8cb02f9f2926a5 (diff) | |
download | nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar.gz nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar.bz2 nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar.lz nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar.xz nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.tar.zst nixlib-1e4ba025c260fa6852765e9f5c59e985f10c6a43.zip |
Reverts a bunch of commits as a try to fix GC errors.
Commits - 694f01db2d2e1cde06ee243a5909d196e84f0a18 - 829479d1dda5dbb579885e16dc655716127457ed - bd81885f706dae5cdeb8c03845fa43d8b74fa57c - b2fdcf801ce08bf0c44e63bafe8ae2c720704da7
Diffstat (limited to 'pkgs/development/web')
-rw-r--r-- | pkgs/development/web/nodejs/build-node-package.nix | 170 |
1 files changed, 59 insertions, 111 deletions
diff --git a/pkgs/development/web/nodejs/build-node-package.nix b/pkgs/development/web/nodejs/build-node-package.nix index 042e29f29705..cda1162c947d 100644 --- a/pkgs/development/web/nodejs/build-node-package.nix +++ b/pkgs/development/web/nodejs/build-node-package.nix @@ -1,33 +1,25 @@ { stdenv, runCommand, nodejs, neededNatives}: { - name, version ? "", src, + name, src, # by default name of nodejs interpreter e.g. "nodejs-${name}" namePrefix ? nodejs.interpreterName + "-", # Node package name - pkgName ? - if version != "" then stdenv.lib.removeSuffix "-${version}" name else - (builtins.parseDrvName name).name, + pkgName ? (builtins.parseDrvName name).name, # List or attribute set of dependencies deps ? {}, # List or attribute set of peer depencies - peerDependencies ? {}, - - # List or attribute set of optional dependencies - optionalDependencies ? {}, - - # List of optional dependencies to skip - skipOptionalDependencies ? [], + peerDependencies ? [], # Whether package is binary or library - bin ? false, + bin ? null, - # Additional flags passed to npm install - flags ? "", + # Flags passed to npm install + flags ? [], # Command to be run before shell hook preShellHook ? "", @@ -35,12 +27,6 @@ # Command to be run after shell hook postShellHook ? "", - # Same as https://docs.npmjs.com/files/package.json#os - os ? [], - - # Same as https://docs.npmjs.com/files/package.json#cpu - cpu ? [], - # Attribute set of already resolved deps (internal), # for avoiding infinite recursion resolvedDeps ? {}, @@ -51,72 +37,42 @@ with stdenv.lib; let - self = let - sources = runCommand "node-sources" {} '' - tar --no-same-owner --no-same-permissions -xf ${nodejs.src} - mv $(find . -type d -mindepth 1 -maxdepth 1) $out - ''; + npmFlags = concatStringsSep " " (map (v: "--${v}") flags); - platforms = if os == [] then nodejs.meta.platforms else - fold (entry: platforms: - let - filterPlatforms = - stdenv.lib.platforms.${removePrefix "!" entry} or []; - in - # Ignore unknown platforms - if filterPlatforms == [] then platforms - else - if hasPrefix "!" entry then - subtractLists (intersectLists filterPlatforms nodejs.meta.platforms) platforms - else - platforms ++ (intersectLists filterPlatforms nodejs.meta.platforms) - ) [] os; - - mapDependencies = deps: f: rec { - # Convert deps to attribute set - attrDeps = if isAttrs deps then deps else - (listToAttrs (map (dep: nameValuePair dep.name dep) deps)); - - # All required node modules, without already resolved dependencies - # Also override with already resolved dependencies - requiredDeps = mapAttrs (name: dep: - dep.override { - resolvedDeps = resolvedDeps // { "${name}" = self; }; - } - ) (filterAttrs f (removeAttrs attrDeps (attrNames resolvedDeps))); - - # Recursive dependencies that we want to avoid with shim creation - recursiveDeps = filterAttrs f (removeAttrs attrDeps (attrNames requiredDeps)); - }; - - _dependencies = mapDependencies deps (name: dep: - dep.pkgName != pkgName); - _optionalDependencies = mapDependencies optionalDependencies (name: dep: - (builtins.tryEval dep).success && - !(elem dep.pkgName skipOptionalDependencies) - ); - _peerDependencies = mapDependencies peerDependencies (name: dep: - dep.pkgName != pkgName); - - requiredDependencies = - _dependencies.requiredDeps // - _optionalDependencies.requiredDeps // - _peerDependencies.requiredDeps; - - recursiveDependencies = - _dependencies.recursiveDeps // - _optionalDependencies.recursiveDeps // - _peerDependencies.recursiveDeps; + sources = runCommand "node-sources" {} '' + tar --no-same-owner --no-same-permissions -xf ${nodejs.src} + mv $(find . -type d -mindepth 1 -maxdepth 1) $out + ''; + + # Convert deps to attribute set + attrDeps = if isAttrs deps then deps else + (listToAttrs (map (dep: nameValuePair dep.name dep) deps)); + + # All required node modules, without already resolved dependencies + requiredDeps = removeAttrs attrDeps (attrNames resolvedDeps); + + # Recursive dependencies that we want to avoid with shim creation + recursiveDeps = removeAttrs attrDeps (attrNames requiredDeps); + + peerDeps = filter (dep: dep.pkgName != pkgName) peerDependencies; + + self = let + # Pass resolved dependencies to dependencies of this package + deps = map ( + dep: dep.override { + resolvedDeps = resolvedDeps // { "${name}" = self; }; + } + ) (attrValues requiredDeps); patchShebangs = dir: '' - node=`type -p node` - coffee=`type -p coffee || true` - find -L ${dir} -type f -print0 | xargs -0 grep -Il . | \ - xargs sed --follow-symlinks -i \ - -e 's@#!/usr/bin/env node@#!'"$node"'@' \ - -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ - -e 's@#!/.*/node@#!'"$node"'@' \ - -e 's@#!/.*/coffee@#!'"$coffee"'@' || true + node=`type -p node` + coffee=`type -p coffee || true` + find -L ${dir} -type f -print0 | xargs -0 grep -Il . | \ + xargs sed --follow-symlinks -i \ + -e 's@#!/usr/bin/env node@#!'"$node"'@' \ + -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ + -e 's@#!/.*/node@#!'"$node"'@' \ + -e 's@#!/.*/coffee@#!'"$coffee"'@' || true ''; in stdenv.mkDerivation ({ @@ -194,9 +150,9 @@ let # We do not handle shrinkwraps yet rm npm-shrinkwrap.json 2>/dev/null || true - mkdir ../build-dir + mkdir build-dir ( - cd ../build-dir + cd build-dir mkdir node_modules # Symlink or copy dependencies for node modules @@ -208,7 +164,12 @@ let '' else '' cp -R ${dep}/lib/node_modules/${dep.pkgName} node_modules/ '' - ) (attrValues requiredDependencies)} + ) deps} + + # Symlink peer dependencies + ${concatMapStrings (dep: '' + ln -sv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ + '') peerDeps} # Create shims for recursive dependenceies ${concatMapStrings (dep: '' @@ -219,10 +180,10 @@ let "version": "${getVersion dep}" } EOF - '') (attrValues recursiveDependencies)} + '') (attrValues recursiveDeps)} ) - export HOME=$PWD/../build-dir + export HOME=$PWD/build-dir runHook postConfigure ''; @@ -231,14 +192,14 @@ let # If source was a file, repackage it, so npm pre/post publish hooks are not triggered, if [[ -f $src ]]; then - GZIP=-1 tar -czf ../build-dir/package.tgz ./ + tar --exclude='build-dir' -czf build-dir/package.tgz ./ export src=$HOME/package.tgz else export src=$PWD fi # Install package - (cd $HOME && npm --registry http://www.example.com --nodedir=${sources} install $src --fetch-retries 0 ${flags}) + (cd $HOME && npm --registry http://www.example.com --nodedir=${sources} install $src ${npmFlags}) runHook postBuild ''; @@ -253,7 +214,7 @@ let ${concatMapStrings (dep: '' rm node_modules/${dep.pkgName}/package.json rmdir node_modules/${dep.pkgName} - '') (attrValues recursiveDependencies)} + '') (attrValues recursiveDeps)} mkdir -p $out/lib/node_modules @@ -272,10 +233,10 @@ let done fi - # Move peer dependencies to node_modules + # Symlink dependencies ${concatMapStrings (dep: '' mv node_modules/${dep.pkgName} $out/lib/node_modules - '') (attrValues _peerDependencies.requiredDeps)} + '') peerDeps} # Install binaries and patch shebangs mv node_modules/.bin $out/lib/node_modules 2>/dev/null || true @@ -298,36 +259,23 @@ let mkdir -p node_modules ${concatMapStrings (dep: '' ln -sfv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ - '') (attrValues requiredDependencies)} + '') deps} ${postShellHook} ''; - # Stipping does not make a lot of sense in node packages - dontStrip = true; - - meta = { - inherit platforms; - maintainers = [ stdenv.lib.maintainers.offline ]; - }; - passthru.pkgName = pkgName; - } // (filterAttrs (n: v: all (k: n != k) ["deps" "resolvedDeps" "optionalDependencies"]) args) // { + } // (filterAttrs (n: v: n != "deps" && n != "resolvedDeps") args) // { name = namePrefix + name; # Run the node setup hook when this package is a build input propagatedNativeBuildInputs = (args.propagatedNativeBuildInputs or []) ++ [ nodejs ]; - nativeBuildInputs = - (args.nativeBuildInputs or []) ++ neededNatives ++ - (attrValues requiredDependencies); + # Make buildNodePackage useful with --run-env + nativeBuildInputs = (args.nativeBuildInputs or []) ++ deps ++ peerDependencies ++ neededNatives; # Expose list of recursive dependencies upstream, up to the package that # caused recursive dependency - recursiveDeps = - (flatten ( - map (dep: remove name dep.recursiveDeps) (attrValues requiredDependencies) - )) ++ - (attrNames recursiveDependencies); + recursiveDeps = (flatten (map (d: remove name d.recursiveDeps) deps)) ++ (attrNames recursiveDeps); }); in self |