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.
This commit is contained in:
David McFarland
2026-01-15 15:16:52 -04:00
parent 537368d3cb
commit cb2ca79bd0
2 changed files with 65 additions and 56 deletions
+62 -55
View File
@@ -100,71 +100,77 @@ 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
pkgs.callPackage ./wrapper.nix { } "sdk" (
(pkgs.combinePackages [
base.runtime
base.aspnetcore
(overlay.overrideAttrs (old: {
passthru = old.passthru // {
inherit (base)
packages
targetPackages
;
};
}))
]).unwrapped.overrideAttrs
(old: {
name = overlay.unwrapped.name;
# resolve symlinks so DOTNET_ROOT is self-contained
postBuild = ''
mv "$out"/share/dotnet{,~}
cp -Lr "$out"/share/dotnet{~,}
rm -r "$out"/share/dotnet~
''
+ old.postBuild;
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;
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;
in
{
inherit hasILCompiler packages;
let
withBaseRuntimes =
if fallback.version == base.version then
base.unwrapped
else
(pkgs.combinePackages [
base.runtime
base.aspnetcore
fallback
]).unwrapped.overrideAttrs
(old: {
name = fallback.unwrapped.name;
# resolve symlinks so DOTNET_ROOT is self-contained
postBuild = ''
mv "$out"/share/dotnet{,~}
cp -Lr "$out"/share/dotnet{~,}
rm -r "$out"/share/dotnet~
''
+ old.postBuild;
passthru = old.passthru // {
inherit (base)
targetPackages
runtime
aspnetcore
;
inherit (overlay.unwrapped)
inherit (fallback.unwrapped)
pname
version
;
}
);
})
);
};
});
withFallbackPackages = withBaseRuntimes.overrideAttrs (old: {
passthru =
old.passthru
// (
let
hostRid = pkgs.systemToDotnetRid base.stdenv.hostPlatform.system;
hasILCompiler = base.hasILCompiler || fallback.hasILCompiler;
packageName = "runtime.${hostRid}.Microsoft.DotNet.ILCompiler";
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 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;
@@ -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)