Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 1 | // 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 Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 5 | import 'package:meta/meta.dart'; |
| 6 | |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 7 | import 'base/context.dart'; |
| 8 | import 'base/file_system.dart'; |
| 9 | import 'base/platform.dart'; |
Alexander Aprelev | 70b32e8 | 2017-12-22 14:58:53 -0800 | [diff] [blame] | 10 | import 'base/process_manager.dart'; |
Stanislav Baranov | 393f927 | 2018-08-16 08:43:41 -0700 | [diff] [blame] | 11 | import 'base/utils.dart'; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 12 | import 'build_info.dart'; |
Alexander Aprelev | fe00598 | 2018-02-16 09:20:23 -0800 | [diff] [blame] | 13 | import 'dart/sdk.dart'; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 14 | import 'globals.dart'; |
| 15 | |
| 16 | enum Artifact { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 17 | genSnapshot, |
Jason Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 18 | flutterTester, |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 19 | snapshotDart, |
| 20 | flutterFramework, |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 21 | vmSnapshotData, |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 22 | isolateSnapshotData, |
| 23 | platformKernelDill, |
| 24 | platformLibrariesJson, |
| 25 | flutterPatchedSdkPath, |
| 26 | frontendServerSnapshotForEngineDartSdk, |
Alexander Aprelev | fe00598 | 2018-02-16 09:20:23 -0800 | [diff] [blame] | 27 | engineDartSdkPath, |
Keerti Parthasarathy | 0263394 | 2018-03-06 14:41:50 -0800 | [diff] [blame] | 28 | engineDartBinary, |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 29 | dart2jsSnapshot, |
| 30 | kernelWorkerSnapshot, |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 31 | flutterWebSdk, |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 32 | } |
| 33 | |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 34 | String _artifactToFileName(Artifact artifact, [ TargetPlatform platform, BuildMode mode ]) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 35 | switch (artifact) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 36 | case Artifact.genSnapshot: |
Alexander Aprelev | 70b32e8 | 2017-12-22 14:58:53 -0800 | [diff] [blame] | 37 | return 'gen_snapshot'; |
Jason Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 38 | case Artifact.flutterTester: |
Konstantin Scheglov | cf500bf | 2018-04-11 08:52:17 -0700 | [diff] [blame] | 39 | if (platform == TargetPlatform.windows_x64) { |
| 40 | return 'flutter_tester.exe'; |
| 41 | } |
Jason Simmons | 72effdd | 2017-03-29 15:31:36 -0700 | [diff] [blame] | 42 | return 'flutter_tester'; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 43 | case Artifact.snapshotDart: |
| 44 | return 'snapshot.dart'; |
| 45 | case Artifact.flutterFramework: |
| 46 | return 'Flutter.framework'; |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 47 | case Artifact.vmSnapshotData: |
Stanislav Baranov | c799c2f | 2018-09-20 13:12:38 -0700 | [diff] [blame] | 48 | // 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 Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 57 | return 'vm_isolate_snapshot.bin'; |
| 58 | case Artifact.isolateSnapshotData: |
Stanislav Baranov | c799c2f | 2018-09-20 13:12:38 -0700 | [diff] [blame] | 59 | if (mode == BuildMode.dynamicRelease) { |
| 60 | return 'product_isolate_snapshot.bin'; |
| 61 | } |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 62 | return 'isolate_snapshot.bin'; |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 63 | case Artifact.platformKernelDill: |
Siva | 426d6b0 | 2018-01-04 10:39:02 -0800 | [diff] [blame] | 64 | return 'platform_strong.dill'; |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 65 | 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 Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 70 | case Artifact.flutterWebSdk: |
| 71 | assert(false, 'No filename for web sdk path, should not be invoked'); |
| 72 | return null; |
Alexander Aprelev | fe00598 | 2018-02-16 09:20:23 -0800 | [diff] [blame] | 73 | case Artifact.engineDartSdkPath: |
| 74 | return 'dart-sdk'; |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 75 | case Artifact.frontendServerSnapshotForEngineDartSdk: |
| 76 | return 'frontend_server.dart.snapshot'; |
Keerti Parthasarathy | 0263394 | 2018-03-06 14:41:50 -0800 | [diff] [blame] | 77 | case Artifact.engineDartBinary: |
| 78 | return 'dart'; |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 79 | case Artifact.dart2jsSnapshot: |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 80 | return 'dart2js.dart.snapshot'; |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 81 | case Artifact.kernelWorkerSnapshot: |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 82 | return 'kernel_worker.dart.snapshot'; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 83 | } |
| 84 | assert(false, 'Invalid artifact $artifact.'); |
| 85 | return null; |
| 86 | } |
| 87 | |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 88 | class EngineBuildPaths { |
Alexandre Ardhuin | ef276ff | 2019-01-29 21:47:16 +0100 | [diff] [blame] | 89 | const EngineBuildPaths({ |
| 90 | @required this.targetEngine, |
| 91 | @required this.hostEngine, |
| 92 | }) : assert(targetEngine != null), |
| 93 | assert(hostEngine != null); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 94 | |
| 95 | final String targetEngine; |
| 96 | final String hostEngine; |
| 97 | } |
| 98 | |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 99 | // Manages the engine artifacts of Flutter. |
| 100 | abstract class Artifacts { |
| 101 | static Artifacts get instance => context[Artifacts]; |
| 102 | |
Todd Volkert | 8d11f5c | 2018-03-28 10:58:28 -0700 | [diff] [blame] | 103 | static LocalEngineArtifacts getLocalEngine(String engineSrcPath, EngineBuildPaths engineBuildPaths) { |
Alexandre Ardhuin | d927c93 | 2018-09-12 08:29:29 +0200 | [diff] [blame] | 104 | return LocalEngineArtifacts(engineSrcPath, engineBuildPaths.targetEngine, engineBuildPaths.hostEngine); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | // Returns the requested [artifact] for the [platform] and [mode] combination. |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 108 | String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 109 | |
| 110 | // Returns which set of engine artifacts is currently used for the [platform] |
| 111 | // and [mode] combination. |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 112 | String getEngineType(TargetPlatform platform, [ BuildMode mode ]); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 113 | } |
| 114 | |
| 115 | /// Manages the engine artifacts downloaded to the local cache. |
| 116 | class CachedArtifacts extends Artifacts { |
| 117 | |
| 118 | @override |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 119 | String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 120 | platform ??= _currentHostPlatform; |
| 121 | switch (platform) { |
| 122 | case TargetPlatform.android_arm: |
Jason Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 123 | case TargetPlatform.android_arm64: |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 124 | 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 Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 131 | case TargetPlatform.windows_x64: |
Zachary Anderson | b6ba37d | 2017-03-14 11:12:19 -0700 | [diff] [blame] | 132 | case TargetPlatform.fuchsia: |
Konstantin Scheglov | 38970f5 | 2018-04-10 09:37:16 -0700 | [diff] [blame] | 133 | case TargetPlatform.tester: |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 134 | case TargetPlatform.web: |
Stanislav Baranov | c799c2f | 2018-09-20 13:12:38 -0700 | [diff] [blame] | 135 | return _getHostArtifactPath(artifact, platform, mode); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 136 | } |
| 137 | assert(false, 'Invalid platform $platform.'); |
| 138 | return null; |
| 139 | } |
| 140 | |
| 141 | @override |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 142 | String getEngineType(TargetPlatform platform, [ BuildMode mode ]) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 143 | return fs.path.basename(_getEngineArtifactsPath(platform, mode)); |
| 144 | } |
| 145 | |
| 146 | String _getAndroidArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { |
Chris Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 147 | final String engineDir = _getEngineArtifactsPath(platform, mode); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 148 | switch (artifact) { |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 149 | case Artifact.frontendServerSnapshotForEngineDartSdk: |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 150 | 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 Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 154 | final String hostPlatform = getNameForHostPlatform(getCurrentHostPlatform()); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 155 | 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 Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 163 | final String engineDir = _getEngineArtifactsPath(platform, mode); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 164 | switch (artifact) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 165 | case Artifact.genSnapshot: |
| 166 | case Artifact.snapshotDart: |
| 167 | case Artifact.flutterFramework: |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 168 | case Artifact.frontendServerSnapshotForEngineDartSdk: |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 169 | 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 Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 176 | String _getFlutterPatchedSdkPath(BuildMode mode) { |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 177 | final String engineArtifactsPath = cache.getArtifactDirectory('engine').path; |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 178 | return fs.path.join(engineArtifactsPath, 'common', |
| 179 | mode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk'); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 180 | } |
| 181 | |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 182 | String _getFlutterWebSdkPath() { |
| 183 | return cache.getWebSdkDirectory().path; |
| 184 | } |
| 185 | |
Stanislav Baranov | c799c2f | 2018-09-20 13:12:38 -0700 | [diff] [blame] | 186 | String _getHostArtifactPath(Artifact artifact, TargetPlatform platform, BuildMode mode) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 187 | switch (artifact) { |
Michael Goderbauer | 906103d | 2017-03-08 13:33:06 -0800 | [diff] [blame] | 188 | 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 Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 192 | case Artifact.flutterTester: |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 193 | case Artifact.vmSnapshotData: |
| 194 | case Artifact.isolateSnapshotData: |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 195 | case Artifact.frontendServerSnapshotForEngineDartSdk: |
Chris Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 196 | final String engineArtifactsPath = cache.getArtifactDirectory('engine').path; |
| 197 | final String platformDirName = getNameForTargetPlatform(platform); |
Stanislav Baranov | c799c2f | 2018-09-20 13:12:38 -0700 | [diff] [blame] | 198 | return fs.path.join(engineArtifactsPath, platformDirName, _artifactToFileName(artifact, platform, mode)); |
Alexander Aprelev | fe00598 | 2018-02-16 09:20:23 -0800 | [diff] [blame] | 199 | case Artifact.engineDartSdkPath: |
| 200 | return dartSdkPath; |
Keerti Parthasarathy | 0263394 | 2018-03-06 14:41:50 -0800 | [diff] [blame] | 201 | case Artifact.engineDartBinary: |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 202 | return fs.path.join(dartSdkPath, 'bin', _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 203 | case Artifact.platformKernelDill: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 204 | return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 205 | case Artifact.platformLibrariesJson: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 206 | return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 207 | case Artifact.flutterPatchedSdkPath: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 208 | return _getFlutterPatchedSdkPath(mode); |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 209 | case Artifact.flutterWebSdk: |
| 210 | return _getFlutterWebSdkPath(); |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 211 | 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 Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 215 | default: |
| 216 | assert(false, 'Artifact $artifact not available for platform $platform.'); |
| 217 | return null; |
| 218 | } |
| 219 | } |
| 220 | |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 221 | String _getEngineArtifactsPath(TargetPlatform platform, [ BuildMode mode ]) { |
Chris Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 222 | final String engineDir = cache.getArtifactDirectory('engine').path; |
| 223 | final String platformName = getNameForTargetPlatform(platform); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 224 | switch (platform) { |
| 225 | case TargetPlatform.linux_x64: |
| 226 | case TargetPlatform.darwin_x64: |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 227 | case TargetPlatform.windows_x64: |
Zachary Anderson | b6ba37d | 2017-03-14 11:12:19 -0700 | [diff] [blame] | 228 | case TargetPlatform.fuchsia: |
Konstantin Scheglov | 38970f5 | 2018-04-10 09:37:16 -0700 | [diff] [blame] | 229 | case TargetPlatform.tester: |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 230 | case TargetPlatform.web: |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 231 | 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 Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 235 | case TargetPlatform.android_arm64: |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 236 | case TargetPlatform.android_x64: |
| 237 | case TargetPlatform.android_x86: |
| 238 | assert(mode != null, 'Need to specify a build mode for platform $platform.'); |
Stanislav Baranov | 393f927 | 2018-08-16 08:43:41 -0700 | [diff] [blame] | 239 | final String suffix = mode != BuildMode.debug ? '-${snakeCase(getModeName(mode), '-')}' : ''; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 240 | 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 Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 251 | if (platform.isWindows) |
| 252 | return TargetPlatform.windows_x64; |
Alexandre Ardhuin | d927c93 | 2018-09-12 08:29:29 +0200 | [diff] [blame] | 253 | throw UnimplementedError('Host OS not supported.'); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 254 | } |
| 255 | } |
| 256 | |
| 257 | /// Manages the artifacts of a locally built engine. |
| 258 | class LocalEngineArtifacts extends Artifacts { |
Alexandre Ardhuin | 2ea1d81 | 2018-10-04 07:28:07 +0200 | [diff] [blame] | 259 | LocalEngineArtifacts(this._engineSrcPath, this.engineOutPath, this._hostEngineOutPath); |
| 260 | |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 261 | final String _engineSrcPath; |
| 262 | final String engineOutPath; // TODO(goderbauer): This should be private. |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 263 | String _hostEngineOutPath; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 264 | |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 265 | @override |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 266 | String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 267 | switch (artifact) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 268 | case Artifact.snapshotDart: |
| 269 | return fs.path.join(_engineSrcPath, 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 270 | case Artifact.genSnapshot: |
Jason Simmons | 22ccb74 | 2017-07-27 14:22:21 -0700 | [diff] [blame] | 271 | return _genSnapshotPath(); |
Jason Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 272 | case Artifact.flutterTester: |
| 273 | return _flutterTesterPath(platform); |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 274 | case Artifact.isolateSnapshotData: |
| 275 | case Artifact.vmSnapshotData: |
| 276 | return fs.path.join(engineOutPath, 'gen', 'flutter', 'lib', 'snapshot', _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 277 | case Artifact.platformKernelDill: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 278 | return fs.path.join(_getFlutterPatchedSdkPath(mode), _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 279 | case Artifact.platformLibrariesJson: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 280 | return fs.path.join(_getFlutterPatchedSdkPath(mode), 'lib', _artifactToFileName(artifact)); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 281 | case Artifact.flutterFramework: |
| 282 | return fs.path.join(engineOutPath, _artifactToFileName(artifact)); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 283 | case Artifact.flutterPatchedSdkPath: |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 284 | // 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 Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 289 | case Artifact.flutterWebSdk: |
| 290 | return _getFlutterWebSdkPath(); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 291 | case Artifact.frontendServerSnapshotForEngineDartSdk: |
| 292 | return fs.path.join(_hostEngineOutPath, 'gen', _artifactToFileName(artifact)); |
Alexander Aprelev | fe00598 | 2018-02-16 09:20:23 -0800 | [diff] [blame] | 293 | case Artifact.engineDartSdkPath: |
| 294 | return fs.path.join(_hostEngineOutPath, 'dart-sdk'); |
Keerti Parthasarathy | 0263394 | 2018-03-06 14:41:50 -0800 | [diff] [blame] | 295 | case Artifact.engineDartBinary: |
| 296 | return fs.path.join(_hostEngineOutPath, 'dart-sdk', 'bin', _artifactToFileName(artifact)); |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 297 | 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 Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 301 | } |
| 302 | assert(false, 'Invalid artifact $artifact.'); |
| 303 | return null; |
| 304 | } |
| 305 | |
| 306 | @override |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 307 | String getEngineType(TargetPlatform platform, [ BuildMode mode ]) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 308 | return fs.path.basename(engineOutPath); |
| 309 | } |
| 310 | |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 311 | String _getFlutterPatchedSdkPath(BuildMode buildMode) { |
| 312 | return fs.path.join(engineOutPath, |
| 313 | buildMode == BuildMode.release ? 'flutter_patched_sdk_product' : 'flutter_patched_sdk'); |
Alexander Aprelev | c5750cd | 2017-08-31 13:35:55 -0700 | [diff] [blame] | 314 | } |
| 315 | |
Jonah Williams | 44b22c7 | 2019-03-25 18:47:37 -0700 | [diff] [blame] | 316 | String _getFlutterWebSdkPath() { |
| 317 | return fs.path.join(engineOutPath, 'flutter_web_sdk'); |
| 318 | } |
| 319 | |
Jason Simmons | 22ccb74 | 2017-07-27 14:22:21 -0700 | [diff] [blame] | 320 | String _genSnapshotPath() { |
Alexandre Ardhuin | eda03e2 | 2018-08-02 12:02:32 +0200 | [diff] [blame] | 321 | const List<String> clangDirs = <String>['.', 'clang_x86', 'clang_x64', 'clang_i386']; |
Jason Simmons | 22ccb74 | 2017-07-27 14:22:21 -0700 | [diff] [blame] | 322 | final String genSnapshotName = _artifactToFileName(Artifact.genSnapshot); |
| 323 | for (String clangDir in clangDirs) { |
| 324 | final String genSnapshotPath = fs.path.join(engineOutPath, clangDir, genSnapshotName); |
Alexander Aprelev | 70b32e8 | 2017-12-22 14:58:53 -0800 | [diff] [blame] | 325 | if (processManager.canRun(genSnapshotPath)) |
Jason Simmons | 22ccb74 | 2017-07-27 14:22:21 -0700 | [diff] [blame] | 326 | return genSnapshotPath; |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 327 | } |
Alexandre Ardhuin | d927c93 | 2018-09-12 08:29:29 +0200 | [diff] [blame] | 328 | throw Exception('Unable to find $genSnapshotName'); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 329 | } |
| 330 | |
Jason Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 331 | String _flutterTesterPath(TargetPlatform platform) { |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 332 | if (getCurrentHostPlatform() == HostPlatform.linux_x64) { |
Jason Simmons | e7f1361 | 2017-03-29 16:30:41 -0700 | [diff] [blame] | 333 | return fs.path.join(engineOutPath, _artifactToFileName(Artifact.flutterTester)); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 334 | } else if (getCurrentHostPlatform() == HostPlatform.darwin_x64) { |
Michael Goderbauer | 561e777 | 2017-07-10 12:34:04 -0700 | [diff] [blame] | 335 | return fs.path.join(engineOutPath, 'flutter_tester'); |
Alexander Aprelev | 9e0a610 | 2018-04-16 20:40:52 -0700 | [diff] [blame] | 336 | } else if (getCurrentHostPlatform() == HostPlatform.windows_x64) { |
| 337 | return fs.path.join(engineOutPath, 'flutter_tester.exe'); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 338 | } |
Alexandre Ardhuin | d927c93 | 2018-09-12 08:29:29 +0200 | [diff] [blame] | 339 | throw Exception('Unsupported platform $platform.'); |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 340 | } |
Michael Goderbauer | cd8434d | 2017-02-16 23:10:11 -0800 | [diff] [blame] | 341 | } |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 342 | |
| 343 | /// An implementation of [Artifacts] that provides individual overrides. |
| 344 | /// |
| 345 | /// If an artifact is not provided, the lookup delegates to the parent. |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 346 | class OverrideArtifacts implements Artifacts { |
| 347 | /// Creates a new [OverrideArtifacts]. |
| 348 | /// |
| 349 | /// [parent] must be provided. |
| 350 | OverrideArtifacts({ |
| 351 | @required this.parent, |
| 352 | this.frontendServer, |
Jonah Williams | 81c7af3 | 2018-11-06 14:36:35 -0800 | [diff] [blame] | 353 | this.engineDartBinary, |
Jonah Williams | a226c0f | 2018-11-30 16:18:18 -0800 | [diff] [blame] | 354 | this.platformKernelDill, |
| 355 | this.flutterPatchedSdk, |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 356 | }) : assert(parent != null); |
| 357 | |
| 358 | final Artifacts parent; |
| 359 | final File frontendServer; |
Jonah Williams | 81c7af3 | 2018-11-06 14:36:35 -0800 | [diff] [blame] | 360 | final File engineDartBinary; |
Jonah Williams | a226c0f | 2018-11-30 16:18:18 -0800 | [diff] [blame] | 361 | final File platformKernelDill; |
| 362 | final File flutterPatchedSdk; |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 363 | |
| 364 | @override |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 365 | String getArtifactPath(Artifact artifact, { TargetPlatform platform, BuildMode mode }) { |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 366 | if (artifact == Artifact.frontendServerSnapshotForEngineDartSdk && frontendServer != null) { |
| 367 | return frontendServer.path; |
| 368 | } |
Jonah Williams | 81c7af3 | 2018-11-06 14:36:35 -0800 | [diff] [blame] | 369 | if (artifact == Artifact.engineDartBinary && engineDartBinary != null) { |
| 370 | return engineDartBinary.path; |
| 371 | } |
Jonah Williams | a226c0f | 2018-11-30 16:18:18 -0800 | [diff] [blame] | 372 | if (artifact == Artifact.platformKernelDill && platformKernelDill != null) { |
| 373 | return platformKernelDill.path; |
| 374 | } |
| 375 | if (artifact == Artifact.flutterPatchedSdkPath && flutterPatchedSdk != null) { |
| 376 | return flutterPatchedSdk.path; |
| 377 | } |
Alexander Aprelev | d775908 | 2019-04-15 21:02:20 -0700 | [diff] [blame] | 378 | return parent.getArtifactPath(artifact, platform: platform, mode: mode); |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 379 | } |
| 380 | |
| 381 | @override |
Alexandre Ardhuin | 5169ab5 | 2019-02-21 09:27:07 +0100 | [diff] [blame] | 382 | String getEngineType(TargetPlatform platform, [ BuildMode mode ]) => parent.getEngineType(platform, mode); |
Jonah Williams | c9ca7c4 | 2018-10-16 14:27:22 -0700 | [diff] [blame] | 383 | } |