Adam Barth | bdd2066 | 2015-10-11 19:42:50 -0700 | [diff] [blame] | 1 | // Copyright 2015 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 | |
John McCutchan | 0b737ac | 2016-11-29 07:54:20 -0800 | [diff] [blame] | 5 | import 'base/context.dart'; |
Michael Goderbauer | 5e54fd5 | 2017-02-13 17:45:50 -0800 | [diff] [blame] | 6 | import 'base/file_system.dart'; |
Todd Volkert | 417c2f2 | 2017-01-25 16:06:41 -0800 | [diff] [blame] | 7 | import 'base/platform.dart'; |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 8 | import 'base/utils.dart'; |
Devon Carew | d5a6fce | 2016-02-17 00:59:56 -0800 | [diff] [blame] | 9 | import 'globals.dart'; |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 10 | |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 11 | /// Information about a build to be performed or used. |
| 12 | class BuildInfo { |
Alexandre Ardhuin | bfa1d25 | 2019-03-23 00:02:21 +0100 | [diff] [blame] | 13 | const BuildInfo( |
| 14 | this.mode, |
| 15 | this.flavor, { |
Alexandre Ardhuin | 09276be | 2018-06-05 08:50:40 +0200 | [diff] [blame] | 16 | this.trackWidgetCreation = false, |
Yegor | 905f9ac | 2018-03-02 15:45:55 -0800 | [diff] [blame] | 17 | this.extraFrontEndOptions, |
| 18 | this.extraGenSnapshotOptions, |
Alexander Aprelev | 43284d7 | 2018-03-17 12:47:40 -0700 | [diff] [blame] | 19 | this.fileSystemRoots, |
| 20 | this.fileSystemScheme, |
Ralph Bergmann | 8957073 | 2018-03-29 14:58:31 +0200 | [diff] [blame] | 21 | this.buildNumber, |
| 22 | this.buildName, |
Yegor | 905f9ac | 2018-03-02 15:45:55 -0800 | [diff] [blame] | 23 | }); |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 24 | |
| 25 | final BuildMode mode; |
Yegor | 905f9ac | 2018-03-02 15:45:55 -0800 | [diff] [blame] | 26 | |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 27 | /// Represents a custom Android product flavor or an Xcode scheme, null for |
| 28 | /// using the default. |
| 29 | /// |
| 30 | /// If not null, the Gradle build task will be `assembleFlavorMode` (e.g. |
| 31 | /// `assemblePaidRelease`), and the Xcode build configuration will be |
| 32 | /// Mode-Flavor (e.g. Release-Paid). |
| 33 | final String flavor; |
| 34 | |
Alexander Aprelev | 43284d7 | 2018-03-17 12:47:40 -0700 | [diff] [blame] | 35 | final List<String> fileSystemRoots; |
| 36 | final String fileSystemScheme; |
| 37 | |
Jacob Richman | 2c05eca | 2018-02-12 10:44:31 -0800 | [diff] [blame] | 38 | /// Whether the build should track widget creation locations. |
| 39 | final bool trackWidgetCreation; |
| 40 | |
Alexander Markov | 7153dea | 2017-10-03 12:55:53 -0700 | [diff] [blame] | 41 | /// Extra command-line options for front-end. |
| 42 | final String extraFrontEndOptions; |
| 43 | |
| 44 | /// Extra command-line options for gen_snapshot. |
| 45 | final String extraGenSnapshotOptions; |
| 46 | |
Ralph Bergmann | 8957073 | 2018-03-29 14:58:31 +0200 | [diff] [blame] | 47 | /// Internal version number (not displayed to users). |
| 48 | /// Each build must have a unique number to differentiate it from previous builds. |
| 49 | /// It is used to determine whether one build is more recent than another, with higher numbers indicating more recent build. |
| 50 | /// On Android it is used as versionCode. |
| 51 | /// On Xcode builds it is used as CFBundleVersion. |
KyleWong | 4b4a9400 | 2019-02-13 23:48:03 +0800 | [diff] [blame] | 52 | final String buildNumber; |
Ralph Bergmann | 8957073 | 2018-03-29 14:58:31 +0200 | [diff] [blame] | 53 | |
| 54 | /// A "x.y.z" string used as the version number shown to users. |
| 55 | /// For each new version of your app, you will provide a version number to differentiate it from previous versions. |
| 56 | /// On Android it is used as versionName. |
| 57 | /// On Xcode builds it is used as CFBundleShortVersionString, |
| 58 | final String buildName; |
| 59 | |
Alexandre Ardhuin | eda03e2 | 2018-08-02 12:02:32 +0200 | [diff] [blame] | 60 | static const BuildInfo debug = BuildInfo(BuildMode.debug, null); |
| 61 | static const BuildInfo profile = BuildInfo(BuildMode.profile, null); |
| 62 | static const BuildInfo release = BuildInfo(BuildMode.release, null); |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 63 | |
| 64 | /// Returns whether a debug build is requested. |
| 65 | /// |
| 66 | /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. |
| 67 | bool get isDebug => mode == BuildMode.debug; |
| 68 | |
| 69 | /// Returns whether a profile build is requested. |
| 70 | /// |
| 71 | /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. |
Jonah Williams | 73330e1 | 2019-06-18 15:22:04 -0700 | [diff] [blame] | 72 | bool get isProfile => mode == BuildMode.profile; |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 73 | |
| 74 | /// Returns whether a release build is requested. |
| 75 | /// |
| 76 | /// Exactly one of [isDebug], [isProfile], or [isRelease] is true. |
Jonah Williams | 73330e1 | 2019-06-18 15:22:04 -0700 | [diff] [blame] | 77 | bool get isRelease => mode == BuildMode.release; |
Stanislav Baranov | 55f3da7 | 2018-12-19 16:27:47 -0800 | [diff] [blame] | 78 | |
Mikkel Nygaard Ravn | 9496e6d | 2017-08-23 10:55:35 +0200 | [diff] [blame] | 79 | bool get usesAot => isAotBuildMode(mode); |
| 80 | bool get supportsEmulator => isEmulatorBuildMode(mode); |
| 81 | bool get supportsSimulator => isEmulatorBuildMode(mode); |
| 82 | String get modeName => getModeName(mode); |
Stanislav Baranov | 585e231 | 2019-01-10 16:07:50 -0800 | [diff] [blame] | 83 | String get friendlyModeName => getFriendlyModeName(mode); |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 84 | } |
Jason Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 85 | |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 86 | /// Information about an Android build to be performed or used. |
| 87 | class AndroidBuildInfo { |
| 88 | const AndroidBuildInfo( |
| 89 | this.buildInfo, { |
| 90 | this.targetArchs = const <AndroidArch>[ |
| 91 | AndroidArch.armeabi_v7a, |
| 92 | AndroidArch.arm64_v8a, |
| 93 | ], |
| 94 | this.splitPerAbi = false, |
Emmanuel Garcia | 2c857b9 | 2019-09-13 19:06:40 -0700 | [diff] [blame] | 95 | this.shrink = false, |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 96 | }); |
| 97 | |
| 98 | // The build info containing the mode and flavor. |
| 99 | final BuildInfo buildInfo; |
| 100 | |
| 101 | /// Whether to split the shared library per ABI. |
| 102 | /// |
| 103 | /// When this is false, multiple ABIs will be contained within one primary |
| 104 | /// build artifact. When this is true, multiple build artifacts (one per ABI) |
| 105 | /// will be produced. |
| 106 | final bool splitPerAbi; |
| 107 | |
Emmanuel Garcia | 2c857b9 | 2019-09-13 19:06:40 -0700 | [diff] [blame] | 108 | /// Whether to enable code shrinking on release mode. |
| 109 | final bool shrink; |
Emmanuel Garcia | f098de1 | 2019-09-10 17:22:55 -0700 | [diff] [blame] | 110 | |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 111 | /// The target platforms for the build. |
| 112 | final Iterable<AndroidArch> targetArchs; |
Adam Barth | bdd2066 | 2015-10-11 19:42:50 -0700 | [diff] [blame] | 113 | } |
| 114 | |
Stanislav Baranov | 393f927 | 2018-08-16 08:43:41 -0700 | [diff] [blame] | 115 | /// The type of build. |
Devon Carew | 1c0a966 | 2016-04-18 16:41:15 -0700 | [diff] [blame] | 116 | enum BuildMode { |
| 117 | debug, |
Jason Simmons | 07951ee | 2016-04-25 13:36:31 -0700 | [diff] [blame] | 118 | profile, |
Stanislav Baranov | 393f927 | 2018-08-16 08:43:41 -0700 | [diff] [blame] | 119 | release, |
Devon Carew | 8849cd6 | 2016-04-12 09:21:17 -0700 | [diff] [blame] | 120 | } |
| 121 | |
Jonah Williams | e91b98a | 2019-07-11 16:53:17 -0700 | [diff] [blame] | 122 | const List<String> _kBuildModes = <String>[ |
| 123 | 'debug', |
| 124 | 'profile', |
| 125 | 'release', |
Jonah Williams | e91b98a | 2019-07-11 16:53:17 -0700 | [diff] [blame] | 126 | ]; |
| 127 | |
| 128 | /// Return the name for the build mode, or "any" if null. |
| 129 | String getNameForBuildMode(BuildMode buildMode) { |
| 130 | return _kBuildModes[buildMode.index]; |
| 131 | } |
| 132 | |
| 133 | /// Returns the [BuildMode] for a particular `name`. |
| 134 | BuildMode getBuildModeForName(String name) { |
| 135 | switch (name) { |
| 136 | case 'debug': |
| 137 | return BuildMode.debug; |
| 138 | case 'profile': |
| 139 | return BuildMode.profile; |
| 140 | case 'release': |
| 141 | return BuildMode.release; |
| 142 | } |
| 143 | return null; |
| 144 | } |
| 145 | |
KyleWong | 4b4a9400 | 2019-02-13 23:48:03 +0800 | [diff] [blame] | 146 | String validatedBuildNumberForPlatform(TargetPlatform targetPlatform, String buildNumber) { |
| 147 | if (buildNumber == null) { |
| 148 | return null; |
| 149 | } |
| 150 | if (targetPlatform == TargetPlatform.ios || |
| 151 | targetPlatform == TargetPlatform.darwin_x64) { |
| 152 | // See CFBundleVersion at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html |
| 153 | final RegExp disallowed = RegExp(r'[^\d\.]'); |
| 154 | String tmpBuildNumber = buildNumber.replaceAll(disallowed, ''); |
Jenn Magder | 9a68b0d | 2019-09-17 17:07:41 -0700 | [diff] [blame] | 155 | if (tmpBuildNumber.isEmpty) { |
| 156 | return null; |
| 157 | } |
KyleWong | 4b4a9400 | 2019-02-13 23:48:03 +0800 | [diff] [blame] | 158 | final List<String> segments = tmpBuildNumber |
| 159 | .split('.') |
| 160 | .where((String segment) => segment.isNotEmpty) |
| 161 | .toList(); |
| 162 | if (segments.isEmpty) { |
| 163 | segments.add('0'); |
| 164 | } |
| 165 | tmpBuildNumber = segments.join('.'); |
| 166 | if (tmpBuildNumber != buildNumber) { |
| 167 | printTrace('Invalid build-number: $buildNumber for iOS/macOS, overridden by $tmpBuildNumber.\n' |
| 168 | 'See CFBundleVersion at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html'); |
| 169 | } |
| 170 | return tmpBuildNumber; |
| 171 | } |
| 172 | if (targetPlatform == TargetPlatform.android_arm || |
| 173 | targetPlatform == TargetPlatform.android_arm64 || |
| 174 | targetPlatform == TargetPlatform.android_x64 || |
| 175 | targetPlatform == TargetPlatform.android_x86) { |
| 176 | // See versionCode at https://developer.android.com/studio/publish/versioning |
| 177 | final RegExp disallowed = RegExp(r'[^\d]'); |
| 178 | String tmpBuildNumberStr = buildNumber.replaceAll(disallowed, ''); |
| 179 | int tmpBuildNumberInt = int.tryParse(tmpBuildNumberStr) ?? 0; |
| 180 | if (tmpBuildNumberInt < 1) { |
| 181 | tmpBuildNumberInt = 1; |
| 182 | } |
| 183 | tmpBuildNumberStr = tmpBuildNumberInt.toString(); |
| 184 | if (tmpBuildNumberStr != buildNumber) { |
| 185 | printTrace('Invalid build-number: $buildNumber for Android, overridden by $tmpBuildNumberStr.\n' |
| 186 | 'See versionCode at https://developer.android.com/studio/publish/versioning'); |
| 187 | } |
| 188 | return tmpBuildNumberStr; |
| 189 | } |
| 190 | return buildNumber; |
| 191 | } |
| 192 | |
| 193 | String validatedBuildNameForPlatform(TargetPlatform targetPlatform, String buildName) { |
| 194 | if (buildName == null) { |
| 195 | return null; |
| 196 | } |
| 197 | if (targetPlatform == TargetPlatform.ios || |
| 198 | targetPlatform == TargetPlatform.darwin_x64) { |
| 199 | // See CFBundleShortVersionString at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html |
| 200 | final RegExp disallowed = RegExp(r'[^\d\.]'); |
| 201 | String tmpBuildName = buildName.replaceAll(disallowed, ''); |
Jenn Magder | 9a68b0d | 2019-09-17 17:07:41 -0700 | [diff] [blame] | 202 | if (tmpBuildName.isEmpty) { |
| 203 | return null; |
| 204 | } |
KyleWong | 4b4a9400 | 2019-02-13 23:48:03 +0800 | [diff] [blame] | 205 | final List<String> segments = tmpBuildName |
| 206 | .split('.') |
| 207 | .where((String segment) => segment.isNotEmpty) |
| 208 | .toList(); |
| 209 | while (segments.length < 3) { |
| 210 | segments.add('0'); |
| 211 | } |
| 212 | tmpBuildName = segments.join('.'); |
| 213 | if (tmpBuildName != buildName) { |
| 214 | printTrace('Invalid build-name: $buildName for iOS/macOS, overridden by $tmpBuildName.\n' |
| 215 | 'See CFBundleShortVersionString at https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html'); |
| 216 | } |
| 217 | return tmpBuildName; |
| 218 | } |
| 219 | if (targetPlatform == TargetPlatform.android_arm || |
| 220 | targetPlatform == TargetPlatform.android_arm64 || |
| 221 | targetPlatform == TargetPlatform.android_x64 || |
| 222 | targetPlatform == TargetPlatform.android_x86) { |
| 223 | // See versionName at https://developer.android.com/studio/publish/versioning |
| 224 | return buildName; |
| 225 | } |
| 226 | return buildName; |
| 227 | } |
| 228 | |
Devon Carew | 1c0a966 | 2016-04-18 16:41:15 -0700 | [diff] [blame] | 229 | String getModeName(BuildMode mode) => getEnumName(mode); |
Devon Carew | 8849cd6 | 2016-04-12 09:21:17 -0700 | [diff] [blame] | 230 | |
Stanislav Baranov | 585e231 | 2019-01-10 16:07:50 -0800 | [diff] [blame] | 231 | String getFriendlyModeName(BuildMode mode) { |
| 232 | return snakeCase(getModeName(mode)).replaceAll('_', ' '); |
| 233 | } |
| 234 | |
Jason Simmons | f161f23 | 2016-05-02 11:40:32 -0700 | [diff] [blame] | 235 | // Returns true if the selected build mode uses ahead-of-time compilation. |
| 236 | bool isAotBuildMode(BuildMode mode) { |
| 237 | return mode == BuildMode.profile || mode == BuildMode.release; |
| 238 | } |
| 239 | |
Devon Carew | 9cfa966 | 2016-05-26 09:14:51 -0700 | [diff] [blame] | 240 | // Returns true if the given build mode can be used on emulators / simulators. |
Stanislav Baranov | eb8219e | 2019-01-17 14:21:35 -0800 | [diff] [blame] | 241 | bool isEmulatorBuildMode(BuildMode mode) { |
Jonah Williams | 73330e1 | 2019-06-18 15:22:04 -0700 | [diff] [blame] | 242 | return mode == BuildMode.debug; |
Stanislav Baranov | eb8219e | 2019-01-17 14:21:35 -0800 | [diff] [blame] | 243 | } |
Devon Carew | 9cfa966 | 2016-05-26 09:14:51 -0700 | [diff] [blame] | 244 | |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 245 | enum HostPlatform { |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 246 | darwin_x64, |
| 247 | linux_x64, |
Michael Goderbauer | 9f28b4f | 2017-01-26 17:04:53 -0800 | [diff] [blame] | 248 | windows_x64, |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 249 | } |
| 250 | |
| 251 | String getNameForHostPlatform(HostPlatform platform) { |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 252 | switch (platform) { |
| 253 | case HostPlatform.darwin_x64: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 254 | return 'darwin-x64'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 255 | case HostPlatform.linux_x64: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 256 | return 'linux-x64'; |
Michael Goderbauer | 9f28b4f | 2017-01-26 17:04:53 -0800 | [diff] [blame] | 257 | case HostPlatform.windows_x64: |
| 258 | return 'windows-x64'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 259 | } |
| 260 | assert(false); |
pq | 7a95548 | 2016-06-14 12:13:56 -0700 | [diff] [blame] | 261 | return null; |
Adam Barth | bdd2066 | 2015-10-11 19:42:50 -0700 | [diff] [blame] | 262 | } |
| 263 | |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 264 | enum TargetPlatform { |
Devon Carew | e939b15 | 2016-03-12 11:08:21 -0800 | [diff] [blame] | 265 | android_arm, |
Jason Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 266 | android_arm64, |
Devon Carew | 1311ae6 | 2016-04-08 14:04:46 -0700 | [diff] [blame] | 267 | android_x64, |
Jason Simmons | 4d0e698 | 2016-05-05 16:04:22 -0700 | [diff] [blame] | 268 | android_x86, |
Chinmay Garde | c8377d7 | 2016-03-21 14:41:26 -0700 | [diff] [blame] | 269 | ios, |
Devon Carew | e939b15 | 2016-03-12 11:08:21 -0800 | [diff] [blame] | 270 | darwin_x64, |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 271 | linux_x64, |
Zachary Anderson | b6ba37d | 2017-03-14 11:12:19 -0700 | [diff] [blame] | 272 | windows_x64, |
| 273 | fuchsia, |
Konstantin Scheglov | 38970f5 | 2018-04-10 09:37:16 -0700 | [diff] [blame] | 274 | tester, |
Jonah Williams | 83986ac | 2019-06-03 23:19:42 -0700 | [diff] [blame] | 275 | web_javascript, |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 276 | } |
| 277 | |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 278 | /// iOS and macOS target device architecture. |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 279 | // |
| 280 | // TODO(cbracken): split TargetPlatform.ios into ios_armv7, ios_arm64. |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 281 | enum DarwinArch { |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 282 | armv7, |
| 283 | arm64, |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 284 | x86_64, |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 285 | } |
| 286 | |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 287 | enum AndroidArch { |
| 288 | armeabi_v7a, |
| 289 | arm64_v8a, |
| 290 | x86, |
| 291 | x86_64, |
| 292 | } |
| 293 | |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 294 | /// The default set of iOS device architectures to build for. |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 295 | const List<DarwinArch> defaultIOSArchs = <DarwinArch>[ |
| 296 | DarwinArch.arm64, |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 297 | ]; |
| 298 | |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 299 | String getNameForDarwinArch(DarwinArch arch) { |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 300 | switch (arch) { |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 301 | case DarwinArch.armv7: |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 302 | return 'armv7'; |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 303 | case DarwinArch.arm64: |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 304 | return 'arm64'; |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 305 | case DarwinArch.x86_64: |
| 306 | return 'x86_64'; |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 307 | } |
| 308 | assert(false); |
| 309 | return null; |
| 310 | } |
| 311 | |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 312 | DarwinArch getIOSArchForName(String arch) { |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 313 | switch (arch) { |
| 314 | case 'armv7': |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 315 | return DarwinArch.armv7; |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 316 | case 'arm64': |
Jonah Williams | 1df165e | 2019-08-15 17:38:35 -0700 | [diff] [blame] | 317 | return DarwinArch.arm64; |
Chris Bracken | 849676f | 2018-05-06 18:43:07 -0700 | [diff] [blame] | 318 | } |
| 319 | assert(false); |
| 320 | return null; |
| 321 | } |
| 322 | |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 323 | String getNameForTargetPlatform(TargetPlatform platform) { |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 324 | switch (platform) { |
| 325 | case TargetPlatform.android_arm: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 326 | return 'android-arm'; |
Jason Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 327 | case TargetPlatform.android_arm64: |
| 328 | return 'android-arm64'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 329 | case TargetPlatform.android_x64: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 330 | return 'android-x64'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 331 | case TargetPlatform.android_x86: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 332 | return 'android-x86'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 333 | case TargetPlatform.ios: |
Chinmay Garde | 66fee3a | 2016-05-23 12:58:42 -0700 | [diff] [blame] | 334 | return 'ios'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 335 | case TargetPlatform.darwin_x64: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 336 | return 'darwin-x64'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 337 | case TargetPlatform.linux_x64: |
Chinmay Garde | a21dedc | 2016-05-13 17:03:03 -0700 | [diff] [blame] | 338 | return 'linux-x64'; |
Michael Goderbauer | d579d58 | 2017-03-02 10:57:27 -0800 | [diff] [blame] | 339 | case TargetPlatform.windows_x64: |
| 340 | return 'windows-x64'; |
Zachary Anderson | b6ba37d | 2017-03-14 11:12:19 -0700 | [diff] [blame] | 341 | case TargetPlatform.fuchsia: |
| 342 | return 'fuchsia'; |
Konstantin Scheglov | 38970f5 | 2018-04-10 09:37:16 -0700 | [diff] [blame] | 343 | case TargetPlatform.tester: |
| 344 | return 'flutter-tester'; |
Jonah Williams | 83986ac | 2019-06-03 23:19:42 -0700 | [diff] [blame] | 345 | case TargetPlatform.web_javascript: |
| 346 | return 'web-javascript'; |
Chinmay Garde | 29b8c80 | 2016-05-11 14:54:51 -0700 | [diff] [blame] | 347 | } |
| 348 | assert(false); |
pq | 7a95548 | 2016-06-14 12:13:56 -0700 | [diff] [blame] | 349 | return null; |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 350 | } |
| 351 | |
Adam Barth | cb7a690 | 2016-05-24 11:21:07 -0700 | [diff] [blame] | 352 | TargetPlatform getTargetPlatformForName(String platform) { |
| 353 | switch (platform) { |
| 354 | case 'android-arm': |
| 355 | return TargetPlatform.android_arm; |
Jason Simmons | d5149d4 | 2018-02-01 15:14:48 -0800 | [diff] [blame] | 356 | case 'android-arm64': |
| 357 | return TargetPlatform.android_arm64; |
Adam Barth | cb7a690 | 2016-05-24 11:21:07 -0700 | [diff] [blame] | 358 | case 'android-x64': |
| 359 | return TargetPlatform.android_x64; |
| 360 | case 'android-x86': |
| 361 | return TargetPlatform.android_x86; |
| 362 | case 'ios': |
| 363 | return TargetPlatform.ios; |
| 364 | case 'darwin-x64': |
| 365 | return TargetPlatform.darwin_x64; |
| 366 | case 'linux-x64': |
| 367 | return TargetPlatform.linux_x64; |
stuartmorgan | 4e1bfca | 2019-05-15 19:32:47 -0400 | [diff] [blame] | 368 | case 'windows-x64': |
| 369 | return TargetPlatform.windows_x64; |
Jonah Williams | 83986ac | 2019-06-03 23:19:42 -0700 | [diff] [blame] | 370 | case 'web-javascript': |
| 371 | return TargetPlatform.web_javascript; |
Adam Barth | cb7a690 | 2016-05-24 11:21:07 -0700 | [diff] [blame] | 372 | } |
pq | f5a4e63 | 2016-06-14 15:19:14 -0700 | [diff] [blame] | 373 | assert(platform != null); |
Adam Barth | cb7a690 | 2016-05-24 11:21:07 -0700 | [diff] [blame] | 374 | return null; |
| 375 | } |
| 376 | |
Emmanuel Garcia | 8627ff4 | 2019-06-10 13:16:09 -0700 | [diff] [blame] | 377 | AndroidArch getAndroidArchForName(String platform) { |
| 378 | switch (platform) { |
| 379 | case 'android-arm': |
| 380 | return AndroidArch.armeabi_v7a; |
| 381 | case 'android-arm64': |
| 382 | return AndroidArch.arm64_v8a; |
| 383 | case 'android-x64': |
| 384 | return AndroidArch.x86_64; |
| 385 | case 'android-x86': |
| 386 | return AndroidArch.x86; |
| 387 | } |
| 388 | assert(false); |
| 389 | return null; |
| 390 | } |
| 391 | |
| 392 | String getNameForAndroidArch(AndroidArch arch) { |
| 393 | switch (arch) { |
| 394 | case AndroidArch.armeabi_v7a: |
| 395 | return 'armeabi-v7a'; |
| 396 | case AndroidArch.arm64_v8a: |
| 397 | return 'arm64-v8a'; |
| 398 | case AndroidArch.x86_64: |
| 399 | return 'x86_64'; |
| 400 | case AndroidArch.x86: |
| 401 | return 'x86'; |
| 402 | } |
| 403 | assert(false); |
| 404 | return null; |
| 405 | } |
| 406 | |
| 407 | String getPlatformNameForAndroidArch(AndroidArch arch) { |
| 408 | switch (arch) { |
| 409 | case AndroidArch.armeabi_v7a: |
| 410 | return 'android-arm'; |
| 411 | case AndroidArch.arm64_v8a: |
| 412 | return 'android-arm64'; |
| 413 | case AndroidArch.x86_64: |
| 414 | return 'android-x64'; |
| 415 | case AndroidArch.x86: |
| 416 | return 'android-x86'; |
| 417 | } |
| 418 | assert(false); |
| 419 | return null; |
| 420 | } |
| 421 | |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 422 | HostPlatform getCurrentHostPlatform() { |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 423 | if (platform.isMacOS) { |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 424 | return HostPlatform.darwin_x64; |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 425 | } |
| 426 | if (platform.isLinux) { |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 427 | return HostPlatform.linux_x64; |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 428 | } |
| 429 | if (platform.isWindows) { |
Michael Goderbauer | 9f28b4f | 2017-01-26 17:04:53 -0800 | [diff] [blame] | 430 | return HostPlatform.windows_x64; |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 431 | } |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 432 | |
Devon Carew | d7fbf53 | 2016-01-27 22:38:57 -0800 | [diff] [blame] | 433 | printError('Unsupported host platform, defaulting to Linux'); |
Devon Carew | f132aca | 2016-04-15 21:08:03 -0700 | [diff] [blame] | 434 | |
| 435 | return HostPlatform.linux_x64; |
Adam Barth | 94b472f | 2015-10-30 22:57:39 -0700 | [diff] [blame] | 436 | } |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 437 | |
| 438 | /// Returns the top-level build output directory. |
| 439 | String getBuildDirectory() { |
John McCutchan | 0b737ac | 2016-11-29 07:54:20 -0800 | [diff] [blame] | 440 | // TODO(johnmccutchan): Stop calling this function as part of setting |
| 441 | // up command line argument processing. |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 442 | if (context == null || config == null) { |
John McCutchan | 0b737ac | 2016-11-29 07:54:20 -0800 | [diff] [blame] | 443 | return 'build'; |
Zachary Anderson | e2340c6 | 2019-09-13 14:51:35 -0700 | [diff] [blame] | 444 | } |
John McCutchan | 0b737ac | 2016-11-29 07:54:20 -0800 | [diff] [blame] | 445 | |
Chris Bracken | 7a09316 | 2017-03-03 17:50:46 -0800 | [diff] [blame] | 446 | final String buildDir = config.getValue('build-dir') ?? 'build'; |
Michael Goderbauer | 5e54fd5 | 2017-02-13 17:45:50 -0800 | [diff] [blame] | 447 | if (fs.path.isAbsolute(buildDir)) { |
Alexandre Ardhuin | d927c93 | 2018-09-12 08:29:29 +0200 | [diff] [blame] | 448 | throw Exception( |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 449 | 'build-dir config setting in ${config.configPath} must be relative'); |
| 450 | } |
| 451 | return buildDir; |
| 452 | } |
| 453 | |
| 454 | /// Returns the Android build output directory. |
| 455 | String getAndroidBuildDirectory() { |
Ian Hickson | b726158 | 2018-08-21 14:02:11 -0700 | [diff] [blame] | 456 | // TODO(cbracken): move to android subdir. |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 457 | return getBuildDirectory(); |
| 458 | } |
| 459 | |
| 460 | /// Returns the AOT build output directory. |
| 461 | String getAotBuildDirectory() { |
Michael Goderbauer | 5e54fd5 | 2017-02-13 17:45:50 -0800 | [diff] [blame] | 462 | return fs.path.join(getBuildDirectory(), 'aot'); |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 463 | } |
| 464 | |
| 465 | /// Returns the asset build output directory. |
| 466 | String getAssetBuildDirectory() { |
Sarah Zakarias | 5e18c07 | 2017-12-14 17:27:25 +0100 | [diff] [blame] | 467 | return fs.path.join(getBuildDirectory(), 'flutter_assets'); |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 468 | } |
| 469 | |
| 470 | /// Returns the iOS build output directory. |
| 471 | String getIosBuildDirectory() { |
Michael Goderbauer | 5e54fd5 | 2017-02-13 17:45:50 -0800 | [diff] [blame] | 472 | return fs.path.join(getBuildDirectory(), 'ios'); |
Chris Bracken | b5f763b | 2016-08-25 16:38:19 -0700 | [diff] [blame] | 473 | } |
Alexander Aprelev | 9ae893b | 2017-11-10 10:09:37 -0800 | [diff] [blame] | 474 | |
Jonah Williams | 7f959d8 | 2019-04-22 13:51:00 -0700 | [diff] [blame] | 475 | /// Returns the macOS build output directory. |
| 476 | String getMacOSBuildDirectory() { |
| 477 | return fs.path.join(getBuildDirectory(), 'macos'); |
| 478 | } |
| 479 | |
Jonah Williams | 9bc5656 | 2019-02-14 22:42:30 -0800 | [diff] [blame] | 480 | /// Returns the web build output directory. |
| 481 | String getWebBuildDirectory() { |
| 482 | return fs.path.join(getBuildDirectory(), 'web'); |
| 483 | } |
| 484 | |
Zachary Anderson | 8841afe | 2019-05-14 10:59:23 -0700 | [diff] [blame] | 485 | /// Returns the Linux build output directory. |
Jonah Williams | 37c73e7 | 2019-04-24 13:34:56 -0700 | [diff] [blame] | 486 | String getLinuxBuildDirectory() { |
| 487 | return fs.path.join(getBuildDirectory(), 'linux'); |
| 488 | } |
| 489 | |
stuartmorgan | 4e1bfca | 2019-05-15 19:32:47 -0400 | [diff] [blame] | 490 | /// Returns the Windows build output directory. |
| 491 | String getWindowsBuildDirectory() { |
| 492 | return fs.path.join(getBuildDirectory(), 'windows'); |
| 493 | } |
| 494 | |
Zachary Anderson | 8841afe | 2019-05-14 10:59:23 -0700 | [diff] [blame] | 495 | /// Returns the Fuchsia build output directory. |
| 496 | String getFuchsiaBuildDirectory() { |
| 497 | return fs.path.join(getBuildDirectory(), 'fuchsia'); |
| 498 | } |