From 3050096d46a786f99737eb9a46f3a51c5a7f8d92 Mon Sep 17 00:00:00 2001 From: Hidenori Matsubayashi Date: Mon, 21 Feb 2022 16:31:12 +0900 Subject: [PATCH] Switch gen_snapshot from Android's one to elinux's one (#82) --- lib/commands/build.dart | 3 +- lib/commands/drive.dart | 4 ++- lib/commands/run.dart | 3 +- lib/elinux_artifacts.dart | 71 +++++++++++++++++++++++++++++++++++++++ lib/elinux_cache.dart | 10 ++++++ lib/executable.dart | 8 +++++ 6 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 lib/elinux_artifacts.dart diff --git a/lib/commands/build.dart b/lib/commands/build.dart index b91aa8d..4c9547d 100644 --- a/lib/commands/build.dart +++ b/lib/commands/build.dart @@ -27,7 +27,8 @@ class ELinuxBuildCommand extends BuildCommand { } } -class BuildPackageCommand extends BuildSubCommand with ELinuxExtension { +class BuildPackageCommand extends BuildSubCommand + with ELinuxExtension, ELinuxRequiredArtifacts { /// See: [BuildApkCommand] in `build_apk.dart` BuildPackageCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) { diff --git a/lib/commands/drive.dart b/lib/commands/drive.dart index c1845df..661e585 100644 --- a/lib/commands/drive.dart +++ b/lib/commands/drive.dart @@ -8,9 +8,11 @@ import 'package:flutter_tools/src/commands/drive.dart'; import 'package:flutter_tools/src/globals.dart' as globals; +import '../elinux_cache.dart'; import '../elinux_plugins.dart'; -class ELinuxDriveCommand extends DriveCommand with ELinuxExtension { +class ELinuxDriveCommand extends DriveCommand + with ELinuxExtension, ELinuxRequiredArtifacts { ELinuxDriveCommand({bool verboseHelp = false}) : super( verboseHelp: verboseHelp, diff --git a/lib/commands/run.dart b/lib/commands/run.dart index ee6456c..3605fea 100644 --- a/lib/commands/run.dart +++ b/lib/commands/run.dart @@ -13,7 +13,8 @@ import 'package:flutter_tools/src/commands/run.dart'; import '../elinux_cache.dart'; import '../elinux_plugins.dart'; -class ELinuxRunCommand extends RunCommand with ELinuxExtension { +class ELinuxRunCommand extends RunCommand + with ELinuxExtension, ELinuxRequiredArtifacts { ELinuxRunCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp); diff --git a/lib/elinux_artifacts.dart b/lib/elinux_artifacts.dart new file mode 100644 index 0000000..f52abdc --- /dev/null +++ b/lib/elinux_artifacts.dart @@ -0,0 +1,71 @@ +// Copyright 2022 Sony Group Corporation. All rights reserved. +// Copyright 2021 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. + +import 'package:file/file.dart'; +import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/base/os.dart'; +import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/cache.dart'; + +class ELinuxArtifacts extends CachedArtifacts { + ELinuxArtifacts({ + required FileSystem fileSystem, + required Platform platform, + required Cache cache, + required OperatingSystemUtils operatingSystemUtils, + }) : _cache = cache, + super( + fileSystem: fileSystem, + platform: platform, + cache: cache, + operatingSystemUtils: operatingSystemUtils, + ); + + final Cache _cache; + + /// See: [CachedArtifacts._getEngineArtifactsPath] + Directory _getEngineArtifactsDirectory(String arch, BuildMode mode) { + return _cache + .getArtifactDirectory('engine') + .childDirectory('elinux-$arch-${mode.name}'); + } + + /// See: [CachedArtifacts._getAndroidArtifactPath] in `artifacts.dart` + @override + String getArtifactPath( + Artifact artifact, { + TargetPlatform? platform, + BuildMode? mode, + EnvironmentType? environmentType, + }) { + if (artifact == Artifact.genSnapshot && + platform != null && + getNameForTargetPlatform(platform).startsWith('android')) { + assert(mode != null, 'Need to specify a build mode.'); + assert(mode != BuildMode.debug, + 'Artifact $artifact only available in non-debug mode.'); + final String arch = _getArchForTargetPlatform(platform); + final HostPlatform hostPlatform = getCurrentHostPlatform(); + assert(hostPlatform != HostPlatform.linux_arm64, + 'Artifact $artifact not available on Linux arm64.'); + return _getEngineArtifactsDirectory(arch, mode!) + // TODO(hidenori): Remove this comment out. + // See: https://github.com/sony/flutter-elinux/issues/81 + //.childDirectory(getNameForHostPlatform(hostPlatform)) + .childFile('gen_snapshot') + .path; + } + return super.getArtifactPath(artifact, platform: platform, mode: mode); + } + + String _getArchForTargetPlatform(TargetPlatform platform) { + if (platform == TargetPlatform.android_arm64) { + return 'arm64'; + } else { + return 'x64'; + } + } +} diff --git a/lib/elinux_cache.dart b/lib/elinux_cache.dart index 2c2cb5b..afe8467 100644 --- a/lib/elinux_cache.dart +++ b/lib/elinux_cache.dart @@ -12,6 +12,16 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/flutter_cache.dart'; import 'package:flutter_tools/src/globals.dart' as globals; +import 'package:flutter_tools/src/runner/flutter_command.dart'; + +mixin ELinuxRequiredArtifacts on FlutterCommand { + @override + Future> get requiredArtifacts async => + { + ...await super.requiredArtifacts, + ELinuxDevelopmentArtifact.elinux, + }; +} /// See: [DevelopmentArtifact] in `cache.dart` class ELinuxDevelopmentArtifact implements DevelopmentArtifact { diff --git a/lib/executable.dart b/lib/executable.dart index 8761289..58da717 100644 --- a/lib/executable.dart +++ b/lib/executable.dart @@ -11,6 +11,7 @@ import 'dart:io'; import 'package:flutter_tools/executable.dart' as flutter; import 'package:flutter_tools/runner.dart' as runner; import 'package:flutter_tools/src/application_package.dart'; +import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/context.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/template.dart'; @@ -48,6 +49,7 @@ import 'elinux_cache.dart'; import 'elinux_device_discovery.dart'; import 'elinux_doctor.dart'; import 'elinux_package.dart'; +import 'elinux_artifacts.dart'; /// Main entry point for commands. /// @@ -127,6 +129,12 @@ Future main(List args) async { ), TemplateRenderer: () => const MustacheTemplateRenderer(), ApplicationPackageFactory: () => ELinuxApplicationPackageFactory(), + Artifacts: () => ELinuxArtifacts( + fileSystem: globals.fs, + cache: globals.cache, + platform: globals.platform, + operatingSystemUtils: globals.os, + ), DeviceManager: () => ELinuxDeviceManager(), DoctorValidatorsProvider: () => ELinuxDoctorValidatorsProvider(), ELinuxWorkflow: () => ELinuxWorkflow(