Xcodebuild takes an extra parameter for the build directory.
diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index 466b2d7..6db8a43 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 '../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 @@ 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<int> runInProject() async { @@ -48,14 +51,20 @@ 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 fd1db37..3745bc5 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -89,7 +89,8 @@ return false; } -Future<bool> buildIOSXcodeProject(ApplicationPackage app, { bool buildForDevice }) async { +Future<bool> buildIOSXcodeProject(ApplicationPackage app, + { bool buildForDevice, Directory buildDirectory }) async { String flutterProjectPath = Directory.current.path; if (xcodeProjectRequiresUpdate()) { @@ -114,9 +115,23 @@ await _addServicesToBundle(new Directory(app.localPath)); List<String> commands = <String>[ - '/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(<String>['-sdk', 'iphoneos', '-arch', 'arm64']); } else {