flutter/packages/flutter_tools/lib/src/commands/build_ios.dart
Jonah Williams e23c4796a3
Expose extra frontend options through build apk/ios/macOS (#53273)
This will allow experimenting with the remove to string transformer before we're ready to turn it on by default. This doesn't work for web yet since we use dart2js instead of the frontend_server for producing kernel
2020-03-25 16:56:41 -07:00

103 lines
3.3 KiB
Dart

// Copyright 2014 The Flutter 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' as globals;
import '../ios/mac.dart';
import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult;
import 'build.dart';
/// Builds an .app for an iOS app to be used for local testing on an iOS device
/// or simulator. Can only be run on a macOS host. For producing deployment
/// .ipas, see https://flutter.dev/docs/deployment/ios.
class BuildIOSCommand extends BuildSubCommand {
BuildIOSCommand() {
addTreeShakeIconsFlag();
addSplitDebugInfoOption();
addBuildModeFlags(defaultToRelease: false);
usesTargetOption();
usesFlavorOption();
usesPubOption();
usesBuildNumberOption();
usesBuildNameOption();
addDartObfuscationOption();
usesDartDefineOption();
usesExtraFrontendOptions();
argParser
..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.iOS,
};
@override
Future<FlutterCommandResult> runCommand() async {
final bool forSimulator = boolArg('simulator');
defaultBuildMode = forSimulator ? BuildMode.debug : BuildMode.release;
if (!globals.platform.isMacOS) {
throwToolExit('Building for iOS is only supported on the Mac.');
}
final BuildableIOSApp app = await applicationPackages.getPackageForPlatform(TargetPlatform.ios) as BuildableIOSApp;
if (app == null) {
throwToolExit('Application not configured for iOS');
}
final bool shouldCodesign = boolArg('codesign');
if (!forSimulator && !shouldCodesign) {
globals.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 = globals.artifacts.getEngineType(TargetPlatform.ios, buildInfo.mode);
globals.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) {
globals.printStatus('Built ${result.output}.');
}
return FlutterCommandResult.success();
}
}