From cb2ca79bd0ef2c00d5c518c359d8e25bf34f9c28 Mon Sep 17 00:00:00 2001 From: David McFarland Date: Thu, 15 Jan 2026 15:07:04 -0400 Subject: [PATCH] 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. --- pkgs/development/compilers/dotnet/default.nix | 117 ++++++++++-------- .../development/compilers/dotnet/packages.nix | 4 +- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/pkgs/development/compilers/dotnet/default.nix b/pkgs/development/compilers/dotnet/default.nix index 9e1f248e61cd..1519f5562271 100644 --- a/pkgs/development/compilers/dotnet/default.nix +++ b/pkgs/development/compilers/dotnet/default.nix @@ -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; diff --git a/pkgs/development/compilers/dotnet/packages.nix b/pkgs/development/compilers/dotnet/packages.nix index 756343e08258..6be556fe204c 100644 --- a/pkgs/development/compilers/dotnet/packages.nix +++ b/pkgs/development/compilers/dotnet/packages.nix @@ -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)