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