Reverts a bunch of commits as a try to fix GC errors.

Commits

- 694f01db2d2e1cde06ee243a5909d196e84f0a18
- 829479d1dda5dbb579885e16dc655716127457ed
- bd81885f706dae5cdeb8c03845fa43d8b74fa57c
- b2fdcf801ce08bf0c44e63bafe8ae2c720704da7

+57 -109
+3 -3
lib/lists.nix
··· 234 234 in [x] ++ remove x xs; 235 235 236 236 # Intersects list 'e' and another list 237 - intersectLists = e: filter (x: elem x e); 237 + intersect = e: filter (x: elem x e); 238 238 239 - # Subtracts list 'e' from another list 240 - subtractLists = e: filter (x: !(elem x e)); 239 + # Substracts list 'e' from another list 240 + substract = e: filter (x: !(elem x e)); 241 241 }
+54 -106
pkgs/development/web/nodejs/build-node-package.nix
··· 1 1 { stdenv, runCommand, nodejs, neededNatives}: 2 2 3 3 { 4 - name, version ? "", src, 4 + name, src, 5 5 6 6 # by default name of nodejs interpreter e.g. "nodejs-${name}" 7 7 namePrefix ? nodejs.interpreterName + "-", 8 8 9 9 # Node package name 10 - pkgName ? 11 - if version != "" then stdenv.lib.removeSuffix "-${version}" name else 12 - (builtins.parseDrvName name).name, 10 + pkgName ? (builtins.parseDrvName name).name, 13 11 14 12 # List or attribute set of dependencies 15 13 deps ? {}, 16 14 17 15 # List or attribute set of peer depencies 18 - peerDependencies ? {}, 19 - 20 - # List or attribute set of optional dependencies 21 - optionalDependencies ? {}, 22 - 23 - # List of optional dependencies to skip 24 - skipOptionalDependencies ? [], 16 + peerDependencies ? [], 25 17 26 18 # Whether package is binary or library 27 - bin ? false, 19 + bin ? null, 28 20 29 - # Additional flags passed to npm install 30 - flags ? "", 21 + # Flags passed to npm install 22 + flags ? [], 31 23 32 24 # Command to be run before shell hook 33 25 preShellHook ? "", ··· 35 27 # Command to be run after shell hook 36 28 postShellHook ? "", 37 29 38 - # Same as https://docs.npmjs.com/files/package.json#os 39 - os ? [], 40 - 41 - # Same as https://docs.npmjs.com/files/package.json#cpu 42 - cpu ? [], 43 - 44 30 # Attribute set of already resolved deps (internal), 45 31 # for avoiding infinite recursion 46 32 resolvedDeps ? {}, ··· 51 37 with stdenv.lib; 52 38 53 39 let 54 - self = let 55 - sources = runCommand "node-sources" {} '' 56 - tar --no-same-owner --no-same-permissions -xf ${nodejs.src} 57 - mv $(find . -type d -mindepth 1 -maxdepth 1) $out 58 - ''; 59 - 60 - platforms = if os == [] then nodejs.meta.platforms else 61 - fold (entry: platforms: 62 - let 63 - filterPlatforms = 64 - stdenv.lib.platforms.${removePrefix "!" entry} or []; 65 - in 66 - # Ignore unknown platforms 67 - if filterPlatforms == [] then platforms 68 - else 69 - if hasPrefix "!" entry then 70 - subtractLists (intersectLists filterPlatforms nodejs.meta.platforms) platforms 71 - else 72 - platforms ++ (intersectLists filterPlatforms nodejs.meta.platforms) 73 - ) [] os; 40 + npmFlags = concatStringsSep " " (map (v: "--${v}") flags); 74 41 75 - mapDependencies = deps: f: rec { 76 - # Convert deps to attribute set 77 - attrDeps = if isAttrs deps then deps else 78 - (listToAttrs (map (dep: nameValuePair dep.name dep) deps)); 42 + sources = runCommand "node-sources" {} '' 43 + tar --no-same-owner --no-same-permissions -xf ${nodejs.src} 44 + mv $(find . -type d -mindepth 1 -maxdepth 1) $out 45 + ''; 79 46 80 - # All required node modules, without already resolved dependencies 81 - # Also override with already resolved dependencies 82 - requiredDeps = mapAttrs (name: dep: 83 - dep.override { 84 - resolvedDeps = resolvedDeps // { "${name}" = self; }; 85 - } 86 - ) (filterAttrs f (removeAttrs attrDeps (attrNames resolvedDeps))); 47 + # Convert deps to attribute set 48 + attrDeps = if isAttrs deps then deps else 49 + (listToAttrs (map (dep: nameValuePair dep.name dep) deps)); 87 50 88 - # Recursive dependencies that we want to avoid with shim creation 89 - recursiveDeps = filterAttrs f (removeAttrs attrDeps (attrNames requiredDeps)); 90 - }; 51 + # All required node modules, without already resolved dependencies 52 + requiredDeps = removeAttrs attrDeps (attrNames resolvedDeps); 91 53 92 - _dependencies = mapDependencies deps (name: dep: 93 - dep.pkgName != pkgName); 94 - _optionalDependencies = mapDependencies optionalDependencies (name: dep: 95 - (builtins.tryEval dep).success && 96 - !(elem dep.pkgName skipOptionalDependencies) 97 - ); 98 - _peerDependencies = mapDependencies peerDependencies (name: dep: 99 - dep.pkgName != pkgName); 54 + # Recursive dependencies that we want to avoid with shim creation 55 + recursiveDeps = removeAttrs attrDeps (attrNames requiredDeps); 100 56 101 - requiredDependencies = 102 - _dependencies.requiredDeps // 103 - _optionalDependencies.requiredDeps // 104 - _peerDependencies.requiredDeps; 57 + peerDeps = filter (dep: dep.pkgName != pkgName) peerDependencies; 105 58 106 - recursiveDependencies = 107 - _dependencies.recursiveDeps // 108 - _optionalDependencies.recursiveDeps // 109 - _peerDependencies.recursiveDeps; 59 + self = let 60 + # Pass resolved dependencies to dependencies of this package 61 + deps = map ( 62 + dep: dep.override { 63 + resolvedDeps = resolvedDeps // { "${name}" = self; }; 64 + } 65 + ) (attrValues requiredDeps); 110 66 111 67 patchShebangs = dir: '' 112 - node=`type -p node` 113 - coffee=`type -p coffee || true` 114 - find -L ${dir} -type f -print0 | xargs -0 grep -Il . | \ 115 - xargs sed --follow-symlinks -i \ 116 - -e 's@#!/usr/bin/env node@#!'"$node"'@' \ 117 - -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ 118 - -e 's@#!/.*/node@#!'"$node"'@' \ 119 - -e 's@#!/.*/coffee@#!'"$coffee"'@' || true 68 + node=`type -p node` 69 + coffee=`type -p coffee || true` 70 + find -L ${dir} -type f -print0 | xargs -0 grep -Il . | \ 71 + xargs sed --follow-symlinks -i \ 72 + -e 's@#!/usr/bin/env node@#!'"$node"'@' \ 73 + -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ 74 + -e 's@#!/.*/node@#!'"$node"'@' \ 75 + -e 's@#!/.*/coffee@#!'"$coffee"'@' || true 120 76 ''; 121 77 122 78 in stdenv.mkDerivation ({ ··· 194 150 # We do not handle shrinkwraps yet 195 151 rm npm-shrinkwrap.json 2>/dev/null || true 196 152 197 - mkdir ../build-dir 153 + mkdir build-dir 198 154 ( 199 - cd ../build-dir 155 + cd build-dir 200 156 mkdir node_modules 201 157 202 158 # Symlink or copy dependencies for node modules ··· 208 164 '' else '' 209 165 cp -R ${dep}/lib/node_modules/${dep.pkgName} node_modules/ 210 166 '' 211 - ) (attrValues requiredDependencies)} 167 + ) deps} 168 + 169 + # Symlink peer dependencies 170 + ${concatMapStrings (dep: '' 171 + ln -sv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ 172 + '') peerDeps} 212 173 213 174 # Create shims for recursive dependenceies 214 175 ${concatMapStrings (dep: '' ··· 219 180 "version": "${getVersion dep}" 220 181 } 221 182 EOF 222 - '') (attrValues recursiveDependencies)} 183 + '') (attrValues recursiveDeps)} 223 184 ) 224 185 225 - export HOME=$PWD/../build-dir 186 + export HOME=$PWD/build-dir 226 187 runHook postConfigure 227 188 ''; 228 189 ··· 231 192 232 193 # If source was a file, repackage it, so npm pre/post publish hooks are not triggered, 233 194 if [[ -f $src ]]; then 234 - GZIP=-1 tar -czf ../build-dir/package.tgz ./ 195 + tar --exclude='build-dir' -czf build-dir/package.tgz ./ 235 196 export src=$HOME/package.tgz 236 197 else 237 198 export src=$PWD 238 199 fi 239 200 240 201 # Install package 241 - (cd $HOME && npm --registry http://www.example.com --nodedir=${sources} install $src --fetch-retries 0 ${flags}) 202 + (cd $HOME && npm --registry http://www.example.com --nodedir=${sources} install $src ${npmFlags}) 242 203 243 204 runHook postBuild 244 205 ''; ··· 253 214 ${concatMapStrings (dep: '' 254 215 rm node_modules/${dep.pkgName}/package.json 255 216 rmdir node_modules/${dep.pkgName} 256 - '') (attrValues recursiveDependencies)} 217 + '') (attrValues recursiveDeps)} 257 218 258 219 mkdir -p $out/lib/node_modules 259 220 ··· 272 233 done 273 234 fi 274 235 275 - # Move peer dependencies to node_modules 236 + # Symlink dependencies 276 237 ${concatMapStrings (dep: '' 277 238 mv node_modules/${dep.pkgName} $out/lib/node_modules 278 - '') (attrValues _peerDependencies.requiredDeps)} 239 + '') peerDeps} 279 240 280 241 # Install binaries and patch shebangs 281 242 mv node_modules/.bin $out/lib/node_modules 2>/dev/null || true ··· 298 259 mkdir -p node_modules 299 260 ${concatMapStrings (dep: '' 300 261 ln -sfv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ 301 - '') (attrValues requiredDependencies)} 262 + '') deps} 302 263 ${postShellHook} 303 264 ''; 304 265 305 - # Stipping does not make a lot of sense in node packages 306 - dontStrip = true; 307 - 308 - meta = { 309 - inherit platforms; 310 - maintainers = [ stdenv.lib.maintainers.offline ]; 311 - }; 312 - 313 266 passthru.pkgName = pkgName; 314 - } // (filterAttrs (n: v: all (k: n != k) ["deps" "resolvedDeps" "optionalDependencies"]) args) // { 267 + } // (filterAttrs (n: v: n != "deps" && n != "resolvedDeps") args) // { 315 268 name = namePrefix + name; 316 269 317 270 # Run the node setup hook when this package is a build input 318 271 propagatedNativeBuildInputs = (args.propagatedNativeBuildInputs or []) ++ [ nodejs ]; 319 272 320 - nativeBuildInputs = 321 - (args.nativeBuildInputs or []) ++ neededNatives ++ 322 - (attrValues requiredDependencies); 273 + # Make buildNodePackage useful with --run-env 274 + nativeBuildInputs = (args.nativeBuildInputs or []) ++ deps ++ peerDependencies ++ neededNatives; 323 275 324 276 # Expose list of recursive dependencies upstream, up to the package that 325 277 # caused recursive dependency 326 - recursiveDeps = 327 - (flatten ( 328 - map (dep: remove name dep.recursiveDeps) (attrValues requiredDependencies) 329 - )) ++ 330 - (attrNames recursiveDependencies); 278 + recursiveDeps = (flatten (map (d: remove name d.recursiveDeps) deps)) ++ (attrNames recursiveDeps); 331 279 }); 332 280 333 281 in self