From 3f9dcfe144a769597099755b17281d622aab8775 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Fri, 25 Mar 2016 14:17:55 -0700 Subject: [PATCH 1/2] Add: flutter build ios [--[no-]simulator] This allows the user to build an iOS application bundle from the command line even if no device is attached to the workstation. --- .../flutter_tools/lib/src/commands/build.dart | 2 + .../lib/src/commands/build_ios.dart | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 packages/flutter_tools/lib/src/commands/build_ios.dart diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index c3c78bc6a2a..bd88f4ad6ba 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -8,12 +8,14 @@ import 'dart:io'; import '../globals.dart'; import '../runner/flutter_command.dart'; import 'build_apk.dart'; +import 'build_ios.dart'; import 'build_flx.dart'; class BuildCommand extends FlutterCommand { BuildCommand() { addSubcommand(new BuildApkCommand()); addSubcommand(new BuildCleanCommand()); + addSubcommand(new BuildIOSCommand()); addSubcommand(new BuildFlxCommand()); } diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart new file mode 100644 index 00000000000..466b2d7a23b --- /dev/null +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -0,0 +1,62 @@ +// 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 '../build_configuration.dart'; +import '../globals.dart'; +import '../ios/mac.dart'; +import '../runner/flutter_command.dart'; + +class BuildIOSCommand extends FlutterCommand { + BuildIOSCommand() { + argParser.addFlag('simulator', help: 'Build for the iOS simulator instead of the device'); + } + + @override + final String name = 'ios'; + + @override + final String description = 'Build an iOS application bundle.'; + + @override + Future runInProject() async { + if (getCurrentHostPlatform() != HostPlatform.mac) { + printError('Building for iOS is only supported on the Mac.'); + return 1; + } + + printTrace('Ensuring toolchains are up to date.'); + + await Future.wait([ + downloadToolchain(), + downloadApplicationPackages(), + ], eagerError: true); + + IOSApp app = applicationPackages.iOS; + + if (app == null) { + printError('Application not configured for iOS'); + return 1; + } + + bool forSimulator = argResults['simulator']; + + String logTarget = forSimulator ? "simulator" : "device"; + + printStatus('Building the application for $logTarget.'); + + bool result = await buildIOSXcodeProject(app, buildForDevice: !forSimulator); + + if (!result) { + printError('Encountered error while building for $logTarget.'); + return 1; + } + + printStatus('Done.'); + + return 0; + } +} From 66e100619327231b2a1ae5d28c318b44ec670f55 Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Fri, 25 Mar 2016 15:36:45 -0700 Subject: [PATCH 2/2] Xcodebuild takes an extra parameter for the build directory. --- .../lib/src/commands/build_ios.dart | 15 ++++++++++++--- packages/flutter_tools/lib/src/ios/mac.dart | 19 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index 466b2d7a23b..6db8a43fc8f 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:io'; import '../application_package.dart'; import '../build_configuration.dart'; @@ -10,6 +11,8 @@ import '../globals.dart'; import '../ios/mac.dart'; import '../runner/flutter_command.dart'; +import 'package:path/path.dart' as path; + class BuildIOSCommand extends FlutterCommand { BuildIOSCommand() { argParser.addFlag('simulator', help: 'Build for the iOS simulator instead of the device'); @@ -19,7 +22,7 @@ class BuildIOSCommand extends FlutterCommand { final String name = 'ios'; @override - final String description = 'Build an iOS application bundle.'; + final String description = 'Build an iOS application bundle (Mac OSX host only).'; @override Future runInProject() async { @@ -48,14 +51,20 @@ class BuildIOSCommand extends FlutterCommand { printStatus('Building the application for $logTarget.'); - bool result = await buildIOSXcodeProject(app, buildForDevice: !forSimulator); + Directory buildDir = new Directory(path.join('build', 'ios_$logTarget')); + + if (!buildDir.existsSync()) + await buildDir.create(); + + bool result = await buildIOSXcodeProject(app, + buildForDevice: !forSimulator, buildDirectory: buildDir); if (!result) { printError('Encountered error while building for $logTarget.'); return 1; } - printStatus('Done.'); + printStatus('Built in ${buildDir.path}.'); return 0; } diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index fd1db37d45e..3745bc52ba7 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -89,7 +89,8 @@ bool _xcodeVersionCheckValid(int major, int minor) { return false; } -Future buildIOSXcodeProject(ApplicationPackage app, { bool buildForDevice }) async { +Future buildIOSXcodeProject(ApplicationPackage app, + { bool buildForDevice, Directory buildDirectory }) async { String flutterProjectPath = Directory.current.path; if (xcodeProjectRequiresUpdate()) { @@ -114,9 +115,23 @@ Future buildIOSXcodeProject(ApplicationPackage app, { bool buildForDevice await _addServicesToBundle(new Directory(app.localPath)); List commands = [ - '/usr/bin/env', 'xcrun', 'xcodebuild', '-target', 'Runner', '-configuration', 'Release' + '/usr/bin/env', + 'xcrun', + 'xcodebuild', + '-target', 'Runner', + '-configuration', 'Release', + 'ONLY_ACTIVE_ARCH=YES', ]; + if (buildDirectory != null) { + if (!buildDirectory.existsSync()) { + printError('The specified build directory ${buildDirectory.path} does not exist'); + return false; + } + + commands.add('TARGET_BUILD_DIR=${buildDirectory.absolute.path}'); + } + if (buildForDevice) { commands.addAll(['-sdk', 'iphoneos', '-arch', 'arm64']); } else {