summaryrefslogtreecommitdiffstats
path: root/pkgs/development/compilers/flutter/default.nix
blob: 59453eb93b8db7ff4f9eae5332fa8976d40689f4 (plain)
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
{
  callPackage,
  fetchzip,
  fetchFromGitHub,
  dart,
  dart-bin,
  lib,
  stdenv,
  runCommand,
}:
let
  mkCustomFlutter = args: callPackage ./flutter.nix args;
  wrapFlutter = flutter: callPackage ./wrapper.nix { inherit flutter; };
  getPatches =
    dir:
    let
      files = builtins.attrNames (builtins.readDir dir);
    in
    if (builtins.pathExists dir) then map (f: dir + ("/" + f)) files else [ ];
  mkFlutter =
    {
      version,
      engineVersion,
      dartVersion,
      flutterHash,
      dartHash,
      patches,
      pubspecLock,
      artifactHashes,
      channel,
    }:
    let
      args = {
        inherit
          version
          engineVersion
          patches
          pubspecLock
          artifactHashes
          channel
          ;

        dart =
          let
            hash =
              dartHash.${stdenv.hostPlatform.system}
                or (throw "Unsupported system: ${stdenv.hostPlatform.system}");
          in
          (
            if lib.versionAtLeast version "3.41" then
              (dart-bin.overrideAttrs (oldAttrs: {
                version = dartVersion;
                src = oldAttrs.src.overrideAttrs (_: {
                  inherit hash;
                });
              }))
            else
              (dart-bin.overrideAttrs (_: {
                # This overrideAttrs is used to replace the version in src.url
                version = dartVersion;
                __intentionallyOverridingVersion = true;
              })).overrideAttrs
                (oldAttrs: {
                  src = fetchzip {
                    inherit (oldAttrs.src) url;
                    inherit hash;
                  };
                })
          );
        src =
          let
            source = fetchFromGitHub {
              owner = "flutter";
              repo = "flutter";
              tag = version;
              hash = flutterHash;
            };
          in
          (
            if lib.versionAtLeast version "3.32" then
              # # Could not determine engine revision
              (runCommand source.name { } ''
                cp --recursive ${source} $out
                chmod +w $out/bin
                mkdir $out/bin/cache
                cp $out/bin/internal/engine.version $out/bin/cache/engine.stamp
                touch $out/bin/cache/engine.realm
              '')
            else
              source
          );
      };
    in
    (mkCustomFlutter args).overrideAttrs (
      prev: next: {
        passthru = next.passthru // {
          inherit wrapFlutter mkCustomFlutter mkFlutter;
          buildFlutterApplication = callPackage ./build-support/build-flutter-application.nix {
            flutter = wrapFlutter (mkCustomFlutter args);
          };
        };
      }
    );

  flutterVersions = lib.mapAttrs' (
    version: _:
    let
      versionDir = ./versions + "/${version}";
      data = lib.importJSON (versionDir + "/data.json");
    in
    lib.nameValuePair "v${version}" (
      wrapFlutter (
        mkFlutter (
          {
            patches = (getPatches ./patches) ++ (getPatches (versionDir + "/patches"));
          }
          // data
        )
      )
    )
  ) (builtins.readDir ./versions);

  stableFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "stable") flutterVersions;
  betaFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "beta") flutterVersions;
in
flutterVersions
// {
  inherit wrapFlutter mkFlutter;
}
// lib.optionalAttrs (betaFlutterVersions != { }) {
  beta = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames betaFlutterVersions))};
}
// lib.optionalAttrs (stableFlutterVersions != { }) {
  stable = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames stableFlutterVersions))};
}