1{
2 useNixpkgsEngine ? false,
3 callPackage,
4 fetchzip,
5 fetchFromGitHub,
6 dart,
7 lib,
8 stdenv,
9 runCommand,
10}:
11let
12 mkCustomFlutter = args: callPackage ./flutter.nix args;
13 wrapFlutter = flutter: callPackage ./wrapper.nix { inherit flutter; };
14 getPatches =
15 dir:
16 let
17 files = builtins.attrNames (builtins.readDir dir);
18 in
19 if (builtins.pathExists dir) then map (f: dir + ("/" + f)) files else [ ];
20 mkFlutter =
21 {
22 version,
23 engineVersion,
24 engineSwiftShaderHash,
25 engineSwiftShaderRev,
26 engineHashes,
27 enginePatches,
28 dartVersion,
29 flutterHash,
30 dartHash,
31 patches,
32 pubspecLock,
33 artifactHashes,
34 channel,
35 }:
36 let
37 args = {
38 inherit
39 version
40 engineVersion
41 engineSwiftShaderRev
42 engineSwiftShaderHash
43 engineHashes
44 enginePatches
45 patches
46 pubspecLock
47 artifactHashes
48 useNixpkgsEngine
49 channel
50 ;
51
52 dart = dart.override {
53 version = dartVersion;
54 sources = {
55 "${dartVersion}-x86_64-linux" = fetchzip {
56 url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-x64-release.zip";
57 sha256 = dartHash.x86_64-linux;
58 };
59 "${dartVersion}-aarch64-linux" = fetchzip {
60 url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-linux-arm64-release.zip";
61 sha256 = dartHash.aarch64-linux;
62 };
63 "${dartVersion}-x86_64-darwin" = fetchzip {
64 url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-x64-release.zip";
65 sha256 = dartHash.x86_64-darwin;
66 };
67 "${dartVersion}-aarch64-darwin" = fetchzip {
68 url = "https://storage.googleapis.com/dart-archive/channels/${channel}/release/${dartVersion}/sdk/dartsdk-macos-arm64-release.zip";
69 sha256 = dartHash.aarch64-darwin;
70 };
71 };
72 };
73 src =
74 let
75 source = fetchFromGitHub {
76 owner = "flutter";
77 repo = "flutter";
78 rev = version;
79 hash = flutterHash;
80 };
81 in
82 (
83 if lib.versionAtLeast version "3.32" then
84 # # Could not determine engine revision
85 (runCommand source.name { } ''
86 cp -r ${source} $out
87 chmod +w $out/bin
88 mkdir $out/bin/cache
89 cp $out/bin/internal/engine.version $out/bin/cache/engine.stamp
90 touch $out/bin/cache/engine.realm
91 '')
92 else
93 source
94 );
95 };
96 in
97 (mkCustomFlutter args).overrideAttrs (
98 prev: next: {
99 passthru = next.passthru // {
100 inherit wrapFlutter mkCustomFlutter mkFlutter;
101 buildFlutterApplication = callPackage ./build-support/build-flutter-application.nix {
102 flutter = wrapFlutter (mkCustomFlutter args);
103 };
104 };
105 }
106 );
107
108 flutterVersions = lib.mapAttrs' (
109 version: _:
110 let
111 versionDir = ./versions + "/${version}";
112 data = lib.importJSON (versionDir + "/data.json");
113 in
114 lib.nameValuePair "v${version}" (
115 wrapFlutter (
116 mkFlutter (
117 {
118 patches = (getPatches ./patches) ++ (getPatches (versionDir + "/patches"));
119 enginePatches = (getPatches ./engine/patches) ++ (getPatches (versionDir + "/engine/patches"));
120 }
121 // data
122 )
123 )
124 )
125 ) (builtins.readDir ./versions);
126
127 stableFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "stable") flutterVersions;
128 betaFlutterVersions = lib.attrsets.filterAttrs (_: v: v.channel == "beta") flutterVersions;
129in
130flutterVersions
131// {
132 inherit wrapFlutter mkFlutter;
133}
134// lib.optionalAttrs (betaFlutterVersions != { }) {
135 beta = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames betaFlutterVersions))};
136}
137// lib.optionalAttrs (stableFlutterVersions != { }) {
138 stable = flutterVersions.${lib.last (lib.naturalSort (builtins.attrNames stableFlutterVersions))};
139}