| // Copyright 2016 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| |
| import '../application_package.dart'; |
| import '../base/common.dart'; |
| import '../base/utils.dart'; |
| import '../build_info.dart'; |
| import '../globals.dart'; |
| import '../ios/mac.dart'; |
| import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult; |
| import 'build.dart'; |
| |
| class BuildIOSCommand extends BuildSubCommand { |
| BuildIOSCommand() { |
| usesTargetOption(); |
| usesFlavorOption(); |
| usesPubOption(); |
| usesBuildNumberOption(); |
| usesBuildNameOption(); |
| argParser |
| ..addFlag('debug', |
| negatable: false, |
| help: 'Build a debug version of your app (default mode for iOS simulator builds).', |
| ) |
| ..addFlag('profile', |
| negatable: false, |
| help: 'Build a version of your app specialized for performance profiling.', |
| ) |
| ..addFlag('release', |
| negatable: false, |
| help: 'Build a release version of your app (default mode for device builds).', |
| ) |
| ..addFlag('simulator', |
| help: 'Build for the iOS simulator instead of the device.', |
| ) |
| ..addFlag('codesign', |
| defaultsTo: true, |
| help: 'Codesign the application bundle (only available on device builds).', |
| ); |
| } |
| |
| @override |
| final String name = 'ios'; |
| |
| @override |
| final String description = 'Build an iOS application bundle (Mac OS X host only).'; |
| |
| @override |
| Future<Set<DevelopmentArtifact>> get requiredArtifacts async => const <DevelopmentArtifact>{ |
| DevelopmentArtifact.universal, |
| DevelopmentArtifact.iOS, |
| }; |
| |
| @override |
| Future<FlutterCommandResult> runCommand() async { |
| final bool forSimulator = argResults['simulator']; |
| defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release; |
| |
| if (getCurrentHostPlatform() != HostPlatform.darwin_x64) |
| throwToolExit('Building for iOS is only supported on the Mac.'); |
| |
| final BuildableIOSApp app = await applicationPackages.getPackageForPlatform(TargetPlatform.ios); |
| |
| if (app == null) |
| throwToolExit('Application not configured for iOS'); |
| |
| final bool shouldCodesign = argResults['codesign']; |
| |
| if (!forSimulator && !shouldCodesign) { |
| printStatus('Warning: Building for device with codesigning disabled. You will ' |
| 'have to manually codesign before deploying to device.'); |
| } |
| final BuildInfo buildInfo = getBuildInfo(); |
| if (forSimulator && !buildInfo.supportsSimulator) |
| throwToolExit('${toTitleCase(buildInfo.friendlyModeName)} mode is not supported for simulators.'); |
| |
| final String logTarget = forSimulator ? 'simulator' : 'device'; |
| |
| final String typeName = artifacts.getEngineType(TargetPlatform.ios, buildInfo.mode); |
| printStatus('Building $app for $logTarget ($typeName)...'); |
| final XcodeBuildResult result = await buildXcodeProject( |
| app: app, |
| buildInfo: buildInfo, |
| targetOverride: targetFile, |
| buildForDevice: !forSimulator, |
| codesign: shouldCodesign, |
| ); |
| |
| if (!result.success) { |
| await diagnoseXcodeBuildFailure(result); |
| throwToolExit('Encountered error while building for $logTarget.'); |
| } |
| |
| if (result.output != null) |
| printStatus('Built ${result.output}.'); |
| |
| return null; |
| } |
| } |