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