Commit cb2ca79b authored by David McFarland's avatar David McFarland
Browse files

dotnet: improve package fallbacks

In the combined SDK packages, include any packages from the binary SDKs
that aren't available in source builds.  This covers the previous
ILCompiler case, but also new ones like
Microsoft.AspNetCore.App.Internal.Assets.
parent 537368d3
Loading
Loading
Loading
Loading
+62 −55
Original line number Diff line number Diff line
@@ -100,25 +100,24 @@ let

  # combine an SDK with the runtime/packages from a base SDK
  combineSdk =
    base: overlay:
    if (overlay.runtime.version != base.runtime.version) then
      throw "combineSdk: unable to combine ${overlay.name} with ${base.name} because runtime versions don't match (${overlay.runtime.version} != ${base.runtime.version})"
    base: fallback:
    if (fallback.runtime.version != base.runtime.version) then
      throw "combineSdk: unable to combine ${fallback.name} with ${base.name} because runtime versions don't match (${fallback.runtime.version} != ${base.runtime.version})"
    else if base.meta.broken then
      fallback
    else
      let
        withBaseRuntimes =
          if fallback.version == base.version then
            base.unwrapped
          else
      pkgs.callPackage ./wrapper.nix { } "sdk" (
            (pkgs.combinePackages [
              base.runtime
              base.aspnetcore
          (overlay.overrideAttrs (old: {
            passthru = old.passthru // {
              inherit (base)
                packages
                targetPackages
                ;
            };
          }))
              fallback
            ]).unwrapped.overrideAttrs
              (old: {
            name = overlay.unwrapped.name;
                name = fallback.unwrapped.name;
                # resolve symlinks so DOTNET_ROOT is self-contained
                postBuild = ''
                  mv "$out"/share/dotnet{,~}
@@ -126,45 +125,52 @@ let
                  rm -r "$out"/share/dotnet~
                ''
                + old.postBuild;
                passthru = old.passthru // {
                  inherit (base)
                    runtime
                    aspnetcore
                    ;
                  inherit (fallback.unwrapped)
                    pname
                    version
                    ;
                };
              });

        withFallbackPackages = withBaseRuntimes.overrideAttrs (old: {
          passthru =
            old.passthru
            // (
              let
                  # if only overlay has a working ILCompiler, use it
                hostRid = pkgs.systemToDotnetRid base.stdenv.hostPlatform.system;
                  hasILCompiler = base.hasILCompiler || overlay.hasILCompiler;
                hasILCompiler = base.hasILCompiler || fallback.hasILCompiler;
                packageName = "runtime.${hostRid}.Microsoft.DotNet.ILCompiler";
                  packages =
                    if !base.hasILCompiler && overlay.hasILCompiler then
                      lib.filter (x: x.pname != packageName) base.packages
                      ++ lib.filter (x: x.pname == packageName) overlay.packages
                    else
                      base.packages;
                mergePackages =
                  a: b:
                  let
                    names = lib.genAttrs' a (p: lib.nameValuePair p.pname null);
                  in
                  a ++ lib.filter (p: !lib.hasAttr p.pname names) b;
                packages = mergePackages base.packages fallback.packages;
                targetPackages = lib.mapAttrs (
                  name: value: mergePackages value fallback.targetPackages.${name}
                ) base.targetPackages;
              in
              {
                  inherit hasILCompiler packages;
                  inherit (base)
                    targetPackages
                    runtime
                    aspnetcore
                    ;
                  inherit (overlay.unwrapped)
                    pname
                    version
                    ;
                inherit hasILCompiler packages targetPackages;
              }
            );
          })
      );
        });
      in
      pkgs.callPackage ./wrapper.nix { } "sdk" withFallbackPackages;

in
pkgs
// rec {
  # use binary SDK here to avoid downgrading feature band
  sdk_8_0_1xx = if !pkgs.dotnet_8.vmr.meta.broken then pkgs.dotnet_8.sdk else pkgs.sdk_8_0_1xx-bin;
  sdk_9_0_1xx = if !pkgs.dotnet_9.vmr.meta.broken then pkgs.dotnet_9.sdk else pkgs.sdk_9_0_1xx-bin;
  sdk_10_0_1xx =
    if !pkgs.dotnet_10.vmr.meta.broken then pkgs.dotnet_10.sdk else pkgs.sdk_10_0_1xx-bin;
  sdk_8_0_1xx = combineSdk pkgs.dotnet_8.sdk pkgs.sdk_8_0_1xx-bin;
  sdk_9_0_1xx = combineSdk pkgs.dotnet_9.sdk pkgs.sdk_9_0_1xx-bin;
  sdk_10_0_1xx = combineSdk pkgs.dotnet_10.sdk pkgs.sdk_10_0_1xx-bin;
  # source-built SDK only exists for _1xx feature band
  # https://github.com/dotnet/source-build/issues/3667
  sdk_8_0_4xx = combineSdk sdk_8_0_1xx pkgs.sdk_8_0_4xx-bin;
@@ -172,9 +178,10 @@ pkgs
  sdk_8_0 = sdk_8_0_4xx;
  sdk_9_0 = sdk_9_0_3xx;
  sdk_10_0 = sdk_10_0_1xx;
  sdk_8_0-source = sdk_8_0_1xx;
  sdk_9_0-source = sdk_9_0_1xx;
  sdk_10_0-source = sdk_10_0_1xx;
  sdk_8_0-source = if !pkgs.dotnet_8.vmr.meta.broken then pkgs.dotnet_8.sdk else pkgs.sdk_8_0_1xx-bin;
  sdk_9_0-source = if !pkgs.dotnet_9.vmr.meta.broken then pkgs.dotnet_9.sdk else pkgs.sdk_9_0_1xx-bin;
  sdk_10_0-source =
    if !pkgs.dotnet_10.vmr.meta.broken then pkgs.dotnet_10.sdk else pkgs.sdk_10_0_1xx-bin;
  runtime_8_0 = sdk_8_0.runtime;
  runtime_9_0 = sdk_9_0.runtime;
  runtime_10_0 = sdk_10_0.runtime;
+3 −1
Original line number Diff line number Diff line
@@ -94,8 +94,10 @@ let
    (mkPackage "Microsoft.DotNet.ILCompiler" runtime.version)
    (mkPackage "Microsoft.NET.ILLink.Tasks" runtime.version)
    (mkPackage "Microsoft.NETCore.App.Crossgen2.${hostRid}" runtime.version)
    (mkPackage "runtime.${hostRid}.Microsoft.DotNet.ILCompiler" runtime.version)
  ]
  ++ lib.optional vmr.hasILCompiler (
    mkPackage "runtime.${hostRid}.Microsoft.DotNet.ILCompiler" runtime.version
  )
  ++ lib.optionals (lib.versionOlder runtime.version "9") [
    (mkPackage "Microsoft.NETCore.DotNetHost" runtime.version)
    (mkPackage "Microsoft.NETCore.DotNetHostPolicy" runtime.version)