| // Copyright 2019 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 '../base/common.dart'; |
| import '../base/file_system.dart'; |
| import '../base/io.dart'; |
| import '../base/logger.dart'; |
| import '../base/process_manager.dart'; |
| import '../build_info.dart'; |
| import '../convert.dart'; |
| import '../globals.dart'; |
| import '../ios/xcodeproj.dart'; |
| import '../project.dart'; |
| import '../reporting/reporting.dart'; |
| |
| import 'cocoapod_utils.dart'; |
| |
| /// Builds the macOS project through xcodebuild. |
| // TODO(jonahwilliams): refactor to share code with the existing iOS code. |
| Future<void> buildMacOS({ |
| FlutterProject flutterProject, |
| BuildInfo buildInfo, |
| String targetOverride, |
| }) async { |
| final Directory flutterBuildDir = fs.directory(getMacOSBuildDirectory()); |
| if (!flutterBuildDir.existsSync()) { |
| flutterBuildDir.createSync(recursive: true); |
| } |
| // Write configuration to an xconfig file in a standard location. |
| await updateGeneratedXcodeProperties( |
| project: flutterProject, |
| buildInfo: buildInfo, |
| targetOverride: targetOverride, |
| useMacOSConfig: true, |
| setSymroot: false, |
| ); |
| await processPodsIfNeeded(flutterProject.macos, getMacOSBuildDirectory(), buildInfo.mode); |
| |
| // Set debug or release mode. |
| String config = 'Debug'; |
| if (buildInfo.isRelease) { |
| config = 'Release'; |
| } |
| // Run build script provided by application. |
| final Stopwatch sw = Stopwatch()..start(); |
| final Process process = await processManager.start(<String>[ |
| '/usr/bin/env', |
| 'xcrun', |
| 'xcodebuild', |
| '-workspace', flutterProject.macos.xcodeWorkspace.path, |
| '-configuration', '$config', |
| '-scheme', 'Runner', |
| '-derivedDataPath', flutterBuildDir.absolute.path, |
| 'OBJROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Intermediates.noindex')}', |
| 'SYMROOT=${fs.path.join(flutterBuildDir.absolute.path, 'Build', 'Products')}', |
| ], runInShell: true); |
| final Status status = logger.startProgress( |
| 'Building macOS application...', |
| timeout: null, |
| ); |
| int result; |
| try { |
| process.stderr |
| .transform(utf8.decoder) |
| .transform(const LineSplitter()) |
| .listen(printError); |
| process.stdout |
| .transform(utf8.decoder) |
| .transform(const LineSplitter()) |
| .listen(printTrace); |
| result = await process.exitCode; |
| } finally { |
| status.cancel(); |
| } |
| if (result != 0) { |
| throwToolExit('Build process failed'); |
| } |
| flutterUsage.sendTiming('build', 'xcode-macos', Duration(milliseconds: sw.elapsedMilliseconds)); |
| } |