From 5f5d4802fe7743ad0d26d2b8fe1fdd0de9dad8ca Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 30 Aug 2022 10:44:14 -0700 Subject: [PATCH] Support single arch local engines for 'build macos-framework' and 'ios-framework' (#110564) --- packages/flutter_tools/lib/src/artifacts.dart | 9 +++++ .../flutter_tools/lib/src/build_info.dart | 31 +++++++++++++- .../lib/src/commands/build_ios_framework.dart | 2 +- .../src/commands/build_macos_framework.dart | 7 ++-- .../lib/src/ios/xcode_build_settings.dart | 2 +- .../lib/src/linux/build_linux.dart | 2 +- .../lib/src/windows/build_windows.dart | 2 +- .../test/general.shard/build_info_test.dart | 40 +++++++++++++++++++ 8 files changed, 85 insertions(+), 10 deletions(-) diff --git a/packages/flutter_tools/lib/src/artifacts.dart b/packages/flutter_tools/lib/src/artifacts.dart index c539d67156f..a8aadef1a9f 100644 --- a/packages/flutter_tools/lib/src/artifacts.dart +++ b/packages/flutter_tools/lib/src/artifacts.dart @@ -732,6 +732,8 @@ abstract class LocalEngineArtifacts implements Artifacts { }) = CachedLocalEngineArtifacts; String get engineOutPath; + + String get localEngineName; } /// Manages the artifacts of a locally built engine. @@ -745,6 +747,7 @@ class CachedLocalEngineArtifacts implements LocalEngineArtifacts { required Platform platform, required OperatingSystemUtils operatingSystemUtils, }) : _fileSystem = fileSystem, + localEngineName = fileSystem.path.basename(engineOutPath), _cache = cache, _processManager = processManager, _platform = platform, @@ -753,6 +756,9 @@ class CachedLocalEngineArtifacts implements LocalEngineArtifacts { @override final String engineOutPath; + @override + final String localEngineName; + final String _hostEngineOutPath; final FileSystem _fileSystem; final Cache _cache; @@ -1063,4 +1069,7 @@ class _TestLocalEngine extends _TestArtifacts implements LocalEngineArtifacts { @override final String engineOutPath; + + @override + String get localEngineName => fileSystem.path.basename(engineOutPath); } diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index 1a18be5613d..6f7a2ab6a22 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -4,6 +4,7 @@ import 'package:package_config/package_config_types.dart'; +import 'artifacts.dart'; import 'base/config.dart'; import 'base/context.dart'; import 'base/file_system.dart'; @@ -562,8 +563,19 @@ enum AndroidArch { /// The default set of iOS device architectures to build for. List defaultIOSArchsForEnvironment( - EnvironmentType environmentType) { - if (environmentType == EnvironmentType.simulator) { + EnvironmentType environmentType, + Artifacts artifacts, +) { + // Handle single-arch local engines. + if (artifacts is LocalEngineArtifacts) { + final String localEngineName = artifacts.localEngineName; + if (localEngineName.contains('_arm64')) { + return [ DarwinArch.arm64 ]; + } + if (localEngineName.contains('_sim')) { + return [ DarwinArch.x86_64 ]; + } + } else if (environmentType == EnvironmentType.simulator) { return [ DarwinArch.x86_64, DarwinArch.arm64, @@ -574,6 +586,21 @@ List defaultIOSArchsForEnvironment( ]; } +/// The default set of macOS device architectures to build for. +List defaultMacOSArchsForEnvironment(Artifacts artifacts) { + // Handle single-arch local engines. + if (artifacts is LocalEngineArtifacts) { + if (artifacts.localEngineName.contains('_arm64')) { + return [ DarwinArch.arm64 ]; + } + return [ DarwinArch.x86_64 ]; + } + return [ + DarwinArch.x86_64, + DarwinArch.arm64, + ]; +} + // Returns the Dart SDK's name for the specified target architecture. // // When building for Darwin platforms, the tool invokes architecture-specific diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index 9ec39afaf8d..75b11e80b33 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -422,7 +422,7 @@ end kTargetFile: targetFile, kTargetPlatform: getNameForTargetPlatform(TargetPlatform.ios), kBitcodeFlag: 'true', - kIosArchs: defaultIOSArchsForEnvironment(sdkType) + kIosArchs: defaultIOSArchsForEnvironment(sdkType, globals.artifacts!) .map(getNameForDarwinArch) .join(' '), kSdkRoot: await globals.xcode!.sdkLocation(sdkType), diff --git a/packages/flutter_tools/lib/src/commands/build_macos_framework.dart b/packages/flutter_tools/lib/src/commands/build_macos_framework.dart index 60d32b85da8..e6e65f4b318 100644 --- a/packages/flutter_tools/lib/src/commands/build_macos_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_macos_framework.dart @@ -193,10 +193,9 @@ end defines: { kTargetFile: targetFile, kTargetPlatform: getNameForTargetPlatform(TargetPlatform.darwin), - kDarwinArchs: [ - DarwinArch.x86_64, - DarwinArch.arm64, - ].map(getNameForDarwinArch).join(' '), + kDarwinArchs: defaultMacOSArchsForEnvironment(globals.artifacts!) + .map(getNameForDarwinArch) + .join(' '), ...buildInfo.toBuildSystemEnvironment(), }, artifacts: globals.artifacts!, diff --git a/packages/flutter_tools/lib/src/ios/xcode_build_settings.dart b/packages/flutter_tools/lib/src/ios/xcode_build_settings.dart index 3b703dd4393..d76cd7e57dc 100644 --- a/packages/flutter_tools/lib/src/ios/xcode_build_settings.dart +++ b/packages/flutter_tools/lib/src/ios/xcode_build_settings.dart @@ -176,7 +176,7 @@ Future> _xcodeBuildSettingsLines({ final String engineOutPath = localEngineArtifacts.engineOutPath; xcodeBuildSettings.add('FLUTTER_ENGINE=${globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath))}'); - final String localEngineName = globals.fs.path.basename(engineOutPath); + final String localEngineName = localEngineArtifacts.localEngineName; xcodeBuildSettings.add('LOCAL_ENGINE=$localEngineName'); // Tell Xcode not to build universal binaries for local engines, which are diff --git a/packages/flutter_tools/lib/src/linux/build_linux.dart b/packages/flutter_tools/lib/src/linux/build_linux.dart index 062fea30037..12fc35b5313 100644 --- a/packages/flutter_tools/lib/src/linux/build_linux.dart +++ b/packages/flutter_tools/lib/src/linux/build_linux.dart @@ -60,7 +60,7 @@ Future buildLinux( final LocalEngineArtifacts localEngineArtifacts = artifacts; final String engineOutPath = localEngineArtifacts.engineOutPath; environmentConfig['FLUTTER_ENGINE'] = globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath)); - environmentConfig['LOCAL_ENGINE'] = globals.fs.path.basename(engineOutPath); + environmentConfig['LOCAL_ENGINE'] = localEngineArtifacts.localEngineName; } writeGeneratedCmakeConfig(Cache.flutterRoot!, linuxProject, buildInfo, environmentConfig); diff --git a/packages/flutter_tools/lib/src/windows/build_windows.dart b/packages/flutter_tools/lib/src/windows/build_windows.dart index e46924edd0d..6c2b985aee1 100644 --- a/packages/flutter_tools/lib/src/windows/build_windows.dart +++ b/packages/flutter_tools/lib/src/windows/build_windows.dart @@ -221,7 +221,7 @@ void _writeGeneratedFlutterConfig( if (artifacts is LocalEngineArtifacts) { final String engineOutPath = artifacts.engineOutPath; environment['FLUTTER_ENGINE'] = globals.fs.path.dirname(globals.fs.path.dirname(engineOutPath)); - environment['LOCAL_ENGINE'] = globals.fs.path.basename(engineOutPath); + environment['LOCAL_ENGINE'] = artifacts.localEngineName; } writeGeneratedCmakeConfig(Cache.flutterRoot!, windowsProject, buildInfo, environment); } diff --git a/packages/flutter_tools/test/general.shard/build_info_test.dart b/packages/flutter_tools/test/general.shard/build_info_test.dart index 53a4e2578b5..e628b7b0022 100644 --- a/packages/flutter_tools/test/general.shard/build_info_test.dart +++ b/packages/flutter_tools/test/general.shard/build_info_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; @@ -99,6 +100,45 @@ void main() { expect(getNameForTargetPlatform(TargetPlatform.android), isNot(contains('ios'))); }); + testWithoutContext('defaultIOSArchsForEnvironment', () { + expect(defaultIOSArchsForEnvironment( + EnvironmentType.physical, + Artifacts.test(localEngine: 'ios_debug_unopt'), + ).single, DarwinArch.arm64); + + expect(defaultIOSArchsForEnvironment( + EnvironmentType.simulator, + Artifacts.test(localEngine: 'ios_debug_sim_unopt'), + ).single, DarwinArch.x86_64); + + expect(defaultIOSArchsForEnvironment( + EnvironmentType.simulator, + Artifacts.test(localEngine: 'ios_debug_sim_unopt_arm64'), + ).single, DarwinArch.arm64); + + expect(defaultIOSArchsForEnvironment( + EnvironmentType.physical, Artifacts.test(), + ).single, DarwinArch.arm64); + + expect(defaultIOSArchsForEnvironment( + EnvironmentType.simulator, Artifacts.test(), + ), [ DarwinArch.x86_64, DarwinArch.arm64 ]); + }); + + testWithoutContext('defaultMacOSArchsForEnvironment', () { + expect(defaultMacOSArchsForEnvironment( + Artifacts.test(localEngine: 'host_debug_unopt'), + ).single, DarwinArch.x86_64); + + expect(defaultMacOSArchsForEnvironment( + Artifacts.test(localEngine: 'host_debug_unopt_arm64'), + ).single, DarwinArch.arm64); + + expect(defaultMacOSArchsForEnvironment( + Artifacts.test(), + ), [ DarwinArch.x86_64, DarwinArch.arm64 ]); + }); + testWithoutContext('getIOSArchForName on Darwin arches', () { expect(getIOSArchForName('armv7'), DarwinArch.armv7); expect(getIOSArchForName('arm64'), DarwinArch.arm64);