dotnet: fix dotnet executables in darwin sandbox

This fixes:

    Could not load ICU data. UErrorCode: 2

We're using a hook instead of a wrapper because various things like to
reference the unwrapped dotnet executable.
This commit is contained in:
David McFarland 2024-02-21 13:08:01 -04:00
parent dd1e778bf6
commit 26c3d6878a
4 changed files with 45 additions and 20 deletions

View file

@ -185,6 +185,10 @@ stdenvNoCC.mkDerivation (args // {
inherit selfContainedBuild useAppHost useDotnetFromEnv; inherit selfContainedBuild useAppHost useDotnetFromEnv;
# propagate the runtime sandbox profile since the contents apply to published
# executables
propagatedSandboxProfile = toString dotnet-runtime.__propagatedSandboxProfile;
passthru = { passthru = {
inherit nuget-source; inherit nuget-source;
} // lib.optionalAttrs (!lib.isDerivation nugetDeps) { } // lib.optionalAttrs (!lib.isDerivation nugetDeps) {
@ -316,8 +320,4 @@ stdenvNoCC.mkDerivation (args // {
} // args.passthru or { }; } // args.passthru or { };
meta = (args.meta or { }) // { inherit platforms; }; meta = (args.meta or { }) // { inherit platforms; };
} })
# ICU tries to unconditionally load files from /usr/share/icu on Darwin, which makes builds fail
# in the sandbox, so disable ICU on Darwin. This, as far as I know, shouldn't cause any built packages
# to behave differently, just the dotnet build tool.
// lib.optionalAttrs stdenvNoCC.isDarwin { DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = 1; })

View file

@ -26,6 +26,7 @@ assert if type == "sdk" then packages != null else true;
, mkNugetDeps , mkNugetDeps
, callPackage , callPackage
, dotnetCorePackages , dotnetCorePackages
, xmlstarlet
}: }:
let let
@ -47,6 +48,9 @@ let
targetRid = dotnetCorePackages.systemToDotnetRid stdenv.targetPlatform.system; targetRid = dotnetCorePackages.systemToDotnetRid stdenv.targetPlatform.system;
sigtool = callPackage ./sigtool.nix {};
signAppHost = callPackage ./sign-apphost.nix {};
in in
mkCommon type rec { mkCommon type rec {
inherit pname version; inherit pname version;
@ -54,7 +58,11 @@ mkCommon type rec {
# Some of these dependencies are `dlopen()`ed. # Some of these dependencies are `dlopen()`ed.
nativeBuildInputs = [ nativeBuildInputs = [
makeWrapper makeWrapper
] ++ lib.optional stdenv.isLinux autoPatchelfHook; ] ++ lib.optional stdenv.isLinux autoPatchelfHook
++ lib.optionals (type == "sdk" && stdenv.isDarwin) [
xmlstarlet
sigtool
];
buildInputs = [ buildInputs = [
stdenv.cc.cc stdenv.cc.cc
@ -71,6 +79,16 @@ mkCommon type rec {
sourceRoot = "."; sourceRoot = ".";
postPatch = if type == "sdk" && stdenv.isDarwin then ''
xmlstarlet ed \
--inplace \
-s //_:Project -t elem -n Import \
-i \$prev -t attr -n Project -v "${signAppHost}" \
sdk/*/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.Sdk.targets
codesign --remove-signature packs/Microsoft.NETCore.App.Host.osx-*/*/runtimes/osx-*/native/{apphost,singlefilehost}
'' else null;
dontPatchELF = true; dontPatchELF = true;
noDumpEnvVars = true; noDumpEnvVars = true;
@ -108,6 +126,14 @@ mkCommon type rec {
$out/packs/Microsoft.NETCore.App.Host.${targetRid}/*/runtimes/${targetRid}/native/*host $out/packs/Microsoft.NETCore.App.Host.${targetRid}/*/runtimes/${targetRid}/native/*host
''; '';
# fixes: Could not load ICU data. UErrorCode: 2
propagatedSandboxProfile = lib.optionalString stdenv.isDarwin ''
(allow file-read* (subpath "/usr/share/icu"))
(allow file-read* (subpath "/private/var/db/mds/system"))
(allow mach-lookup (global-name "com.apple.SecurityServer")
(global-name "com.apple.system.opendirectoryd.membership"))
'';
passthru = { passthru = {
inherit icu; inherit icu;
} // lib.optionalAttrs (type == "sdk") { } // lib.optionalAttrs (type == "sdk") {

View file

@ -52,7 +52,12 @@
run ? null, run ? null,
}: }:
let let
built = runCommand "dotnet-test-${name}" { buildInputs = [ finalAttrs.finalPackage ]; } ('' sdk = finalAttrs.finalPackage;
built = runCommand "dotnet-test-${name}" {
buildInputs = [ sdk ];
# make sure ICU works in a sandbox
propagatedSandboxProfile = toString sdk.__propagatedSandboxProfile;
} (''
HOME=$PWD/.home HOME=$PWD/.home
dotnet new nugetconfig dotnet new nugetconfig
dotnet nuget disable source nuget dotnet nuget disable source nuget
@ -65,11 +70,13 @@
if run == null if run == null
then built then built
else else
runCommand "${built.name}-run" { src = built; nativeBuildInputs = runInputs; } ( runCommand "${built.name}-run" {
lib.optionalString (runtime != null) '' src = built;
# TODO: use runtime here nativeBuildInputs = [ built ] ++ runInputs;
export DOTNET_ROOT=${runtime} } (lib.optionalString (runtime != null) ''
'' + run); # TODO: use runtime here
export DOTNET_ROOT=${runtime}
'' + run);
# Setting LANG to something other than 'C' forces the runtime to search # Setting LANG to something other than 'C' forces the runtime to search
# for ICU, which will be required in most user environments. # for ICU, which will be required in most user environments.

View file

@ -25,8 +25,6 @@ let
patchNupkgs = pkgsBuildHost.callPackage ./patch-nupkgs.nix {}; patchNupkgs = pkgsBuildHost.callPackage ./patch-nupkgs.nix {};
signAppHost = callPackage ./sign-apphost.nix {};
deps = mkNugetDeps { deps = mkNugetDeps {
name = "dotnet-vmr-deps"; name = "dotnet-vmr-deps";
sourceFile = depsFile; sourceFile = depsFile;
@ -51,12 +49,6 @@ let
-s //Project -t elem -n Import \ -s //Project -t elem -n Import \
-i \$prev -t attr -n Project -v "${./patch-restored-packages.proj}" \ -i \$prev -t attr -n Project -v "${./patch-restored-packages.proj}" \
src/*/Directory.Build.targets src/*/Directory.Build.targets
'' + lib.optionalString stdenv.isDarwin ''
xmlstarlet ed \
--inplace \
-s //Project -t elem -n Import \
-i \$prev -t attr -n Project -v "${signAppHost}" \
src/runtime/Directory.Build.targets
''; '';
postConfigure = old.postConfigure or "" + '' postConfigure = old.postConfigure or "" + ''