Make flutter_tools use newest package:{native_assets_builder,native_assets_cli,native_toolchain_c} (#158214)

Almost all of the code is just adopting to changes to the APIs of
`package:native_assets_builder`, `package:native_assets_cli` and
`package:native_toolchain_c`

There's only two semantic changes

* Removes a test that checks for a verification error if a build hook
produces a static library if the preferred linking mode is dynamic:
=> The test is written in a very hacky way. By monkey patching the build
config.json that flutter build actually made. This monkey patching
relies on package:cli_config which is now no longer used.
=> The actual code that checks for this mismatch lives in
dart-lang/native repository and is tested there. So there's really no
need to duplicate that.

* The `package:native_assets_builder` no longer knows about code assets.
This is something a user of that package (e.g. flutter tools) adds. Now
the dry-run functionality will invoke build hooks who produce code
assets without an architecture.
=> The `package:native_assets_builder` used to expand such a code asset
to N different code assets (one for each supported architecture)
=> This logic was now moved to flutter tools. => In the near future
we're going to this dry-run complexity, which will then also get rid of
this uglyness (of expanding to all archs of an OS).
This commit is contained in:
Martin Kustermann
2024-11-06 14:12:34 +01:00
committed by GitHub
parent 22a7afd99a
commit 3a83e43ede
24 changed files with 519 additions and 449 deletions

View File

@@ -3,12 +3,12 @@
// found in the LICENSE file.
import 'package:logging/logging.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/code_assets.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:native_toolchain_c/native_toolchain_c.dart';
void main(List<String> args) async {
await build(args, (BuildConfig config, BuildOutput output) async {
await build(args, (BuildConfig config, BuildOutputBuilder output) async {
final String assetName;
if (config.linkingEnabled) {
// The link hook will be run. So emit an asset with a name that is
@@ -30,7 +30,7 @@ void main(List<String> args) async {
],
dartBuildFiles: <String>['hook/build.dart'],
);
final BuildOutput outputCatcher = BuildOutput();
final BuildOutputBuilder outputCatcher = BuildOutputBuilder();
await cbuilder.run(
config: config,
output: outputCatcher,
@@ -38,10 +38,11 @@ void main(List<String> args) async {
..level = Level.ALL
..onRecord.listen((LogRecord record) => print(record.message)),
);
output.addDependencies(outputCatcher.dependencies);
final BuildOutput catchedOutput = BuildOutput(outputCatcher.json);
output.addDependencies(catchedOutput.dependencies);
// Send the asset to hook/link.dart or immediately for bundling.
output.addAsset(
outputCatcher.assets.single,
output.codeAssets.add(
catchedOutput.codeAssets.single,
linkInPackage: config.linkingEnabled ? 'link_hook' : null,
);
});

View File

@@ -2,13 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/code_assets.dart';
void main(List<String> args) async {
await link(args, (LinkConfig config, LinkOutput output) async {
final NativeCodeAsset asset = config.assets.single as NativeCodeAsset;
await link(args, (LinkConfig config, LinkOutputBuilder output) async {
final CodeAsset asset = config.codeAssets.single;
final String packageName = config.packageName;
output.addAsset(NativeCodeAsset(
output.codeAssets.add(CodeAsset(
package: packageName,
// Change the asset id to something that is used.
name: '${packageName}_bindings_generated.dart',

View File

@@ -6,10 +6,9 @@ environment:
sdk: '>=3.5.0-154.0.dev <4.0.0'
dependencies:
cli_config: 0.2.0
logging: 1.2.0
native_assets_cli: 0.8.0
native_toolchain_c: 0.5.4
native_assets_cli: 0.9.0
native_toolchain_c: 0.6.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"
@@ -68,4 +67,4 @@ dev_dependencies:
quiver: 3.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
yaml_edit: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
# PUBSPEC CHECKSUM: ddf6
# PUBSPEC CHECKSUM: a89a

View File

@@ -3,8 +3,7 @@
// found in the LICENSE file.
import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../android/android_sdk.dart';
import '../../../android/gradle_utils.dart';
@@ -19,7 +18,7 @@ int targetAndroidNdkApi(Map<String, String> environmentDefines) {
Future<void> copyNativeCodeAssetsAndroid(
Uri buildUri,
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocations,
Map<CodeAsset, KernelAsset> assetTargetLocations,
FileSystem fileSystem,
) async {
if (assetTargetLocations.isNotEmpty) {
@@ -33,7 +32,7 @@ Future<void> copyNativeCodeAssetsAndroid(
final Uri archUri = buildUri.resolve('jniLibs/lib/$jniArchDir/');
await fileSystem.directory(archUri).create(recursive: true);
}
for (final MapEntry<NativeCodeAssetImpl, KernelAsset> assetMapping
for (final MapEntry<CodeAsset, KernelAsset> assetMapping
in assetTargetLocations.entries) {
final Uri source = assetMapping.key.file!;
final Uri target = (assetMapping.value.path as KernelAssetAbsolutePath).uri;
@@ -71,17 +70,17 @@ AndroidArch _getAndroidArch(Target target) {
};
}
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocationsAndroid(
List<NativeCodeAssetImpl> nativeAssets) {
return <NativeCodeAssetImpl, KernelAsset>{
for (final NativeCodeAssetImpl asset in nativeAssets)
Map<CodeAsset, KernelAsset> assetTargetLocationsAndroid(
List<CodeAsset> nativeAssets) {
return <CodeAsset, KernelAsset>{
for (final CodeAsset asset in nativeAssets)
asset: _targetLocationAndroid(asset),
};
}
/// Converts the `path` of [asset] as output from a `build.dart` invocation to
/// the path used inside the Flutter app bundle.
KernelAsset _targetLocationAndroid(NativeCodeAssetImpl asset) {
KernelAsset _targetLocationAndroid(CodeAsset asset) {
final LinkMode linkMode = asset.linkMode;
final KernelAssetPath kernelAssetPath;
switch (linkMode) {
@@ -113,12 +112,12 @@ KernelAsset _targetLocationAndroid(NativeCodeAssetImpl asset) {
/// Should only be invoked if a native assets build is performed. If the native
/// assets feature is disabled, or none of the packages have native assets, a
/// missing NDK is okay.
Future<CCompilerConfigImpl> cCompilerConfigAndroid() async {
Future<CCompilerConfig> cCompilerConfigAndroid() async {
final AndroidSdk? androidSdk = AndroidSdk.locateAndroidSdk();
if (androidSdk == null) {
throwToolExit('Android SDK could not be found.');
}
final CCompilerConfigImpl result = CCompilerConfigImpl(
final CCompilerConfig result = CCompilerConfig(
compiler: _toOptionalFileUri(androidSdk.getNdkClangPath()),
archiver: _toOptionalFileUri(androidSdk.getNdkArPath()),
linker: _toOptionalFileUri(androidSdk.getNdkLdPath()),

View File

@@ -3,8 +3,7 @@
// found in the LICENSE file.
import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/file_system.dart';
import '../../../build_info.dart' hide BuildMode;
@@ -15,10 +14,10 @@ import '../macos/native_assets_host.dart';
// TODO(dcharkes): Fetch minimum iOS version from somewhere. https://github.com/flutter/flutter/issues/145104
const int targetIOSVersion = 12;
IOSSdkImpl getIOSSdk(EnvironmentType environmentType) {
IOSSdk getIOSSdk(EnvironmentType environmentType) {
return switch (environmentType) {
EnvironmentType.physical => IOSSdkImpl.iPhoneOS,
EnvironmentType.simulator => IOSSdkImpl.iPhoneSimulator,
EnvironmentType.physical => IOSSdk.iPhoneOS,
EnvironmentType.simulator => IOSSdk.iPhoneSimulator,
};
}
@@ -31,13 +30,13 @@ Target getNativeIOSTarget(DarwinArch darwinArch) {
};
}
Map<KernelAssetPath, List<NativeCodeAssetImpl>> fatAssetTargetLocationsIOS(
List<NativeCodeAssetImpl> nativeAssets) {
Map<KernelAssetPath, List<CodeAsset>> fatAssetTargetLocationsIOS(
List<CodeAsset> nativeAssets) {
final Set<String> alreadyTakenNames = <String>{};
final Map<KernelAssetPath, List<NativeCodeAssetImpl>> result =
<KernelAssetPath, List<NativeCodeAssetImpl>>{};
final Map<KernelAssetPath, List<CodeAsset>> result =
<KernelAssetPath, List<CodeAsset>>{};
final Map<String, KernelAssetPath> idToPath = <String, KernelAssetPath>{};
for (final NativeCodeAssetImpl asset in nativeAssets) {
for (final CodeAsset asset in nativeAssets) {
// Use same target path for all assets with the same id.
final KernelAssetPath path = idToPath[asset.id] ??
_targetLocationIOS(
@@ -45,19 +44,18 @@ Map<KernelAssetPath, List<NativeCodeAssetImpl>> fatAssetTargetLocationsIOS(
alreadyTakenNames,
).path;
idToPath[asset.id] = path;
result[path] ??= <NativeCodeAssetImpl>[];
result[path] ??= <CodeAsset>[];
result[path]!.add(asset);
}
return result;
}
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocationsIOS(
List<NativeCodeAssetImpl> nativeAssets) {
Map<CodeAsset, KernelAsset> assetTargetLocationsIOS(
List<CodeAsset> nativeAssets) {
final Set<String> alreadyTakenNames = <String>{};
final Map<String, KernelAssetPath> idToPath = <String, KernelAssetPath>{};
final Map<NativeCodeAssetImpl, KernelAsset> result =
<NativeCodeAssetImpl, KernelAsset>{};
for (final NativeCodeAssetImpl asset in nativeAssets) {
final Map<CodeAsset, KernelAsset> result = <CodeAsset, KernelAsset>{};
for (final CodeAsset asset in nativeAssets) {
final KernelAssetPath path =
idToPath[asset.id] ?? _targetLocationIOS(asset, alreadyTakenNames).path;
idToPath[asset.id] = path;
@@ -70,8 +68,7 @@ Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocationsIOS(
return result;
}
KernelAsset _targetLocationIOS(
NativeCodeAssetImpl asset, Set<String> alreadyTakenNames) {
KernelAsset _targetLocationIOS(CodeAsset asset, Set<String> alreadyTakenNames) {
final LinkMode linkMode = asset.linkMode;
final KernelAssetPath kernelAssetPath;
switch (linkMode) {
@@ -113,7 +110,7 @@ KernelAsset _targetLocationIOS(
/// in xcode_backend.dart.
Future<void> copyNativeCodeAssetsIOS(
Uri buildUri,
Map<KernelAssetPath, List<NativeCodeAssetImpl>> assetTargetLocations,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity,
build_info.BuildMode buildMode,
FileSystem fileSystem,
@@ -125,11 +122,11 @@ Future<void> copyNativeCodeAssetsIOS(
final Map<String, String> oldToNewInstallNames = <String, String>{};
final List<(File, String, Directory)> dylibs = <(File, String, Directory)>[];
for (final MapEntry<KernelAssetPath, List<NativeCodeAssetImpl>> assetMapping
for (final MapEntry<KernelAssetPath, List<CodeAsset>> assetMapping
in assetTargetLocations.entries) {
final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri;
final List<File> sources = <File>[
for (final NativeCodeAssetImpl source in assetMapping.value)
for (final CodeAsset source in assetMapping.value)
fileSystem.file(source.file)
];
final Uri targetUri = buildUri.resolveUri(target);

View File

@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/common.dart';
import '../../../base/file_system.dart';
@@ -12,7 +12,7 @@ import '../../../globals.dart' as globals;
/// Flutter expects `clang++` to be on the path on Linux hosts.
///
/// Search for the accompanying `clang`, `ar`, and `ld`.
Future<CCompilerConfigImpl> cCompilerConfigLinux() async {
Future<CCompilerConfig> cCompilerConfigLinux() async {
const String kClangPlusPlusBinary = 'clang++';
const String kClangBinary = 'clang';
const String kArBinary = 'llvm-ar';
@@ -34,7 +34,7 @@ Future<CCompilerConfigImpl> cCompilerConfigLinux() async {
}
binaryPaths[binary] = binaryFile.uri;
}
return CCompilerConfigImpl(
return CCompilerConfig(
archiver: binaryPaths[kArBinary],
compiler: binaryPaths[kClangBinary],
linker: binaryPaths[kLdBinary],

View File

@@ -3,8 +3,7 @@
// found in the LICENSE file.
import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/file_system.dart';
import '../../../build_info.dart' hide BuildMode;
@@ -24,15 +23,15 @@ Target getNativeMacOSTarget(DarwinArch darwinArch) {
};
}
Map<KernelAssetPath, List<NativeCodeAssetImpl>> fatAssetTargetLocationsMacOS(
List<NativeCodeAssetImpl> nativeAssets,
Map<KernelAssetPath, List<CodeAsset>> fatAssetTargetLocationsMacOS(
List<CodeAsset> nativeAssets,
Uri? absolutePath,
) {
final Set<String> alreadyTakenNames = <String>{};
final Map<KernelAssetPath, List<NativeCodeAssetImpl>> result =
<KernelAssetPath, List<NativeCodeAssetImpl>>{};
final Map<KernelAssetPath, List<CodeAsset>> result =
<KernelAssetPath, List<CodeAsset>>{};
final Map<String, KernelAssetPath> idToPath = <String, KernelAssetPath>{};
for (final NativeCodeAssetImpl asset in nativeAssets) {
for (final CodeAsset asset in nativeAssets) {
// Use same target path for all assets with the same id.
final KernelAssetPath path = idToPath[asset.id] ??
_targetLocationMacOS(
@@ -41,20 +40,20 @@ Map<KernelAssetPath, List<NativeCodeAssetImpl>> fatAssetTargetLocationsMacOS(
alreadyTakenNames,
).path;
idToPath[asset.id] = path;
result[path] ??= <NativeCodeAssetImpl>[];
result[path] ??= <CodeAsset>[];
result[path]!.add(asset);
}
return result;
}
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocationsMacOS(
List<NativeCodeAssetImpl> nativeAssets,
Map<CodeAsset, KernelAsset> assetTargetLocationsMacOS(
List<CodeAsset> nativeAssets,
Uri? absolutePath,
) {
final Set<String> alreadyTakenNames = <String>{};
final Map<String, KernelAssetPath> idToPath = <String, KernelAssetPath>{};
final Map<NativeCodeAssetImpl, KernelAsset> result = <NativeCodeAssetImpl, KernelAsset>{};
for (final NativeCodeAssetImpl asset in nativeAssets) {
final Map<CodeAsset, KernelAsset> result = <CodeAsset, KernelAsset>{};
for (final CodeAsset asset in nativeAssets) {
final KernelAssetPath path = idToPath[asset.id] ??
_targetLocationMacOS(asset, absolutePath, alreadyTakenNames).path;
idToPath[asset.id] = path;
@@ -68,7 +67,7 @@ Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocationsMacOS(
}
KernelAsset _targetLocationMacOS(
NativeCodeAssetImpl asset,
CodeAsset asset,
Uri? absolutePath,
Set<String> alreadyTakenNames,
) {
@@ -123,7 +122,7 @@ KernelAsset _targetLocationMacOS(
/// in macos_assemble.sh.
Future<void> copyNativeCodeAssetsMacOS(
Uri buildUri,
Map<KernelAssetPath, List<NativeCodeAssetImpl>> assetTargetLocations,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity,
build_info.BuildMode buildMode,
FileSystem fileSystem,
@@ -136,11 +135,11 @@ Future<void> copyNativeCodeAssetsMacOS(
final Map<String, String> oldToNewInstallNames = <String, String>{};
final List<(File, String, Directory)> dylibs = <(File, String, Directory)>[];
for (final MapEntry<KernelAssetPath, List<NativeCodeAssetImpl>> assetMapping
for (final MapEntry<KernelAssetPath, List<CodeAsset>> assetMapping
in assetTargetLocations.entries) {
final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri;
final List<File> sources = <File>[
for (final NativeCodeAssetImpl source in assetMapping.value) fileSystem.file(source.file),
for (final CodeAsset source in assetMapping.value) fileSystem.file(source.file),
];
final Uri targetUri = buildUri.resolveUri(target);
final String name = targetUri.pathSegments.last;
@@ -217,7 +216,7 @@ Future<void> copyNativeCodeAssetsMacOS(
/// Code signing is also done here.
Future<void> copyNativeCodeAssetsMacOSFlutterTester(
Uri buildUri,
Map<KernelAssetPath, List<NativeCodeAssetImpl>> assetTargetLocations,
Map<KernelAssetPath, List<CodeAsset>> assetTargetLocations,
String? codesignIdentity,
build_info.BuildMode buildMode,
FileSystem fileSystem,
@@ -230,11 +229,11 @@ Future<void> copyNativeCodeAssetsMacOSFlutterTester(
final Map<String, String> oldToNewInstallNames = <String, String>{};
final List<(File, String)> dylibs = <(File, String)>[];
for (final MapEntry<KernelAssetPath, List<NativeCodeAssetImpl>> assetMapping
for (final MapEntry<KernelAssetPath, List<CodeAsset>> assetMapping
in assetTargetLocations.entries) {
final Uri target = (assetMapping.key as KernelAssetAbsolutePath).uri;
final List<File> sources = <File>[
for (final NativeCodeAssetImpl source in assetMapping.value) fileSystem.file(source.file),
for (final CodeAsset source in assetMapping.value) fileSystem.file(source.file),
];
final Uri targetUri = buildUri.resolveUri(target);
final File dylibFile = fileSystem.file(targetUri);

View File

@@ -4,8 +4,7 @@
// Shared logic between iOS and macOS implementations of native assets.
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../base/common.dart';
import '../../../base/file_system.dart';
@@ -178,7 +177,7 @@ Future<void> codesignDylib(
/// Flutter expects `xcrun` to be on the path on macOS hosts.
///
/// Use the `clang`, `ar`, and `ld` that would be used if run with `xcrun`.
Future<CCompilerConfigImpl> cCompilerConfigMacOS() async {
Future<CCompilerConfig> cCompilerConfigMacOS() async {
final ProcessResult xcrunResult = await globals.processManager.run(
<String>['xcrun', 'clang', '--version'],
);
@@ -189,7 +188,7 @@ Future<CCompilerConfigImpl> cCompilerConfigMacOS() async {
.firstWhere((String s) => s.startsWith('InstalledDir: '))
.split(' ')
.last;
return CCompilerConfigImpl(
return CCompilerConfig(
compiler: Uri.file('$installPath/clang'),
archiver: Uri.file('$installPath/ar'),
linker: Uri.file('$installPath/ld'),

View File

@@ -6,7 +6,7 @@
import 'package:logging/logging.dart' as logging;
import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:package_config/package_config_types.dart';
@@ -34,12 +34,12 @@ import 'windows/native_assets.dart';
/// If any of the dependencies change, then the Dart build should be performed
/// again.
final class DartBuildResult {
const DartBuildResult({required this.codeAssets, required this.dependencies});
const DartBuildResult(this.codeAssets, this.dependencies);
const DartBuildResult.empty()
: codeAssets = const <NativeCodeAssetImpl>[],
: codeAssets = const <CodeAsset>[],
dependencies = const <Uri>[];
final List<NativeCodeAssetImpl> codeAssets;
final List<CodeAsset> codeAssets;
final List<Uri> dependencies;
}
@@ -109,7 +109,7 @@ Future<(DartBuildResult, Uri)> runFlutterSpecificDartBuild({
final String? codesignIdentity =
environmentDefines[build_info.kCodesignIdentity];
final Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocations =
final Map<CodeAsset, KernelAsset> assetTargetLocations =
_assetTargetLocationsForOS(
targetOS, result.codeAssets, flutterTester, buildUri);
await _copyNativeCodeAssetsForOS(targetOS, buildUri, buildMode, fileSystem,
@@ -130,8 +130,8 @@ Future<Uri?> runFlutterSpecificDartDryRunOnPlatforms({
return null;
}
final Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocations =
<NativeCodeAssetImpl, KernelAsset>{};
final Map<CodeAsset, KernelAsset> assetTargetLocations =
<CodeAsset, KernelAsset>{};
for (final build_info.TargetPlatform targetPlatform in targetPlatforms) {
// This dry-run functionality is only used in the `flutter run`
// implementation (not in `flutter build` or `flutter test`).
@@ -142,7 +142,7 @@ Future<Uri?> runFlutterSpecificDartDryRunOnPlatforms({
final bool flutterTester =
targetPlatform == build_info.TargetPlatform.tester;
final OSImpl targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform);
final OS targetOS = _getNativeOSFromTargetPlatfrorm(targetPlatform);
if (targetOS != OS.macOS &&
targetOS != OS.windows &&
targetOS != OS.linux &&
@@ -194,48 +194,48 @@ abstract interface class FlutterNativeAssetsBuildRunner {
Future<List<Package>> packagesWithNativeAssets();
/// Runs all [packagesWithNativeAssets] `build.dart` in dry run.
Future<BuildDryRunResult> buildDryRun({
Future<BuildDryRunResult?> buildDryRun({
required List<String> supportedAssetTypes,
required BuildConfigCreator configCreator,
required BuildValidator buildValidator,
required bool includeParentEnvironment,
required LinkModePreferenceImpl linkModePreference,
required OSImpl targetOS,
required OS targetOS,
required Uri workingDirectory,
});
/// Runs all [packagesWithNativeAssets] `build.dart`.
Future<BuildResult> build({
Future<BuildResult?> build({
required List<String> supportedAssetTypes,
required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator,
required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
CCompilerConfigImpl? cCompilerConfig,
int? targetAndroidNdkApi,
int? targetIOSVersion,
int? targetMacOSVersion,
IOSSdkImpl? targetIOSSdkImpl,
required bool linkingEnabled,
});
/// Runs all [packagesWithNativeAssets] `link.dart`.
Future<LinkResult> link({
Future<LinkResult?> link({
required List<String> supportedAssetTypes,
required LinkConfigValidator configValidator,
required LinkConfigCreator configCreator,
required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
required BuildResult buildResult,
CCompilerConfigImpl? cCompilerConfig,
int? targetAndroidNdkApi,
int? targetIOSVersion,
int? targetMacOSVersion,
IOSSdkImpl? targetIOSSdkImpl,
});
/// The C compiler config to use for compilation.
Future<CCompilerConfigImpl> get cCompilerConfig;
Future<CCompilerConfig> get cCompilerConfig;
/// The NDK compiler to use to use for compilation for Android.
Future<CCompilerConfigImpl> get ndkCCompilerConfigImpl;
Future<CCompilerConfig> get ndkCCompilerConfig;
}
/// Uses `package:native_assets_builder` for its implementation.
@@ -294,10 +294,12 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
}
@override
Future<BuildDryRunResult> buildDryRun({
Future<BuildDryRunResult?> buildDryRun({
required List<String> supportedAssetTypes,
required BuildConfigCreator configCreator,
required BuildValidator buildValidator,
required bool includeParentEnvironment,
required LinkModePreferenceImpl linkModePreference,
required OSImpl targetOS,
required OS targetOS,
required Uri workingDirectory,
}) {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
@@ -305,8 +307,10 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
Uri.file(packageConfigPath),
);
return _buildRunner.buildDryRun(
supportedAssetTypes: supportedAssetTypes,
configCreator: configCreator,
buildValidator: buildValidator,
includeParentEnvironment: includeParentEnvironment,
linkModePreference: linkModePreference,
targetOS: targetOS,
workingDirectory: workingDirectory,
packageLayout: packageLayout,
@@ -315,17 +319,16 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
}
@override
Future<BuildResult> build({
Future<BuildResult?> build({
required List<String> supportedAssetTypes,
required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator,
required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
CCompilerConfigImpl? cCompilerConfig,
int? targetIOSVersion,
int? targetMacOSVersion,
int? targetAndroidNdkApi,
IOSSdkImpl? targetIOSSdkImpl,
required bool linkingEnabled,
}) {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
@@ -333,57 +336,54 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
Uri.file(packageConfigPath),
);
return _buildRunner.build(
supportedAssetTypes: supportedAssetTypes,
configCreator: configCreator,
configValidator: configValidator,
buildValidator: buildValidator,
applicationAssetValidator: applicationAssetValidator,
buildMode: buildMode,
cCompilerConfig: cCompilerConfig,
includeParentEnvironment: includeParentEnvironment,
linkModePreference: linkModePreference,
target: target,
targetAndroidNdkApi: targetAndroidNdkApi,
targetIOSSdk: targetIOSSdkImpl,
targetOS: targetOS,
workingDirectory: workingDirectory,
packageLayout: packageLayout,
targetIOSVersion: targetIOSVersion,
targetMacOSVersion: targetMacOSVersion,
linkingEnabled: linkingEnabled,
);
}
@override
Future<LinkResult> link({
Future<LinkResult?> link({
required List<String> supportedAssetTypes,
required LinkConfigValidator configValidator,
required LinkConfigCreator configCreator,
required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
required BuildResult buildResult,
CCompilerConfigImpl? cCompilerConfig,
int? targetAndroidNdkApi,
int? targetIOSVersion,
int? targetMacOSVersion,
IOSSdkImpl? targetIOSSdkImpl,
}) {
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
packageConfig,
Uri.file(packageConfigPath),
);
return _buildRunner.link(
supportedAssetTypes: supportedAssetTypes,
configCreator: configCreator,
configValidator: configValidator,
linkValidator: linkValidator,
applicationAssetValidator: applicationAssetValidator,
buildMode: buildMode,
cCompilerConfig: cCompilerConfig,
includeParentEnvironment: includeParentEnvironment,
linkModePreference: linkModePreference,
target: target,
targetAndroidNdkApi: targetAndroidNdkApi,
targetIOSSdk: targetIOSSdkImpl,
targetOS: targetOS,
workingDirectory: workingDirectory,
packageLayout: packageLayout,
buildResult: buildResult,
targetIOSVersion: targetIOSVersion,
targetMacOSVersion: targetMacOSVersion,
);
}
@override
late final Future<CCompilerConfigImpl> cCompilerConfig = () {
late final Future<CCompilerConfig> cCompilerConfig = () {
if (globals.platform.isMacOS || globals.platform.isIOS) {
return cCompilerConfigMacOS();
}
@@ -400,7 +400,7 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
}();
@override
late final Future<CCompilerConfigImpl> ndkCCompilerConfigImpl = () {
late final Future<CCompilerConfig> ndkCCompilerConfig = () {
return cCompilerConfigAndroid();
}();
}
@@ -423,14 +423,14 @@ Future<Uri> writeNativeAssetsYaml(
}
/// Select the native asset build mode for a given Flutter build mode.
BuildModeImpl _nativeAssetsBuildMode(build_info.BuildMode buildMode) {
BuildMode _nativeAssetsBuildMode(build_info.BuildMode buildMode) {
switch (buildMode) {
case build_info.BuildMode.debug:
return BuildModeImpl.debug;
return BuildMode.debug;
case build_info.BuildMode.jitRelease:
case build_info.BuildMode.profile:
case build_info.BuildMode.release:
return BuildModeImpl.release;
return BuildMode.release;
}
}
@@ -448,7 +448,6 @@ Future<bool> _hasNoPackageConfig(FlutterNativeAssetsBuildRunner buildRunner) asy
return !packageConfigExists;
}
Future<bool> _nativeBuildRequired(FlutterNativeAssetsBuildRunner buildRunner) async {
if (await _hasNoPackageConfig(buildRunner)) {
return false;
@@ -547,7 +546,6 @@ class HotRunnerNativeAssetsBuilderImpl implements HotRunnerNativeAssetsBuilder {
}
}
/// With `flutter run -d all` we need a place to store the native assets
/// mapping for multiple OSes combined.
Uri _buildUriMultiple(Uri projectUri) {
@@ -555,12 +553,12 @@ Uri _buildUriMultiple(Uri projectUri) {
return projectUri.resolve('$buildDir/native_assets/multiple/');
}
Map<NativeCodeAssetImpl, KernelAsset> _assetTargetLocationsWindowsLinux(
List<NativeCodeAssetImpl> assets,
Map<CodeAsset, KernelAsset> _assetTargetLocationsWindowsLinux(
List<CodeAsset> assets,
Uri? absolutePath,
) {
return <NativeCodeAssetImpl, KernelAsset>{
for (final NativeCodeAssetImpl asset in assets)
return <CodeAsset, KernelAsset>{
for (final CodeAsset asset in assets)
asset: _targetLocationSingleArchitecture(
asset,
absolutePath,
@@ -569,7 +567,7 @@ Map<NativeCodeAssetImpl, KernelAsset> _assetTargetLocationsWindowsLinux(
}
KernelAsset _targetLocationSingleArchitecture(
NativeCodeAssetImpl asset, Uri? absolutePath) {
CodeAsset asset, Uri? absolutePath) {
final LinkMode linkMode = asset.linkMode;
final KernelAssetPath kernelAssetPath;
switch (linkMode) {
@@ -604,8 +602,8 @@ KernelAsset _targetLocationSingleArchitecture(
);
}
Map<NativeCodeAssetImpl, KernelAsset> _assetTargetLocationsForOS(OS targetOS,
List<NativeCodeAssetImpl> codeAssets, bool flutterTester, Uri buildUri) {
Map<CodeAsset, KernelAsset> _assetTargetLocationsForOS(
OS targetOS, List<CodeAsset> codeAssets, bool flutterTester, Uri buildUri) {
switch (targetOS) {
case OS.windows:
case OS.linux:
@@ -628,11 +626,10 @@ Future<void> _copyNativeCodeAssetsForOS(
Uri buildUri,
build_info.BuildMode buildMode,
FileSystem fileSystem,
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocations,
Map<CodeAsset, KernelAsset> assetTargetLocations,
String? codesignIdentity,
bool flutterTester) async {
final List<NativeCodeAssetImpl> codeAssets =
assetTargetLocations.keys.toList();
final List<CodeAsset> codeAssets = assetTargetLocations.keys.toList();
switch (targetOS) {
case OS.windows:
case OS.linux:
@@ -687,7 +684,7 @@ Future<DartBuildResult> _runDartBuild({
required FlutterNativeAssetsBuildRunner buildRunner,
required List<Target> targets,
required Uri projectUri,
required BuildModeImpl buildMode,
required BuildMode buildMode,
required FileSystem fileSystem,
required OS targetOS,
}) async {
@@ -697,7 +694,7 @@ Future<DartBuildResult> _runDartBuild({
: targets.toList().toString();
globals.logger
.printTrace('Building native assets for $targetString $buildMode.');
final List<Asset> assets = <Asset>[];
final List<EncodedAsset> assets = <EncodedAsset>[];
final Set<Uri> dependencies = <Uri>{};
final build_info.EnvironmentType? environmentType;
if (targetOS == OS.iOS) {
@@ -710,8 +707,8 @@ Future<DartBuildResult> _runDartBuild({
environmentType = null;
}
final CCompilerConfigImpl cCompilerConfig = targetOS == OS.android
? await buildRunner.ndkCCompilerConfigImpl
final CCompilerConfig cCompilerConfig = targetOS == OS.android
? await buildRunner.ndkCCompilerConfig
: await buildRunner.cCompilerConfig;
final String? codesignIdentity = environmentDefines[build_info.kCodesignIdentity];
@@ -720,81 +717,122 @@ Future<DartBuildResult> _runDartBuild({
final int? androidNdkApi = targetOS == OS.android ? targetAndroidNdkApi(environmentDefines) : null;
final int? iOSVersion = targetOS == OS.iOS ? targetIOSVersion : null;
final int? macOSVersion = targetOS == OS.macOS ? targetMacOSVersion : null;
final IOSSdkImpl? iOSSdkImpl = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null;
final IOSSdk? iOSSdk = targetOS == OS.iOS ? getIOSSdk(environmentType!) : null;
for (final Target target in targets) {
final BuildResult buildResult = await buildRunner.build(
linkModePreference: LinkModePreferenceImpl.dynamic,
target: target,
final BuildResult? buildResult = await buildRunner.build(
supportedAssetTypes: <String>[CodeAsset.type],
configCreator: () => BuildConfigBuilder()
..setupCodeConfig(
targetArchitecture: target.architecture,
linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
targetIOSVersion: iOSVersion,
targetMacOSVersion: macOSVersion,
targetIOSSdk: iOSSdk,
),
configValidator: (BuildConfig config) async => <String>[
...await validateCodeAssetBuildConfig(config),
],
buildValidator: (BuildConfig config, BuildOutput output) async => <String>[
...await validateCodeAssetBuildOutput(config, output),
],
applicationAssetValidator: (List<EncodedAsset> assets) async => <String>[
...await validateCodeAssetInApplication(assets),
],
targetOS: target.os,
buildMode: buildMode,
workingDirectory: projectUri,
includeParentEnvironment: true,
linkingEnabled: linkingEnabled,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
targetIOSVersion: iOSVersion,
targetMacOSVersion: macOSVersion,
targetIOSSdkImpl: iOSSdkImpl,
);
if (!buildResult.success) {
if (buildResult == null) {
_throwNativeAssetsBuildFailed();
}
assets.addAll(buildResult.assets);
assets.addAll(buildResult.encodedAssets);
dependencies.addAll(buildResult.dependencies);
if (linkingEnabled) {
final LinkResult linkResult = await buildRunner.link(
linkModePreference: LinkModePreferenceImpl.dynamic,
target: target,
buildMode: buildMode,
final LinkResult? linkResult = await buildRunner.link(
supportedAssetTypes: <String>[CodeAsset.type],
configCreator: () => LinkConfigBuilder()
..setupCodeConfig(
targetArchitecture: target.architecture,
linkModePreference: LinkModePreference.dynamic,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
targetIOSVersion: iOSVersion,
targetMacOSVersion: macOSVersion,
targetIOSSdk: iOSSdk,
),
configValidator: (LinkConfig config) async => <String>[
...await validateCodeAssetLinkConfig(config),
],
linkValidator: (LinkConfig config, LinkOutput output) async => <String>[
...await validateCodeAssetLinkOutput(config, output),
],
applicationAssetValidator: (List<EncodedAsset> assets) async => <String>[
...await validateCodeAssetInApplication(assets),
],
workingDirectory: projectUri,
includeParentEnvironment: true,
buildResult: buildResult,
cCompilerConfig: cCompilerConfig,
targetAndroidNdkApi: androidNdkApi,
targetIOSVersion: iOSVersion,
targetMacOSVersion: macOSVersion,
targetIOSSdkImpl: iOSSdkImpl,
targetOS: targetOS,
buildMode: buildMode,
);
if (!linkResult.success) {
if (linkResult == null) {
_throwNativeAssetsLinkFailed();
}
assets.addAll(linkResult.assets);
assets.addAll(linkResult.encodedAssets);
dependencies.addAll(linkResult.dependencies);
}
}
final List<NativeCodeAssetImpl> codeAssets =
assets.whereType<NativeCodeAssetImpl>().toList();
final List<CodeAsset> codeAssets = assets
.where((EncodedAsset asset) => asset.type == CodeAsset.type)
.map<CodeAsset>(CodeAsset.fromEncoded)
.toList();
globals.logger
.printTrace('Building native assets for $targetString $buildMode done.');
return DartBuildResult(codeAssets: codeAssets, dependencies: dependencies.toList());
return DartBuildResult(codeAssets, dependencies.toList());
}
Future<DartBuildResult> _runDartDryRunBuild({
required FlutterNativeAssetsBuildRunner buildRunner,
required Uri projectUri,
required FileSystem fileSystem,
required OSImpl targetOS,
required OS targetOS,
}) async {
globals.logger.printTrace('Dry running native assets for $targetOS.');
final List<Asset> assets = <Asset>[];
final List<EncodedAsset> assets = <EncodedAsset>[];
final Set<Uri> dependencies = <Uri>{};
final BuildDryRunResult buildResult = await buildRunner.buildDryRun(
linkModePreference: LinkModePreferenceImpl.dynamic,
targetOS: targetOS,
final BuildDryRunResult? buildResult = await buildRunner.buildDryRun(
supportedAssetTypes: <String>[CodeAsset.type],
configCreator: () => BuildConfigBuilder()
..setupCodeConfig(
targetArchitecture: null,
linkModePreference: LinkModePreference.dynamic,
),
buildValidator: (BuildConfig config, BuildOutput output) async => <String>[
...await validateCodeAssetBuildOutput(config, output),
],
workingDirectory: projectUri,
targetOS: targetOS,
includeParentEnvironment: true,
);
if (!buildResult.success) {
if (buildResult == null) {
_throwNativeAssetsBuildDryRunFailed();
}
assets.addAll(buildResult.assets);
assets.addAll(buildResult.encodedAssets);
final List<NativeCodeAssetImpl> codeAssets =
assets.whereType<NativeCodeAssetImpl>().toList();
final List<CodeAsset> codeAssets = assets
.where((EncodedAsset asset) => asset.type == CodeAsset.type)
.map<CodeAsset>(CodeAsset.fromEncoded)
.toList();
globals.logger.printTrace('Dry running native assets for $targetOS done.');
return DartBuildResult(codeAssets: codeAssets, dependencies: dependencies.toList());
return DartBuildResult(
_expandCodeAssetsToAllArchitectures(codeAssets),
dependencies.toList());
}
List<Target> _targetsForOS(build_info.TargetPlatform targetPlatform,
@@ -865,7 +903,7 @@ Target _getNativeTarget(build_info.TargetPlatform targetPlatform) {
Future<void> _copyNativeCodeAssetsToBundleOnWindowsLinux(
Uri buildUri,
Map<NativeCodeAssetImpl, KernelAsset> assetTargetLocations,
Map<CodeAsset, KernelAsset> assetTargetLocations,
build_info.BuildMode buildMode,
FileSystem fileSystem,
) async {
@@ -876,7 +914,7 @@ Future<void> _copyNativeCodeAssetsToBundleOnWindowsLinux(
if (!buildDir.existsSync()) {
buildDir.createSync(recursive: true);
}
for (final MapEntry<NativeCodeAssetImpl, KernelAsset> assetMapping in assetTargetLocations.entries) {
for (final MapEntry<CodeAsset, KernelAsset> assetMapping in assetTargetLocations.entries) {
final Uri source = assetMapping.key.file!;
final Uri target = (assetMapping.value.path as KernelAssetAbsolutePath).uri;
final Uri targetUri = buildUri.resolveUri(target);
@@ -906,35 +944,34 @@ Never _throwNativeAssetsLinkFailed() {
);
}
OSImpl _getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) {
OS _getNativeOSFromTargetPlatfrorm(build_info.TargetPlatform platform) {
switch (platform) {
case build_info.TargetPlatform.ios:
return OSImpl.iOS;
return OS.iOS;
case build_info.TargetPlatform.darwin:
return OSImpl.macOS;
return OS.macOS;
case build_info.TargetPlatform.linux_x64:
case build_info.TargetPlatform.linux_arm64:
return OSImpl.linux;
return OS.linux;
case build_info.TargetPlatform.windows_x64:
case build_info.TargetPlatform.windows_arm64:
return OSImpl.windows;
return OS.windows;
case build_info.TargetPlatform.fuchsia_arm64:
case build_info.TargetPlatform.fuchsia_x64:
return OSImpl.fuchsia;
return OS.fuchsia;
case build_info.TargetPlatform.android:
case build_info.TargetPlatform.android_arm:
case build_info.TargetPlatform.android_arm64:
case build_info.TargetPlatform.android_x64:
case build_info.TargetPlatform.android_x86:
return OSImpl.android;
return OS.android;
case build_info.TargetPlatform.tester:
if (const LocalPlatform().isMacOS) {
return OSImpl.macOS;
return OS.macOS;
} else if (const LocalPlatform().isLinux) {
return OSImpl.linux;
return OS.linux;
} else if (const LocalPlatform().isWindows) {
return OSImpl.windows;
return OS.windows;
} else {
throw StateError('Unknown operating system');
}
@@ -984,3 +1021,52 @@ String? _emptyToNull(String? input) {
}
return input;
}
List<CodeAsset> _expandCodeAssetsToAllArchitectures(List<CodeAsset> codeAssets) {
assert(codeAssets.every((CodeAsset asset) => asset.architecture == null));
return <CodeAsset>[
for (final CodeAsset codeAsset in codeAssets)
for (final Architecture architecture in codeAsset.os.architectures)
codeAsset.copyWith(architecture: architecture),
];
}
extension OSArchitectures on OS {
Set<Architecture> get architectures => _osTargets[this]!;
}
const Map<OS, Set<Architecture>> _osTargets = <OS, Set<Architecture>>{
OS.android: <Architecture>{
Architecture.arm,
Architecture.arm64,
Architecture.ia32,
Architecture.x64,
Architecture.riscv64,
},
OS.fuchsia: <Architecture>{
Architecture.arm64,
Architecture.x64,
},
OS.iOS: <Architecture>{
Architecture.arm,
Architecture.arm64,
Architecture.x64,
},
OS.linux: <Architecture>{
Architecture.arm,
Architecture.arm64,
Architecture.ia32,
Architecture.riscv32,
Architecture.riscv64,
Architecture.x64,
},
OS.macOS: <Architecture>{
Architecture.arm64,
Architecture.x64,
},
OS.windows: <Architecture>{
Architecture.arm64,
Architecture.ia32,
Architecture.x64,
},
};

View File

@@ -2,12 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../globals.dart' as globals;
import '../../../windows/visual_studio.dart';
Future<CCompilerConfigImpl> cCompilerConfigWindows() async {
Future<CCompilerConfig> cCompilerConfigWindows() async {
final VisualStudio visualStudio = VisualStudio(
fileSystem: globals.fs,
platform: globals.platform,
@@ -16,7 +16,7 @@ Future<CCompilerConfigImpl> cCompilerConfigWindows() async {
osUtils: globals.os,
);
return CCompilerConfigImpl(
return CCompilerConfig(
compiler: _toOptionalFileUri(visualStudio.clPath),
linker: _toOptionalFileUri(visualStudio.linkPath),
archiver: _toOptionalFileUri(visualStudio.libPath),

View File

@@ -23,8 +23,8 @@ const Map<String, String> kManuallyPinnedDependencies = <String, String>{
'flutter_gallery_assets': '1.0.2', // Tests depend on the exact version.
'flutter_template_images': '4.2.0', // Must always exactly match flutter_tools template.
'google_mobile_ads': '5.1.0', // https://github.com/flutter/flutter/issues/156912
'native_assets_builder': '0.8.3', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
'native_assets_cli': '0.8.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
'native_assets_builder': '0.9.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
'native_assets_cli': '0.9.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.
'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

View File

@@ -54,10 +54,9 @@ dependencies:
async: 2.11.0
unified_analytics: 6.1.4
cli_config: 0.2.0
graphs: 2.3.2
native_assets_builder: 0.8.3
native_assets_cli: 0.8.0
native_assets_builder: 0.9.0
native_assets_cli: 0.9.0
# We depend on very specific internal implementation details of the
# 'test' package, which change between versions, so when upgrading
@@ -122,4 +121,4 @@ dartdoc:
# Exclude this package from the hosted API docs.
nodoc: true
# PUBSPEC CHECKSUM: 3825
# PUBSPEC CHECKSUM: 2ec9

View File

@@ -7,10 +7,9 @@ environment:
sdk: {{dartSdkVersionBounds}}
dependencies:
cli_config: ^0.2.0
logging: ^1.2.0
native_assets_cli: ^0.8.0
native_toolchain_c: ^0.5.4
native_assets_cli: ^0.9.0
native_toolchain_c: ^0.6.0
dev_dependencies:
ffi: ^2.1.3

View File

@@ -16,7 +16,7 @@ import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart';
@@ -71,13 +71,14 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
buildResult: FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.android,
architecture: ArchitectureImpl.arm64,
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.android,
architecture: Architecture.arm64,
file: Uri.file('libbar.so'),
),
],
@@ -182,6 +183,6 @@ class _BuildRunnerWithoutNdk extends FakeFlutterNativeAssetsBuildRunner {
});
@override
Future<CCompilerConfigImpl> get ndkCCompilerConfigImpl async =>
Future<CCompilerConfig> get ndkCCompilerConfig async =>
throwToolExit('Android NDK Clang could not be found.');
}

View File

@@ -13,8 +13,8 @@ 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/features.dart';
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart'
as native_assets_cli;
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
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 '../../../../src/common.dart';
@@ -192,13 +192,14 @@ void main() {
final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
packagesWithNativeAssetsResult: <Package>[Package('foo', iosEnvironment.buildDir.uri)],
buildResult: FakeFlutterNativeAssetsBuilderResult(
assets: <native_assets_cli.AssetImpl>[
native_assets_cli.NativeCodeAssetImpl(
id: 'package:foo/foo.dart',
linkMode: native_assets_cli.DynamicLoadingBundledImpl(),
os: native_assets_cli.OSImpl.iOS,
architecture: native_assets_cli.ArchitectureImpl.arm64,
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'foo',
name: 'foo.dart',
linkMode: DynamicLoadingBundled(),
os: OS.iOS,
architecture: Architecture.arm64,
file: Uri.file('foo.framework/foo'),
),
],
@@ -255,14 +256,15 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('foo', androidEnvironment.buildDir.uri)
],
buildResult: FakeFlutterNativeAssetsBuilderResult(
assets: <native_assets_cli.AssetImpl>[
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
if (hasAssets)
native_assets_cli.NativeCodeAssetImpl(
id: 'package:foo/foo.dart',
linkMode: native_assets_cli.DynamicLoadingBundledImpl(),
os: native_assets_cli.OSImpl.android,
architecture: native_assets_cli.ArchitectureImpl.arm64,
CodeAsset(
package: 'foo',
name: 'foo.dart',
linkMode: DynamicLoadingBundled(),
os: OS.android,
architecture: Architecture.arm64,
file: Uri.file('libfoo.so'),
),
],
@@ -274,7 +276,7 @@ void main() {
await NativeAssets(buildRunner: buildRunner).build(androidEnvironment);
expect(
buildRunner.lastBuildMode,
native_assets_cli.BuildModeImpl.release,
native_assets_cli.BuildMode.release,
);
},
);

View File

@@ -4,13 +4,12 @@
import 'package:file/file.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/build_info.dart' hide BuildMode;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart';
import 'package:native_assets_builder/native_assets_builder.dart'
as native_assets_builder;
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_builder/native_assets_builder.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config_types.dart';
/// Mocks all logic instead of using `package:native_assets_builder`, which
@@ -24,71 +23,96 @@ class FakeFlutterNativeAssetsBuildRunner
this.buildDryRunResult = const FakeFlutterNativeAssetsBuilderResult(),
this.buildResult = const FakeFlutterNativeAssetsBuilderResult(),
this.linkResult = const FakeFlutterNativeAssetsBuilderResult(),
CCompilerConfigImpl? cCompilerConfigResult,
CCompilerConfigImpl? ndkCCompilerConfigImplResult,
}) : cCompilerConfigResult = cCompilerConfigResult ?? CCompilerConfigImpl(),
ndkCCompilerConfigImplResult =
ndkCCompilerConfigImplResult ?? CCompilerConfigImpl();
CCompilerConfig? cCompilerConfigResult,
CCompilerConfig? ndkCCompilerConfigResult,
}) : cCompilerConfigResult = cCompilerConfigResult ?? CCompilerConfig(),
ndkCCompilerConfigResult =
ndkCCompilerConfigResult ?? CCompilerConfig();
final native_assets_builder.BuildResult Function(Target)? onBuild;
final native_assets_builder.BuildResult buildResult;
final native_assets_builder.LinkResult linkResult;
final native_assets_builder.BuildDryRunResult buildDryRunResult;
final BuildResult? Function(BuildConfig)? onBuild;
final BuildResult? buildResult;
final LinkResult? linkResult;
final BuildDryRunResult? buildDryRunResult;
final bool hasPackageConfigResult;
final List<Package> packagesWithNativeAssetsResult;
final CCompilerConfigImpl cCompilerConfigResult;
final CCompilerConfigImpl ndkCCompilerConfigImplResult;
final CCompilerConfig cCompilerConfigResult;
final CCompilerConfig ndkCCompilerConfigResult;
int buildInvocations = 0;
int buildDryRunInvocations = 0;
int linkInvocations = 0;
int hasPackageConfigInvocations = 0;
int packagesWithNativeAssetsInvocations = 0;
BuildModeImpl? lastBuildMode;
BuildMode? lastBuildMode;
@override
Future<native_assets_builder.BuildResult> build({
Future<BuildResult?> build({
required List<String> supportedAssetTypes,
required BuildConfigValidator configValidator,
required BuildConfigCreator configCreator,
required BuildValidator buildValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
CCompilerConfigImpl? cCompilerConfig,
int? targetAndroidNdkApi,
int? targetIOSVersion,
int? targetMacOSVersion,
IOSSdkImpl? targetIOSSdkImpl,
required bool linkingEnabled,
}) async {
buildInvocations++;
lastBuildMode = buildMode;
return onBuild?.call(target) ?? buildResult;
BuildResult? result = buildResult;
for (final Package package in packagesWithNativeAssetsResult) {
final BuildConfigBuilder configBuilder = configCreator()
..setupHookConfig(
packageRoot: package.root,
packageName: package.name,
targetOS: targetOS,
supportedAssetTypes: supportedAssetTypes,
buildMode: buildMode,
)
..setupBuildConfig(
dryRun: false,
linkingEnabled: linkingEnabled,
)
..setupBuildRunConfig(
outputDirectory: Uri.parse('build-out-dir'),
outputDirectoryShared: Uri.parse('build-out-dir-shared'),
);
final BuildConfig buildConfig = BuildConfig(configBuilder.json);
if (onBuild != null) {
result = onBuild!(buildConfig);
}
lastBuildMode = buildConfig.buildMode;
buildInvocations++;
}
return result;
}
@override
Future<native_assets_builder.LinkResult> link({
Future<LinkResult?> link({
required List<String> supportedAssetTypes,
required LinkConfigCreator configCreator,
required LinkConfigValidator configValidator,
required LinkValidator linkValidator,
required ApplicationAssetValidator applicationAssetValidator,
required bool includeParentEnvironment,
required BuildModeImpl buildMode,
required LinkModePreferenceImpl linkModePreference,
required Target target,
required BuildMode buildMode,
required OS targetOS,
required Uri workingDirectory,
required native_assets_builder.BuildResult buildResult,
CCompilerConfigImpl? cCompilerConfig,
int? targetAndroidNdkApi,
int? targetIOSVersion,
int? targetMacOSVersion,
IOSSdkImpl? targetIOSSdkImpl,
required BuildResult buildResult,
}) async {
linkInvocations++;
lastBuildMode = buildMode;
for (final Package _ in packagesWithNativeAssetsResult) {
lastBuildMode = buildMode;
linkInvocations++;
}
return linkResult;
}
@override
Future<native_assets_builder.BuildDryRunResult> buildDryRun({
Future<BuildDryRunResult?> buildDryRun({
required List<String> supportedAssetTypes,
required ConfigCreator configCreator,
required BuildValidator buildValidator,
required bool includeParentEnvironment,
required LinkModePreferenceImpl linkModePreference,
required OSImpl targetOS,
required OS targetOS,
required Uri workingDirectory,
}) async {
buildDryRunInvocations++;
@@ -108,37 +132,38 @@ class FakeFlutterNativeAssetsBuildRunner
}
@override
Future<CCompilerConfigImpl> get cCompilerConfig async =>
cCompilerConfigResult;
Future<CCompilerConfig> get cCompilerConfig async => cCompilerConfigResult;
@override
Future<CCompilerConfigImpl> get ndkCCompilerConfigImpl async =>
cCompilerConfigResult;
Future<CCompilerConfig> get ndkCCompilerConfig async => cCompilerConfigResult;
}
final class FakeFlutterNativeAssetsBuilderResult
implements
native_assets_builder.BuildResult,
native_assets_builder.BuildDryRunResult,
native_assets_builder.LinkResult {
implements BuildResult, BuildDryRunResult, LinkResult {
const FakeFlutterNativeAssetsBuilderResult({
this.assets = const <AssetImpl>[],
this.assetsForLinking = const <String, List<AssetImpl>>{},
this.encodedAssets = const <EncodedAsset>[],
this.encodedAssetsForLinking = const <String, List<EncodedAsset>>{},
this.dependencies = const <Uri>[],
this.success = true,
});
@override
final List<AssetImpl> assets;
factory FakeFlutterNativeAssetsBuilderResult.fromAssets({
List<CodeAsset> codeAssets = const <CodeAsset>[],
List<Uri> dependencies = const <Uri>[],
}) {
return FakeFlutterNativeAssetsBuilderResult(
encodedAssets: <EncodedAsset>[
for (final CodeAsset codeAsset in codeAssets) codeAsset.encode(),
], dependencies: dependencies);
}
@override
final Map<String, List<AssetImpl>> assetsForLinking;
final List<EncodedAsset> encodedAssets;
@override
final Map<String, List<EncodedAsset>> encodedAssetsForLinking;
@override
final List<Uri> dependencies;
@override
final bool success;
}
class FakeHotRunnerNativeAssetsBuilder implements HotRunnerNativeAssetsBuilder {

View File

@@ -13,8 +13,7 @@ import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/resident_devtools_handler.dart';
import 'package:flutter_tools/src/resident_runner.dart';
import 'package:flutter_tools/src/run_hot.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart'
hide Target;
import 'package:native_assets_cli/code_assets_builder.dart';
import 'package:package_config/package_config.dart';
import 'package:unified_analytics/unified_analytics.dart';
@@ -62,20 +61,22 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', fileSystem.currentDirectory.uri),
],
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.macOS,
architecture: ArchitectureImpl.arm64,
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.macOS,
architecture: Architecture.arm64,
file: Uri.file('bar.dylib'),
),
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.macOS,
architecture: ArchitectureImpl.x64,
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.macOS,
architecture: Architecture.x64,
file: Uri.file('bar.dylib'),
),
],
@@ -131,20 +132,22 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', fileSystem.currentDirectory.uri),
],
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.macOS,
architecture: ArchitectureImpl.arm64,
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.macOS,
architecture: Architecture.arm64,
file: Uri.file('bar.dylib'),
),
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.macOS,
architecture: ArchitectureImpl.x64,
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.macOS,
architecture: Architecture.x64,
file: Uri.file('bar.dylib'),
),
],

View File

@@ -14,9 +14,7 @@ import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart' hide Target;
import 'package:native_assets_cli/native_assets_cli_internal.dart'
as native_assets_cli;
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart';
@@ -168,22 +166,24 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
onBuild: (native_assets_cli.Target target) =>
FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: target.os,
architecture: target.architecture,
file: Uri.file('${target.architecture}/libbar.dylib'),
onBuild: (BuildConfig config) =>
FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: config.targetOS,
architecture: config.codeConfig.targetArchitecture,
file: Uri.file('${config.codeConfig.targetArchitecture}/libbar.dylib'),
),
NativeCodeAssetImpl(
id: 'package:buz/buz.dart',
linkMode: DynamicLoadingBundledImpl(),
os: target.os,
architecture: target.architecture,
file: Uri.file('${target.architecture}/libbuz.dylib'),
CodeAsset(
package: 'buz',
name: 'buz.dart',
linkMode: DynamicLoadingBundled(),
os: config.targetOS,
architecture: config.codeConfig.targetArchitecture,
file: Uri.file('${config.codeConfig.targetArchitecture}/libbuz.dylib'),
),
],
),

View File

@@ -15,8 +15,7 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart'
hide Target;
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart';
@@ -112,13 +111,13 @@ void main() {
);
final FlutterNativeAssetsBuildRunner runner =
FlutterNativeAssetsBuildRunnerImpl(projectUri, packageConfigFile.path, packageConfig, fileSystem, logger);
final CCompilerConfigImpl result = await runner.cCompilerConfig;
final CCompilerConfig result = await runner.cCompilerConfig;
expect(result.compiler, Uri.file('/some/path/to/clang'));
});
}
class _BuildRunnerWithoutClang extends FakeFlutterNativeAssetsBuildRunner {
@override
Future<CCompilerConfigImpl> get cCompilerConfig async =>
Future<CCompilerConfig> get cCompilerConfig async =>
throwToolExit('Failed to find clang++ on the PATH.');
}

View File

@@ -3,7 +3,7 @@
// found in the LICENSE file.
import 'package:flutter_tools/src/isolated/native_assets/macos/native_assets_host.dart';
import 'package:native_assets_cli/native_assets_cli.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../../src/common.dart';

View File

@@ -14,9 +14,7 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart' hide Target;
import 'package:native_assets_cli/native_assets_cli_internal.dart'
as native_assets_cli;
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:package_config/package_config_types.dart';
import '../../../src/common.dart';
@@ -50,7 +48,7 @@ void main() {
});
for (final bool flutterTester in <bool>[false, true]) {
final bool isArm64 = native_assets_cli.ArchitectureImpl.current == ArchitectureImpl.arm64;
final bool isArm64 = Architecture.current == Architecture.arm64;
String testName = '';
if (flutterTester) {
@@ -274,22 +272,24 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
onBuild: (native_assets_cli.Target target) =>
FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: target.os,
architecture: target.architecture,
file: Uri.file('${target.architecture}/libbar.dylib'),
onBuild: (BuildConfig config) =>
FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: config.targetOS,
architecture: config.codeConfig.targetArchitecture,
file: Uri.file('${config.codeConfig.targetArchitecture}/libbar.dylib'),
),
NativeCodeAssetImpl(
id: 'package:buz/buz.dart',
linkMode: DynamicLoadingBundledImpl(),
os: target.os,
architecture: target.architecture,
file: Uri.file('${target.architecture}/libbuz.dylib'),
CodeAsset(
package: 'buz',
name: 'buz.dart',
linkMode: DynamicLoadingBundled(),
os: config.targetOS,
architecture: config.codeConfig.targetArchitecture,
file: Uri.file('${config.codeConfig.targetArchitecture}/libbuz.dylib'),
),
],
),
@@ -395,7 +395,7 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault
fileSystem,
logger,
);
final CCompilerConfigImpl result = await runner.cCompilerConfig;
final CCompilerConfig result = await runner.cCompilerConfig;
expect(
result.compiler,
Uri.file(

View File

@@ -13,7 +13,7 @@ import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:package_config/package_config_types.dart';
import '../../src/common.dart';
@@ -144,13 +144,13 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.windows,
architecture: ArchitectureImpl.x64,
buildDryRunResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.windows,
file: Uri.file('bar.dll'),
),
],
@@ -259,9 +259,7 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
buildDryRunResult: const FakeFlutterNativeAssetsBuilderResult(
success: false,
),
buildDryRunResult: null,
),
),
throwsToolExit(
@@ -293,9 +291,7 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
buildResult: const FakeFlutterNativeAssetsBuilderResult(
success: false,
),
buildResult: null,
),
),
throwsToolExit(
@@ -304,5 +300,4 @@ void main() {
),
);
});
}

View File

@@ -14,7 +14,7 @@ import 'package:flutter_tools/src/dart/package_map.dart';
import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart' hide BuildMode;
import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli;
import 'package:package_config/package_config_types.dart';
@@ -81,13 +81,14 @@ void main() {
packagesWithNativeAssetsResult: <Package>[
Package('bar', projectUri),
],
buildResult: FakeFlutterNativeAssetsBuilderResult(
assets: <AssetImpl>[
NativeCodeAssetImpl(
id: 'package:bar/bar.dart',
linkMode: DynamicLoadingBundledImpl(),
os: OSImpl.windows,
architecture: ArchitectureImpl.x64,
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
codeAssets: <CodeAsset>[
CodeAsset(
package: 'bar',
name: 'bar.dart',
linkMode: DynamicLoadingBundled(),
os: OS.windows,
architecture: Architecture.x64,
file: dylibAfterCompiling.uri,
),
],
@@ -116,7 +117,7 @@ void main() {
]),
);
final String expectedDirectory = flutterTester
? native_assets_cli.OSImpl.current.toString()
? native_assets_cli.OS.current.toString()
: 'windows';
expect(nativeAssetsYaml,
flutterTester
@@ -246,7 +247,7 @@ void main() {
fileSystem,
logger,
);
final CCompilerConfigImpl result = await runner.cCompilerConfig;
final CCompilerConfig result = await runner.cCompilerConfig;
expect(
result.compiler?.toFilePath(),
msvcBinDir.childFile('cl.exe').uri.toFilePath(),

View File

@@ -19,7 +19,7 @@ import 'package:file/file.dart';
import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/os.dart';
import 'package:native_assets_cli/native_assets_cli_internal.dart';
import 'package:native_assets_cli/code_assets_builder.dart';
import '../../src/common.dart';
import '../test_utils.dart' show fileSystem, platform;
@@ -222,47 +222,6 @@ void main() {
});
});
}
// This could be an hermetic unit test if the native_assets_builder
// could mock process runs and file system.
// https://github.com/dart-lang/native/issues/90.
testWithoutContext('flutter build $buildSubcommand error on static libraries', () async {
await inTempDir((Directory tempDirectory) async {
final Directory packageDirectory = await createTestProject(packageName, tempDirectory);
final File buildDotDart =
packageDirectory.childDirectory('hook').childFile('build.dart');
final String buildDotDartContents = await buildDotDart.readAsString();
// Overrides the build to output static libraries.
final String buildDotDartContentsNew = buildDotDartContents.replaceFirst(
'await build(args, (config, output) async {',
'''
await build([
'-D${LinkModePreferenceImpl.configKey}=${LinkModePreferenceImpl.static}',
...args,
], (config, output) async {
''',
);
expect(buildDotDartContentsNew, isNot(buildDotDartContents));
await buildDotDart.writeAsString(buildDotDartContentsNew);
final Directory exampleDirectory = packageDirectory.childDirectory('example');
final ProcessResult result = processManager.runSync(
<String>[
flutterBin,
'build',
buildSubcommand,
if (buildSubcommand == 'ios') '--no-codesign',
'-v', // Requires verbose mode for error.
],
workingDirectory: exampleDirectory.path,
);
expect(
(result.stdout as String) + (result.stderr as String),
contains('has a link mode "static", which is not allowed by by the config link mode preference "dynamic"'),
);
expect(result.exitCode, isNot(0));
});
});
}
for (final String add2appBuildSubcommand in add2appBuildSubcommands) {
@@ -421,7 +380,7 @@ void expectDylibIsBundledIos(Directory appDirectory, String buildMode) {
/// Sample path: build/linux/x64/release/bundle/lib/libmy_package.so
void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) {
// Linux does not support cross compilation, so always only check current architecture.
final String architecture = ArchitectureImpl.current.dartPlatform;
final String architecture = Architecture.current.name;
final Directory appBundle = appDirectory
.childDirectory('build')
.childDirectory(hostOs)
@@ -432,7 +391,7 @@ void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) {
final Directory dylibsFolder = appBundle.childDirectory('lib');
expect(dylibsFolder, exists);
final File dylib =
dylibsFolder.childFile(OSImpl.linux.dylibFileName(packageName));
dylibsFolder.childFile(OS.linux.dylibFileName(packageName));
expect(dylib, exists);
}
@@ -441,7 +400,7 @@ void expectDylibIsBundledLinux(Directory appDirectory, String buildMode) {
/// Sample path: build\windows\x64\runner\Debug\my_package_example.exe
void expectDylibIsBundledWindows(Directory appDirectory, String buildMode) {
// Linux does not support cross compilation, so always only check current architecture.
final String architecture = ArchitectureImpl.current.dartPlatform;
final String architecture = Architecture.current.name;
final Directory appBundle = appDirectory
.childDirectory('build')
.childDirectory(hostOs)
@@ -450,7 +409,7 @@ void expectDylibIsBundledWindows(Directory appDirectory, String buildMode) {
.childDirectory(buildMode.upperCaseFirst());
expect(appBundle, exists);
final File dylib =
appBundle.childFile(OSImpl.windows.dylibFileName(packageName));
appBundle.childFile(OS.windows.dylibFileName(packageName));
expect(dylib, exists);
}
@@ -481,7 +440,7 @@ void expectDylibIsBundledAndroid(Directory appDirectory, String buildMode) {
expect(archDir.childFile('libapp.so'), exists);
}
final File dylib =
archDir.childFile(OSImpl.android.dylibFileName(packageName));
archDir.childFile(OS.android.dylibFileName(packageName));
expect(dylib, exists);
}
}
@@ -504,6 +463,13 @@ void expectDylibIsBundledWithFrameworks(Directory appDirectory, String buildMode
void expectCCompilerIsConfigured(Directory appDirectory) {
final Directory nativeAssetsBuilderDir = appDirectory.childDirectory('.dart_tool/native_assets_builder/');
for (final Directory subDir in nativeAssetsBuilderDir.listSync().whereType<Directory>()) {
// We only want to look at build/link hook invocation directories. The
// `/shared/*` directory allows the individual hooks to store data that is
// reusable across different build/link confiurations.
if (subDir.path.endsWith('shared')) {
continue;
}
final File config = subDir.childFile('config.json');
expect(config, exists);
final String contents = config.readAsStringSync();