nodePackages: correctly handle platforms and optional dependencies

+17 -12
+17 -12
pkgs/development/web/nodejs/build-node-package.nix
··· 57 57 mv $(find . -type d -mindepth 1 -maxdepth 1) $out 58 58 ''; 59 59 60 - platforms = fold (entry: platforms: 61 - let 62 - filterPlatforms = attrByPath [(removePrefix "!" entry)] [] stdenv.lib.platforms; 63 - in 64 - if hasPrefix "!" entry then 65 - filter (p: any (f: p != f) filterPlatforms) platforms 66 - else 67 - filter (p: any (f: p == f) filterPlatforms) platforms 68 - ) nodejs.meta.platforms os; 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 + substract (intersect filterPlatforms nodejs.meta.platforms) platforms 71 + else 72 + platforms ++ (intersect filterPlatforms nodejs.meta.platforms) 73 + ) [] os; 69 74 70 75 mapDependencies = deps: f: rec { 71 76 # Convert deps to attribute set ··· 87 92 _dependencies = mapDependencies deps (name: dep: 88 93 dep.pkgName != pkgName); 89 94 _optionalDependencies = mapDependencies optionalDependencies (name: dep: 90 - any (platform: stdenv.system == platform) dep.meta.platforms && 91 - all (d: d != dep.pkgName) skipOptionalDependencies 95 + (builtins.tryEval dep).success && 96 + !(elem dep.pkgName skipOptionalDependencies) 92 97 ); 93 98 _peerDependencies = mapDependencies peerDependencies (name: dep: 94 99 dep.pkgName != pkgName); ··· 301 306 dontStrip = true; 302 307 303 308 meta = { 304 - platforms = platforms; 309 + inherit platforms; 305 310 maintainers = [ stdenv.lib.maintainers.offline ]; 306 311 }; 307 312