// Copyright 2021 Sony Group Corporation. All rights reserved. // Copyright 2020 Samsung Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // @dart = 2.8 import 'package:flutter_tools/src/android/build_validation.dart' as android; import 'package:flutter_tools/src/base/analyze_size.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_apk.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import '../elinux_builder.dart'; import '../elinux_cache.dart'; import '../elinux_plugins.dart'; class ELinuxBuildCommand extends BuildCommand { ELinuxBuildCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) { addSubcommand(BuildPackageCommand(verboseHelp: verboseHelp)); } } class BuildPackageCommand extends BuildSubCommand with ELinuxExtension { /// See: [BuildApkCommand] in `build_apk.dart` BuildPackageCommand({bool verboseHelp = false}) { addCommonDesktopBuildOptions(verboseHelp: verboseHelp); usesBuildNameOption(); argParser.addOption( 'target-arch', defaultsTo: _getCurrentHostPlatformArchName(), allowed: ['x64', 'arm64'], help: 'Target architecture for which the the app is compiled', ); argParser.addOption( 'target-backend-type', defaultsTo: 'wayland', allowed: ['wayland', 'gbm', 'eglstream', 'x11'], help: 'Target backend type that the app will run on devices.', ); } @override final String name = 'elinux'; @override Future> get requiredArtifacts async => { DevelopmentArtifact.androidGenSnapshot, ELinuxDevelopmentArtifact.elinux, }; @override final String description = 'Build an eLinux package from your app.'; /// See: [android.validateBuild] in `build_validation.dart` void validateBuild(ELinuxBuildInfo eLinuxBuildInfo) { if (eLinuxBuildInfo.buildInfo.mode.isPrecompiled && eLinuxBuildInfo.targetArch == 'x86') { throwToolExit('x86 ABI does not support AOT compilation.'); } } /// See: [BuildApkCommand.runCommand] in `build_apk.dart` @override Future runCommand() async { final BuildInfo buildInfo = await getBuildInfo(); final ELinuxBuildInfo eLinuxBuildInfo = ELinuxBuildInfo( buildInfo, targetArch: stringArg('target-arch'), targetBackendType: stringArg('target-backend-type'), ); validateBuild(eLinuxBuildInfo); displayNullSafetyMode(buildInfo); await ELinuxBuilder.buildBundle( project: FlutterProject.current(), targetFile: targetFile, eLinuxBuildInfo: eLinuxBuildInfo, sizeAnalyzer: SizeAnalyzer( fileSystem: globals.fs, logger: globals.logger, flutterUsage: globals.flutterUsage, ), ); return FlutterCommandResult.success(); } String _getCurrentHostPlatformArchName() { final HostPlatform hostPlatform = getCurrentHostPlatform(); return getNameForHostPlatformArch(hostPlatform); } }