about summary refs log tree commit diff
path: root/pkgs/development/compilers/dotnet/stage0.nix
blob: e0caad3f9a674ca298b928a7c76ef5c799e2a77c (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
127
128
129
130
131
132
133
134
135
{ 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/
    '';

    buildFlags =
      old.buildFlags
      ++ lib.optionals (lib.versionAtLeast old.version "9") [
        # We need to set this as long as we have something in deps.nix. Currently
        # that's the portable ilasm/ildasm which aren't in the centos sourcebuilt
        # artifacts.
        "-p:SkipErrorOnPrebuilts=true"
      ];

    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; }