Host Flutter tool patch alongside engine

This commit is contained in:
2026-02-27 16:16:10 +01:00
parent 8cdde18478
commit 9a52d9b524
2 changed files with 669 additions and 1 deletions

View File

@@ -49,6 +49,6 @@
<h2>Hosted artifacts:</h2> <h2>Hosted artifacts:</h2>
<h3>Flutter 3.38.9 - <a href="flutter_infra_release/flutter/587c18f873b8ab57330422bce09047420d9c7f42/">587c18f873b8ab57330422bce09047420d9c7f42</a></h3> <h3>Flutter 3.38.9 - <a href="flutter_infra_release/flutter/587c18f873b8ab57330422bce09047420d9c7f42/">587c18f873b8ab57330422bce09047420d9c7f42</a></h3>
<p style="margin-left: 20px;"><a href="https://code.launchpad.net/~vhaudiquet/+git/flutter/+build/207763">Launchpad build</a></p> <p style="margin-left: 20px;"><a href="https://code.launchpad.net/~vhaudiquet/+git/flutter/+build/207763">Launchpad build</a><a href="tool/3.38.9.patch">Tool patch</a></p>
</body> </body>
</html> </html>

View File

@@ -0,0 +1,668 @@
commit 03f313d12ed3d2c381cb48617442d7a4c5f9d643
Author: Valentin Haudiquet <valentin.haudiquet@canonical.com>
Date: Tue Dec 2 19:52:25 2025 +0100
[ Tool ] Support riscv64 architecture
This adds support for buildind desktop linux applications for riscv64 on the flutter tool, as well as basic riscv64 support for the tool.
diff --git a/bin/internal/update_dart_sdk.sh b/bin/internal/update_dart_sdk.sh
index 9ab6151021a..878c9e59ea9 100755
--- a/bin/internal/update_dart_sdk.sh
+++ b/bin/internal/update_dart_sdk.sh
@@ -89,6 +89,9 @@ if [ ! -f "$ENGINE_STAMP" ] || [ "$ENGINE_VERSION" != `cat "$ENGINE_STAMP"` ]; t
x86_64)
ARCH="x64"
;;
+ riscv64)
+ ARCH="riscv64"
+ ;;
*)
ARCH="arm64"
;;
diff --git a/packages/flutter_tools/lib/src/android/android_device.dart b/packages/flutter_tools/lib/src/android/android_device.dart
index 2813a7ea069..fae4fb66575 100644
--- a/packages/flutter_tools/lib/src/android/android_device.dart
+++ b/packages/flutter_tools/lib/src/android/android_device.dart
@@ -228,6 +228,7 @@ class AndroidDevice extends Device {
case TargetPlatform.fuchsia_x64:
case TargetPlatform.ios:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
@@ -551,6 +552,7 @@ class AndroidDevice extends Device {
case TargetPlatform.fuchsia_x64:
case TargetPlatform.ios:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart
index 545b594ec45..3cb6fd2f21a 100644
--- a/packages/flutter_tools/lib/src/artifacts.dart
+++ b/packages/flutter_tools/lib/src/artifacts.dart
@@ -30,6 +30,7 @@ enum Artifact {
/// The tool which compiles a dart kernel file into native code.
genSnapshot,
genSnapshotArm64,
+ genSnapshotRiscv64,
genSnapshotX64,
/// The flutter tester binary.
@@ -155,6 +156,7 @@ TargetPlatform? _mapTargetPlatform(TargetPlatform? targetPlatform) {
case TargetPlatform.darwin:
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.windows_x64:
case TargetPlatform.windows_arm64:
case TargetPlatform.fuchsia_arm64:
@@ -177,6 +179,8 @@ String? _artifactToFileName(Artifact artifact, Platform hostPlatform, [BuildMode
return 'gen_snapshot';
case Artifact.genSnapshotArm64:
return 'gen_snapshot_arm64';
+ case Artifact.genSnapshotRiscv64:
+ return 'gen_snapshot_riscv64';
case Artifact.genSnapshotX64:
return 'gen_snapshot_x64';
case Artifact.flutterTester:
@@ -519,6 +523,7 @@ class CachedArtifacts implements Artifacts {
case TargetPlatform.darwin:
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.windows_x64:
case TargetPlatform.windows_arm64:
return _getDesktopArtifactPath(artifact, platform!, mode);
@@ -550,6 +555,7 @@ class CachedArtifacts implements Artifacts {
switch (artifact) {
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
return _fileSystem.path.join(engineDir, _artifactToFileName(artifact, _platform));
case Artifact.engineDartSdkPath:
@@ -590,6 +596,7 @@ class CachedArtifacts implements Artifacts {
switch (artifact) {
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
assert(mode != BuildMode.debug, 'Artifact $artifact only available in non-debug mode.');
@@ -647,6 +654,7 @@ class CachedArtifacts implements Artifacts {
switch (artifact) {
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
case Artifact.flutterXcframework:
final String artifactFileName = _artifactToFileName(artifact, _platform)!;
@@ -699,6 +707,7 @@ class CachedArtifacts implements Artifacts {
final genSnapshot = mode.isRelease ? 'gen_snapshot_product' : 'gen_snapshot';
return _fileSystem.path.join(root, runtime, 'dart_binaries', genSnapshot);
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
throw ArgumentError('$artifact is not available on this platform');
case Artifact.flutterPatchedSdkPath:
@@ -757,6 +766,7 @@ class CachedArtifacts implements Artifacts {
switch (artifact) {
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
// For script snapshots any gen_snapshot binary will do. Returning gen_snapshot for
// android_arm in profile mode because it is available on all supported host platforms.
@@ -878,6 +888,7 @@ class CachedArtifacts implements Artifacts {
switch (platform) {
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.darwin:
case TargetPlatform.windows_x64:
case TargetPlatform.windows_arm64:
@@ -919,9 +930,11 @@ TargetPlatform _currentHostPlatform(Platform platform, OperatingSystemUtils oper
return TargetPlatform.darwin;
}
if (platform.isLinux) {
- return operatingSystemUtils.hostPlatform == HostPlatform.linux_x64
- ? TargetPlatform.linux_x64
- : TargetPlatform.linux_arm64;
+ return switch (operatingSystemUtils.hostPlatform) {
+ HostPlatform.linux_x64 => TargetPlatform.linux_x64,
+ HostPlatform.linux_riscv64 => TargetPlatform.linux_riscv64,
+ _ => TargetPlatform.linux_arm64,
+ };
}
if (platform.isWindows) {
return operatingSystemUtils.hostPlatform == HostPlatform.windows_arm64
@@ -1197,6 +1210,7 @@ class CachedLocalEngineArtifacts implements Artifacts {
switch (artifact) {
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
return _genSnapshotPath(artifact);
case Artifact.flutterTester:
@@ -1338,6 +1352,8 @@ class CachedLocalEngineArtifacts implements Artifacts {
switch (hostPlatform) {
case TargetPlatform.darwin:
return 'macos-x64';
+ case TargetPlatform.linux_riscv64:
+ return 'linux-riscv64';
case TargetPlatform.linux_arm64:
return 'linux-arm64';
case TargetPlatform.linux_x64:
@@ -1373,6 +1389,7 @@ class CachedLocalEngineArtifacts implements Artifacts {
'clang_x86',
'clang_i386',
'clang_arm64',
+ 'clang_riscv64',
];
final String genSnapshotName = _artifactToFileName(artifact, _platform)!;
for (final clangDir in clangDirs) {
@@ -1445,6 +1462,7 @@ class CachedLocalWebSdkArtifacts implements Artifacts {
);
case Artifact.genSnapshot:
case Artifact.genSnapshotArm64:
+ case Artifact.genSnapshotRiscv64:
case Artifact.genSnapshotX64:
case Artifact.flutterTester:
case Artifact.flutterFramework:
@@ -1570,6 +1588,8 @@ class CachedLocalWebSdkArtifacts implements Artifacts {
return 'macos-x64';
case TargetPlatform.linux_arm64:
return 'linux-arm64';
+ case TargetPlatform.linux_riscv64:
+ return 'linux-riscv64';
case TargetPlatform.linux_x64:
return 'linux-x64';
case TargetPlatform.windows_x64:
diff --git a/packages/flutter_tools/lib/src/base/build.dart b/packages/flutter_tools/lib/src/base/build.dart
index 4551708cbfe..9cd34be24c3 100644
--- a/packages/flutter_tools/lib/src/base/build.dart
+++ b/packages/flutter_tools/lib/src/base/build.dart
@@ -360,6 +360,7 @@ class AOTSnapshotter {
TargetPlatform.darwin,
TargetPlatform.linux_x64,
TargetPlatform.linux_arm64,
+ TargetPlatform.linux_riscv64,
TargetPlatform.windows_x64,
TargetPlatform.windows_arm64,
].contains(platform);
diff --git a/packages/flutter_tools/lib/src/base/os.dart b/packages/flutter_tools/lib/src/base/os.dart
index 5b499fef54f..297bf10159c 100644
--- a/packages/flutter_tools/lib/src/base/os.dart
+++ b/packages/flutter_tools/lib/src/base/os.dart
@@ -279,6 +279,8 @@ class _PosixUtils extends OperatingSystemUtils {
);
} else if (hostPlatformCheck.stdout.trim().endsWith('x86_64')) {
_hostPlatform = HostPlatform.linux_x64;
+ } else if (hostPlatformCheck.stdout.trim().endsWith('riscv64')) {
+ _hostPlatform = HostPlatform.linux_riscv64;
} else {
// We default to ARM if it's not x86_64 and we did not get an error.
_hostPlatform = HostPlatform.linux_arm64;
@@ -611,6 +613,7 @@ enum HostPlatform {
darwin_arm64,
linux_x64,
linux_arm64,
+ linux_riscv64,
windows_x64,
windows_arm64;
@@ -619,6 +622,7 @@ enum HostPlatform {
HostPlatform.darwin_arm64 => 'arm64',
HostPlatform.linux_x64 => 'x64',
HostPlatform.linux_arm64 => 'arm64',
+ HostPlatform.linux_riscv64 => 'riscv64',
HostPlatform.windows_x64 => 'x64',
HostPlatform.windows_arm64 => 'arm64',
};
@@ -630,6 +634,7 @@ String getNameForHostPlatform(HostPlatform platform) {
HostPlatform.darwin_arm64 => 'darwin-arm64',
HostPlatform.linux_x64 => 'linux-x64',
HostPlatform.linux_arm64 => 'linux-arm64',
+ HostPlatform.linux_riscv64 => 'linux-riscv64',
HostPlatform.windows_x64 => 'windows-x64',
HostPlatform.windows_arm64 => 'windows-arm64',
};
diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart
index b59d4b3912b..f923af4c7d0 100644
--- a/packages/flutter_tools/lib/src/build_info.dart
+++ b/packages/flutter_tools/lib/src/build_info.dart
@@ -576,6 +576,7 @@ enum TargetPlatform {
darwin,
linux_x64,
linux_arm64,
+ linux_riscv64,
windows_x64,
windows_arm64,
fuchsia_arm64,
@@ -604,6 +605,7 @@ enum TargetPlatform {
case TargetPlatform.darwin:
case TargetPlatform.ios:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
@@ -618,6 +620,7 @@ enum TargetPlatform {
switch (this) {
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
return 'linux';
case TargetPlatform.darwin:
return 'macos';
@@ -652,6 +655,8 @@ enum TargetPlatform {
case TargetPlatform.linux_arm64:
case TargetPlatform.windows_arm64:
return 'arm64';
+ case TargetPlatform.linux_riscv64:
+ return 'riscv64';
case TargetPlatform.android:
case TargetPlatform.android_arm:
case TargetPlatform.android_arm64:
@@ -786,6 +791,7 @@ String getNameForTargetPlatform(TargetPlatform platform, {DarwinArch? darwinArch
TargetPlatform.android_x64 => 'android-x64',
TargetPlatform.linux_x64 => 'linux-x64',
TargetPlatform.linux_arm64 => 'linux-arm64',
+ TargetPlatform.linux_riscv64 => 'linux-riscv64',
TargetPlatform.windows_x64 => 'windows-x64',
TargetPlatform.windows_arm64 => 'windows-arm64',
TargetPlatform.fuchsia_arm64 => 'fuchsia-arm64',
@@ -811,6 +817,7 @@ TargetPlatform getTargetPlatformForName(String platform) {
'darwin' || 'darwin-x64' || 'darwin-arm64' => TargetPlatform.darwin,
'linux-x64' => TargetPlatform.linux_x64,
'linux-arm64' => TargetPlatform.linux_arm64,
+ 'linux-riscv64' => TargetPlatform.linux_riscv64,
'windows-x64' => TargetPlatform.windows_x64,
'windows-arm64' => TargetPlatform.windows_arm64,
'web-javascript' => TargetPlatform.web_javascript,
diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart
index 63eb1c736e8..f4695404411 100644
--- a/packages/flutter_tools/lib/src/build_system/targets/common.dart
+++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart
@@ -228,6 +228,7 @@ class KernelSnapshot extends Target {
case TargetPlatform.fuchsia_x64:
case TargetPlatform.ios:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
forceLinkPlatform = false;
@@ -243,7 +244,9 @@ class KernelSnapshot extends Target {
TargetPlatform.android_x64 => 'android',
TargetPlatform.darwin => 'macos',
TargetPlatform.ios => 'ios',
- TargetPlatform.linux_arm64 || TargetPlatform.linux_x64 => 'linux',
+ TargetPlatform.linux_arm64 ||
+ TargetPlatform.linux_riscv64 ||
+ TargetPlatform.linux_x64 => 'linux',
TargetPlatform.windows_arm64 || TargetPlatform.windows_x64 => 'windows',
TargetPlatform.tester || TargetPlatform.web_javascript => null,
TargetPlatform.unsupported => TargetPlatform.throwUnsupportedTarget(),
diff --git a/packages/flutter_tools/lib/src/build_system/tools/shader_compiler.dart b/packages/flutter_tools/lib/src/build_system/tools/shader_compiler.dart
index db28675db2d..c2f8820945c 100644
--- a/packages/flutter_tools/lib/src/build_system/tools/shader_compiler.dart
+++ b/packages/flutter_tools/lib/src/build_system/tools/shader_compiler.dart
@@ -112,6 +112,7 @@ class ShaderCompiler {
case TargetPlatform.android:
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.windows_x64:
case TargetPlatform.windows_arm64:
return <String>[
diff --git a/packages/flutter_tools/lib/src/commands/assemble.dart b/packages/flutter_tools/lib/src/commands/assemble.dart
index 2e7b11ad1e5..26b2dad909f 100644
--- a/packages/flutter_tools/lib/src/commands/assemble.dart
+++ b/packages/flutter_tools/lib/src/commands/assemble.dart
@@ -46,10 +46,13 @@ var _kDefaultTargets = <Target>[
// Linux targets
const DebugBundleLinuxAssets(TargetPlatform.linux_x64),
const DebugBundleLinuxAssets(TargetPlatform.linux_arm64),
+ const DebugBundleLinuxAssets(TargetPlatform.linux_riscv64),
const ProfileBundleLinuxAssets(TargetPlatform.linux_x64),
const ProfileBundleLinuxAssets(TargetPlatform.linux_arm64),
+ const ProfileBundleLinuxAssets(TargetPlatform.linux_riscv64),
const ReleaseBundleLinuxAssets(TargetPlatform.linux_x64),
const ReleaseBundleLinuxAssets(TargetPlatform.linux_arm64),
+ const ReleaseBundleLinuxAssets(TargetPlatform.linux_riscv64),
const ReleaseAndroidApplication(),
// This is a one-off rule for bundle and aot compat.
const CopyFlutterBundle(),
diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart
index 927edb22877..06d0ef67a76 100644
--- a/packages/flutter_tools/lib/src/commands/build_bundle.dart
+++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart
@@ -46,6 +46,7 @@ class BuildBundleCommand extends BuildSubCommand {
'darwin',
'linux-x64',
'linux-arm64',
+ 'linux-riscv64',
'windows-x64',
'windows-arm64',
],
@@ -122,6 +123,7 @@ class BuildBundleCommand extends BuildSubCommand {
}
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
if (!featureFlags.isLinuxEnabled) {
throwToolExit('Linux is not a supported target platform.');
}
diff --git a/packages/flutter_tools/lib/src/commands/build_linux.dart b/packages/flutter_tools/lib/src/commands/build_linux.dart
index 832be184a32..f948f87f0aa 100644
--- a/packages/flutter_tools/lib/src/commands/build_linux.dart
+++ b/packages/flutter_tools/lib/src/commands/build_linux.dart
@@ -23,13 +23,15 @@ class BuildLinuxCommand extends BuildSubCommand {
}) : _operatingSystemUtils = operatingSystemUtils,
super(verboseHelp: verboseHelp) {
addCommonDesktopBuildOptions(verboseHelp: verboseHelp);
- final defaultTargetPlatform = (_operatingSystemUtils.hostPlatform == HostPlatform.linux_arm64)
- ? 'linux-arm64'
- : 'linux-x64';
+ final String defaultTargetPlatform = switch (_operatingSystemUtils.hostPlatform) {
+ HostPlatform.linux_arm64 => 'linux-arm64',
+ HostPlatform.linux_riscv64 => 'linux-riscv64',
+ _ => 'linux-x64',
+ };
argParser.addOption(
'target-platform',
defaultsTo: defaultTargetPlatform,
- allowed: <String>['linux-arm64', 'linux-x64'],
+ allowed: <String>['linux-arm64', 'linux-x64', 'linux-riscv64'],
help: 'The target platform for which the app is compiled.',
);
argParser.addOption(
@@ -79,9 +81,8 @@ class BuildLinuxCommand extends BuildSubCommand {
if (!globals.platform.isLinux) {
throwToolExit('"build linux" only supported on Linux hosts.');
}
- // Cross-building for x64 targets on arm64 hosts is not supported.
- if (_operatingSystemUtils.hostPlatform != HostPlatform.linux_x64 &&
- targetPlatform != TargetPlatform.linux_arm64) {
+ // Cross-building is only supported on x64 hosts
+ if (_operatingSystemUtils.hostPlatform != HostPlatform.linux_x64 && needCrossBuild) {
throwToolExit('"cross-building" only supported on Linux x64 hosts.');
}
// TODO(fujino): https://github.com/flutter/flutter/issues/74929
@@ -91,6 +92,14 @@ class BuildLinuxCommand extends BuildSubCommand {
'Cross-build from Linux x64 host to Linux arm64 target is not currently supported.',
);
}
+ // Building for riscv64 (on a non-riscv64 host) is experimental
+ if (_operatingSystemUtils.hostPlatform != HostPlatform.linux_riscv64 &&
+ targetPlatform == TargetPlatform.linux_riscv64 &&
+ !featureFlags.isRiscv64SupportEnabled) {
+ throwToolExit(
+ 'Building for Linux riscv64 is currently an experimental feature. To enable, run "flutter config --enable-riscv64"',
+ );
+ }
final Logger logger = globals.logger;
await buildLinux(
project.linux,
diff --git a/packages/flutter_tools/lib/src/features.dart b/packages/flutter_tools/lib/src/features.dart
index fdbfbfdca2e..ac2f5dbefb8 100644
--- a/packages/flutter_tools/lib/src/features.dart
+++ b/packages/flutter_tools/lib/src/features.dart
@@ -76,6 +76,9 @@ abstract class FeatureFlags {
/// Whether UIScene migration is enabled.
bool get isUISceneMigrationEnabled;
+ /// Wether riscv64 support is enabled.
+ bool get isRiscv64SupportEnabled;
+
/// Whether a particular feature is enabled for the current channel.
///
/// Prefer using one of the specific getters above instead of this API.
@@ -99,6 +102,7 @@ abstract class FeatureFlags {
windowingFeature,
lldbDebugging,
uiSceneMigration,
+ riscv64,
];
/// All current Flutter feature flags that can be configured.
@@ -268,6 +272,16 @@ const uiSceneMigration = Feature(
stable: FeatureChannelSetting(available: true),
);
+/// The [Feature] for building code targetting riscv64 architecture
+const riscv64 = Feature(
+ name: 'support for riscv64 architecture',
+ configSetting: 'enable-riscv64',
+ environmentOverride: 'FLUTTER_RISCV64',
+ master: FeatureChannelSetting(available: true, enabledByDefault: true),
+ beta: FeatureChannelSetting(available: true),
+ stable: FeatureChannelSetting(available: true),
+);
+
/// A [Feature] is a process for conditionally enabling tool features.
///
/// All settings are optional, and if not provided will generally default to
diff --git a/packages/flutter_tools/lib/src/flutter_application_package.dart b/packages/flutter_tools/lib/src/flutter_application_package.dart
index 75eaeea481e..c61de499a28 100644
--- a/packages/flutter_tools/lib/src/flutter_application_package.dart
+++ b/packages/flutter_tools/lib/src/flutter_application_package.dart
@@ -91,6 +91,7 @@ class FlutterApplicationPackageFactory extends ApplicationPackageFactory {
return WebApplicationPackage(FlutterProject.current());
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
return applicationBinary == null
? LinuxApp.fromLinuxProject(FlutterProject.current().linux)
: LinuxApp.fromPrebuiltApp(applicationBinary);
diff --git a/packages/flutter_tools/lib/src/flutter_cache.dart b/packages/flutter_tools/lib/src/flutter_cache.dart
index 31f5fbc825a..46b8eb48b23 100644
--- a/packages/flutter_tools/lib/src/flutter_cache.dart
+++ b/packages/flutter_tools/lib/src/flutter_cache.dart
@@ -683,6 +683,7 @@ class FlutterRunnerDebugSymbols extends CachedArtifact {
}
await _downloadDebugSymbols('x64', artifactUpdater);
await _downloadDebugSymbols('arm64', artifactUpdater);
+ await _downloadDebugSymbols('riscv64', artifactUpdater);
}
}
diff --git a/packages/flutter_tools/lib/src/flutter_features.dart b/packages/flutter_tools/lib/src/flutter_features.dart
index c1102780346..ee7fb68b6ab 100644
--- a/packages/flutter_tools/lib/src/flutter_features.dart
+++ b/packages/flutter_tools/lib/src/flutter_features.dart
@@ -66,6 +66,9 @@ mixin FlutterFeatureFlagsIsEnabled implements FeatureFlags {
@override
bool get isUISceneMigrationEnabled => isEnabled(uiSceneMigration);
+
+ @override
+ bool get isRiscv64SupportEnabled => isEnabled(riscv64);
}
interface class FlutterFeatureFlags extends FeatureFlags with FlutterFeatureFlagsIsEnabled {
diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart
index 1ed907c050a..86d0010f495 100644
--- a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart
+++ b/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart
@@ -666,6 +666,7 @@ OS getNativeOSFromTargetPlatform(TargetPlatform platform) {
return OS.macOS;
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
return OS.linux;
case TargetPlatform.windows_x64:
case TargetPlatform.windows_arm64:
diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/targets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/targets.dart
index cc0de9f2452..d036e29a352 100644
--- a/packages/flutter_tools/lib/src/isolated/native_assets/targets.dart
+++ b/packages/flutter_tools/lib/src/isolated/native_assets/targets.dart
@@ -69,6 +69,8 @@ sealed class AssetBuildTarget {
return _linuxTarget(supportedAssetTypes, Architecture.x64);
case TargetPlatform.linux_arm64:
return _linuxTarget(supportedAssetTypes, Architecture.arm64);
+ case TargetPlatform.linux_riscv64:
+ return _linuxTarget(supportedAssetTypes, Architecture.riscv64);
case TargetPlatform.windows_arm64:
return _windowsTarget(supportedAssetTypes, Architecture.arm64);
case TargetPlatform.darwin:
@@ -402,6 +404,7 @@ List<AndroidArch> _androidArchs(TargetPlatform targetPlatform, String? androidAr
case TargetPlatform.fuchsia_x64:
case TargetPlatform.ios:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart
index 6525bb9e61d..aa86e904948 100644
--- a/packages/flutter_tools/lib/src/linux/build_linux.dart
+++ b/packages/flutter_tools/lib/src/linux/build_linux.dart
@@ -163,6 +163,8 @@ Future<void> _runCmake(
final String buildFlag = sentenceCase(buildModeName);
final bool needCrossBuildOptionsForArm64 =
needCrossBuild && targetPlatform == TargetPlatform.linux_arm64;
+ final bool needCrossBuildOptionsForRiscv64 =
+ needCrossBuild && targetPlatform == TargetPlatform.linux_riscv64;
int result;
if (!globals.processManager.canRun('cmake')) {
throwToolExit(globals.userMessages.cmakeMissing);
@@ -179,6 +181,9 @@ Future<void> _runCmake(
if (needCrossBuild) '-DFLUTTER_TARGET_PLATFORM_SYSROOT=$targetSysroot',
if (needCrossBuildOptionsForArm64) '-DCMAKE_C_COMPILER_TARGET=aarch64-linux-gnu',
if (needCrossBuildOptionsForArm64) '-DCMAKE_CXX_COMPILER_TARGET=aarch64-linux-gnu',
+ // Support cross-building for riscv64 targets on x64 hosts.
+ if (needCrossBuildOptionsForRiscv64) '-DCMAKE_C_COMPILER_TARGET=riscv64-linux-gnu',
+ if (needCrossBuildOptionsForRiscv64) '-DCMAKE_CXX_COMPILER_TARGET=riscv64-linux-gnu',
sourceDir.path,
],
workingDirectory: buildDir.path,
diff --git a/packages/flutter_tools/lib/src/linux/linux_device.dart b/packages/flutter_tools/lib/src/linux/linux_device.dart
index a42d783ed09..b352cee0203 100644
--- a/packages/flutter_tools/lib/src/linux/linux_device.dart
+++ b/packages/flutter_tools/lib/src/linux/linux_device.dart
@@ -49,6 +49,8 @@ class LinuxDevice extends DesktopDevice {
late final Future<TargetPlatform> targetPlatform = () async {
if (_operatingSystemUtils.hostPlatform == HostPlatform.linux_x64) {
return TargetPlatform.linux_x64;
+ } else if (_operatingSystemUtils.hostPlatform == HostPlatform.linux_riscv64) {
+ return TargetPlatform.linux_riscv64;
}
return TargetPlatform.linux_arm64;
}();
diff --git a/packages/flutter_tools/lib/src/mdns_discovery.dart b/packages/flutter_tools/lib/src/mdns_discovery.dart
index b21795ddb3e..0840c95b637 100644
--- a/packages/flutter_tools/lib/src/mdns_discovery.dart
+++ b/packages/flutter_tools/lib/src/mdns_discovery.dart
@@ -599,6 +599,7 @@ class MDnsVmServiceDiscovery {
case TargetPlatform.fuchsia_arm64:
case TargetPlatform.fuchsia_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 7fb86c0cc9a..10f58eedda8 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -1611,6 +1611,7 @@ Future<String?> getMissingPackageHintForPlatform(TargetPlatform platform) async
case TargetPlatform.fuchsia_arm64:
case TargetPlatform.fuchsia_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
case TargetPlatform.linux_x64:
case TargetPlatform.tester:
case TargetPlatform.web_javascript:
diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart
index 1c5811835d4..075d565eb58 100644
--- a/packages/flutter_tools/lib/src/runner/flutter_command.dart
+++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart
@@ -2090,6 +2090,7 @@ DevelopmentArtifact? artifactFromTargetPlatform(TargetPlatform targetPlatform) {
return null;
case TargetPlatform.linux_x64:
case TargetPlatform.linux_arm64:
+ case TargetPlatform.linux_riscv64:
if (featureFlags.isLinuxEnabled) {
return DevelopmentArtifact.linux;
}
diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart
index b625816f366..11a7003a35c 100644
--- a/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart
+++ b/packages/flutter_tools/test/general.shard/build_system/targets/dart_plugin_registrant_test.dart
@@ -90,6 +90,7 @@ void main() {
'darwin-x64': false,
'linux-x64': false,
'linux-arm64': false,
+ 'linux-riscv64': false,
'windows-x64': false,
'web-javascript': true,
'ios': false,
diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart
index f4743bb66a3..8b78ff91ddf 100644
--- a/packages/flutter_tools/test/general.shard/cache_test.dart
+++ b/packages/flutter_tools/test/general.shard/cache_test.dart
@@ -574,6 +574,7 @@ void main() {
expect(packageResolver.resolved, <List<String>>[
<String>['fuchsia-debug-symbols-x64', '123456'],
<String>['fuchsia-debug-symbols-arm64', '123456'],
+ <String>['fuchsia-debug-symbols-riscv64', '123456'],
]);
});
diff --git a/packages/flutter_tools/test/general.shard/flutter_validator_test.dart b/packages/flutter_tools/test/general.shard/flutter_validator_test.dart
index 050bd3d6c6d..f0a864f0424 100644
--- a/packages/flutter_tools/test/general.shard/flutter_validator_test.dart
+++ b/packages/flutter_tools/test/general.shard/flutter_validator_test.dart
@@ -824,6 +824,9 @@ class FakeFlutterFeatures extends FeatureFlags {
@override
bool get isUISceneMigrationEnabled => _enabled;
+ @override
+ bool get isRiscv64SupportEnabled => _enabled;
+
@override
final List<Feature> allFeatures;
diff --git a/packages/flutter_tools/test/src/fakes.dart b/packages/flutter_tools/test/src/fakes.dart
index fe3e8730e1e..7df0fa1fe53 100644
--- a/packages/flutter_tools/test/src/fakes.dart
+++ b/packages/flutter_tools/test/src/fakes.dart
@@ -532,6 +532,7 @@ class TestFeatureFlags implements FeatureFlags {
this.isWindowingEnabled = false,
this.isLLDBDebuggingEnabled = false,
this.isUISceneMigrationEnabled = false,
+ this.isRiscv64SupportEnabled = false,
});
@override
@@ -582,6 +583,9 @@ class TestFeatureFlags implements FeatureFlags {
@override
final bool isUISceneMigrationEnabled;
+ @override
+ final bool isRiscv64SupportEnabled;
+
@override
bool isEnabled(Feature feature) {
return switch (feature) {
@@ -600,6 +604,7 @@ class TestFeatureFlags implements FeatureFlags {
windowingFeature => isWindowingEnabled,
lldbDebugging => isLLDBDebuggingEnabled,
uiSceneMigration => isUISceneMigrationEnabled,
+ riscv64 => isRiscv64SupportEnabled,
_ => false,
};
}
@@ -622,6 +627,7 @@ class TestFeatureFlags implements FeatureFlags {
windowingFeature,
lldbDebugging,
uiSceneMigration,
+ riscv64,
];
@override