blob: 7ff4f34a44e12c1a7014378e9d45c334e1cd749e [file] [log] [blame]
Michael Goderbauercd8434d2017-02-16 23:10:11 -08001// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alexander Aprelevc5750cd2017-08-31 13:35:55 -07005import 'package:meta/meta.dart';
6
Michael Goderbauercd8434d2017-02-16 23:10:11 -08007import 'base/context.dart';
8import 'base/file_system.dart';
9import 'base/platform.dart';
Alexander Aprelev70b32e82017-12-22 14:58:53 -080010import 'base/process_manager.dart';
Stanislav Baranov393f9272018-08-16 08:43:41 -070011import 'base/utils.dart';
Michael Goderbauercd8434d2017-02-16 23:10:11 -080012import 'build_info.dart';
Alexander Aprelevfe005982018-02-16 09:20:23 -080013import 'dart/sdk.dart';
Michael Goderbauercd8434d2017-02-16 23:10:11 -080014import 'globals.dart';
15
16enum Artifact {
Michael Goderbauercd8434d2017-02-16 23:10:11 -080017 genSnapshot,
Jason Simmonse7f13612017-03-29 16:30:41 -070018 flutterTester,
Michael Goderbauercd8434d2017-02-16 23:10:11 -080019 snapshotDart,
20 flutterFramework,
Michael Goderbauerd579d582017-03-02 10:57:27 -080021 vmSnapshotData,
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070022 isolateSnapshotData,
23 platformKernelDill,
24 platformLibrariesJson,
25 flutterPatchedSdkPath,
26 frontendServerSnapshotForEngineDartSdk,
Alexander Aprelevfe005982018-02-16 09:20:23 -080027 engineDartSdkPath,
Keerti Parthasarathy02633942018-03-06 14:41:50 -080028 engineDartBinary,
Jonah Williams9bc56562019-02-14 22:42:30 -080029 dart2jsSnapshot,
30 kernelWorkerSnapshot,
Jonah Williams44b22c72019-03-25 18:47:37 -070031 flutterWebSdk,
Michael Goderbauercd8434d2017-02-16 23:10:11 -080032}
33
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +010034String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMode mode ]) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -080035 switch (artifact) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -080036 case Artifact.genSnapshot:
Alexander Aprelev70b32e82017-12-22 14:58:53 -080037 return 'gen_snapshot';
Jason Simmonse7f13612017-03-29 16:30:41 -070038 case Artifact.flutterTester:
Konstantin Scheglovcf500bf2018-04-11 08:52:17 -070039 if (platform == TargetPlatform.windows_x64) {
40 return 'flutter_tester.exe';
41 }
Jason Simmons72effdd2017-03-29 15:31:36 -070042 return 'flutter_tester';
Michael Goderbauercd8434d2017-02-16 23:10:11 -080043 case Artifact.snapshotDart:
44 return 'snapshot.dart';
45 case Artifact.flutterFramework:
46 return 'Flutter.framework';
Michael Goderbauerd579d582017-03-02 10:57:27 -080047 case Artifact.vmSnapshotData:
Stanislav Baranovc799c2f2018-09-20 13:12:38 -070048 // Flutter debug and dynamic profile modes for all target platforms use Dart
49 // RELEASE VM snapshot that comes from host debug build and has the metadata
50 // related to development tools.
51 if (mode == BuildMode.dynamicRelease) {
52 return 'product_vm_isolate_snapshot.bin';
53 }
54 // Flutter dynamic release mode for all target platforms uses Dart PRODUCT
55 // VM snapshot from host dynamic release build that strips out the metadata
56 // related to development tools.
Michael Goderbauerd579d582017-03-02 10:57:27 -080057 return 'vm_isolate_snapshot.bin';
58 case Artifact.isolateSnapshotData:
Stanislav Baranovc799c2f2018-09-20 13:12:38 -070059 if (mode == BuildMode.dynamicRelease) {
60 return 'product_isolate_snapshot.bin';
61 }
Michael Goderbauerd579d582017-03-02 10:57:27 -080062 return 'isolate_snapshot.bin';
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070063 case Artifact.platformKernelDill:
Siva426d6b02018-01-04 10:39:02 -080064 return 'platform_strong.dill';
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070065 case Artifact.platformLibrariesJson:
66 return 'libraries.json';
67 case Artifact.flutterPatchedSdkPath:
68 assert(false, 'No filename for sdk path, should not be invoked');
69 return null;
Jonah Williams44b22c72019-03-25 18:47:37 -070070 case Artifact.flutterWebSdk:
71 assert(false, 'No filename for web sdk path, should not be invoked');
72 return null;
Alexander Aprelevfe005982018-02-16 09:20:23 -080073 case Artifact.engineDartSdkPath:
74 return 'dart-sdk';
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070075 case Artifact.frontendServerSnapshotForEngineDartSdk:
76 return 'frontend_server.dart.snapshot';
Keerti Parthasarathy02633942018-03-06 14:41:50 -080077 case Artifact.engineDartBinary:
78 return 'dart';
Jonah Williams9bc56562019-02-14 22:42:30 -080079 case Artifact.dart2jsSnapshot:
Jonah Williams44b22c72019-03-25 18:47:37 -070080 return 'dart2js.dart.snapshot';
Jonah Williams9bc56562019-02-14 22:42:30 -080081 case Artifact.kernelWorkerSnapshot:
Jonah Williams44b22c72019-03-25 18:47:37 -070082 return 'kernel_worker.dart.snapshot';
Michael Goderbauercd8434d2017-02-16 23:10:11 -080083 }
84 assert(false, 'Invalid artifact $artifact.');
85 return null;
86}
87
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070088class EngineBuildPaths {
Alexandre Ardhuinef276ff2019-01-29 21:47:16 +010089 const EngineBuildPaths({
90 @required this.targetEngine,
91 @required this.hostEngine,
92 }) : assert(targetEngine != null),
93 assert(hostEngine != null);
Alexander Aprelevc5750cd2017-08-31 13:35:55 -070094
95 final String targetEngine;
96 final String hostEngine;
97}
98
Michael Goderbauercd8434d2017-02-16 23:10:11 -080099// Manages the engine artifacts of Flutter.
100abstract class Artifacts {
101 static Artifacts get instance => context[Artifacts];
102
Todd Volkert8d11f5c2018-03-28 10:58:28 -0700103 static LocalEngineArtifacts getLocalEngine(String engineSrcPath, EngineBuildPaths engineBuildPaths) {
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200104 return LocalEngineArtifacts(engineSrcPath, engineBuildPaths.targetEngine, engineBuildPaths.hostEngine);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800105 }
106
107 // Returns the requested [artifact] for the [platform] and [mode] combination.
Alexander Aprelevd7759082019-04-15 21:02:20 -0700108 String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode });
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800109
110 // Returns which set of engine artifacts is currently used for the [platform]
111 // and [mode] combination.
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +0100112 String getEngineType(TargetPlatform platform, [ BuildMode mode ]);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800113}
114
115/// Manages the engine artifacts downloaded to the local cache.
116class CachedArtifacts extends Artifacts {
117
118 @override
Alexander Aprelevd7759082019-04-15 21:02:20 -0700119 String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800120 platform ??= _currentHostPlatform;
121 switch (platform) {
122 case TargetPlatform.android_arm:
Jason Simmonsd5149d42018-02-01 15:14:48 -0800123 case TargetPlatform.android_arm64:
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800124 case TargetPlatform.android_x64:
125 case TargetPlatform.android_x86:
126 return _getAndroidArtifactPath(artifact, platform, mode);
127 case TargetPlatform.ios:
128 return _getIosArtifactPath(artifact, platform, mode);
129 case TargetPlatform.darwin_x64:
130 case TargetPlatform.linux_x64:
Michael Goderbauerd579d582017-03-02 10:57:27 -0800131 case TargetPlatform.windows_x64:
Zachary Andersonb6ba37d2017-03-14 11:12:19 -0700132 case TargetPlatform.fuchsia:
Konstantin Scheglov38970f52018-04-10 09:37:16 -0700133 case TargetPlatform.tester:
Jonah Williams9bc56562019-02-14 22:42:30 -0800134 case TargetPlatform.web:
Stanislav Baranovc799c2f2018-09-20 13:12:38 -0700135 return _getHostArtifactPath(artifact, platform, mode);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800136 }
137 assert(false, 'Invalid platform $platform.');
138 return null;
139 }
140
141 @override
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +0100142 String getEngineType(TargetPlatform platform, [ BuildMode mode ]) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800143 return fs.path.basename(_getEngineArtifactsPath(platform, mode));
144 }
145
146 String _getAndroidArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
Chris Bracken7a093162017-03-03 17:50:46 -0800147 final String engineDir = _getEngineArtifactsPath(platform, mode);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800148 switch (artifact) {
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700149 case Artifact.frontendServerSnapshotForEngineDartSdk:
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800150 assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.');
151 return fs.path.join(engineDir, _artifactToFileName(artifact));
152 case Artifact.genSnapshot:
153 assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.');
Chris Bracken7a093162017-03-03 17:50:46 -0800154 final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform());
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800155 return fs.path.join(engineDir, hostPlatform, _artifactToFileName(artifact));
156 default:
157 assert(false, 'Artifact $artifact not available for platform $platform.');
158 return null;
159 }
160 }
161
162 String _getIosArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
Chris Bracken7a093162017-03-03 17:50:46 -0800163 final String engineDir = _getEngineArtifactsPath(platform, mode);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800164 switch (artifact) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800165 case Artifact.genSnapshot:
166 case Artifact.snapshotDart:
167 case Artifact.flutterFramework:
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700168 case Artifact.frontendServerSnapshotForEngineDartSdk:
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800169 return fs.path.join(engineDir, _artifactToFileName(artifact));
170 default:
171 assert(false, 'Artifact $artifact not available for platform $platform.');
172 return null;
173 }
174 }
175
Alexander Aprelevd7759082019-04-15 21:02:20 -0700176 String _getFlutterPatchedSdkPath(BuildMode mode) {
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700177 final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
Alexander Aprelevd7759082019-04-15 21:02:20 -0700178 return fs.path.join(engineArtifactsPath, 'common',
179 mode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk');
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700180 }
181
Jonah Williams44b22c72019-03-25 18:47:37 -0700182 String _getFlutterWebSdkPath() {
183 return cache.getWebSdkDirectory().path;
184 }
185
Stanislav Baranovc799c2f2018-09-20 13:12:38 -0700186 String _getHostArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800187 switch (artifact) {
Michael Goderbauer906103d2017-03-08 13:33:06 -0800188 case Artifact.genSnapshot:
189 // For script snapshots any gen_snapshot binary will do. Returning gen_snapshot for
190 // android_arm in profile mode because it is available on all supported host platforms.
191 return _getAndroidArtifactPath(artifact, TargetPlatform.android_arm, BuildMode.profile);
Jason Simmonse7f13612017-03-29 16:30:41 -0700192 case Artifact.flutterTester:
Michael Goderbauerd579d582017-03-02 10:57:27 -0800193 case Artifact.vmSnapshotData:
194 case Artifact.isolateSnapshotData:
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700195 case Artifact.frontendServerSnapshotForEngineDartSdk:
Chris Bracken7a093162017-03-03 17:50:46 -0800196 final String engineArtifactsPath = cache.getArtifactDirectory('engine').path;
197 final String platformDirName = getNameForTargetPlatform(platform);
Stanislav Baranovc799c2f2018-09-20 13:12:38 -0700198 return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode));
Alexander Aprelevfe005982018-02-16 09:20:23 -0800199 case Artifact.engineDartSdkPath:
200 return dartSdkPath;
Keerti Parthasarathy02633942018-03-06 14:41:50 -0800201 case Artifact.engineDartBinary:
Jonah Williams9bc56562019-02-14 22:42:30 -0800202 return fs.path.join(dartSdkPath, 'bin', _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700203 case Artifact.platformKernelDill:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700204 return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700205 case Artifact.platformLibrariesJson:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700206 return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700207 case Artifact.flutterPatchedSdkPath:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700208 return _getFlutterPatchedSdkPath(mode);
Jonah Williams44b22c72019-03-25 18:47:37 -0700209 case Artifact.flutterWebSdk:
210 return _getFlutterWebSdkPath();
Jonah Williams9bc56562019-02-14 22:42:30 -0800211 case Artifact.dart2jsSnapshot:
212 return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
213 case Artifact.kernelWorkerSnapshot:
214 return fs.path.join(dartSdkPath, 'bin', 'snapshots', _artifactToFileName(artifact));
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800215 default:
216 assert(false, 'Artifact $artifact not available for platform $platform.');
217 return null;
218 }
219 }
220
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +0100221 String _getEngineArtifactsPath(TargetPlatform platform, [ BuildMode mode ]) {
Chris Bracken7a093162017-03-03 17:50:46 -0800222 final String engineDir = cache.getArtifactDirectory('engine').path;
223 final String platformName = getNameForTargetPlatform(platform);
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800224 switch (platform) {
225 case TargetPlatform.linux_x64:
226 case TargetPlatform.darwin_x64:
Michael Goderbauerd579d582017-03-02 10:57:27 -0800227 case TargetPlatform.windows_x64:
Zachary Andersonb6ba37d2017-03-14 11:12:19 -0700228 case TargetPlatform.fuchsia:
Konstantin Scheglov38970f52018-04-10 09:37:16 -0700229 case TargetPlatform.tester:
Jonah Williams9bc56562019-02-14 22:42:30 -0800230 case TargetPlatform.web:
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800231 assert(mode == null, 'Platform $platform does not support different build modes.');
232 return fs.path.join(engineDir, platformName);
233 case TargetPlatform.ios:
234 case TargetPlatform.android_arm:
Jason Simmonsd5149d42018-02-01 15:14:48 -0800235 case TargetPlatform.android_arm64:
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800236 case TargetPlatform.android_x64:
237 case TargetPlatform.android_x86:
238 assert(mode != null, 'Need to specify a build mode for platform $platform.');
Stanislav Baranov393f9272018-08-16 08:43:41 -0700239 final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode), '-')}' : '';
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800240 return fs.path.join(engineDir, platformName + suffix);
241 }
242 assert(false, 'Invalid platform $platform.');
243 return null;
244 }
245
246 TargetPlatform get _currentHostPlatform {
247 if (platform.isMacOS)
248 return TargetPlatform.darwin_x64;
249 if (platform.isLinux)
250 return TargetPlatform.linux_x64;
Michael Goderbauerd579d582017-03-02 10:57:27 -0800251 if (platform.isWindows)
252 return TargetPlatform.windows_x64;
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200253 throw UnimplementedError('Host OS not supported.');
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800254 }
255}
256
257/// Manages the artifacts of a locally built engine.
258class LocalEngineArtifacts extends Artifacts {
Alexandre Ardhuin2ea1d812018-10-04 07:28:07 +0200259 LocalEngineArtifacts(this._engineSrcPath, this.engineOutPath, this._hostEngineOutPath);
260
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800261 final String _engineSrcPath;
262 final String engineOutPath; // TODO(goderbauer): This should be private.
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700263 String _hostEngineOutPath;
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800264
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800265 @override
Alexander Aprelevd7759082019-04-15 21:02:20 -0700266 String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800267 switch (artifact) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800268 case Artifact.snapshotDart:
269 return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact));
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800270 case Artifact.genSnapshot:
Jason Simmons22ccb742017-07-27 14:22:21 -0700271 return _genSnapshotPath();
Jason Simmonse7f13612017-03-29 16:30:41 -0700272 case Artifact.flutterTester:
273 return _flutterTesterPath(platform);
Michael Goderbauerd579d582017-03-02 10:57:27 -0800274 case Artifact.isolateSnapshotData:
275 case Artifact.vmSnapshotData:
276 return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700277 case Artifact.platformKernelDill:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700278 return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700279 case Artifact.platformLibrariesJson:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700280 return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact));
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800281 case Artifact.flutterFramework:
282 return fs.path.join(engineOutPath, _artifactToFileName(artifact));
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700283 case Artifact.flutterPatchedSdkPath:
Alexander Aprelevd7759082019-04-15 21:02:20 -0700284 // When using local engine always use [BuildMode.debug] regardless of
285 // what was specified in [mode] argument because local engine will
286 // have only one flutter_patched_sdk in standard location, that
287 // is happen to be what debug(non-release) mode is using.
288 return _getFlutterPatchedSdkPath(BuildMode.debug);
Jonah Williams44b22c72019-03-25 18:47:37 -0700289 case Artifact.flutterWebSdk:
290 return _getFlutterWebSdkPath();
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700291 case Artifact.frontendServerSnapshotForEngineDartSdk:
292 return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact));
Alexander Aprelevfe005982018-02-16 09:20:23 -0800293 case Artifact.engineDartSdkPath:
294 return fs.path.join(_hostEngineOutPath, 'dart-sdk');
Keerti Parthasarathy02633942018-03-06 14:41:50 -0800295 case Artifact.engineDartBinary:
296 return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact));
Jonah Williams9bc56562019-02-14 22:42:30 -0800297 case Artifact.dart2jsSnapshot:
298 return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact));
299 case Artifact.kernelWorkerSnapshot:
300 return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', 'snapshots', _artifactToFileName(artifact));
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800301 }
302 assert(false, 'Invalid artifact $artifact.');
303 return null;
304 }
305
306 @override
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +0100307 String getEngineType(TargetPlatform platform, [ BuildMode mode ]) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800308 return fs.path.basename(engineOutPath);
309 }
310
Alexander Aprelevd7759082019-04-15 21:02:20 -0700311 String _getFlutterPatchedSdkPath(BuildMode buildMode) {
312 return fs.path.join(engineOutPath,
313 buildMode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk');
Alexander Aprelevc5750cd2017-08-31 13:35:55 -0700314 }
315
Jonah Williams44b22c72019-03-25 18:47:37 -0700316 String _getFlutterWebSdkPath() {
317 return fs.path.join(engineOutPath, 'flutter_web_sdk');
318 }
319
Jason Simmons22ccb742017-07-27 14:22:21 -0700320 String _genSnapshotPath() {
Alexandre Ardhuineda03e22018-08-02 12:02:32 +0200321 const List<String> clangDirs = <String>['.', 'clang_x86', 'clang_x64', 'clang_i386'];
Jason Simmons22ccb742017-07-27 14:22:21 -0700322 final String genSnapshotName = _artifactToFileName(Artifact.genSnapshot);
323 for (String clangDir in clangDirs) {
324 final String genSnapshotPath = fs.path.join(engineOutPath, clangDir, genSnapshotName);
Alexander Aprelev70b32e82017-12-22 14:58:53 -0800325 if (processManager.canRun(genSnapshotPath))
Jason Simmons22ccb742017-07-27 14:22:21 -0700326 return genSnapshotPath;
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800327 }
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200328 throw Exception('Unable to find $genSnapshotName');
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800329 }
330
Jason Simmonse7f13612017-03-29 16:30:41 -0700331 String _flutterTesterPath(TargetPlatform platform) {
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800332 if (getCurrentHostPlatform() == HostPlatform.linux_x64) {
Jason Simmonse7f13612017-03-29 16:30:41 -0700333 return fs.path.join(engineOutPath, _artifactToFileName(Artifact.flutterTester));
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800334 } else if (getCurrentHostPlatform() == HostPlatform.darwin_x64) {
Michael Goderbauer561e7772017-07-10 12:34:04 -0700335 return fs.path.join(engineOutPath, 'flutter_tester');
Alexander Aprelev9e0a6102018-04-16 20:40:52 -0700336 } else if (getCurrentHostPlatform() == HostPlatform.windows_x64) {
337 return fs.path.join(engineOutPath, 'flutter_tester.exe');
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800338 }
Alexandre Ardhuind927c932018-09-12 08:29:29 +0200339 throw Exception('Unsupported platform $platform.');
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800340 }
Michael Goderbauercd8434d2017-02-16 23:10:11 -0800341}
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700342
343/// An implementation of [Artifacts] that provides individual overrides.
344///
345/// If an artifact is not provided, the lookup delegates to the parent.
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700346class OverrideArtifacts implements Artifacts {
347 /// Creates a new [OverrideArtifacts].
348 ///
349 /// [parent] must be provided.
350 OverrideArtifacts({
351 @required this.parent,
352 this.frontendServer,
Jonah Williams81c7af32018-11-06 14:36:35 -0800353 this.engineDartBinary,
Jonah Williamsa226c0f2018-11-30 16:18:18 -0800354 this.platformKernelDill,
355 this.flutterPatchedSdk,
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700356 }) : assert(parent != null);
357
358 final Artifacts parent;
359 final File frontendServer;
Jonah Williams81c7af32018-11-06 14:36:35 -0800360 final File engineDartBinary;
Jonah Williamsa226c0f2018-11-30 16:18:18 -0800361 final File platformKernelDill;
362 final File flutterPatchedSdk;
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700363
364 @override
Alexander Aprelevd7759082019-04-15 21:02:20 -0700365 String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) {
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700366 if (artifact == Artifact.frontendServerSnapshotForEngineDartSdk && frontendServer != null) {
367 return frontendServer.path;
368 }
Jonah Williams81c7af32018-11-06 14:36:35 -0800369 if (artifact == Artifact.engineDartBinary && engineDartBinary != null) {
370 return engineDartBinary.path;
371 }
Jonah Williamsa226c0f2018-11-30 16:18:18 -0800372 if (artifact == Artifact.platformKernelDill && platformKernelDill != null) {
373 return platformKernelDill.path;
374 }
375 if (artifact == Artifact.flutterPatchedSdkPath && flutterPatchedSdk != null) {
376 return flutterPatchedSdk.path;
377 }
Alexander Aprelevd7759082019-04-15 21:02:20 -0700378 return parent.getArtifactPath(artifact, platform: platform, mode: mode);
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700379 }
380
381 @override
Alexandre Ardhuin5169ab52019-02-21 09:27:07 +0100382 String getEngineType(TargetPlatform platform, [ BuildMode mode ]) => parent.getEngineType(platform, mode);
Jonah Williamsc9ca7c42018-10-16 14:27:22 -0700383}