1{
2 lib,
3 callPackage,
4 fetchgit,
5 tools ? null,
6 curl,
7 pkg-config,
8 git,
9 python3,
10 runCommand,
11 writeText,
12 cacert,
13 flutterVersion,
14 version,
15 hashes,
16 url,
17 hostPlatform,
18 targetPlatform,
19 buildPlatform,
20}@pkgs:
21let
22 target-constants = callPackage ./constants.nix { platform = targetPlatform; };
23 build-constants = callPackage ./constants.nix { platform = buildPlatform; };
24 tools = pkgs.tools or (callPackage ./tools.nix { inherit hostPlatform buildPlatform; });
25
26 boolOption = value: if value then "True" else "False";
27in
28runCommand "flutter-engine-source-${version}-${buildPlatform.system}-${targetPlatform.system}"
29 {
30 pname = "flutter-engine-source";
31 inherit version;
32
33 inherit (tools) depot_tools;
34
35 nativeBuildInputs = [
36 curl
37 pkg-config
38 git
39 tools.cipd
40 (python3.withPackages (
41 ps: with ps; [
42 httplib2
43 six
44 ]
45 ))
46 ];
47
48 gclient = writeText "flutter-engine-${version}.gclient" ''
49 solutions = [{
50 "managed": False,
51 "name": "${lib.optionalString (lib.versionAtLeast flutterVersion "3.29") "engine/"}src/flutter",
52 "url": "${url}",
53 "custom_vars": {
54 "download_fuchsia_deps": False,
55 "download_android_deps": False,
56 "download_linux_deps": ${boolOption targetPlatform.isLinux},
57 "setup_githooks": False,
58 "download_esbuild": False,
59 "download_dart_sdk": False,
60 "host_cpu": "${build-constants.alt-arch}",
61 "host_os": "${build-constants.alt-os}",
62 },
63 }]
64
65 target_os_only = True
66 target_os = [
67 "${target-constants.alt-os}"
68 ]
69
70 target_cpu_only = True
71 target_cpu = [
72 "${target-constants.alt-arch}"
73 ]
74 '';
75
76 NIX_SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
77 GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
78 SSL_CERT_FILE = "${cacert}/etc/ssl/certs/ca-bundle.crt";
79 DEPOT_TOOLS_UPDATE = "0";
80 DEPOT_TOOLS_COLLECT_METRICS = "0";
81 PYTHONDONTWRITEBYTECODE = "1";
82
83 outputHashAlgo = "sha256";
84 outputHashMode = "recursive";
85 outputHash =
86 (hashes."${buildPlatform.system}" or { })."${targetPlatform.system}"
87 or (throw "Hash not set for ${targetPlatform.system} on ${buildPlatform.system}");
88 }
89 (
90 ''
91 source ${../../../../build-support/fetchgit/deterministic-git}
92 export -f clean_git
93 export -f make_deterministic_repo
94
95 ''
96 + (
97 if lib.versionAtLeast flutterVersion "3.29" then
98 ''
99 mkdir -p source
100 cp $gclient source/.gclient
101 cd source
102 ''
103 else
104 ''
105 mkdir -p $out
106 cp $gclient $out/.gclient
107 cd $out
108 ''
109 )
110 + ''
111
112 export PATH=$PATH:$depot_tools
113 python3 $depot_tools/gclient.py sync --no-history --shallow --nohooks -j $NIX_BUILD_CORES
114 ''
115 + lib.optionalString (lib.versionAtLeast flutterVersion "3.29") ''
116 cp -r engine/src/flutter/third_party/* engine/src/flutter/engine/src/flutter/third_party/
117 mv engine/src/flutter/engine $out
118 ''
119 + ''
120 find $out -name '.git' -exec rm -rf {} \; || true
121
122 rm -rf $out/src/{buildtools,fuchsia}
123 rm -rf $out/src/flutter/{buildtools,prebuilts,third_party/swiftshader,third_party/gn/.versions}
124 rm -rf $out/src/flutter/{third_party/dart/tools/sdks/dart-sdk,third_party/ninja/ninja,third_party/java}
125 rm -rf $out/src/third_party/{dart/tools/sdks/dart-sdk,libcxx/test}
126
127 rm -rf $out/.cipd $out/.gclient $out/.gclient_entries $out/.gclient_previous_custom_vars $out/.gclient_previous_sync_commits
128 ''
129 )