// 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 '../usage.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)); }