[native assets] Roll dependencies (#160672)

This PR rolls in a number of breaking changes from dart-lang/native:

* `BuildMode` is no longer part of the protocol, so Flutter no longer
passes it in.
* This means all code dealing with the name conflict between
`native_assets_cli.BuildMode` and `flutter_tools.BuildMode` has been
cleaned up.
  * Also, the logs no longer mention the build mode.
* The tests still exercise both modes, because linking only happens in
release mode.
* `OS` is no longer part of the main protocol, but of the "code"
"protocol extension".
* The code now aligns more with `OS?` being nullable in a bunch of
places, since it is nullable if there's no code assets.
* The OS-specific config is nested in an object per OS.
* `CCompilerConfig`s fields are non-nullable now.
* So instead of passing an object with nullable fields around, a null
instead of the object is returned in various places.
* `FileSystem` is now passed in to the native assets builder.

This PR contains no feature changes.

This PR will need to be followed up by restricting what environment
variables are passed in (similar to
https://github.com/dart-lang/native/pull/1764), I will do this in a
follow up PR.

Tests:

* All existing features should be covered by existing tests.
This commit is contained in:
Daco Harkes 2025-01-02 20:26:02 +01:00 committed by GitHub
parent d9b7e56646
commit 27ba2f2790
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 267 additions and 286 deletions

View File

@ -9,7 +9,7 @@ import 'package:native_toolchain_c/native_toolchain_c.dart';
void main(List<String> args) async { void main(List<String> args) async {
await build(args, (BuildConfig config, BuildOutputBuilder output) async { await build(args, (BuildConfig config, BuildOutputBuilder output) async {
if (!config.supportedAssetTypes.contains(CodeAsset.type)) { if (!config.buildAssetTypes.contains(CodeAsset.type)) {
return; return;
} }

View File

@ -6,7 +6,7 @@ import 'package:native_assets_cli/code_assets.dart';
void main(List<String> args) async { void main(List<String> args) async {
await link(args, (LinkConfig config, LinkOutputBuilder output) async { await link(args, (LinkConfig config, LinkOutputBuilder output) async {
if (!config.supportedAssetTypes.contains(CodeAsset.type)) { if (!config.buildAssetTypes.contains(CodeAsset.type)) {
return; return;
} }
final CodeAsset asset = config.codeAssets.single; final CodeAsset asset = config.codeAssets.single;

View File

@ -1,5 +1,5 @@
name: link_hook name: link_hook
description: "A new Dart FFI package project." description: 'A new Dart FFI package project.'
version: 0.0.1 version: 0.0.1
environment: environment:
@ -7,53 +7,21 @@ environment:
dependencies: dependencies:
logging: 1.3.0 logging: 1.3.0
native_assets_cli: 0.9.0 native_assets_cli: 0.10.0
native_toolchain_c: 0.6.0 native_toolchain_c: 0.7.0
_fe_analyzer_shared: 76.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
analyzer: 6.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 2.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
async: 2.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" async: 2.12.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
collection: 1.19.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" collection: 1.19.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
convert: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
coverage: 1.11.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
crypto: 3.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" crypto: 3.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
file: 7.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" file: 7.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
frontend_server_client: 4.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
glob: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_multi_server: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_parser: 4.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.7.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
meta: 1.15.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" meta: 1.15.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 1.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
node_preamble: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
package_config: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
path: 1.9.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.9.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pub_semver: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pub_semver: 2.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 3.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 1.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_web_socket: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
source_map_stack_trace: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
source_maps: 0.10.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
source_span: 1.10.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" source_span: 1.10.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
stack_trace: 1.12.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
stream_channel: 2.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
string_scanner: 1.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" string_scanner: 1.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
term_glyph: 1.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" term_glyph: 1.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test_api: 0.7.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test_core: 0.6.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
typed_data: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" typed_data: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
vm_service: 14.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
watcher: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web_socket: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web_socket_channel: 3.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dev_dependencies: dev_dependencies:
@ -62,10 +30,42 @@ dev_dependencies:
flutter_lints: 5.0.0 flutter_lints: 5.0.0
test: 1.25.14 test: 1.25.14
_fe_analyzer_shared: 76.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
analyzer: 6.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
args: 2.6.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
boolean_selector: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
cli_util: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" cli_util: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
convert: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
coverage: 1.11.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dart_style: 2.3.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" dart_style: 2.3.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
lints: 5.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" frontend_server_client: 4.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_multi_server: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_parser: 4.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.7.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
lints: 5.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
mime: 1.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
node_preamble: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
package_config: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
pool: 1.5.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
quiver: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" quiver: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 3.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_static: 1.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_web_socket: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
source_map_stack_trace: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
source_maps: 0.10.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
stack_trace: 1.12.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
stream_channel: 2.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test_api: 0.7.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test_core: 0.6.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
vm_service: 14.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
watcher: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web_socket: 0.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
web_socket_channel: 3.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml_edit: 2.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml_edit: 2.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
# PUBSPEC CHECKSUM: 3044 # PUBSPEC CHECKSUM: 016c

View File

@ -9,7 +9,7 @@ import '../../../android/android_sdk.dart';
import '../../../android/gradle_utils.dart'; import '../../../android/gradle_utils.dart';
import '../../../base/common.dart'; import '../../../base/common.dart';
import '../../../base/file_system.dart'; import '../../../base/file_system.dart';
import '../../../build_info.dart' hide BuildMode; import '../../../build_info.dart';
int targetAndroidNdkApi(Map<String, String> environmentDefines) { int targetAndroidNdkApi(Map<String, String> environmentDefines) {
return int.parse(environmentDefines[kMinSdkVersion] ?? minSdkVersion); return int.parse(environmentDefines[kMinSdkVersion] ?? minSdkVersion);
@ -105,14 +105,17 @@ Future<CCompilerConfig> cCompilerConfigAndroid() async {
if (androidSdk == null) { if (androidSdk == null) {
throwToolExit('Android SDK could not be found.'); throwToolExit('Android SDK could not be found.');
} }
final CCompilerConfig result = CCompilerConfig( final Uri? compiler = _toOptionalFileUri(androidSdk.getNdkClangPath());
compiler: _toOptionalFileUri(androidSdk.getNdkClangPath()), final Uri? archiver = _toOptionalFileUri(androidSdk.getNdkArPath());
archiver: _toOptionalFileUri(androidSdk.getNdkArPath()), final Uri? linker = _toOptionalFileUri(androidSdk.getNdkLdPath());
linker: _toOptionalFileUri(androidSdk.getNdkLdPath()), if (compiler == null || archiver == null || linker == null) {
);
if (result.compiler == null || result.archiver == null || result.linker == null) {
throwToolExit('Android NDK Clang could not be found.'); throwToolExit('Android NDK Clang could not be found.');
} }
final CCompilerConfig result = CCompilerConfig(
compiler: compiler,
archiver: archiver,
linker: linker,
);
return result; return result;
} }

View File

@ -6,8 +6,7 @@ import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/file_system.dart'; import '../../../base/file_system.dart';
import '../../../build_info.dart' hide BuildMode; import '../../../build_info.dart';
import '../../../build_info.dart' as build_info;
import '../macos/native_assets_host.dart'; import '../macos/native_assets_host.dart';
// TODO(dcharkes): Fetch minimum iOS version from somewhere. https://github.com/flutter/flutter/issues/145104 // TODO(dcharkes): Fetch minimum iOS version from somewhere. https://github.com/flutter/flutter/issues/145104
@ -100,7 +99,7 @@ Future<void> copyNativeCodeAssetsIOS(
Uri buildUri, Uri buildUri,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations, Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity, String? codesignIdentity,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystem fileSystem, FileSystem fileSystem,
) async { ) async {
assert(assetTargetLocations.isNotEmpty); assert(assetTargetLocations.isNotEmpty);

View File

@ -37,9 +37,11 @@ Future<CCompilerConfig> cCompilerConfigLinux() async {
} }
binaryPaths[binary] = binaryFile.uri; binaryPaths[binary] = binaryFile.uri;
} }
return CCompilerConfig( final Uri? archiver = binaryPaths[kArBinary];
archiver: binaryPaths[kArBinary], final Uri? compiler = binaryPaths[kClangBinary];
compiler: binaryPaths[kClangBinary], final Uri? linker = binaryPaths[kLdBinary];
linker: binaryPaths[kLdBinary], if (archiver == null || compiler == null || linker == null) {
); throwToolExit('Clang could not be found.');
}
return CCompilerConfig(archiver: archiver, compiler: compiler, linker: linker);
} }

View File

@ -6,8 +6,7 @@ import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/code_assets_builder.dart'; import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/file_system.dart'; import '../../../base/file_system.dart';
import '../../../build_info.dart' hide BuildMode; import '../../../build_info.dart';
import '../../../build_info.dart' as build_info;
import 'native_assets_host.dart'; import 'native_assets_host.dart';
// TODO(dcharkes): Fetch minimum MacOS version from somewhere. https://github.com/flutter/flutter/issues/145104 // TODO(dcharkes): Fetch minimum MacOS version from somewhere. https://github.com/flutter/flutter/issues/145104
@ -116,7 +115,7 @@ Future<void> copyNativeCodeAssetsMacOS(
Uri buildUri, Uri buildUri,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations, Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity, String? codesignIdentity,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystem fileSystem, FileSystem fileSystem,
) async { ) async {
assert(assetTargetLocations.isNotEmpty); assert(assetTargetLocations.isNotEmpty);
@ -204,7 +203,7 @@ Future<void> copyNativeCodeAssetsMacOSFlutterTester(
Uri buildUri, Uri buildUri,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations, Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity, String? codesignIdentity,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystem fileSystem, FileSystem fileSystem,
) async { ) async {
assert(assetTargetLocations.isNotEmpty); assert(assetTargetLocations.isNotEmpty);

View File

@ -9,7 +9,7 @@ import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/common.dart'; import '../../../base/common.dart';
import '../../../base/file_system.dart'; import '../../../base/file_system.dart';
import '../../../base/io.dart'; import '../../../base/io.dart';
import '../../../build_info.dart' as build_info; import '../../../build_info.dart';
import '../../../convert.dart'; import '../../../convert.dart';
import '../../../globals.dart' as globals; import '../../../globals.dart' as globals;
@ -136,7 +136,7 @@ Future<Set<String>> getInstallNamesDylib(File dylibFile) async {
Future<void> codesignDylib( Future<void> codesignDylib(
String? codesignIdentity, String? codesignIdentity,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystemEntity target, FileSystemEntity target,
) async { ) async {
if (codesignIdentity == null || codesignIdentity.isEmpty) { if (codesignIdentity == null || codesignIdentity.isEmpty) {
@ -147,7 +147,7 @@ Future<void> codesignDylib(
'--force', '--force',
'--sign', '--sign',
codesignIdentity, codesignIdentity,
if (buildMode != build_info.BuildMode.release) ...<String>[ if (buildMode != BuildMode.release) ...<String>[
// Mimic Xcode's timestamp codesigning behavior on non-release binaries. // Mimic Xcode's timestamp codesigning behavior on non-release binaries.
'--timestamp=none', '--timestamp=none',
], ],

View File

@ -14,7 +14,7 @@ import '../../base/common.dart';
import '../../base/file_system.dart'; import '../../base/file_system.dart';
import '../../base/logger.dart'; import '../../base/logger.dart';
import '../../base/platform.dart'; import '../../base/platform.dart';
import '../../build_info.dart' as build_info; import '../../build_info.dart';
import '../../build_system/exceptions.dart'; import '../../build_system/exceptions.dart';
import '../../cache.dart'; import '../../cache.dart';
import '../../convert.dart'; import '../../convert.dart';
@ -69,7 +69,7 @@ final class DartBuildResult {
Future<DartBuildResult> runFlutterSpecificDartBuild({ Future<DartBuildResult> runFlutterSpecificDartBuild({
required Map<String, String> environmentDefines, required Map<String, String> environmentDefines,
required FlutterNativeAssetsBuildRunner buildRunner, required FlutterNativeAssetsBuildRunner buildRunner,
required build_info.TargetPlatform targetPlatform, required TargetPlatform targetPlatform,
required Uri projectUri, required Uri projectUri,
required FileSystem fileSystem, required FileSystem fileSystem,
}) async { }) async {
@ -77,7 +77,7 @@ Future<DartBuildResult> runFlutterSpecificDartBuild({
final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS); final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS);
final Directory buildDir = fileSystem.directory(buildUri); final Directory buildDir = fileSystem.directory(buildUri);
final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; final bool flutterTester = targetPlatform == TargetPlatform.tester;
if (!await buildDir.exists()) { if (!await buildDir.exists()) {
// Ensure the folder exists so the native build system can copy it even // Ensure the folder exists so the native build system can copy it even
@ -89,7 +89,7 @@ Future<DartBuildResult> runFlutterSpecificDartBuild({
return const DartBuildResult.empty(); return const DartBuildResult.empty();
} }
final build_info.BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester); final BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester);
final List<Architecture> architectures = final List<Architecture> architectures =
flutterTester flutterTester
? <Architecture>[Architecture.current] ? <Architecture>[Architecture.current]
@ -102,7 +102,7 @@ Future<DartBuildResult> runFlutterSpecificDartBuild({
buildRunner: buildRunner, buildRunner: buildRunner,
architectures: architectures, architectures: architectures,
projectUri: projectUri, projectUri: projectUri,
buildMode: _nativeAssetsBuildMode(buildMode), linkingEnabled: _nativeAssetsLinkingEnabled(buildMode),
fileSystem: fileSystem, fileSystem: fileSystem,
targetOS: targetOS, targetOS: targetOS,
); );
@ -112,17 +112,17 @@ Future<DartBuildResult> runFlutterSpecificDartBuild({
Future<void> installCodeAssets({ Future<void> installCodeAssets({
required DartBuildResult dartBuildResult, required DartBuildResult dartBuildResult,
required Map<String, String> environmentDefines, required Map<String, String> environmentDefines,
required build_info.TargetPlatform targetPlatform, required TargetPlatform targetPlatform,
required Uri projectUri, required Uri projectUri,
required FileSystem fileSystem, required FileSystem fileSystem,
required Uri nativeAssetsFileUri, required Uri nativeAssetsFileUri,
}) async { }) async {
final OS targetOS = getNativeOSFromTargetPlatform(targetPlatform); final OS targetOS = getNativeOSFromTargetPlatform(targetPlatform);
final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS); final Uri buildUri = nativeAssetsBuildUri(projectUri, targetOS);
final bool flutterTester = targetPlatform == build_info.TargetPlatform.tester; final bool flutterTester = targetPlatform == TargetPlatform.tester;
final build_info.BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester); final BuildMode buildMode = _getBuildMode(environmentDefines, flutterTester);
final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity]; final String? codesignIdentity = environmentDefines[kCodesignIdentity];
final Map<CodeAsset, KernelAsset> assetTargetLocations = assetTargetLocationsForOS( final Map<CodeAsset, KernelAsset> assetTargetLocations = assetTargetLocationsForOS(
targetOS, targetOS,
dartBuildResult.codeAssets, dartBuildResult.codeAssets,
@ -161,37 +161,33 @@ abstract interface class FlutterNativeAssetsBuildRunner {
/// Runs all [packagesWithNativeAssets] `build.dart`. /// Runs all [packagesWithNativeAssets] `build.dart`.
Future<BuildResult?> build({ Future<BuildResult?> build({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required BuildConfigValidator configValidator, required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator, required BuildConfigCreator configCreator,
required BuildValidator buildValidator, required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required bool linkingEnabled, required bool linkingEnabled,
}); });
/// Runs all [packagesWithNativeAssets] `link.dart`. /// Runs all [packagesWithNativeAssets] `link.dart`.
Future<LinkResult?> link({ Future<LinkResult?> link({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required LinkConfigValidator configValidator, required LinkConfigValidator configValidator,
required LinkConfigCreator configCreator, required LinkConfigCreator configCreator,
required LinkValidator linkValidator, required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required BuildResult buildResult, required BuildResult buildResult,
}); });
/// The C compiler config to use for compilation. /// The C compiler config to use for compilation.
Future<CCompilerConfig> get cCompilerConfig; Future<CCompilerConfig?> get cCompilerConfig;
/// The NDK compiler to use to use for compilation for Android. /// The NDK compiler to use to use for compilation for Android.
Future<CCompilerConfig> get ndkCCompilerConfig; Future<CCompilerConfig?> get ndkCCompilerConfig;
} }
/// Uses `package:native_assets_builder` for its implementation. /// Uses `package:native_assets_builder` for its implementation.
@ -230,6 +226,10 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
late final NativeAssetsBuildRunner _buildRunner = NativeAssetsBuildRunner( late final NativeAssetsBuildRunner _buildRunner = NativeAssetsBuildRunner(
logger: _logger, logger: _logger,
dartExecutable: _dartExecutable, dartExecutable: _dartExecutable,
fileSystem: fileSystem,
// TODO(dcharkes): Filter the environment with
// NativeAssetsBuildRunner.hookEnvironmentVariablesFilter.
hookEnvironment: const LocalPlatform().environment,
); );
@override @override
@ -240,6 +240,7 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
@override @override
Future<List<Package>> packagesWithNativeAssets() async { Future<List<Package>> packagesWithNativeAssets() async {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig( final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
fileSystem,
packageConfig, packageConfig,
Uri.file(packageConfigPath), Uri.file(packageConfigPath),
); );
@ -249,33 +250,28 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
return packageLayout.packagesWithAssets(Hook.build); return packageLayout.packagesWithAssets(Hook.build);
} }
@override
@override @override
Future<BuildResult?> build({ Future<BuildResult?> build({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required BuildConfigValidator configValidator, required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator, required BuildConfigCreator configCreator,
required BuildValidator buildValidator, required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required bool linkingEnabled, required bool linkingEnabled,
}) { }) {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig( final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
fileSystem,
packageConfig, packageConfig,
Uri.file(packageConfigPath), Uri.file(packageConfigPath),
); );
return _buildRunner.build( return _buildRunner.build(
supportedAssetTypes: supportedAssetTypes, buildAssetTypes: buildAssetTypes,
configCreator: configCreator, configCreator: configCreator,
configValidator: configValidator, configValidator: configValidator,
buildValidator: buildValidator, buildValidator: buildValidator,
applicationAssetValidator: applicationAssetValidator, applicationAssetValidator: applicationAssetValidator,
buildMode: buildMode,
includeParentEnvironment: includeParentEnvironment,
targetOS: targetOS,
workingDirectory: workingDirectory, workingDirectory: workingDirectory,
packageLayout: packageLayout, packageLayout: packageLayout,
linkingEnabled: linkingEnabled, linkingEnabled: linkingEnabled,
@ -284,30 +280,26 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
@override @override
Future<LinkResult?> link({ Future<LinkResult?> link({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required LinkConfigValidator configValidator, required LinkConfigValidator configValidator,
required LinkConfigCreator configCreator, required LinkConfigCreator configCreator,
required LinkValidator linkValidator, required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required BuildResult buildResult, required BuildResult buildResult,
}) { }) {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig( final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
fileSystem,
packageConfig, packageConfig,
Uri.file(packageConfigPath), Uri.file(packageConfigPath),
); );
return _buildRunner.link( return _buildRunner.link(
supportedAssetTypes: supportedAssetTypes, buildAssetTypes: buildAssetTypes,
configCreator: configCreator, configCreator: configCreator,
configValidator: configValidator, configValidator: configValidator,
linkValidator: linkValidator, linkValidator: linkValidator,
applicationAssetValidator: applicationAssetValidator, applicationAssetValidator: applicationAssetValidator,
buildMode: buildMode,
includeParentEnvironment: includeParentEnvironment,
targetOS: targetOS,
workingDirectory: workingDirectory, workingDirectory: workingDirectory,
packageLayout: packageLayout, packageLayout: packageLayout,
buildResult: buildResult, buildResult: buildResult,
@ -315,7 +307,7 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
} }
@override @override
late final Future<CCompilerConfig> cCompilerConfig = () { late final Future<CCompilerConfig?> cCompilerConfig = () {
if (globals.platform.isMacOS || globals.platform.isIOS) { if (globals.platform.isMacOS || globals.platform.isIOS) {
return cCompilerConfigMacOS(); return cCompilerConfigMacOS();
} }
@ -377,15 +369,18 @@ String _toNativeAssetsJsonFile(List<KernelAsset> kernelAssets) {
return jsonEncode(jsonContents); return jsonEncode(jsonContents);
} }
/// Select the native asset build mode for a given Flutter build mode. /// Whether link hooks should be run.
BuildMode _nativeAssetsBuildMode(build_info.BuildMode buildMode) { ///
/// Link hooks should only be run for AOT Dart builds, which is the non-debug
/// modes in Flutter.
bool _nativeAssetsLinkingEnabled(BuildMode buildMode) {
switch (buildMode) { switch (buildMode) {
case build_info.BuildMode.debug: case BuildMode.debug:
return BuildMode.debug; return false;
case build_info.BuildMode.jitRelease: case BuildMode.jitRelease:
case build_info.BuildMode.profile: case BuildMode.profile:
case build_info.BuildMode.release: case BuildMode.release:
return BuildMode.release; return true;
} }
} }
@ -456,7 +451,7 @@ Future<void> ensureNoNativeAssetsOrOsIsSupported(
/// This should be the same for different archs, debug/release, etc. /// This should be the same for different archs, debug/release, etc.
/// It should work for all macOS. /// It should work for all macOS.
Uri nativeAssetsBuildUri(Uri projectUri, OS os) { Uri nativeAssetsBuildUri(Uri projectUri, OS os) {
final String buildDir = build_info.getBuildDirectory(); final String buildDir = getBuildDirectory();
return projectUri.resolve('$buildDir/native_assets/$os/'); return projectUri.resolve('$buildDir/native_assets/$os/');
} }
@ -529,7 +524,7 @@ Map<CodeAsset, KernelAsset> assetTargetLocationsForOS(
Future<void> _copyNativeCodeAssetsForOS( Future<void> _copyNativeCodeAssetsForOS(
OS targetOS, OS targetOS,
Uri buildUri, Uri buildUri,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystem fileSystem, FileSystem fileSystem,
Map<CodeAsset, KernelAsset> assetTargetLocations, Map<CodeAsset, KernelAsset> assetTargetLocations,
String? codesignIdentity, String? codesignIdentity,
@ -604,59 +599,61 @@ Future<DartBuildResult> _runDartBuild({
required FlutterNativeAssetsBuildRunner buildRunner, required FlutterNativeAssetsBuildRunner buildRunner,
required List<Architecture> architectures, required List<Architecture> architectures,
required Uri projectUri, required Uri projectUri,
required BuildMode buildMode,
required FileSystem fileSystem, required FileSystem fileSystem,
required OS? targetOS, required OS? targetOS,
required bool linkingEnabled,
}) async { }) async {
final bool linkingEnabled = buildMode == BuildMode.release;
final String architectureString = final String architectureString =
architectures.length == 1 architectures.length == 1
? architectures.single.toString() ? architectures.single.toString()
: architectures.toList().toString(); : architectures.toList().toString();
globals.logger.printTrace('Building native assets for $targetOS $architectureString $buildMode.'); globals.logger.printTrace('Building native assets for $targetOS $architectureString.');
final List<EncodedAsset> assets = <EncodedAsset>[]; final List<EncodedAsset> assets = <EncodedAsset>[];
final Set<Uri> dependencies = <Uri>{}; final Set<Uri> dependencies = <Uri>{};
final build_info.EnvironmentType? environmentType; final EnvironmentType? environmentType;
if (targetOS == OS.iOS) { if (targetOS == OS.iOS) {
final String? sdkRoot = environmentDefines[build_info.kSdkRoot]; final String? sdkRoot = environmentDefines[kSdkRoot];
if (sdkRoot == null) { if (sdkRoot == null) {
throw MissingDefineException(build_info.kSdkRoot, 'native_assets'); throw MissingDefineException(kSdkRoot, 'native_assets');
} }
environmentType = xcode.environmentTypeFromSdkroot(sdkRoot, fileSystem); environmentType = xcode.environmentTypeFromSdkroot(sdkRoot, fileSystem);
} else { } else {
environmentType = null; environmentType = null;
} }
final CCompilerConfig cCompilerConfig = final CCompilerConfig? cCompilerConfig =
targetOS == OS.android targetOS == OS.android
? await buildRunner.ndkCCompilerConfig ? await buildRunner.ndkCCompilerConfig
: await buildRunner.cCompilerConfig; : await buildRunner.cCompilerConfig;
final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity]; final String? codesignIdentity = environmentDefines[kCodesignIdentity];
assert(codesignIdentity == null || targetOS == OS.iOS || targetOS == OS.macOS); assert(codesignIdentity == null || targetOS == OS.iOS || targetOS == OS.macOS);
final int? androidNdkApi = final AndroidConfig? androidConfig =
targetOS == OS.android ? targetAndroidNdkApi(environmentDefines) : null; targetOS == OS.android
final int? iOSVersion = targetOS == OS.iOS ? targetIOSVersion : null; ? AndroidConfig(targetNdkApi: targetAndroidNdkApi(environmentDefines))
final int? macOSVersion = targetOS == OS.macOS ? targetMacOSVersion : null; : null;
final IOSSdk? iOSSdk = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null; final IOSConfig? iosConfig =
targetOS == OS.iOS
? IOSConfig(targetVersion: targetIOSVersion, targetSdk: getIOSSdk(environmentType!))
: null;
final MacOSConfig? macOSConfig =
targetOS == OS.macOS ? MacOSConfig(targetVersion: targetMacOSVersion) : null;
for (final Architecture architecture in architectures) { for (final Architecture architecture in architectures) {
final BuildResult? buildResult = await buildRunner.build( final BuildResult? buildResult = await buildRunner.build(
supportedAssetTypes: <String>[CodeAsset.type], buildAssetTypes: <String>[CodeAsset.type],
configCreator: configCreator:
() => () =>
BuildConfigBuilder()..setupCodeConfig( BuildConfigBuilder()..setupCodeConfig(
targetArchitecture: architecture, targetArchitecture: architecture,
linkModePreference: LinkModePreference.dynamic, linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig, cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi, targetOS: targetOS!,
targetIOSVersion: iOSVersion, androidConfig: androidConfig,
targetMacOSVersion: macOSVersion, iOSConfig: iosConfig,
targetIOSSdk: iOSSdk, macOSConfig: macOSConfig,
), ),
configValidator: configValidator:
(BuildConfig config) async => <String>[...await validateCodeAssetBuildConfig(config)], (BuildConfig config) async => <String>[...await validateCodeAssetBuildConfig(config)],
@ -668,8 +665,6 @@ Future<DartBuildResult> _runDartBuild({
(List<EncodedAsset> assets) async => <String>[ (List<EncodedAsset> assets) async => <String>[
...await validateCodeAssetInApplication(assets), ...await validateCodeAssetInApplication(assets),
], ],
targetOS: targetOS!,
buildMode: buildMode,
workingDirectory: projectUri, workingDirectory: projectUri,
includeParentEnvironment: true, includeParentEnvironment: true,
linkingEnabled: linkingEnabled, linkingEnabled: linkingEnabled,
@ -682,17 +677,17 @@ Future<DartBuildResult> _runDartBuild({
assets.addAll(buildResult.encodedAssets); assets.addAll(buildResult.encodedAssets);
} else { } else {
final LinkResult? linkResult = await buildRunner.link( final LinkResult? linkResult = await buildRunner.link(
supportedAssetTypes: <String>[CodeAsset.type], buildAssetTypes: <String>[CodeAsset.type],
configCreator: configCreator:
() => () =>
LinkConfigBuilder()..setupCodeConfig( LinkConfigBuilder()..setupCodeConfig(
targetArchitecture: architecture, targetArchitecture: architecture,
linkModePreference: LinkModePreference.dynamic, linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig, cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi, targetOS: targetOS!,
targetIOSVersion: iOSVersion, androidConfig: androidConfig,
targetMacOSVersion: macOSVersion, iOSConfig: iosConfig,
targetIOSSdk: iOSSdk, macOSConfig: macOSConfig,
), ),
configValidator: configValidator:
(LinkConfig config) async => <String>[...await validateCodeAssetLinkConfig(config)], (LinkConfig config) async => <String>[...await validateCodeAssetLinkConfig(config)],
@ -707,8 +702,6 @@ Future<DartBuildResult> _runDartBuild({
workingDirectory: projectUri, workingDirectory: projectUri,
includeParentEnvironment: true, includeParentEnvironment: true,
buildResult: buildResult, buildResult: buildResult,
targetOS: targetOS,
buildMode: buildMode,
); );
if (linkResult == null) { if (linkResult == null) {
_throwNativeAssetsLinkFailed(); _throwNativeAssetsLinkFailed();
@ -723,14 +716,12 @@ Future<DartBuildResult> _runDartBuild({
.where((EncodedAsset asset) => asset.type == CodeAsset.type) .where((EncodedAsset asset) => asset.type == CodeAsset.type)
.map<CodeAsset>(CodeAsset.fromEncoded) .map<CodeAsset>(CodeAsset.fromEncoded)
.toList(); .toList();
globals.logger.printTrace( globals.logger.printTrace('Building native assets for $targetOS $architectureString done.');
'Building native assets for $targetOS $architectureString $buildMode done.',
);
return DartBuildResult(codeAssets, dependencies.toList()); return DartBuildResult(codeAssets, dependencies.toList());
} }
List<Architecture> _architecturesForOS( List<Architecture> _architecturesForOS(
build_info.TargetPlatform targetPlatform, TargetPlatform targetPlatform,
OS targetOS, OS targetOS,
Map<String, String> environmentDefines, Map<String, String> environmentDefines,
) { ) {
@ -740,25 +731,20 @@ List<Architecture> _architecturesForOS(
case OS.windows: case OS.windows:
return <Architecture>[_getNativeArchitecture(targetPlatform)]; return <Architecture>[_getNativeArchitecture(targetPlatform)];
case OS.macOS: case OS.macOS:
final List<build_info.DarwinArch> darwinArchs = final List<DarwinArch> darwinArchs =
_emptyToNull( _emptyToNull(
environmentDefines[build_info.kDarwinArchs], environmentDefines[kDarwinArchs],
)?.split(' ').map(build_info.getDarwinArchForName).toList() ?? )?.split(' ').map(getDarwinArchForName).toList() ??
<build_info.DarwinArch>[build_info.DarwinArch.x86_64, build_info.DarwinArch.arm64]; <DarwinArch>[DarwinArch.x86_64, DarwinArch.arm64];
return darwinArchs.map(getNativeMacOSArchitecture).toList(); return darwinArchs.map(getNativeMacOSArchitecture).toList();
case OS.android: case OS.android:
final String? androidArchsEnvironment = environmentDefines[build_info.kAndroidArchs]; final String? androidArchsEnvironment = environmentDefines[kAndroidArchs];
final List<build_info.AndroidArch> androidArchs = _androidArchs( final List<AndroidArch> androidArchs = _androidArchs(targetPlatform, androidArchsEnvironment);
targetPlatform,
androidArchsEnvironment,
);
return androidArchs.map(getNativeAndroidArchitecture).toList(); return androidArchs.map(getNativeAndroidArchitecture).toList();
case OS.iOS: case OS.iOS:
final List<build_info.DarwinArch> iosArchs = final List<DarwinArch> iosArchs =
_emptyToNull( _emptyToNull(environmentDefines[kIosArchs])?.split(' ').map(getIOSArchForName).toList() ??
environmentDefines[build_info.kIosArchs], <DarwinArch>[DarwinArch.arm64];
)?.split(' ').map(build_info.getIOSArchForName).toList() ??
<build_info.DarwinArch>[build_info.DarwinArch.arm64];
return iosArchs.map(getNativeIOSArchitecture).toList(); return iosArchs.map(getNativeIOSArchitecture).toList();
default: default:
// TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757 // TODO(dacoharkes): Implement other OSes. https://github.com/flutter/flutter/issues/129757
@ -767,25 +753,25 @@ List<Architecture> _architecturesForOS(
} }
} }
Architecture _getNativeArchitecture(build_info.TargetPlatform targetPlatform) { Architecture _getNativeArchitecture(TargetPlatform targetPlatform) {
switch (targetPlatform) { switch (targetPlatform) {
case build_info.TargetPlatform.linux_x64: case TargetPlatform.linux_x64:
case build_info.TargetPlatform.windows_x64: case TargetPlatform.windows_x64:
return Architecture.x64; return Architecture.x64;
case build_info.TargetPlatform.linux_arm64: case TargetPlatform.linux_arm64:
case build_info.TargetPlatform.windows_arm64: case TargetPlatform.windows_arm64:
return Architecture.arm64; return Architecture.arm64;
case build_info.TargetPlatform.android: case TargetPlatform.android:
case build_info.TargetPlatform.ios: case TargetPlatform.ios:
case build_info.TargetPlatform.darwin: case TargetPlatform.darwin:
case build_info.TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_arm64:
case build_info.TargetPlatform.fuchsia_x64: case TargetPlatform.fuchsia_x64:
case build_info.TargetPlatform.tester: case TargetPlatform.tester:
case build_info.TargetPlatform.web_javascript: case TargetPlatform.web_javascript:
case build_info.TargetPlatform.android_arm: case TargetPlatform.android_arm:
case build_info.TargetPlatform.android_arm64: case TargetPlatform.android_arm64:
case build_info.TargetPlatform.android_x64: case TargetPlatform.android_x64:
case build_info.TargetPlatform.android_x86: case TargetPlatform.android_x86:
throw Exception('Unknown targetPlatform: $targetPlatform.'); throw Exception('Unknown targetPlatform: $targetPlatform.');
} }
} }
@ -793,7 +779,7 @@ Architecture _getNativeArchitecture(build_info.TargetPlatform targetPlatform) {
Future<void> _copyNativeCodeAssetsToBundleOnWindowsLinux( Future<void> _copyNativeCodeAssetsToBundleOnWindowsLinux(
Uri buildUri, Uri buildUri,
Map<CodeAsset, KernelAsset> assetTargetLocations, Map<CodeAsset, KernelAsset> assetTargetLocations,
build_info.BuildMode buildMode, BuildMode buildMode,
FileSystem fileSystem, FileSystem fileSystem,
) async { ) async {
assert(assetTargetLocations.isNotEmpty); assert(assetTargetLocations.isNotEmpty);
@ -819,28 +805,28 @@ Never _throwNativeAssetsLinkFailed() {
throwToolExit('Linking native assets failed. See the logs for more details.'); throwToolExit('Linking native assets failed. See the logs for more details.');
} }
OS getNativeOSFromTargetPlatform(build_info.TargetPlatform platform) { OS getNativeOSFromTargetPlatform(TargetPlatform platform) {
switch (platform) { switch (platform) {
case build_info.TargetPlatform.ios: case TargetPlatform.ios:
return OS.iOS; return OS.iOS;
case build_info.TargetPlatform.darwin: case TargetPlatform.darwin:
return OS.macOS; return OS.macOS;
case build_info.TargetPlatform.linux_x64: case TargetPlatform.linux_x64:
case build_info.TargetPlatform.linux_arm64: case TargetPlatform.linux_arm64:
return OS.linux; return OS.linux;
case build_info.TargetPlatform.windows_x64: case TargetPlatform.windows_x64:
case build_info.TargetPlatform.windows_arm64: case TargetPlatform.windows_arm64:
return OS.windows; return OS.windows;
case build_info.TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_arm64:
case build_info.TargetPlatform.fuchsia_x64: case TargetPlatform.fuchsia_x64:
return OS.fuchsia; return OS.fuchsia;
case build_info.TargetPlatform.android: case TargetPlatform.android:
case build_info.TargetPlatform.android_arm: case TargetPlatform.android_arm:
case build_info.TargetPlatform.android_arm64: case TargetPlatform.android_arm64:
case build_info.TargetPlatform.android_x64: case TargetPlatform.android_x64:
case build_info.TargetPlatform.android_x86: case TargetPlatform.android_x86:
return OS.android; return OS.android;
case build_info.TargetPlatform.tester: case TargetPlatform.tester:
if (const LocalPlatform().isMacOS) { if (const LocalPlatform().isMacOS) {
return OS.macOS; return OS.macOS;
} else if (const LocalPlatform().isLinux) { } else if (const LocalPlatform().isLinux) {
@ -850,39 +836,36 @@ OS getNativeOSFromTargetPlatform(build_info.TargetPlatform platform) {
} else { } else {
throw StateError('Unknown operating system'); throw StateError('Unknown operating system');
} }
case build_info.TargetPlatform.web_javascript: case TargetPlatform.web_javascript:
throw StateError('No dart builds for web yet.'); throw StateError('No dart builds for web yet.');
} }
} }
List<build_info.AndroidArch> _androidArchs( List<AndroidArch> _androidArchs(TargetPlatform targetPlatform, String? androidArchsEnvironment) {
build_info.TargetPlatform targetPlatform,
String? androidArchsEnvironment,
) {
switch (targetPlatform) { switch (targetPlatform) {
case build_info.TargetPlatform.android_arm: case TargetPlatform.android_arm:
return <build_info.AndroidArch>[build_info.AndroidArch.armeabi_v7a]; return <AndroidArch>[AndroidArch.armeabi_v7a];
case build_info.TargetPlatform.android_arm64: case TargetPlatform.android_arm64:
return <build_info.AndroidArch>[build_info.AndroidArch.arm64_v8a]; return <AndroidArch>[AndroidArch.arm64_v8a];
case build_info.TargetPlatform.android_x64: case TargetPlatform.android_x64:
return <build_info.AndroidArch>[build_info.AndroidArch.x86_64]; return <AndroidArch>[AndroidArch.x86_64];
case build_info.TargetPlatform.android_x86: case TargetPlatform.android_x86:
return <build_info.AndroidArch>[build_info.AndroidArch.x86]; return <AndroidArch>[AndroidArch.x86];
case build_info.TargetPlatform.android: case TargetPlatform.android:
if (androidArchsEnvironment == null) { if (androidArchsEnvironment == null) {
throw MissingDefineException(build_info.kAndroidArchs, 'native_assets'); throw MissingDefineException(kAndroidArchs, 'native_assets');
} }
return androidArchsEnvironment.split(' ').map(build_info.getAndroidArchForName).toList(); return androidArchsEnvironment.split(' ').map(getAndroidArchForName).toList();
case build_info.TargetPlatform.darwin: case TargetPlatform.darwin:
case build_info.TargetPlatform.fuchsia_arm64: case TargetPlatform.fuchsia_arm64:
case build_info.TargetPlatform.fuchsia_x64: case TargetPlatform.fuchsia_x64:
case build_info.TargetPlatform.ios: case TargetPlatform.ios:
case build_info.TargetPlatform.linux_arm64: case TargetPlatform.linux_arm64:
case build_info.TargetPlatform.linux_x64: case TargetPlatform.linux_x64:
case build_info.TargetPlatform.tester: case TargetPlatform.tester:
case build_info.TargetPlatform.web_javascript: case TargetPlatform.web_javascript:
case build_info.TargetPlatform.windows_x64: case TargetPlatform.windows_x64:
case build_info.TargetPlatform.windows_arm64: case TargetPlatform.windows_arm64:
throwToolExit('Unsupported Android target platform: $targetPlatform.'); throwToolExit('Unsupported Android target platform: $targetPlatform.');
} }
} }
@ -920,13 +903,13 @@ const Map<OS, Set<Architecture>> _osTargets = <OS, Set<Architecture>>{
OS.windows: <Architecture>{Architecture.arm64, Architecture.ia32, Architecture.x64}, OS.windows: <Architecture>{Architecture.arm64, Architecture.ia32, Architecture.x64},
}; };
build_info.BuildMode _getBuildMode(Map<String, String> environmentDefines, bool isFlutterTester) { BuildMode _getBuildMode(Map<String, String> environmentDefines, bool isFlutterTester) {
if (isFlutterTester) { if (isFlutterTester) {
return build_info.BuildMode.debug; return BuildMode.debug;
} }
final String? environmentBuildMode = environmentDefines[build_info.kBuildMode]; final String? environmentBuildMode = environmentDefines[kBuildMode];
if (environmentBuildMode == null) { if (environmentBuildMode == null) {
throw MissingDefineException(build_info.kBuildMode, 'native_assets'); throw MissingDefineException(kBuildMode, 'native_assets');
} }
return build_info.BuildMode.fromCliName(environmentBuildMode); return BuildMode.fromCliName(environmentBuildMode);
} }

View File

@ -4,7 +4,7 @@
// Logic for native assets shared between all host OSes. // Logic for native assets shared between all host OSes.
import 'package:native_assets_cli/native_assets_cli.dart'; import 'package:native_assets_cli/code_assets.dart' show OS;
import '../../../base/platform.dart'; import '../../../base/platform.dart';
import '../../../build_info.dart'; import '../../../build_info.dart';

View File

@ -7,7 +7,7 @@ import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../globals.dart' as globals; import '../../../globals.dart' as globals;
import '../../../windows/visual_studio.dart'; import '../../../windows/visual_studio.dart';
Future<CCompilerConfig> cCompilerConfigWindows() async { Future<CCompilerConfig?> cCompilerConfigWindows() async {
final VisualStudio visualStudio = VisualStudio( final VisualStudio visualStudio = VisualStudio(
fileSystem: globals.fs, fileSystem: globals.fs,
platform: globals.platform, platform: globals.platform,
@ -16,11 +16,21 @@ Future<CCompilerConfig> cCompilerConfigWindows() async {
osUtils: globals.os, osUtils: globals.os,
); );
final Uri? compiler = _toOptionalFileUri(visualStudio.clPath);
final Uri? archiver = _toOptionalFileUri(visualStudio.libPath);
final Uri? linker = _toOptionalFileUri(visualStudio.linkPath);
final Uri? envScript = _toOptionalFileUri(visualStudio.vcvarsPath);
if (compiler == null || archiver == null || linker == null || envScript == null) {
// Visual Studio might not be installed, don't exit tool.
return null;
}
return CCompilerConfig( return CCompilerConfig(
compiler: _toOptionalFileUri(visualStudio.clPath), compiler: compiler,
linker: _toOptionalFileUri(visualStudio.linkPath), archiver: archiver,
archiver: _toOptionalFileUri(visualStudio.libPath), linker: linker,
envScript: _toOptionalFileUri(visualStudio.vcvarsPath), envScript: envScript,
envScriptArgs: <String>[], envScriptArgs: <String>[],
); );
} }

View File

@ -27,9 +27,9 @@ const Map<String, String> kManuallyPinnedDependencies = <String, String>{
'intl': 'intl':
'0.19.0', // 0.20.0 introduces new transitive dependencies that are not (yet) cleared in Flutter's allow list. '0.19.0', // 0.20.0 introduces new transitive dependencies that are not (yet) cleared in Flutter's allow list.
'native_assets_builder': 'native_assets_builder':
'0.9.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. '0.10.2', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
'native_assets_cli': 'native_assets_cli':
'0.9.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes. '0.10.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
'material_color_utilities': '0.11.1', // Keep pinned to latest until 1.0.0. 'material_color_utilities': '0.11.1', // Keep pinned to latest until 1.0.0.
'leak_tracker': '10.0.8', // https://github.com/flutter/devtools/issues/3951 'leak_tracker': '10.0.8', // https://github.com/flutter/devtools/issues/3951
'leak_tracker_testing': '3.0.1', // https://github.com/flutter/devtools/issues/3951 'leak_tracker_testing': '3.0.1', // https://github.com/flutter/devtools/issues/3951

View File

@ -55,8 +55,8 @@ dependencies:
unified_analytics: 7.0.1 unified_analytics: 7.0.1
graphs: 2.3.2 graphs: 2.3.2
native_assets_builder: 0.9.0 native_assets_builder: 0.10.2
native_assets_cli: 0.9.0 native_assets_cli: 0.10.0
# We depend on very specific internal implementation details of the # We depend on very specific internal implementation details of the
# 'test' package, which change between versions, so when upgrading # 'test' package, which change between versions, so when upgrading
@ -85,10 +85,8 @@ dependencies:
glob: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" glob: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
http_parser: 4.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" http_parser: 4.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
io: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" io: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.7.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_rpc_2: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_rpc_2: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
matcher: 0.12.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" matcher: 0.12.17 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
node_preamble: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
petitparser: 6.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" petitparser: 6.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
platform: 3.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" platform: 3.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
shelf_packages_handler: 3.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf_packages_handler: 3.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@ -101,7 +99,6 @@ dependencies:
string_scanner: 1.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" string_scanner: 1.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
sync_http: 0.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" sync_http: 0.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
term_glyph: 1.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" term_glyph: 1.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test: 1.25.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
typed_data: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" typed_data: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
vm_service_interface: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" vm_service_interface: 2.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
watcher: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" watcher: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
@ -115,10 +112,13 @@ dev_dependencies:
pubspec_parse: 1.4.0 pubspec_parse: 1.4.0
checked_yaml: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" checked_yaml: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
js: 0.7.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
json_annotation: 4.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" json_annotation: 4.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
node_preamble: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
test: 1.25.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
dartdoc: dartdoc:
# Exclude this package from the hosted API docs. # Exclude this package from the hosted API docs.
nodoc: true nodoc: true
# PUBSPEC CHECKSUM: c6ec # PUBSPEC CHECKSUM: a23f

View File

@ -8,8 +8,8 @@ environment:
dependencies: dependencies:
logging: ^1.2.0 logging: ^1.2.0
native_assets_cli: ^0.9.0 native_assets_cli: ^0.10.0
native_toolchain_c: ^0.6.0 native_toolchain_c: ^0.7.0
dev_dependencies: dev_dependencies:
ffi: ^2.1.3 ffi: ^2.1.3

View File

@ -4,8 +4,7 @@ import 'package:{{projectName}}/{{projectName}}.dart';
void main() { void main() {
test('invoke native function', () { test('invoke native function', () {
// Tests are run in debug mode. expect(sum(24, 18), 42);
expect(sum(24, 18), 1042);
}); });
test('invoke async native callback', () async { test('invoke async native callback', () async {

View File

@ -17,7 +17,7 @@ import 'package:flutter_tools/src/build_system/targets/native_assets.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
@ -108,8 +108,8 @@ void main() {
expect( expect(
(globals.logger as BufferLogger).traceText, (globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[ stringContainsInOrder(<String>[
'Building native assets for android arm64 $buildMode.', 'Building native assets for android arm64.',
'Building native assets for android arm64 $buildMode done.', 'Building native assets for android arm64 done.',
]), ]),
); );

View File

@ -13,8 +13,7 @@ import 'package:flutter_tools/src/build_system/exceptions.dart';
import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/build_system/targets/native_assets.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli.dart' as native_assets_cli show BuildMode;
import 'package:package_config/package_config.dart' show Package; import 'package:package_config/package_config.dart' show Package;
import '../../../../src/common.dart'; import '../../../../src/common.dart';
@ -279,7 +278,6 @@ void main() {
linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets), linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
); );
await DartBuildForNative(buildRunner: buildRunner).build(androidEnvironment); await DartBuildForNative(buildRunner: buildRunner).build(androidEnvironment);
expect(buildRunner.lastBuildMode, native_assets_cli.BuildMode.release);
}, },
); );
} }

View File

@ -19,10 +19,9 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
this.onLink, this.onLink,
this.buildResult = const FakeFlutterNativeAssetsBuilderResult(), this.buildResult = const FakeFlutterNativeAssetsBuilderResult(),
this.linkResult = const FakeFlutterNativeAssetsBuilderResult(), this.linkResult = const FakeFlutterNativeAssetsBuilderResult(),
CCompilerConfig? cCompilerConfigResult, this.cCompilerConfigResult,
CCompilerConfig? ndkCCompilerConfigResult, this.ndkCCompilerConfigResult,
}) : cCompilerConfigResult = cCompilerConfigResult ?? CCompilerConfig(), });
ndkCCompilerConfigResult = ndkCCompilerConfigResult ?? CCompilerConfig();
final BuildResult? Function(BuildConfig)? onBuild; final BuildResult? Function(BuildConfig)? onBuild;
final LinkResult? Function(LinkConfig)? onLink; final LinkResult? Function(LinkConfig)? onLink;
@ -30,25 +29,22 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
final LinkResult? linkResult; final LinkResult? linkResult;
final bool hasPackageConfigResult; final bool hasPackageConfigResult;
final List<Package> packagesWithNativeAssetsResult; final List<Package> packagesWithNativeAssetsResult;
final CCompilerConfig cCompilerConfigResult; final CCompilerConfig? cCompilerConfigResult;
final CCompilerConfig ndkCCompilerConfigResult; final CCompilerConfig? ndkCCompilerConfigResult;
int buildInvocations = 0; int buildInvocations = 0;
int linkInvocations = 0; int linkInvocations = 0;
int hasPackageConfigInvocations = 0; int hasPackageConfigInvocations = 0;
int packagesWithNativeAssetsInvocations = 0; int packagesWithNativeAssetsInvocations = 0;
BuildMode? lastBuildMode;
@override @override
Future<BuildResult?> build({ Future<BuildResult?> build({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required BuildConfigValidator configValidator, required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator, required BuildConfigCreator configCreator,
required BuildValidator buildValidator, required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required bool linkingEnabled, required bool linkingEnabled,
}) async { }) async {
@ -59,9 +55,7 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
..setupHookConfig( ..setupHookConfig(
packageRoot: package.root, packageRoot: package.root,
packageName: package.name, packageName: package.name,
targetOS: targetOS, buildAssetTypes: buildAssetTypes,
supportedAssetTypes: supportedAssetTypes,
buildMode: buildMode,
) )
..setupBuildConfig(dryRun: false, linkingEnabled: linkingEnabled) ..setupBuildConfig(dryRun: false, linkingEnabled: linkingEnabled)
..setupBuildRunConfig( ..setupBuildRunConfig(
@ -72,7 +66,6 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
if (onBuild != null) { if (onBuild != null) {
result = onBuild!(buildConfig); result = onBuild!(buildConfig);
} }
lastBuildMode = buildConfig.buildMode;
buildInvocations++; buildInvocations++;
} }
return result; return result;
@ -80,14 +73,12 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
@override @override
Future<LinkResult?> link({ Future<LinkResult?> link({
required List<String> supportedAssetTypes, required List<String> buildAssetTypes,
required LinkConfigCreator configCreator, required LinkConfigCreator configCreator,
required LinkConfigValidator configValidator, required LinkConfigValidator configValidator,
required LinkValidator linkValidator, required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator, required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment, required bool includeParentEnvironment,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory, required Uri workingDirectory,
required BuildResult buildResult, required BuildResult buildResult,
}) async { }) async {
@ -98,9 +89,7 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
..setupHookConfig( ..setupHookConfig(
packageRoot: package.root, packageRoot: package.root,
packageName: package.name, packageName: package.name,
targetOS: targetOS, buildAssetTypes: buildAssetTypes,
supportedAssetTypes: supportedAssetTypes,
buildMode: buildMode,
) )
..setupLinkRunConfig( ..setupLinkRunConfig(
outputDirectory: Uri.parse('build-out-dir'), outputDirectory: Uri.parse('build-out-dir'),
@ -111,7 +100,6 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
if (onLink != null) { if (onLink != null) {
result = onLink!(buildConfig); result = onLink!(buildConfig);
} }
lastBuildMode = buildMode;
linkInvocations++; linkInvocations++;
} }
return result; return result;
@ -130,10 +118,10 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
} }
@override @override
Future<CCompilerConfig> get cCompilerConfig async => cCompilerConfigResult; Future<CCompilerConfig?> get cCompilerConfig async => cCompilerConfigResult;
@override @override
Future<CCompilerConfig> get ndkCCompilerConfig async => cCompilerConfigResult; Future<CCompilerConfig?> get ndkCCompilerConfig async => cCompilerConfigResult;
} }
final class FakeFlutterNativeAssetsBuilderResult implements BuildResult, LinkResult { final class FakeFlutterNativeAssetsBuilderResult implements BuildResult, LinkResult {

View File

@ -15,7 +15,7 @@ import 'package:flutter_tools/src/build_system/targets/native_assets.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
@ -185,14 +185,14 @@ void main() {
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)], packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
onBuild: onBuild:
(BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets( (BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: codeAssets(config.targetOS, config.codeConfig), codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
), ),
onLink: onLink:
(LinkConfig config) => (LinkConfig config) =>
buildMode == BuildMode.debug buildMode == BuildMode.debug
? null ? null
: FakeFlutterNativeAssetsBuilderResult.fromAssets( : FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: codeAssets(config.targetOS, config.codeConfig), codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
), ),
); );
final Map<String, String> environmentDefines = <String, String>{ final Map<String, String> environmentDefines = <String, String>{
@ -218,8 +218,8 @@ void main() {
expect( expect(
(globals.logger as BufferLogger).traceText, (globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[ stringContainsInOrder(<String>[
'Building native assets for ios [arm64, x64] $buildMode.', 'Building native assets for ios [arm64, x64].',
'Building native assets for ios [arm64, x64] $buildMode done.', 'Building native assets for ios [arm64, x64] done.',
]), ]),
); );
expect(environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists); expect(environment.buildDir.childFile(InstallCodeAssets.nativeAssetsFilename), exists);

View File

@ -15,7 +15,7 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
@ -118,7 +118,7 @@ void main() {
fileSystem, fileSystem,
logger, logger,
); );
final CCompilerConfig result = await runner.cCompilerConfig; final CCompilerConfig result = (await runner.cCompilerConfig)!;
expect(result.compiler, Uri.file('/some/path/to/clang')); expect(result.compiler, Uri.file('/some/path/to/clang'));
}, },
); );

View File

@ -15,7 +15,7 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
@ -281,14 +281,14 @@ void main() {
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)], packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
onBuild: onBuild:
(BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets( (BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: codeAssets(config.targetOS, config.codeConfig), codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
), ),
onLink: onLink:
(LinkConfig config) => (LinkConfig config) =>
buildMode == BuildMode.debug buildMode == BuildMode.debug
? null ? null
: FakeFlutterNativeAssetsBuilderResult.fromAssets( : FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: codeAssets(config.targetOS, config.codeConfig), codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
), ),
); );
final Map<String, String> environmentDefines = <String, String>{ final Map<String, String> environmentDefines = <String, String>{
@ -324,8 +324,8 @@ void main() {
expect( expect(
(globals.logger as BufferLogger).traceText, (globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[ stringContainsInOrder(<String>[
'Building native assets for macos $expectedArchsBeingBuilt $buildMode.', 'Building native assets for macos $expectedArchsBeingBuilt.',
'Building native assets for macos $expectedArchsBeingBuilt $buildMode done.', 'Building native assets for macos $expectedArchsBeingBuilt done.',
]), ]),
); );
final String nativeAssetsFileContent = final String nativeAssetsFileContent =
@ -403,7 +403,7 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault
fileSystem, fileSystem,
logger, logger,
); );
final CCompilerConfig result = await runner.cCompilerConfig; final CCompilerConfig result = (await runner.cCompilerConfig)!;
expect( expect(
result.compiler, result.compiler,
Uri.file( Uri.file(

View File

@ -14,7 +14,7 @@ import 'package:flutter_tools/src/build_system/targets/native_assets.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../src/common.dart'; import '../../src/common.dart';

View File

@ -15,8 +15,8 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode; import 'package:native_assets_cli/code_assets.dart' as native_assets_cli;
import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart'; import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart'; import '../../../src/common.dart';
@ -136,8 +136,8 @@ void main() {
expect( expect(
(globals.logger as BufferLogger).traceText, (globals.logger as BufferLogger).traceText,
stringContainsInOrder(<String>[ stringContainsInOrder(<String>[
'Building native assets for $expectedOS $expectedArch $buildMode.', 'Building native assets for $expectedOS $expectedArch.',
'Building native assets for $expectedOS $expectedArch $buildMode done.', 'Building native assets for $expectedOS $expectedArch done.',
]), ]),
); );
expect( expect(
@ -270,10 +270,10 @@ void main() {
fileSystem, fileSystem,
logger, logger,
); );
final CCompilerConfig result = await runner.cCompilerConfig; final CCompilerConfig result = (await runner.cCompilerConfig)!;
expect(result.compiler?.toFilePath(), msvcBinDir.childFile('cl.exe').uri.toFilePath()); expect(result.compiler.toFilePath(), msvcBinDir.childFile('cl.exe').uri.toFilePath());
expect(result.archiver?.toFilePath(), msvcBinDir.childFile('lib.exe').uri.toFilePath()); expect(result.archiver.toFilePath(), msvcBinDir.childFile('lib.exe').uri.toFilePath());
expect(result.linker?.toFilePath(), msvcBinDir.childFile('link.exe').uri.toFilePath()); expect(result.linker.toFilePath(), msvcBinDir.childFile('link.exe').uri.toFilePath());
expect(result.envScript, isNotNull); expect(result.envScript, isNotNull);
expect(result.envScriptArgs, isNotNull); expect(result.envScriptArgs, isNotNull);
}, },

View File

@ -189,7 +189,7 @@ void main(List<String> args) async {
await build(args, (config, output) async { await build(args, (config, output) async {
final packageName = config.packageName; final packageName = config.packageName;
if (!config.supportedAssetTypes.contains(CodeAsset.type)) { if (!config.buildAssetTypes.contains(CodeAsset.type)) {
return; return;
} }
final builders = [ final builders = [
@ -221,7 +221,7 @@ void main(List<String> args) async {
} }
extension on BuildConfig { extension on BuildConfig {
List<String> dynamicLinkingFlags(String libraryName) => switch (targetOS) { List<String> dynamicLinkingFlags(String libraryName) => switch (codeConfig.targetOS) {
OS.macOS || OS.iOS => [ OS.macOS || OS.iOS => [
'-L${outputDirectory.toFilePath()}', '-L${outputDirectory.toFilePath()}',
'-l$libraryName', '-l$libraryName',
@ -234,7 +234,7 @@ extension on BuildConfig {
OS.windows => [ OS.windows => [
outputDirectory.resolve('$libraryName.lib').toFilePath() outputDirectory.resolve('$libraryName.lib').toFilePath()
], ],
_ => throw UnimplementedError('Unsupported OS: $targetOS'), _ => throw UnimplementedError('Unsupported OS: ${codeConfig.targetOS}'),
}; };
} }
'''; ''';