blob: 105fb6f09a94b1ced64c7137880f62d2813d8a13 [file]
// 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 'package:meta/meta.dart';
import '../base/analyze_size.dart';
import '../base/common.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
import '../build_info.dart';
import '../build_system/build_system.dart';
import '../context/tool_context.dart';
import '../features.dart';
import '../macos/build_macos.dart';
import '../runner/flutter_command.dart';
import '../runner/flutter_command_runner.dart' show FlutterGlobalOptions;
import 'build.dart';
/// A command to build a macOS desktop target through a build shell script.
class BuildMacosCommand extends BuildSubCommand {
BuildMacosCommand({
required this.buildSystem,
required this.featureFlags,
required ToolContext super.toolContext,
required super.verboseHelp,
}) : super(logger: toolContext.logger, outputPreferences: toolContext.outputPreferences) {
registerOptionBundles(const <OptionBundle>[
CommonBuildOptionsBundle(),
BuildModeOptionsBundle(),
DartCompileOptionsBundle(),
AppleBuildOptionsBundle(),
]);
argParser.addDescriptors(const <OptionDescriptor<Object?>>[
BuildInfoOptions.trackWidgetCreation,
AppleBuildOptionsBundle.configOnly,
], verboseHelp: verboseHelp);
}
/// The build system used to execute targets.
final BuildSystem buildSystem;
/// Feature flags governing macOS desktop builds.
@visibleForTesting
final FeatureFlags featureFlags;
@override
ToolContext get toolContext => super.toolContext!;
@override
final name = 'macos';
@override
bool get hidden => !featureFlags.isMacOSEnabled || !toolContext.platform.isMacOS;
@override
Future<Set<DevelopmentArtifact>> get requiredArtifacts async => <DevelopmentArtifact>{
DevelopmentArtifact.macOS,
};
@override
String get description => 'Build a macOS desktop application.';
@override
bool get supported => toolContext.platform.isMacOS;
bool get configOnly => getValue(AppleBuildOptionsBundle.configOnly);
@override
Future<FlutterCommandResult> runCommand() async {
final FileSystem fs = toolContext.fs;
final Logger logger = toolContext.logger;
final BuildInfo buildInfo = await getBuildInfo();
if (!featureFlags.isMacOSEnabled) {
throwToolExit(
'"build macos" is not currently supported. To enable, run "flutter config --enable-macos-desktop".',
);
}
if (!supported) {
throwToolExit('"build macos" only supported on macOS hosts.');
}
await buildMacOS(
flutterProject: project,
buildInfo: buildInfo,
targetOverride: targetFile,
verboseLogging: logger.isVerbose || globalResults?[FlutterGlobalOptions.kVerboseFlag] == true,
configOnly: configOnly,
sizeAnalyzer: SizeAnalyzer(
fileSystem: fs,
logger: logger,
appFilenamePattern: 'App',
analytics: analytics,
),
usingCISystem: usingCISystem,
);
return FlutterCommandResult.success();
}
}