about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/compilers/dotnet/stage0.nix
blob: d12d1a6c3d13ae75b0beb4058d27c94ab1aa32c8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
{ stdenv
, stdenvNoCC
, callPackage
, lib
, writeShellScript
, pkgsBuildHost
, mkNugetDeps
, nix
, cacert
, nuget-to-nix
, dotnetCorePackages
, xmlstarlet

, releaseManifestFile
, tarballHash
, depsFile
, bootstrapSdk
}:

let
  mkPackages = callPackage ./packages.nix;
  mkVMR = callPackage ./vmr.nix;

  dotnetSdk = pkgsBuildHost.callPackage bootstrapSdk {};

  patchNupkgs = pkgsBuildHost.callPackage ./patch-nupkgs.nix {};

  signAppHost = callPackage ./sign-apphost.nix {};

  deps = mkNugetDeps {
    name = "dotnet-vmr-deps";
    sourceFile = depsFile;
  };

  vmr = (mkVMR {
    inherit releaseManifestFile tarballHash dotnetSdk;
  }).overrideAttrs (old: rec {
    prebuiltPackages = mkNugetDeps {
      name = "dotnet-vmr-deps";
      sourceFile = depsFile;
    };

    nativeBuildInputs =
      old.nativeBuildInputs or []
      ++ [ xmlstarlet ]
      ++ lib.optional stdenv.isLinux patchNupkgs;

    postPatch = old.postPatch or "" + lib.optionalString stdenv.isLinux ''
      xmlstarlet ed \
        --inplace \
        -s //Project -t elem -n Import \
        -i \$prev -t attr -n Project -v "${./patch-restored-packages.proj}" \
        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 "" + ''
      [[ ! -v prebuiltPackages ]] || ln -sf "$prebuiltPackages"/* prereqs/packages/prebuilt/
    '';

    passthru = old.passthru or {} // { fetch-deps =
      let
        inherit (vmr) targetRid updateScript;
        otherRids =
          lib.remove targetRid (
            map (system: dotnetCorePackages.systemToDotnetRid system)
              vmr.meta.platforms);

        pkg = vmr.overrideAttrs (old: {
          nativeBuildInputs = old.nativeBuildInputs ++ [
            nix
            cacert
            (nuget-to-nix.override { dotnet-sdk = dotnetSdk; })
          ];
          postPatch = old.postPatch or "" + ''
            xmlstarlet ed \
              --inplace \
              -s //Project -t elem -n Import \
              -i \$prev -t attr -n Project -v "${./record-downloaded-packages.proj}" \
              repo-projects/Directory.Build.targets
            # make nuget-client use the standard arcade package-cache dir, which
            # is where we scan for dependencies
            xmlstarlet ed \
              --inplace \
              -s //Project -t elem -n ItemGroup \
              -s \$prev -t elem -n EnvironmentVariables \
              -i \$prev -t attr -n Include -v 'NUGET_PACKAGES=$(ProjectDirectory)artifacts/sb/package-cache/' \
              repo-projects/nuget-client.proj
          '';
          buildFlags = [ "--online" ] ++ old.buildFlags;
          prebuiltPackages = null;
        });

        drv = builtins.unsafeDiscardOutputDependency pkg.drvPath;
      in
        writeShellScript "fetch-dotnet-sdk-deps" ''
          ${nix}/bin/nix-shell --pure --run 'source /dev/stdin' "${drv}" << 'EOF'
          set -e

          tmp=$(mktemp -d)
          trap 'rm -fr "$tmp"' EXIT

          HOME=$tmp/.home
          cd "$tmp"

          phases="''${prePhases[*]:-} unpackPhase patchPhase ''${preConfigurePhases[*]:-} \
            configurePhase ''${preBuildPhases[*]:-} buildPhase checkPhase" \
            genericBuild

          depsFiles=(./src/*/deps.nix)

          cat $(nix-build ${toString ./combine-deps.nix} \
            --arg list "[ ''${depsFiles[*]} ]" \
            --argstr baseRid ${targetRid} \
            --arg otherRids '${lib.generators.toPretty { multiline = false; } otherRids}' \
            ) > "${toString prebuiltPackages.sourceFile}"
          EOF
        '';
    };
  });
in mkPackages { inherit vmr; }