[native assets] Roll dependencies (#162017)
This PR rolls in a number of breaking changes for native assets: * Pub workspaces are now supported, this requires a refactoring to how the `NativeAssetsBuildRunner` is used. Most notably it requires being explicit about the `runPackageName`. Flutter does not seem to have that value, but it does have the `projectUri` which can be used to find the package name via the package config. * The API for build hooks has been redesigned. This PR updates the project template, test project files, and test project strings. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [ ] I added new tests to check the change I am making, or this PR is [test-exempt]. - [ ] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. <!-- Links --> [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
This commit is contained in:
parent
97ca57cf08
commit
9ded795e63
@ -8,13 +8,13 @@ import 'package:native_assets_cli/code_assets_builder.dart';
|
|||||||
import 'package:native_toolchain_c/native_toolchain_c.dart';
|
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, (BuildInput input, BuildOutputBuilder output) async {
|
||||||
if (!config.buildAssetTypes.contains(CodeAsset.type)) {
|
if (!input.config.buildAssetTypes.contains(CodeAsset.type)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String assetName;
|
final String assetName;
|
||||||
if (config.linkingEnabled) {
|
if (input.config.linkingEnabled) {
|
||||||
// The link hook will be run. So emit an asset with a name that is
|
// The link hook will be run. So emit an asset with a name that is
|
||||||
// not used, so that the link hook can rename it.
|
// not used, so that the link hook can rename it.
|
||||||
// This will ensure the test fails if the link-hooks are not run
|
// This will ensure the test fails if the link-hooks are not run
|
||||||
@ -23,9 +23,9 @@ void main(List<String> args) async {
|
|||||||
} else {
|
} else {
|
||||||
// The link hook will not be run, so immediately emit an asset for
|
// The link hook will not be run, so immediately emit an asset for
|
||||||
// bundling.
|
// bundling.
|
||||||
assetName = '${config.packageName}_bindings_generated.dart';
|
assetName = '${input.packageName}_bindings_generated.dart';
|
||||||
}
|
}
|
||||||
final String packageName = config.packageName;
|
final String packageName = input.packageName;
|
||||||
final CBuilder cbuilder = CBuilder.library(
|
final CBuilder cbuilder = CBuilder.library(
|
||||||
name: packageName,
|
name: packageName,
|
||||||
assetName: assetName,
|
assetName: assetName,
|
||||||
@ -34,19 +34,19 @@ void main(List<String> args) async {
|
|||||||
);
|
);
|
||||||
final BuildOutputBuilder outputCatcher = BuildOutputBuilder();
|
final BuildOutputBuilder outputCatcher = BuildOutputBuilder();
|
||||||
await cbuilder.run(
|
await cbuilder.run(
|
||||||
config: config,
|
input: input,
|
||||||
output: outputCatcher,
|
output: outputCatcher,
|
||||||
logger:
|
logger:
|
||||||
Logger('')
|
Logger('')
|
||||||
..level = Level.ALL
|
..level = Level.ALL
|
||||||
..onRecord.listen((LogRecord record) => print(record.message)),
|
..onRecord.listen((LogRecord record) => print(record.message)),
|
||||||
);
|
);
|
||||||
final BuildOutput catchedOutput = BuildOutput(outputCatcher.json);
|
final BuildOutput caughtOutput = BuildOutput(outputCatcher.json);
|
||||||
output.addDependencies(catchedOutput.dependencies);
|
output.addDependencies(caughtOutput.dependencies);
|
||||||
// Send the asset to hook/link.dart or immediately for bundling.
|
// Send the asset to hook/link.dart or immediately for bundling.
|
||||||
output.codeAssets.add(
|
output.assets.code.add(
|
||||||
catchedOutput.codeAssets.single,
|
caughtOutput.assets.code.single,
|
||||||
linkInPackage: config.linkingEnabled ? 'link_hook' : null,
|
linkInPackage: input.config.linkingEnabled ? 'link_hook' : null,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
import 'package:native_assets_cli/code_assets.dart';
|
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, (LinkInput input, LinkOutputBuilder output) async {
|
||||||
if (!config.buildAssetTypes.contains(CodeAsset.type)) {
|
if (!input.config.buildAssetTypes.contains(CodeAsset.type)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final CodeAsset asset = config.codeAssets.single;
|
final CodeAsset asset = input.assets.code.single;
|
||||||
final String packageName = config.packageName;
|
final String packageName = input.packageName;
|
||||||
output.codeAssets.add(
|
output.assets.code.add(
|
||||||
CodeAsset(
|
CodeAsset(
|
||||||
package: packageName,
|
package: packageName,
|
||||||
// Change the asset id to something that is used.
|
// Change the asset id to something that is used.
|
||||||
@ -22,6 +22,5 @@ void main(List<String> args) async {
|
|||||||
file: asset.file,
|
file: asset.file,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
output.addDependency(config.packageRoot.resolve('hook/link.dart'));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,8 @@ environment:
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
logging: 1.3.0
|
logging: 1.3.0
|
||||||
native_assets_cli: 0.10.0
|
native_assets_cli: 0.11.0
|
||||||
native_toolchain_c: 0.7.0
|
native_toolchain_c: 0.8.0
|
||||||
|
|
||||||
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"
|
||||||
collection: 1.19.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
collection: 1.19.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||||
@ -68,4 +68,4 @@ dev_dependencies:
|
|||||||
webkit_inspection_protocol: 1.2.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: 566e
|
# PUBSPEC CHECKSUM: d670
|
||||||
|
@ -39,6 +39,8 @@ abstract class DartBuild extends Target {
|
|||||||
logger: environment.logger,
|
logger: environment.logger,
|
||||||
);
|
);
|
||||||
final Uri projectUri = environment.projectDir.uri;
|
final Uri projectUri = environment.projectDir.uri;
|
||||||
|
final String? runPackageName =
|
||||||
|
packageConfig.packages.where((Package p) => p.root == projectUri).firstOrNull?.name;
|
||||||
final FlutterNativeAssetsBuildRunner buildRunner =
|
final FlutterNativeAssetsBuildRunner buildRunner =
|
||||||
_buildRunner ??
|
_buildRunner ??
|
||||||
FlutterNativeAssetsBuildRunnerImpl(
|
FlutterNativeAssetsBuildRunnerImpl(
|
||||||
@ -46,6 +48,7 @@ abstract class DartBuild extends Target {
|
|||||||
packageConfig,
|
packageConfig,
|
||||||
fileSystem,
|
fileSystem,
|
||||||
environment.logger,
|
environment.logger,
|
||||||
|
runPackageName!,
|
||||||
);
|
);
|
||||||
result = await runFlutterSpecificDartBuild(
|
result = await runFlutterSpecificDartBuild(
|
||||||
environmentDefines: environment.defines,
|
environmentDefines: environment.defines,
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
import 'package:logging/logging.dart' as logging;
|
import 'package:logging/logging.dart' as logging;
|
||||||
import 'package:native_assets_builder/native_assets_builder.dart';
|
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 'package:native_assets_cli/native_assets_cli_internal.dart';
|
|
||||||
import 'package:package_config/package_config_types.dart';
|
import 'package:package_config/package_config_types.dart';
|
||||||
|
|
||||||
import '../../base/common.dart';
|
import '../../base/common.dart';
|
||||||
@ -151,13 +150,13 @@ Future<void> installCodeAssets({
|
|||||||
/// It also enables mocking native toolchain discovery via [cCompilerConfig].
|
/// It also enables mocking native toolchain discovery via [cCompilerConfig].
|
||||||
abstract interface class FlutterNativeAssetsBuildRunner {
|
abstract interface class FlutterNativeAssetsBuildRunner {
|
||||||
/// All packages in the transitive dependencies that have a `build.dart`.
|
/// All packages in the transitive dependencies that have a `build.dart`.
|
||||||
Future<List<Package>> packagesWithNativeAssets();
|
Future<List<String>> packagesWithNativeAssets();
|
||||||
|
|
||||||
/// Runs all [packagesWithNativeAssets] `build.dart`.
|
/// Runs all [packagesWithNativeAssets] `build.dart`.
|
||||||
Future<BuildResult?> build({
|
Future<BuildResult?> build({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required BuildConfigValidator configValidator,
|
required BuildInputValidator inputValidator,
|
||||||
required BuildConfigCreator configCreator,
|
required BuildInputCreator inputCreator,
|
||||||
required BuildValidator buildValidator,
|
required BuildValidator buildValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
@ -167,8 +166,8 @@ abstract interface class FlutterNativeAssetsBuildRunner {
|
|||||||
/// Runs all [packagesWithNativeAssets] `link.dart`.
|
/// Runs all [packagesWithNativeAssets] `link.dart`.
|
||||||
Future<LinkResult?> link({
|
Future<LinkResult?> link({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required LinkConfigValidator configValidator,
|
required LinkInputValidator inputValidator,
|
||||||
required LinkConfigCreator configCreator,
|
required LinkInputCreator inputCreator,
|
||||||
required LinkValidator linkValidator,
|
required LinkValidator linkValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
@ -189,12 +188,14 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
|
|||||||
this.packageConfig,
|
this.packageConfig,
|
||||||
this.fileSystem,
|
this.fileSystem,
|
||||||
this.logger,
|
this.logger,
|
||||||
|
this.runPackageName,
|
||||||
);
|
);
|
||||||
|
|
||||||
final String packageConfigPath;
|
final String packageConfigPath;
|
||||||
final PackageConfig packageConfig;
|
final PackageConfig packageConfig;
|
||||||
final FileSystem fileSystem;
|
final FileSystem fileSystem;
|
||||||
final Logger logger;
|
final Logger logger;
|
||||||
|
final String runPackageName;
|
||||||
|
|
||||||
late final logging.Logger _logger = logging.Logger('')
|
late final logging.Logger _logger = logging.Logger('')
|
||||||
..onRecord.listen((logging.LogRecord record) {
|
..onRecord.listen((logging.LogRecord record) {
|
||||||
@ -221,48 +222,44 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
|
|||||||
.uri
|
.uri
|
||||||
.resolve('bin/cache/dart-sdk/bin/dart');
|
.resolve('bin/cache/dart-sdk/bin/dart');
|
||||||
|
|
||||||
|
late final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
|
||||||
|
fileSystem,
|
||||||
|
packageConfig,
|
||||||
|
Uri.file(packageConfigPath),
|
||||||
|
runPackageName,
|
||||||
|
);
|
||||||
|
|
||||||
late final NativeAssetsBuildRunner _buildRunner = NativeAssetsBuildRunner(
|
late final NativeAssetsBuildRunner _buildRunner = NativeAssetsBuildRunner(
|
||||||
logger: _logger,
|
logger: _logger,
|
||||||
dartExecutable: _dartExecutable,
|
dartExecutable: _dartExecutable,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
|
packageLayout: packageLayout,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<Package>> packagesWithNativeAssets() async {
|
Future<List<String>> packagesWithNativeAssets() async {
|
||||||
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
|
|
||||||
fileSystem,
|
|
||||||
packageConfig,
|
|
||||||
Uri.file(packageConfigPath),
|
|
||||||
);
|
|
||||||
// It suffices to only check for build hooks. If no packages have a build
|
// It suffices to only check for build hooks. If no packages have a build
|
||||||
// hook. Then no build hook will output any assets for any link hook, and
|
// hook. Then no build hook will output any assets for any link hook, and
|
||||||
// thus the link hooks will never be run.
|
// thus the link hooks will never be run.
|
||||||
return packageLayout.packagesWithAssets(Hook.build);
|
return _buildRunner.packagesWithBuildHooks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<BuildResult?> build({
|
Future<BuildResult?> build({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required BuildConfigValidator configValidator,
|
required BuildInputValidator inputValidator,
|
||||||
required BuildConfigCreator configCreator,
|
required BuildInputCreator inputCreator,
|
||||||
required BuildValidator buildValidator,
|
required BuildValidator buildValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
required bool linkingEnabled,
|
required bool linkingEnabled,
|
||||||
}) {
|
}) {
|
||||||
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
|
|
||||||
fileSystem,
|
|
||||||
packageConfig,
|
|
||||||
Uri.file(packageConfigPath),
|
|
||||||
);
|
|
||||||
return _buildRunner.build(
|
return _buildRunner.build(
|
||||||
buildAssetTypes: buildAssetTypes,
|
buildAssetTypes: buildAssetTypes,
|
||||||
configCreator: configCreator,
|
inputCreator: inputCreator,
|
||||||
configValidator: configValidator,
|
inputValidator: inputValidator,
|
||||||
buildValidator: buildValidator,
|
buildValidator: buildValidator,
|
||||||
applicationAssetValidator: applicationAssetValidator,
|
applicationAssetValidator: applicationAssetValidator,
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
packageLayout: packageLayout,
|
|
||||||
linkingEnabled: linkingEnabled,
|
linkingEnabled: linkingEnabled,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -270,26 +267,19 @@ class FlutterNativeAssetsBuildRunnerImpl implements FlutterNativeAssetsBuildRunn
|
|||||||
@override
|
@override
|
||||||
Future<LinkResult?> link({
|
Future<LinkResult?> link({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required LinkConfigValidator configValidator,
|
required LinkInputValidator inputValidator,
|
||||||
required LinkConfigCreator configCreator,
|
required LinkInputCreator inputCreator,
|
||||||
required LinkValidator linkValidator,
|
required LinkValidator linkValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
required BuildResult buildResult,
|
required BuildResult buildResult,
|
||||||
}) {
|
}) {
|
||||||
final PackageLayout packageLayout = PackageLayout.fromPackageConfig(
|
|
||||||
fileSystem,
|
|
||||||
packageConfig,
|
|
||||||
Uri.file(packageConfigPath),
|
|
||||||
);
|
|
||||||
return _buildRunner.link(
|
return _buildRunner.link(
|
||||||
buildAssetTypes: buildAssetTypes,
|
buildAssetTypes: buildAssetTypes,
|
||||||
configCreator: configCreator,
|
inputCreator: inputCreator,
|
||||||
configValidator: configValidator,
|
inputValidator: inputValidator,
|
||||||
linkValidator: linkValidator,
|
linkValidator: linkValidator,
|
||||||
applicationAssetValidator: applicationAssetValidator,
|
applicationAssetValidator: applicationAssetValidator,
|
||||||
workingDirectory: workingDirectory,
|
|
||||||
packageLayout: packageLayout,
|
|
||||||
buildResult: buildResult,
|
buildResult: buildResult,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -373,7 +363,7 @@ bool _nativeAssetsLinkingEnabled(BuildMode buildMode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _nativeBuildRequired(FlutterNativeAssetsBuildRunner buildRunner) async {
|
Future<bool> _nativeBuildRequired(FlutterNativeAssetsBuildRunner buildRunner) async {
|
||||||
final List<Package> packagesWithNativeAssets = await buildRunner.packagesWithNativeAssets();
|
final List<String> packagesWithNativeAssets = await buildRunner.packagesWithNativeAssets();
|
||||||
if (packagesWithNativeAssets.isEmpty) {
|
if (packagesWithNativeAssets.isEmpty) {
|
||||||
globals.logger.printTrace(
|
globals.logger.printTrace(
|
||||||
'No packages with native assets. Skipping native assets compilation.',
|
'No packages with native assets. Skipping native assets compilation.',
|
||||||
@ -382,7 +372,7 @@ Future<bool> _nativeBuildRequired(FlutterNativeAssetsBuildRunner buildRunner) as
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!featureFlags.isNativeAssetsEnabled) {
|
if (!featureFlags.isNativeAssetsEnabled) {
|
||||||
final String packageNames = packagesWithNativeAssets.map((Package p) => p.name).join(' ');
|
final String packageNames = packagesWithNativeAssets.join(' ');
|
||||||
throwToolExit(
|
throwToolExit(
|
||||||
'Package(s) $packageNames require the native assets feature to be enabled. '
|
'Package(s) $packageNames require the native assets feature to be enabled. '
|
||||||
'Enable using `flutter config --enable-native-assets`.',
|
'Enable using `flutter config --enable-native-assets`.',
|
||||||
@ -401,14 +391,14 @@ Future<void> ensureNoNativeAssetsOrOsIsSupported(
|
|||||||
FileSystem fileSystem,
|
FileSystem fileSystem,
|
||||||
FlutterNativeAssetsBuildRunner buildRunner,
|
FlutterNativeAssetsBuildRunner buildRunner,
|
||||||
) async {
|
) async {
|
||||||
final List<Package> packagesWithNativeAssets = await buildRunner.packagesWithNativeAssets();
|
final List<String> packagesWithNativeAssets = await buildRunner.packagesWithNativeAssets();
|
||||||
if (packagesWithNativeAssets.isEmpty) {
|
if (packagesWithNativeAssets.isEmpty) {
|
||||||
globals.logger.printTrace(
|
globals.logger.printTrace(
|
||||||
'No packages with native assets. Skipping native assets compilation.',
|
'No packages with native assets. Skipping native assets compilation.',
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final String packageNames = packagesWithNativeAssets.map((Package p) => p.name).join(' ');
|
final String packageNames = packagesWithNativeAssets.join(' ');
|
||||||
throwToolExit(
|
throwToolExit(
|
||||||
'Package(s) $packageNames require the native assets feature. '
|
'Package(s) $packageNames require the native assets feature. '
|
||||||
'This feature has not yet been implemented for `$os`. '
|
'This feature has not yet been implemented for `$os`. '
|
||||||
@ -599,34 +589,35 @@ Future<DartBuildResult> _runDartBuild({
|
|||||||
final String? codesignIdentity = environmentDefines[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 AndroidConfig? androidConfig =
|
final AndroidCodeConfig? androidConfig =
|
||||||
targetOS == OS.android
|
targetOS == OS.android
|
||||||
? AndroidConfig(targetNdkApi: targetAndroidNdkApi(environmentDefines))
|
? AndroidCodeConfig(targetNdkApi: targetAndroidNdkApi(environmentDefines))
|
||||||
: null;
|
: null;
|
||||||
final IOSConfig? iosConfig =
|
final IOSCodeConfig? iosConfig =
|
||||||
targetOS == OS.iOS
|
targetOS == OS.iOS
|
||||||
? IOSConfig(targetVersion: targetIOSVersion, targetSdk: getIOSSdk(environmentType!))
|
? IOSCodeConfig(targetVersion: targetIOSVersion, targetSdk: getIOSSdk(environmentType!))
|
||||||
: null;
|
: null;
|
||||||
final MacOSConfig? macOSConfig =
|
final MacOSCodeConfig? macOSConfig =
|
||||||
targetOS == OS.macOS ? MacOSConfig(targetVersion: targetMacOSVersion) : null;
|
targetOS == OS.macOS ? MacOSCodeConfig(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(
|
||||||
buildAssetTypes: <String>[CodeAsset.type],
|
buildAssetTypes: <String>[CodeAsset.type],
|
||||||
configCreator:
|
inputCreator:
|
||||||
() =>
|
() =>
|
||||||
BuildConfigBuilder()..setupCodeConfig(
|
BuildInputBuilder()
|
||||||
targetArchitecture: architecture,
|
..config.setupCode(
|
||||||
linkModePreference: LinkModePreference.dynamic,
|
targetArchitecture: architecture,
|
||||||
cCompilerConfig: cCompilerConfig,
|
linkModePreference: LinkModePreference.dynamic,
|
||||||
targetOS: targetOS!,
|
cCompiler: cCompilerConfig,
|
||||||
androidConfig: androidConfig,
|
targetOS: targetOS!,
|
||||||
iOSConfig: iosConfig,
|
android: androidConfig,
|
||||||
macOSConfig: macOSConfig,
|
iOS: iosConfig,
|
||||||
),
|
macOS: macOSConfig,
|
||||||
configValidator:
|
),
|
||||||
(BuildConfig config) async => <String>[...await validateCodeAssetBuildConfig(config)],
|
inputValidator:
|
||||||
|
(BuildInput config) async => <String>[...await validateCodeAssetBuildInput(config)],
|
||||||
buildValidator:
|
buildValidator:
|
||||||
(BuildConfig config, BuildOutput output) async => <String>[
|
(BuildInput config, BuildOutput output) async => <String>[
|
||||||
...await validateCodeAssetBuildOutput(config, output),
|
...await validateCodeAssetBuildOutput(config, output),
|
||||||
],
|
],
|
||||||
applicationAssetValidator:
|
applicationAssetValidator:
|
||||||
@ -645,21 +636,22 @@ Future<DartBuildResult> _runDartBuild({
|
|||||||
} else {
|
} else {
|
||||||
final LinkResult? linkResult = await buildRunner.link(
|
final LinkResult? linkResult = await buildRunner.link(
|
||||||
buildAssetTypes: <String>[CodeAsset.type],
|
buildAssetTypes: <String>[CodeAsset.type],
|
||||||
configCreator:
|
inputCreator:
|
||||||
() =>
|
() =>
|
||||||
LinkConfigBuilder()..setupCodeConfig(
|
LinkInputBuilder()
|
||||||
targetArchitecture: architecture,
|
..config.setupCode(
|
||||||
linkModePreference: LinkModePreference.dynamic,
|
targetArchitecture: architecture,
|
||||||
cCompilerConfig: cCompilerConfig,
|
linkModePreference: LinkModePreference.dynamic,
|
||||||
targetOS: targetOS!,
|
cCompiler: cCompilerConfig,
|
||||||
androidConfig: androidConfig,
|
targetOS: targetOS!,
|
||||||
iOSConfig: iosConfig,
|
android: androidConfig,
|
||||||
macOSConfig: macOSConfig,
|
iOS: iosConfig,
|
||||||
),
|
macOS: macOSConfig,
|
||||||
configValidator:
|
),
|
||||||
(LinkConfig config) async => <String>[...await validateCodeAssetLinkConfig(config)],
|
inputValidator:
|
||||||
|
(LinkInput config) async => <String>[...await validateCodeAssetLinkInput(config)],
|
||||||
linkValidator:
|
linkValidator:
|
||||||
(LinkConfig config, LinkOutput output) async => <String>[
|
(LinkInput config, LinkOutput output) async => <String>[
|
||||||
...await validateCodeAssetLinkOutput(config, output),
|
...await validateCodeAssetLinkOutput(config, output),
|
||||||
],
|
],
|
||||||
applicationAssetValidator:
|
applicationAssetValidator:
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
// Logic for native assets shared between all host OSes.
|
// Logic for native assets shared between all host OSes.
|
||||||
|
|
||||||
import 'package:native_assets_cli/code_assets.dart' show OS;
|
import 'package:native_assets_cli/code_assets.dart' show OS;
|
||||||
|
import 'package:package_config/package_config_types.dart';
|
||||||
|
|
||||||
import '../../../base/platform.dart';
|
import '../../../base/platform.dart';
|
||||||
import '../../../build_info.dart';
|
import '../../../build_info.dart';
|
||||||
@ -29,11 +30,14 @@ Future<Uri?> testCompilerBuildNativeAssets(BuildInfo buildInfo) async {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final Uri projectUri = FlutterProject.current().directory.uri;
|
final Uri projectUri = FlutterProject.current().directory.uri;
|
||||||
|
final String runPackageName =
|
||||||
|
buildInfo.packageConfig.packages.firstWhere((Package p) => p.root == projectUri).name;
|
||||||
final FlutterNativeAssetsBuildRunner buildRunner = FlutterNativeAssetsBuildRunnerImpl(
|
final FlutterNativeAssetsBuildRunner buildRunner = FlutterNativeAssetsBuildRunnerImpl(
|
||||||
buildInfo.packageConfigPath,
|
buildInfo.packageConfigPath,
|
||||||
buildInfo.packageConfig,
|
buildInfo.packageConfig,
|
||||||
globals.fs,
|
globals.fs,
|
||||||
globals.logger,
|
globals.logger,
|
||||||
|
runPackageName,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!globals.platform.isMacOS && !globals.platform.isLinux && !globals.platform.isWindows) {
|
if (!globals.platform.isMacOS && !globals.platform.isLinux && !globals.platform.isWindows) {
|
||||||
|
@ -30,8 +30,9 @@ Future<CCompilerConfig?> cCompilerConfigWindows() async {
|
|||||||
compiler: compiler,
|
compiler: compiler,
|
||||||
archiver: archiver,
|
archiver: archiver,
|
||||||
linker: linker,
|
linker: linker,
|
||||||
envScript: envScript,
|
windows: WindowsCCompilerConfig(
|
||||||
envScriptArgs: <String>[],
|
developerCommandPrompt: DeveloperCommandPrompt(script: envScript, arguments: <String>[]),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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.10.2', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
|
'0.11.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
|
||||||
'native_assets_cli':
|
'native_assets_cli':
|
||||||
'0.10.0', // Under active development with breaking changes until 1.0.0. Manually rolled by @dcharkes.
|
'0.11.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
|
||||||
|
@ -54,8 +54,8 @@ dependencies:
|
|||||||
unified_analytics: 7.0.1
|
unified_analytics: 7.0.1
|
||||||
|
|
||||||
graphs: 2.3.2
|
graphs: 2.3.2
|
||||||
native_assets_builder: 0.10.2
|
native_assets_builder: 0.11.0
|
||||||
native_assets_cli: 0.10.0
|
native_assets_cli: 0.11.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
|
||||||
@ -121,4 +121,4 @@ dartdoc:
|
|||||||
# Exclude this package from the hosted API docs.
|
# Exclude this package from the hosted API docs.
|
||||||
nodoc: true
|
nodoc: true
|
||||||
|
|
||||||
# PUBSPEC CHECKSUM: 6539
|
# PUBSPEC CHECKSUM: 3b39
|
||||||
|
@ -3,8 +3,8 @@ import 'package:logging/logging.dart';
|
|||||||
import 'package:native_assets_cli/native_assets_cli.dart';
|
import 'package:native_assets_cli/native_assets_cli.dart';
|
||||||
|
|
||||||
void main(List<String> args) async {
|
void main(List<String> args) async {
|
||||||
await build(args, (config, output) async {
|
await build(args, (input, output) async {
|
||||||
final packageName = config.packageName;
|
final packageName = input.packageName;
|
||||||
final cbuilder = CBuilder.library(
|
final cbuilder = CBuilder.library(
|
||||||
name: packageName,
|
name: packageName,
|
||||||
assetName: '${packageName}_bindings_generated.dart',
|
assetName: '${packageName}_bindings_generated.dart',
|
||||||
@ -13,7 +13,7 @@ void main(List<String> args) async {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
await cbuilder.run(
|
await cbuilder.run(
|
||||||
config: config,
|
input: input,
|
||||||
output: output,
|
output: output,
|
||||||
logger: Logger('')
|
logger: Logger('')
|
||||||
..level = Level.ALL
|
..level = Level.ALL
|
||||||
|
@ -8,8 +8,8 @@ environment:
|
|||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
logging: ^1.2.0
|
logging: ^1.2.0
|
||||||
native_assets_cli: ^0.10.0
|
native_assets_cli: ^0.11.0
|
||||||
native_toolchain_c: ^0.7.0
|
native_toolchain_c: ^0.8.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
ffi: ^2.1.3
|
ffi: ^2.1.3
|
||||||
|
@ -18,7 +18,6 @@ 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';
|
import 'package:native_assets_cli/code_assets_builder.dart';
|
||||||
import 'package:package_config/package_config_types.dart';
|
|
||||||
|
|
||||||
import '../../../src/common.dart';
|
import '../../../src/common.dart';
|
||||||
import '../../../src/context.dart';
|
import '../../../src/context.dart';
|
||||||
@ -82,7 +81,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
||||||
linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
||||||
);
|
);
|
||||||
@ -164,9 +163,7 @@ void main() {
|
|||||||
targetPlatform: TargetPlatform.android_arm64,
|
targetPlatform: TargetPlatform.android_arm64,
|
||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: _BuildRunnerWithoutNdk(
|
buildRunner: _BuildRunnerWithoutNdk(packagesWithNativeAssetsResult: <String>['bar']),
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
throwsToolExit(message: 'Android NDK Clang could not be found.'),
|
throwsToolExit(message: 'Android NDK Clang could not be found.'),
|
||||||
);
|
);
|
||||||
@ -175,7 +172,7 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _BuildRunnerWithoutNdk extends FakeFlutterNativeAssetsBuildRunner {
|
class _BuildRunnerWithoutNdk extends FakeFlutterNativeAssetsBuildRunner {
|
||||||
_BuildRunnerWithoutNdk({super.packagesWithNativeAssetsResult = const <Package>[]});
|
_BuildRunnerWithoutNdk({super.packagesWithNativeAssetsResult = const <String>[]});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<CCompilerConfig> get ndkCCompilerConfig async =>
|
Future<CCompilerConfig> get ndkCCompilerConfig async =>
|
||||||
|
@ -14,7 +14,6 @@ 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';
|
import 'package:native_assets_cli/code_assets_builder.dart';
|
||||||
import 'package:package_config/package_config.dart' show Package;
|
|
||||||
|
|
||||||
import '../../../../src/common.dart';
|
import '../../../../src/common.dart';
|
||||||
import '../../../../src/context.dart';
|
import '../../../../src/context.dart';
|
||||||
@ -94,7 +93,7 @@ void main() {
|
|||||||
await createPackageConfig(iosEnvironment);
|
await createPackageConfig(iosEnvironment);
|
||||||
|
|
||||||
final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('foo', iosEnvironment.projectDir.uri)],
|
packagesWithNativeAssetsResult: <String>['foo'],
|
||||||
);
|
);
|
||||||
|
|
||||||
iosEnvironment.defines.remove(kSdkRoot);
|
iosEnvironment.defines.remove(kSdkRoot);
|
||||||
@ -200,7 +199,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('foo', iosEnvironment.buildDir.uri)],
|
packagesWithNativeAssetsResult: <String>['foo'],
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets,
|
codeAssets: codeAssets,
|
||||||
dependencies: <Uri>[Uri.file('src/foo.c')],
|
dependencies: <Uri>[Uri.file('src/foo.c')],
|
||||||
@ -268,9 +267,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[
|
packagesWithNativeAssetsResult: <String>['foo'],
|
||||||
Package('foo', androidEnvironment.buildDir.uri),
|
|
||||||
],
|
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets,
|
codeAssets: codeAssets,
|
||||||
dependencies: <Uri>[Uri.file('src/foo.c')],
|
dependencies: <Uri>[Uri.file('src/foo.c')],
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
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_builder/native_assets_builder.dart';
|
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 'package:package_config/package_config_types.dart';
|
|
||||||
|
|
||||||
export 'package:native_assets_cli/code_assets_builder.dart' show CodeAsset, DynamicLoadingBundled;
|
export 'package:native_assets_cli/code_assets_builder.dart' show CodeAsset, DynamicLoadingBundled;
|
||||||
|
|
||||||
@ -13,7 +12,7 @@ export 'package:native_assets_cli/code_assets_builder.dart' show CodeAsset, Dyna
|
|||||||
/// relies on doing process calls to `pub` and the local file system.
|
/// relies on doing process calls to `pub` and the local file system.
|
||||||
class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunner {
|
class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunner {
|
||||||
FakeFlutterNativeAssetsBuildRunner({
|
FakeFlutterNativeAssetsBuildRunner({
|
||||||
this.packagesWithNativeAssetsResult = const <Package>[],
|
this.packagesWithNativeAssetsResult = const <String>[],
|
||||||
this.onBuild,
|
this.onBuild,
|
||||||
this.onLink,
|
this.onLink,
|
||||||
this.buildResult = const FakeFlutterNativeAssetsBuilderResult(),
|
this.buildResult = const FakeFlutterNativeAssetsBuilderResult(),
|
||||||
@ -22,11 +21,12 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
|
|||||||
this.ndkCCompilerConfigResult,
|
this.ndkCCompilerConfigResult,
|
||||||
});
|
});
|
||||||
|
|
||||||
final BuildResult? Function(BuildConfig)? onBuild;
|
// TODO(dcharkes): Cleanup this fake https://github.com/flutter/flutter/issues/162061
|
||||||
final LinkResult? Function(LinkConfig)? onLink;
|
final BuildResult? Function(BuildInput)? onBuild;
|
||||||
|
final LinkResult? Function(LinkInput)? onLink;
|
||||||
final BuildResult? buildResult;
|
final BuildResult? buildResult;
|
||||||
final LinkResult? linkResult;
|
final LinkResult? linkResult;
|
||||||
final List<Package> packagesWithNativeAssetsResult;
|
final List<String> packagesWithNativeAssetsResult;
|
||||||
final CCompilerConfig? cCompilerConfigResult;
|
final CCompilerConfig? cCompilerConfigResult;
|
||||||
final CCompilerConfig? ndkCCompilerConfigResult;
|
final CCompilerConfig? ndkCCompilerConfigResult;
|
||||||
|
|
||||||
@ -37,28 +37,28 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
|
|||||||
@override
|
@override
|
||||||
Future<BuildResult?> build({
|
Future<BuildResult?> build({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required BuildConfigValidator configValidator,
|
required BuildInputValidator inputValidator,
|
||||||
required BuildConfigCreator configCreator,
|
required BuildInputCreator inputCreator,
|
||||||
required BuildValidator buildValidator,
|
required BuildValidator buildValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
required bool linkingEnabled,
|
required bool linkingEnabled,
|
||||||
}) async {
|
}) async {
|
||||||
BuildResult? result = buildResult;
|
BuildResult? result = buildResult;
|
||||||
for (final Package package in packagesWithNativeAssetsResult) {
|
for (final String package in packagesWithNativeAssetsResult) {
|
||||||
final BuildConfigBuilder configBuilder =
|
final BuildInputBuilder configBuilder =
|
||||||
configCreator()
|
inputCreator()
|
||||||
..setupHookConfig(
|
..setupShared(
|
||||||
packageRoot: package.root,
|
packageRoot: Uri.parse('$package/'),
|
||||||
packageName: package.name,
|
packageName: package,
|
||||||
buildAssetTypes: buildAssetTypes,
|
|
||||||
)
|
|
||||||
..setupBuildConfig(dryRun: false, linkingEnabled: linkingEnabled)
|
|
||||||
..setupBuildRunConfig(
|
|
||||||
outputDirectory: Uri.parse('build-out-dir'),
|
outputDirectory: Uri.parse('build-out-dir'),
|
||||||
outputDirectoryShared: Uri.parse('build-out-dir-shared'),
|
outputDirectoryShared: Uri.parse('build-out-dir-shared'),
|
||||||
);
|
outputFile: Uri.file('output.json'),
|
||||||
final BuildConfig buildConfig = BuildConfig(configBuilder.json);
|
)
|
||||||
|
..setupBuildInput()
|
||||||
|
..config.setupShared(buildAssetTypes: buildAssetTypes)
|
||||||
|
..config.setupBuild(dryRun: false, linkingEnabled: linkingEnabled);
|
||||||
|
final BuildInput buildConfig = BuildInput(configBuilder.json);
|
||||||
if (onBuild != null) {
|
if (onBuild != null) {
|
||||||
result = onBuild!(buildConfig);
|
result = onBuild!(buildConfig);
|
||||||
}
|
}
|
||||||
@ -70,28 +70,27 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
|
|||||||
@override
|
@override
|
||||||
Future<LinkResult?> link({
|
Future<LinkResult?> link({
|
||||||
required List<String> buildAssetTypes,
|
required List<String> buildAssetTypes,
|
||||||
required LinkConfigCreator configCreator,
|
required LinkInputCreator inputCreator,
|
||||||
required LinkConfigValidator configValidator,
|
required LinkInputValidator inputValidator,
|
||||||
required LinkValidator linkValidator,
|
required LinkValidator linkValidator,
|
||||||
required ApplicationAssetValidator applicationAssetValidator,
|
required ApplicationAssetValidator applicationAssetValidator,
|
||||||
required Uri workingDirectory,
|
required Uri workingDirectory,
|
||||||
required BuildResult buildResult,
|
required BuildResult buildResult,
|
||||||
}) async {
|
}) async {
|
||||||
LinkResult? result = linkResult;
|
LinkResult? result = linkResult;
|
||||||
for (final Package package in packagesWithNativeAssetsResult) {
|
for (final String package in packagesWithNativeAssetsResult) {
|
||||||
final LinkConfigBuilder configBuilder =
|
final LinkInputBuilder configBuilder =
|
||||||
configCreator()
|
inputCreator()
|
||||||
..setupHookConfig(
|
..setupShared(
|
||||||
packageRoot: package.root,
|
packageRoot: Uri.parse('$package/'),
|
||||||
packageName: package.name,
|
packageName: package,
|
||||||
buildAssetTypes: buildAssetTypes,
|
|
||||||
)
|
|
||||||
..setupLinkRunConfig(
|
|
||||||
outputDirectory: Uri.parse('build-out-dir'),
|
outputDirectory: Uri.parse('build-out-dir'),
|
||||||
outputDirectoryShared: Uri.parse('build-out-dir-shared'),
|
outputDirectoryShared: Uri.parse('build-out-dir-shared'),
|
||||||
recordedUsesFile: null,
|
outputFile: Uri.file('output.json'),
|
||||||
);
|
)
|
||||||
final LinkConfig buildConfig = LinkConfig(configBuilder.json);
|
..setupLink(assets: buildResult.encodedAssets, recordedUsesFile: null)
|
||||||
|
..config.setupShared(buildAssetTypes: buildAssetTypes);
|
||||||
|
final LinkInput buildConfig = LinkInput(configBuilder.json);
|
||||||
if (onLink != null) {
|
if (onLink != null) {
|
||||||
result = onLink!(buildConfig);
|
result = onLink!(buildConfig);
|
||||||
}
|
}
|
||||||
@ -101,7 +100,7 @@ class FakeFlutterNativeAssetsBuildRunner implements FlutterNativeAssetsBuildRunn
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<List<Package>> packagesWithNativeAssets() async {
|
Future<List<String>> packagesWithNativeAssets() async {
|
||||||
packagesWithNativeAssetsInvocations++;
|
packagesWithNativeAssetsInvocations++;
|
||||||
return packagesWithNativeAssetsResult;
|
return packagesWithNativeAssetsResult;
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@ 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';
|
import 'package:native_assets_cli/code_assets_builder.dart';
|
||||||
import 'package:package_config/package_config_types.dart';
|
|
||||||
|
|
||||||
import '../../../src/common.dart';
|
import '../../../src/common.dart';
|
||||||
import '../../../src/context.dart';
|
import '../../../src/context.dart';
|
||||||
@ -182,17 +181,17 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
onBuild:
|
onBuild:
|
||||||
(BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
(BuildInput input) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
|
codeAssets: codeAssets(input.config.code.targetOS, input.config.code),
|
||||||
),
|
),
|
||||||
onLink:
|
onLink:
|
||||||
(LinkConfig config) =>
|
(LinkInput input) =>
|
||||||
buildMode == BuildMode.debug
|
buildMode == BuildMode.debug
|
||||||
? null
|
? null
|
||||||
: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
|
codeAssets: codeAssets(input.config.code.targetOS, input.config.code),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final Map<String, String> environmentDefines = <String, String>{
|
final Map<String, String> environmentDefines = <String, String>{
|
||||||
|
@ -30,6 +30,7 @@ void main() {
|
|||||||
late FileSystem fileSystem;
|
late FileSystem fileSystem;
|
||||||
late BufferLogger logger;
|
late BufferLogger logger;
|
||||||
late Uri projectUri;
|
late Uri projectUri;
|
||||||
|
late String runPackageName;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
processManager = FakeProcessManager.empty();
|
processManager = FakeProcessManager.empty();
|
||||||
@ -46,6 +47,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
environment.buildDir.createSync(recursive: true);
|
environment.buildDir.createSync(recursive: true);
|
||||||
projectUri = environment.projectDir.uri;
|
projectUri = environment.projectDir.uri;
|
||||||
|
runPackageName = environment.projectDir.basename;
|
||||||
});
|
});
|
||||||
|
|
||||||
testUsingContext(
|
testUsingContext(
|
||||||
@ -116,6 +118,7 @@ void main() {
|
|||||||
packageConfig,
|
packageConfig,
|
||||||
fileSystem,
|
fileSystem,
|
||||||
logger,
|
logger,
|
||||||
|
runPackageName,
|
||||||
);
|
);
|
||||||
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'));
|
||||||
|
@ -30,6 +30,7 @@ void main() {
|
|||||||
late FileSystem fileSystem;
|
late FileSystem fileSystem;
|
||||||
late BufferLogger logger;
|
late BufferLogger logger;
|
||||||
late Uri projectUri;
|
late Uri projectUri;
|
||||||
|
late String runPackageName;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
processManager = FakeProcessManager.empty();
|
processManager = FakeProcessManager.empty();
|
||||||
@ -46,6 +47,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
environment.buildDir.createSync(recursive: true);
|
environment.buildDir.createSync(recursive: true);
|
||||||
projectUri = environment.projectDir.uri;
|
projectUri = environment.projectDir.uri;
|
||||||
|
runPackageName = environment.projectDir.basename;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (final bool flutterTester in <bool>[false, true]) {
|
for (final bool flutterTester in <bool>[false, true]) {
|
||||||
@ -278,17 +280,17 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
onBuild:
|
onBuild:
|
||||||
(BuildConfig config) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
(BuildInput input) => FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
|
codeAssets: codeAssets(input.config.code.targetOS, input.config.code),
|
||||||
),
|
),
|
||||||
onLink:
|
onLink:
|
||||||
(LinkConfig config) =>
|
(LinkInput input) =>
|
||||||
buildMode == BuildMode.debug
|
buildMode == BuildMode.debug
|
||||||
? null
|
? null
|
||||||
: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: codeAssets(config.codeConfig.targetOS, config.codeConfig),
|
codeAssets: codeAssets(input.config.code.targetOS, input.config.code),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
final Map<String, String> environmentDefines = <String, String>{
|
final Map<String, String> environmentDefines = <String, String>{
|
||||||
@ -401,6 +403,7 @@ InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault
|
|||||||
packageConfig,
|
packageConfig,
|
||||||
fileSystem,
|
fileSystem,
|
||||||
logger,
|
logger,
|
||||||
|
runPackageName,
|
||||||
);
|
);
|
||||||
final CCompilerConfig result = (await runner.cCompilerConfig)!;
|
final CCompilerConfig result = (await runner.cCompilerConfig)!;
|
||||||
expect(
|
expect(
|
||||||
|
@ -14,7 +14,6 @@ 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';
|
import 'package:native_assets_cli/code_assets_builder.dart';
|
||||||
import 'package:package_config/package_config_types.dart';
|
|
||||||
|
|
||||||
import '../../src/common.dart';
|
import '../../src/common.dart';
|
||||||
import '../../src/context.dart';
|
import '../../src/context.dart';
|
||||||
@ -84,7 +83,7 @@ void main() {
|
|||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
||||||
linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
linkResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
||||||
),
|
),
|
||||||
@ -115,7 +114,7 @@ void main() {
|
|||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
throwsToolExit(
|
throwsToolExit(
|
||||||
@ -149,7 +148,7 @@ void main() {
|
|||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
await installCodeAssets(
|
await installCodeAssets(
|
||||||
@ -191,7 +190,7 @@ void main() {
|
|||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
buildResult: null,
|
buildResult: null,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -236,7 +235,7 @@ void main() {
|
|||||||
projectUri: projectUri,
|
projectUri: projectUri,
|
||||||
fileSystem: fileSystem,
|
fileSystem: fileSystem,
|
||||||
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
buildRunner: FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(
|
||||||
codeAssets: <CodeAsset>[
|
codeAssets: <CodeAsset>[
|
||||||
makeCodeAsset('direct', directSoFile.uri, DynamicLoadingBundled()),
|
makeCodeAsset('direct', directSoFile.uri, DynamicLoadingBundled()),
|
||||||
|
@ -31,6 +31,7 @@ void main() {
|
|||||||
late FileSystem fileSystem;
|
late FileSystem fileSystem;
|
||||||
late BufferLogger logger;
|
late BufferLogger logger;
|
||||||
late Uri projectUri;
|
late Uri projectUri;
|
||||||
|
late String runPackageName;
|
||||||
|
|
||||||
setUp(() {
|
setUp(() {
|
||||||
processManager = FakeProcessManager.empty();
|
processManager = FakeProcessManager.empty();
|
||||||
@ -47,6 +48,7 @@ void main() {
|
|||||||
);
|
);
|
||||||
environment.buildDir.createSync(recursive: true);
|
environment.buildDir.createSync(recursive: true);
|
||||||
projectUri = environment.projectDir.uri;
|
projectUri = environment.projectDir.uri;
|
||||||
|
runPackageName = environment.projectDir.basename;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (final bool flutterTester in <bool>[false, true]) {
|
for (final bool flutterTester in <bool>[false, true]) {
|
||||||
@ -96,7 +98,7 @@ void main() {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
final FakeFlutterNativeAssetsBuildRunner buildRunner = FakeFlutterNativeAssetsBuildRunner(
|
||||||
packagesWithNativeAssetsResult: <Package>[Package('bar', projectUri)],
|
packagesWithNativeAssetsResult: <String>['bar'],
|
||||||
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
buildResult: FakeFlutterNativeAssetsBuilderResult.fromAssets(codeAssets: codeAssets),
|
||||||
linkResult:
|
linkResult:
|
||||||
buildMode == BuildMode.debug
|
buildMode == BuildMode.debug
|
||||||
@ -268,13 +270,14 @@ void main() {
|
|||||||
packageConfig,
|
packageConfig,
|
||||||
fileSystem,
|
fileSystem,
|
||||||
logger,
|
logger,
|
||||||
|
runPackageName,
|
||||||
);
|
);
|
||||||
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.windows.developerCommandPrompt?.script, isNotNull);
|
||||||
expect(result.envScriptArgs, isNotNull);
|
expect(result.windows.developerCommandPrompt?.arguments, isNotNull);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -456,7 +456,7 @@ void expectDylibIsBundledWithFrameworks(Directory appDirectory, String buildMode
|
|||||||
/// This inspects the build configuration to see if the C compiler was configured.
|
/// This inspects the build configuration to see if the C compiler was configured.
|
||||||
void expectCCompilerIsConfigured(Directory appDirectory) {
|
void expectCCompilerIsConfigured(Directory appDirectory) {
|
||||||
final Directory nativeAssetsBuilderDir = appDirectory.childDirectory(
|
final Directory nativeAssetsBuilderDir = appDirectory.childDirectory(
|
||||||
'.dart_tool/native_assets_builder/',
|
'.dart_tool/native_assets_builder/$packageName/',
|
||||||
);
|
);
|
||||||
for (final Directory subDir in nativeAssetsBuilderDir.listSync().whereType<Directory>()) {
|
for (final Directory subDir in nativeAssetsBuilderDir.listSync().whereType<Directory>()) {
|
||||||
// We only want to look at build/link hook invocation directories. The
|
// We only want to look at build/link hook invocation directories. The
|
||||||
@ -466,14 +466,16 @@ void expectCCompilerIsConfigured(Directory appDirectory) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
final File configFile = subDir.childFile('config.json');
|
final File inputFile = subDir.childFile('input.json');
|
||||||
expect(configFile, exists);
|
expect(inputFile, exists);
|
||||||
final Map<String, Object?> config =
|
final Map<String, Object?> inputContents =
|
||||||
json.decode(configFile.readAsStringSync()) as Map<String, Object?>;
|
json.decode(inputFile.readAsStringSync()) as Map<String, Object?>;
|
||||||
if (!(config['supported_asset_types']! as List<dynamic>).contains(CodeAsset.type)) {
|
final BuildInput input = BuildInput(inputContents);
|
||||||
|
final BuildConfig config = input.config;
|
||||||
|
if (!config.buildCodeAssets) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
expect((config['c_compiler']! as Map<String, Object?>)['cc'], isNotNull);
|
expect(config.code.cCompiler?.compiler, isNot(isNull));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,10 +186,10 @@ import 'package:native_assets_cli/code_assets.dart';
|
|||||||
import 'package:native_toolchain_c/native_toolchain_c.dart';
|
import 'package:native_toolchain_c/native_toolchain_c.dart';
|
||||||
|
|
||||||
void main(List<String> args) async {
|
void main(List<String> args) async {
|
||||||
await build(args, (config, output) async {
|
await build(args, (input, output) async {
|
||||||
final packageName = config.packageName;
|
final packageName = input.packageName;
|
||||||
|
|
||||||
if (!config.buildAssetTypes.contains(CodeAsset.type)) {
|
if (!input.config.buildAssetTypes.contains(CodeAsset.type)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final builders = [
|
final builders = [
|
||||||
@ -202,7 +202,7 @@ void main(List<String> args) async {
|
|||||||
name: packageName,
|
name: packageName,
|
||||||
assetName: '${packageName}_bindings_generated.dart',
|
assetName: '${packageName}_bindings_generated.dart',
|
||||||
sources: ['src/$packageName.c'],
|
sources: ['src/$packageName.c'],
|
||||||
flags: config.dynamicLinkingFlags('add'),
|
flags: input.dynamicLinkingFlags('add'),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -212,7 +212,7 @@ void main(List<String> args) async {
|
|||||||
|
|
||||||
for (final builder in builders) {
|
for (final builder in builders) {
|
||||||
await builder.run(
|
await builder.run(
|
||||||
config: config,
|
input: input,
|
||||||
output: output,
|
output: output,
|
||||||
logger: logger,
|
logger: logger,
|
||||||
);
|
);
|
||||||
@ -220,8 +220,8 @@ void main(List<String> args) async {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
extension on BuildConfig {
|
extension on BuildInput {
|
||||||
List<String> dynamicLinkingFlags(String libraryName) => switch (codeConfig.targetOS) {
|
List<String> dynamicLinkingFlags(String libraryName) => switch (config.code.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: ${codeConfig.targetOS}'),
|
_ => throw UnimplementedError('Unsupported OS: ${config.code.targetOS}'),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
''';
|
''';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user