From 989ef5015ada6bb84913d0ef97de29de7de11de9 Mon Sep 17 00:00:00 2001 From: Daco Harkes Date: Fri, 13 Sep 2024 16:18:21 +0200 Subject: [PATCH] [native_assets_cli] Add `outputDirectoryShared` to config (#1557) --- .github/workflows/native.yaml | 3 + pkgs/native_assets_builder/CHANGELOG.md | 3 +- .../lib/src/build_runner/build_runner.dart | 47 +++++-- .../lib/src/locking/locking.dart | 22 +++ .../build_runner/concurrency_shared_test.dart | 76 ++++++++++ .../concurrency_shared_test_helper.dart | 38 +++++ .../test/locking/locking_test.dart | 2 + .../test/locking/locking_test_helper.dart | 2 +- .../native_dynamic_linking_test.dart | 16 ++- .../test/test_data/transformer_test.dart | 132 ++++++++++++++++++ .../test_data/manifest.yaml | 14 ++ .../test_data/transformer/data/data0.json | 3 + .../test_data/transformer/data/data1.json | 3 + .../test_data/transformer/data/data2.json | 3 + .../test_data/transformer/data/data3.json | 3 + .../test_data/transformer/data/data4.json | 3 + .../test_data/transformer/data/data5.json | 3 + .../test_data/transformer/data/data6.json | 3 + .../test_data/transformer/data/data7.json | 3 + .../test_data/transformer/data/data8.json | 3 + .../test_data/transformer/data/data9.json | 3 + .../test_data/transformer/hook/build.dart | 60 ++++++++ .../transformer/lib/src/transform.dart | 17 +++ .../test_data/transformer/manifest.yaml | 16 +++ .../test_data/transformer/pubspec.yaml | 16 +++ .../transformer/tool/generate_data.dart | 18 +++ pkgs/native_assets_cli/CHANGELOG.md | 4 +- pkgs/native_assets_cli/lib/locking.dart | 8 -- .../lib/src/api/build_config.dart | 4 + .../lib/src/api/hook_config.dart | 25 +++- .../lib/src/api/link_config.dart | 4 + pkgs/native_assets_cli/lib/src/api/test.dart | 3 + .../lib/src/model/build_config.dart | 3 + .../lib/src/model/build_config_CHANGELOG.md | 7 + .../lib/src/model/build_output_CHANGELOG.md | 4 + .../lib/src/model/data_asset.dart | 6 +- .../lib/src/model/hook_config.dart | 26 +++- .../lib/src/model/link_config.dart | 3 + .../test/api/build_config_test.dart | 19 ++- .../test/api/build_test.dart | 4 + .../test/api/link_config_test.dart | 12 +- .../test/example/local_asset_test.dart | 9 +- .../test/example/native_add_library_test.dart | 9 +- .../example/native_dynamic_linking_test.dart | 9 +- .../test/model/build_config_test.dart | 30 ++++ .../test/model/build_output_test.dart | 6 + .../test/model/link_config_test.dart | 26 ++++ .../test/validator/validator_test.dart | 20 ++- .../cbuilder/cbuilder_build_failure_test.dart | 2 + .../cbuilder/cbuilder_cross_android_test.dart | 4 + .../cbuilder/cbuilder_cross_ios_test.dart | 14 +- .../cbuilder_cross_linux_host_test.dart | 2 + .../cbuilder_cross_macos_host_test.dart | 14 +- .../cbuilder_cross_windows_host_test.dart | 2 + .../test/cbuilder/cbuilder_test.dart | 17 +++ .../test/cbuilder/compiler_resolver_test.dart | 4 + .../test/cbuilder/objective_c_test.dart | 2 + .../test/clinker/build_testfiles.dart | 2 + .../test/clinker/objects_test.dart | 4 +- .../test/clinker/throws_test.dart | 2 + .../test/clinker/treeshake_helper.dart | 9 +- 61 files changed, 785 insertions(+), 46 deletions(-) rename pkgs/{native_assets_cli => native_assets_builder}/lib/src/locking/locking.dart (87%) create mode 100644 pkgs/native_assets_builder/test/build_runner/concurrency_shared_test.dart create mode 100644 pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart rename pkgs/{native_assets_cli => native_assets_builder}/test/locking/locking_test.dart (99%) rename pkgs/{native_assets_cli => native_assets_builder}/test/locking/locking_test_helper.dart (91%) create mode 100644 pkgs/native_assets_builder/test/test_data/transformer_test.dart create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data0.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data1.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data2.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data3.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data4.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data5.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data6.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data7.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data8.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/data/data9.json create mode 100644 pkgs/native_assets_builder/test_data/transformer/hook/build.dart create mode 100644 pkgs/native_assets_builder/test_data/transformer/lib/src/transform.dart create mode 100644 pkgs/native_assets_builder/test_data/transformer/manifest.yaml create mode 100644 pkgs/native_assets_builder/test_data/transformer/pubspec.yaml create mode 100644 pkgs/native_assets_builder/test_data/transformer/tool/generate_data.dart delete mode 100644 pkgs/native_assets_cli/lib/locking.dart diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml index 693b1220e..ec16a42fa 100644 --- a/.github/workflows/native.yaml +++ b/.github/workflows/native.yaml @@ -96,6 +96,9 @@ jobs: - run: dart pub get -C test_data/add_asset_link/ if: ${{ matrix.package == 'native_assets_builder' }} + - run: dart pub get -C test_data/transformer/ + if: ${{ matrix.package == 'native_assets_builder' }} + - run: dart pub get -C test_data/treeshaking_native_libs/ if: ${{ matrix.package == 'native_assets_builder' }} diff --git a/pkgs/native_assets_builder/CHANGELOG.md b/pkgs/native_assets_builder/CHANGELOG.md index f446c537d..c1ad9add8 100644 --- a/pkgs/native_assets_builder/CHANGELOG.md +++ b/pkgs/native_assets_builder/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.8.4-wip -- Nothing yet. +- Also lock `BuildConfig` and `LinkConfig` `outputDirectoryShared` when invoking + hooks to prevent concurrency issues with shared output caching. ## 0.8.3 diff --git a/pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart b/pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart index 2a1f05a54..36a3c4d04 100644 --- a/pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart +++ b/pkgs/native_assets_builder/lib/src/build_runner/build_runner.dart @@ -6,11 +6,11 @@ import 'dart:async'; import 'dart:io'; import 'package:logging/logging.dart'; -import 'package:native_assets_cli/locking.dart'; import 'package:native_assets_cli/native_assets_cli.dart' as api; import 'package:native_assets_cli/native_assets_cli_internal.dart'; import 'package:package_config/package_config.dart'; +import '../locking/locking.dart'; import '../model/build_dry_run_result.dart'; import '../model/build_result.dart'; import '../model/hook_result.dart'; @@ -263,13 +263,21 @@ class NativeAssetsBuildRunner { ); final buildDirUri = packageLayout.dartToolNativeAssetsBuilder.resolve('$buildDirName/'); - final outDirUri = buildDirUri.resolve('out/'); - final outDir = Directory.fromUri(outDirUri); + final outputDirectory = buildDirUri.resolve('out/'); + final outDir = Directory.fromUri(outputDirectory); if (!await outDir.exists()) { // TODO(https://dartbug.com/50565): Purge old or unused folders. await outDir.create(recursive: true); } + final outputDirectoryShared = packageLayout.dartToolNativeAssetsBuilder + .resolve('shared/${package.name}/$hook/'); + final outDirShared = Directory.fromUri(outputDirectoryShared); + if (!await outDirShared.exists()) { + // TODO(https://dartbug.com/50565): Purge old or unused folders. + await outDirShared.create(recursive: true); + } + if (hook == Hook.link) { File? resourcesFile; if (resourceIdentifiers != null) { @@ -279,7 +287,8 @@ class NativeAssetsBuildRunner { } return LinkConfigImpl( - outputDirectory: outDirUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: package.name, packageRoot: package.root, targetOS: target.os, @@ -297,7 +306,8 @@ class NativeAssetsBuildRunner { ); } else { return BuildConfigImpl( - outputDirectory: outDirUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: package.name, packageRoot: package.root, targetOS: target.os, @@ -428,8 +438,11 @@ class NativeAssetsBuildRunner { continue; } // TODO(https://github.com/dart-lang/native/issues/1321): Should dry runs be cached? - var (buildOutput, packageSuccess) = await runUnderDirectoryLock( - Directory.fromUri(config.outputDirectory.parent), + var (buildOutput, packageSuccess) = await runUnderDirectoriesLock( + [ + Directory.fromUri(config.outputDirectoryShared.parent), + Directory.fromUri(config.outputDirectory.parent), + ], timeout: singleHookTimeout, logger: logger, () => _runHookForPackage( @@ -482,8 +495,11 @@ class NativeAssetsBuildRunner { PackageLayout packageLayout, ) async { final outDir = config.outputDirectory; - return await runUnderDirectoryLock( - Directory.fromUri(config.outputDirectory.parent), + return await runUnderDirectoriesLock( + [ + Directory.fromUri(config.outputDirectoryShared.parent), + Directory.fromUri(config.outputDirectory.parent), + ], timeout: singleHookTimeout, logger: logger, () async { @@ -784,15 +800,27 @@ ${compileResult.stdout} hook: hook, linkingEnabled: linkingEnabled, ); + final outDirUri = buildParentDir.resolve('$buildDirName/out/'); final outDir = Directory.fromUri(outDirUri); if (!await outDir.exists()) { await outDir.create(recursive: true); } + + // Shared between dry run and wet run. + final outputDirectoryShared = + buildParentDir.resolve('shared/${package.name}/$hook/out/'); + final outDirShared = Directory.fromUri(outputDirectoryShared); + if (!await outDirShared.exists()) { + // TODO(https://dartbug.com/50565): Purge old or unused folders. + await outDirShared.create(recursive: true); + } + switch (hook) { case Hook.build: return BuildConfigImpl.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, targetOS: targetOS, @@ -803,6 +831,7 @@ ${compileResult.stdout} case Hook.link: return LinkConfigImpl.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, targetOS: targetOS, diff --git a/pkgs/native_assets_cli/lib/src/locking/locking.dart b/pkgs/native_assets_builder/lib/src/locking/locking.dart similarity index 87% rename from pkgs/native_assets_cli/lib/src/locking/locking.dart rename to pkgs/native_assets_builder/lib/src/locking/locking.dart index 005bfb88b..c4b1d7ac3 100644 --- a/pkgs/native_assets_cli/lib/src/locking/locking.dart +++ b/pkgs/native_assets_builder/lib/src/locking/locking.dart @@ -7,6 +7,28 @@ import 'dart:io'; import 'package:logging/logging.dart'; +Future runUnderDirectoriesLock( + List directories, + Future Function() callback, { + Duration? timeout, + Logger? logger, +}) async { + if (directories.isEmpty) { + return await callback(); + } + return await runUnderDirectoryLock( + directories.first, + () => runUnderDirectoriesLock( + directories.skip(1).toList(), + callback, + timeout: timeout, + logger: logger, + ), + timeout: timeout, + logger: logger, + ); +} + /// Run [callback] with this Dart process having exclusive access to /// [directory]. /// diff --git a/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test.dart b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test.dart new file mode 100644 index 000000000..1b095e6dd --- /dev/null +++ b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test.dart @@ -0,0 +1,76 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:async'; + +import 'package:native_assets_builder/src/utils/run_process.dart' + show RunProcessResult; +import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:test/test.dart'; + +import '../helpers.dart'; +import 'helpers.dart'; + +const Timeout longTimeout = Timeout(Duration(minutes: 5)); + +void main() async { + const packageName = 'transformer'; + + test('Concurrent invocations', timeout: longTimeout, () async { + await inTempDir((tempUri) async { + final packageUri = tempUri.resolve('$packageName/'); + await copyTestProjects( + sourceUri: testDataUri.resolve('$packageName/'), + targetUri: packageUri, + ); + + await runPubGet( + workingDirectory: packageUri, + logger: logger, + ); + + Future runBuildInProcess( + Target target, + ) async { + final result = await runProcess( + executable: dartExecutable, + arguments: [ + pkgNativeAssetsBuilderUri + .resolve( + 'test/build_runner/concurrency_shared_test_helper.dart', + ) + .toFilePath(), + packageUri.toFilePath(), + target.toString(), + ], + workingDirectory: packageUri, + logger: logger, + ); + expect(result.exitCode, 0); + return result; + } + + // Simulate running `dart run` concurrently in 3 different terminals. + // Twice for the same target and also for a different target. + final results = await Future.wait([ + runBuildInProcess(Target.androidArm64), + runBuildInProcess(Target.current), + runBuildInProcess(Target.current), + ]); + final stdouts = results.map((e) => e.stdout).join('\n'); + // One run for the two targets wins in running first. + expect(stdouts, stringContainsInOrder(['Reused 0 cached files.'])); + // The other run reuses the cached results. + expect(stdouts, stringContainsInOrder(['Reused 10 cached files.'])); + // One of the two runs for the same target will not be invoked at all. + expect( + stdouts, + stringContainsInOrder([ + 'Waiting to be able to obtain lock of directory', + 'Skipping build for', + ]), + ); + }); + }); +} diff --git a/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart new file mode 100644 index 000000000..ebec9d0d5 --- /dev/null +++ b/pkgs/native_assets_builder/test/build_runner/concurrency_shared_test_helper.dart @@ -0,0 +1,38 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:logging/logging.dart'; +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 '../helpers.dart'; + +// Is invoked concurrently multiple times in separate processes. +void main(List args) async { + final packageUri = Uri.directory(args[0]); + final target = Target.fromString(args[1]); + + final logger = Logger('') + ..level = Level.ALL + ..onRecord.listen((event) => print(event.message)); + + final result = await NativeAssetsBuildRunner( + logger: logger, + dartExecutable: dartExecutable, + ).build( + buildMode: BuildModeImpl.release, + linkModePreference: LinkModePreferenceImpl.dynamic, + target: target, + workingDirectory: packageUri, + includeParentEnvironment: true, + linkingEnabled: false, + supportedAssetTypes: [DataAsset.type], + targetAndroidNdkApi: target.os == OS.android ? 30 : null, + ); + if (!result.success) { + throw Error(); + } + print('done'); +} diff --git a/pkgs/native_assets_cli/test/locking/locking_test.dart b/pkgs/native_assets_builder/test/locking/locking_test.dart similarity index 99% rename from pkgs/native_assets_cli/test/locking/locking_test.dart rename to pkgs/native_assets_builder/test/locking/locking_test.dart index ad85cba68..ecf89d5e3 100644 --- a/pkgs/native_assets_cli/test/locking/locking_test.dart +++ b/pkgs/native_assets_builder/test/locking/locking_test.dart @@ -14,6 +14,8 @@ import '../helpers.dart'; const Timeout longTimeout = Timeout(Duration(minutes: 5)); void main() async { + final packageUri = findPackageRoot('native_assets_builder'); + test('Concurrent invocations', timeout: longTimeout, () async { await inTempDir((tempUri) async { Future runInProcess() async { diff --git a/pkgs/native_assets_cli/test/locking/locking_test_helper.dart b/pkgs/native_assets_builder/test/locking/locking_test_helper.dart similarity index 91% rename from pkgs/native_assets_cli/test/locking/locking_test_helper.dart rename to pkgs/native_assets_builder/test/locking/locking_test_helper.dart index aacae4bc6..3fa8248c6 100644 --- a/pkgs/native_assets_cli/test/locking/locking_test_helper.dart +++ b/pkgs/native_assets_builder/test/locking/locking_test_helper.dart @@ -4,7 +4,7 @@ import 'dart:io'; -import 'package:native_assets_cli/locking.dart'; +import 'package:native_assets_builder/src/locking/locking.dart'; void main(List args) async { final directory = Directory.fromUri(Uri.directory(args[0])); diff --git a/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart b/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart index 6ac15ca3d..15352eae7 100644 --- a/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart +++ b/pkgs/native_assets_builder/test/test_data/native_dynamic_linking_test.dart @@ -24,13 +24,18 @@ void main() async { test( 'native_dynamic_linking build$testSuffix', () => inTempDir((tempUri) async { + final outputDirectory = tempUri.resolve('out/'); + await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempUri.resolve('out_shared/'); + await Directory.fromUri(outputDirectoryShared).create(); final testTempUri = tempUri.resolve('test1/'); await Directory.fromUri(testTempUri).create(); final testPackageUri = testDataUri.resolve('$name/'); final dartUri = Uri.file(Platform.resolvedExecutable); final config = BuildConfigImpl( - outputDirectory: tempUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: name, packageRoot: testPackageUri, targetOS: OSImpl.current, @@ -62,7 +67,7 @@ void main() async { } expect(processResult.exitCode, 0); - final buildOutputUri = tempUri.resolve('build_output.json'); + final buildOutputUri = outputDirectory.resolve('build_output.json'); final buildOutput = HookOutputImpl.fromJsonString( await File.fromUri(buildOutputUri).readAsString()); final assets = buildOutput.assets; @@ -100,9 +105,12 @@ void main() async { environment: { // Add the directory containing the linked dynamic libraries to // the PATH so that the dynamic linker can find them. + // TODO(https://github.com/dart-lang/sdk/issues/56551): We could + // skip this if Dart would implicitly add dylib containing + // directories to the PATH. if (Platform.isWindows) - 'PATH': - '${tempUri.toFilePath()};${Platform.environment['PATH']}', + 'PATH': '${outputDirectory.toFilePath()};' + '${Platform.environment['PATH']}', }, throwOnUnexpectedExitCode: true, logger: logger, diff --git a/pkgs/native_assets_builder/test/test_data/transformer_test.dart b/pkgs/native_assets_builder/test/test_data/transformer_test.dart new file mode 100644 index 000000000..eae5cfc7b --- /dev/null +++ b/pkgs/native_assets_builder/test/test_data/transformer_test.dart @@ -0,0 +1,132 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@OnPlatform({ + 'mac-os': Timeout.factor(2), + 'windows': Timeout.factor(10), +}) +library; + +import 'dart:convert'; +import 'dart:io'; + +import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:native_assets_cli/native_assets_cli_internal.dart'; +import 'package:test/test.dart'; + +import '../build_runner/helpers.dart'; +import '../helpers.dart'; + +void main() async { + const packageName = 'transformer'; + + test( + 'transformer caching', + () => inTempDir((tempUri) async { + final packageUri = tempUri.resolve('$packageName/'); + await copyTestProjects( + sourceUri: testDataUri.resolve('$packageName/'), + targetUri: packageUri, + ); + + await runPubGet( + workingDirectory: packageUri, + logger: logger, + ); + + final outputDirectory = tempUri.resolve('out/'); + await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempUri.resolve('out_shared/'); + await Directory.fromUri(outputDirectoryShared).create(); + final testTempUri = tempUri.resolve('test1/'); + await Directory.fromUri(testTempUri).create(); + final dartUri = Uri.file(Platform.resolvedExecutable); + + late String stdout; + late HookOutputImpl output; + + Future runBuild(Architecture architecture) async { + final config = BuildConfigImpl( + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, + packageName: packageName, + packageRoot: packageUri, + targetOS: OSImpl.current, + version: HookConfigImpl.latestVersion, + linkModePreference: LinkModePreferenceImpl.dynamic, + dryRun: false, + linkingEnabled: false, + targetArchitecture: architecture as ArchitectureImpl, + buildMode: BuildModeImpl.debug, + supportedAssetTypes: [DataAsset.type], + ); + + final buildConfigUri = testTempUri.resolve('build_config.json'); + await File.fromUri(buildConfigUri) + .writeAsString(jsonEncode(config.toJson())); + + final processResult = await Process.run( + dartUri.toFilePath(), + [ + 'hook/build.dart', + '--config=${buildConfigUri.toFilePath()}', + ], + workingDirectory: packageUri.toFilePath(), + ); + if (processResult.exitCode != 0) { + print(processResult.stdout); + print(processResult.stderr); + print(processResult.exitCode); + } + expect(processResult.exitCode, 0); + stdout = processResult.stdout as String; + + final buildOutputUri = outputDirectory.resolve('build_output.json'); + output = HookOutputImpl.fromJsonString( + await File.fromUri(buildOutputUri).readAsString()); + } + + await runBuild(Architecture.x64); + expect( + stdout, + stringContainsInOrder([ + 'Transformed 10 files.', + 'Reused 0 cached files.', + ]), + ); + expect( + output.assets, + contains( + DataAsset( + file: outputDirectoryShared.resolve('data_transformed0.json'), + name: 'data_transformed0.json', + package: packageName, + ), + ), + ); + expect( + output.dependencies, + containsAll([ + packageUri.resolve('data/'), + packageUri.resolve('data/data0.json'), + ]), + ); + + await File.fromUri(packageUri.resolve('data/data0.json')).writeAsString( + jsonEncode({'foo': 'bar'}), + ); + + // Run the build for a different architecture. + // This should use the caching inside the hook. + await runBuild(Architecture.arm64); + expect( + stdout, + stringContainsInOrder([ + 'Transformed 1 files.', + 'Reused 9 cached files.', + ]), + ); + }), + ); +} diff --git a/pkgs/native_assets_builder/test_data/manifest.yaml b/pkgs/native_assets_builder/test_data/manifest.yaml index fd8a5fa9c..3fe8dff49 100644 --- a/pkgs/native_assets_builder/test_data/manifest.yaml +++ b/pkgs/native_assets_builder/test_data/manifest.yaml @@ -99,6 +99,20 @@ - simple_data_asset/bin/deep_modify_data_asset.dart.debug - some_dev_dep/bin/some_dev_dep.dart - some_dev_dep/pubspec.yaml +- transformer/data/data0.json +- transformer/data/data1.json +- transformer/data/data2.json +- transformer/data/data3.json +- transformer/data/data4.json +- transformer/data/data5.json +- transformer/data/data6.json +- transformer/data/data7.json +- transformer/data/data8.json +- transformer/data/data9.json +- transformer/hook/build.dart +- transformer/lib/src/transform.dart +- transformer/tool/generate_data.dart +- transformer/pubspec.yaml - treeshaking_native_libs/pubspec.yaml - treeshaking_native_libs/lib/treeshaking_native_libs.dart - treeshaking_native_libs/lib/src/treeshaking_native_libs.dart diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data0.json b/pkgs/native_assets_builder/test_data/transformer/data/data0.json new file mode 100644 index 000000000..6ddd34dfe --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data0.json @@ -0,0 +1,3 @@ +{ + "some_data": 0 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data1.json b/pkgs/native_assets_builder/test_data/transformer/data/data1.json new file mode 100644 index 000000000..8dd184525 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data1.json @@ -0,0 +1,3 @@ +{ + "some_data": 1 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data2.json b/pkgs/native_assets_builder/test_data/transformer/data/data2.json new file mode 100644 index 000000000..2cde95d52 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data2.json @@ -0,0 +1,3 @@ +{ + "some_data": 2 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data3.json b/pkgs/native_assets_builder/test_data/transformer/data/data3.json new file mode 100644 index 000000000..36d4e05a1 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data3.json @@ -0,0 +1,3 @@ +{ + "some_data": 3 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data4.json b/pkgs/native_assets_builder/test_data/transformer/data/data4.json new file mode 100644 index 000000000..be3cb8da1 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data4.json @@ -0,0 +1,3 @@ +{ + "some_data": 4 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data5.json b/pkgs/native_assets_builder/test_data/transformer/data/data5.json new file mode 100644 index 000000000..1994bb266 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data5.json @@ -0,0 +1,3 @@ +{ + "some_data": 5 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data6.json b/pkgs/native_assets_builder/test_data/transformer/data/data6.json new file mode 100644 index 000000000..a78009fb9 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data6.json @@ -0,0 +1,3 @@ +{ + "some_data": 6 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data7.json b/pkgs/native_assets_builder/test_data/transformer/data/data7.json new file mode 100644 index 000000000..9af10bbe7 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data7.json @@ -0,0 +1,3 @@ +{ + "some_data": 7 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data8.json b/pkgs/native_assets_builder/test_data/transformer/data/data8.json new file mode 100644 index 000000000..6d1ba9bbc --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data8.json @@ -0,0 +1,3 @@ +{ + "some_data": 8 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/data/data9.json b/pkgs/native_assets_builder/test_data/transformer/data/data9.json new file mode 100644 index 000000000..4d1a16fdc --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/data/data9.json @@ -0,0 +1,3 @@ +{ + "some_data": 9 +} diff --git a/pkgs/native_assets_builder/test_data/transformer/hook/build.dart b/pkgs/native_assets_builder/test_data/transformer/hook/build.dart new file mode 100644 index 000000000..9b1f2308c --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/hook/build.dart @@ -0,0 +1,60 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:io'; + +import 'package:native_assets_cli/native_assets_cli.dart'; +import 'package:transformer/src/transform.dart'; + +void main(List arguments) async { + await build(arguments, (config, output) async { + final dataDirectory = + Directory.fromUri(config.packageRoot.resolve('data/')); + // If data are added, rerun hook. + output.addDependency(dataDirectory.uri); + + var transformedFiles = 0; + var cachedFiles = 0; + + await for (final sourceFile in dataDirectory.list()) { + if (sourceFile is! File) { + continue; + } + + final sourceName = + sourceFile.uri.pathSegments.lastWhere((e) => e.isNotEmpty); + final name = sourceName.replaceFirst('data', 'data_transformed'); + final targetFile = File.fromUri(config.outputDirectoryShared + .resolve(sourceName.replaceFirst('data', 'data_transformed'))); + + if (!config.dryRun) { + // TODO(dacoharkes): Timestamps are not enough for correct caching. + if (!await targetFile.exists() || + !(await sourceFile.lastModified()) + .isBefore(await targetFile.lastModified())) { + await transformFile(sourceFile, targetFile); + transformedFiles++; + } else { + cachedFiles++; + } + } + + output.addAsset( + DataAsset( + package: config.packageName, + name: name, + file: targetFile.uri, + ), + ); + output.addDependency( + sourceFile.uri, + ); + } + + if (!config.dryRun) { + print('Transformed $transformedFiles files.'); + print('Reused $cachedFiles cached files.'); + } + }); +} diff --git a/pkgs/native_assets_builder/test_data/transformer/lib/src/transform.dart b/pkgs/native_assets_builder/test_data/transformer/lib/src/transform.dart new file mode 100644 index 000000000..afa2314da --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/lib/src/transform.dart @@ -0,0 +1,17 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +final _encoder = JsonEncoder.withIndent(' ' * 4); + +Future transformFile(File input, File output) async { + final inputContents = jsonDecode(await input.readAsString()); + final outputContents = { + 'Status': 'I have been transformed!', + 'original': inputContents, + }; + await output.writeAsString('${_encoder.convert(outputContents)}\n'); +} diff --git a/pkgs/native_assets_builder/test_data/transformer/manifest.yaml b/pkgs/native_assets_builder/test_data/transformer/manifest.yaml new file mode 100644 index 000000000..53c68965a --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/manifest.yaml @@ -0,0 +1,16 @@ +# The list of files to copy to a temporary folder to ensure running tests from +# a completely clean setup. +- data/data0.json +- data/data1.json +- data/data2.json +- data/data3.json +- data/data4.json +- data/data5.json +- data/data6.json +- data/data7.json +- data/data8.json +- data/data9.json +- hook/build.dart +- lib/src/transform.dart +- tool/generate_data.dart +- pubspec.yaml diff --git a/pkgs/native_assets_builder/test_data/transformer/pubspec.yaml b/pkgs/native_assets_builder/test_data/transformer/pubspec.yaml new file mode 100644 index 000000000..547239723 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/pubspec.yaml @@ -0,0 +1,16 @@ +name: transformer +description: Transforms assets, caches the transformation, and caches across build invocations. +version: 0.1.0 + +publish_to: none + +environment: + sdk: '>=3.3.0 <4.0.0' + +dependencies: + # native_assets_cli: ^0.7.3 + native_assets_cli: + path: ../../../native_assets_cli/ + +dev_dependencies: + lints: ^3.0.0 diff --git a/pkgs/native_assets_builder/test_data/transformer/tool/generate_data.dart b/pkgs/native_assets_builder/test_data/transformer/tool/generate_data.dart new file mode 100644 index 000000000..5c344af85 --- /dev/null +++ b/pkgs/native_assets_builder/test_data/transformer/tool/generate_data.dart @@ -0,0 +1,18 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'dart:convert'; +import 'dart:io'; + +void main() async { + final packageRoot = Platform.script.resolve('../'); + final dataDirectory = packageRoot.resolve('data/'); + const numFiles = 10; + final encoder = JsonEncoder.withIndent(' ' * 4); + for (var i = 0; i < numFiles; i++) { + final file = File.fromUri(dataDirectory.resolve('data$i.json')); + await file.writeAsString('${encoder.convert({'some_data': i})}\n'); + } + print('Wrote $numFiles data files to ${dataDirectory.toFilePath()}.'); +} diff --git a/pkgs/native_assets_cli/CHANGELOG.md b/pkgs/native_assets_cli/CHANGELOG.md index 9f61a10c6..ba426b648 100644 --- a/pkgs/native_assets_cli/CHANGELOG.md +++ b/pkgs/native_assets_cli/CHANGELOG.md @@ -1,6 +1,8 @@ ## 0.8.1-wip -- Nothing yet. +- Add `BuildConfig` and `LinkConfig` `outputDirectoryShared`. +- Remove `package:native_assets_cli/locking.dart` with `runUnderDirectoryLock`. + Hook writers should not use this, the `native_assets_builder` does this. ## 0.8.0 diff --git a/pkgs/native_assets_cli/lib/locking.dart b/pkgs/native_assets_cli/lib/locking.dart deleted file mode 100644 index 2db664603..000000000 --- a/pkgs/native_assets_cli/lib/locking.dart +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -/// A library that contains helpers for running hooks concurrently. -library; - -export 'src/locking/locking.dart' show runUnderDirectoryLock; diff --git a/pkgs/native_assets_cli/lib/src/api/build_config.dart b/pkgs/native_assets_cli/lib/src/api/build_config.dart index 7fe7c16b9..9b256eaae 100644 --- a/pkgs/native_assets_cli/lib/src/api/build_config.dart +++ b/pkgs/native_assets_cli/lib/src/api/build_config.dart @@ -112,6 +112,7 @@ abstract final class BuildConfig implements HookConfig { /// parameters in [metadatum]. factory BuildConfig.build({ required Uri outputDirectory, + required Uri outputDirectoryShared, required String packageName, required Uri packageRoot, required BuildMode buildMode, @@ -130,6 +131,7 @@ abstract final class BuildConfig implements HookConfig { }) => BuildConfigImpl( outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, buildMode: buildMode as BuildModeImpl, @@ -160,6 +162,7 @@ abstract final class BuildConfig implements HookConfig { /// For the documentation of the parameters, see the equally named fields. factory BuildConfig.dryRun({ required Uri outputDirectory, + required Uri outputDirectoryShared, required String packageName, required Uri packageRoot, required OS targetOS, @@ -169,6 +172,7 @@ abstract final class BuildConfig implements HookConfig { }) => BuildConfigImpl.dryRun( outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, targetOS: targetOS as OSImpl, diff --git a/pkgs/native_assets_cli/lib/src/api/hook_config.dart b/pkgs/native_assets_cli/lib/src/api/hook_config.dart index 076741267..8171f005e 100644 --- a/pkgs/native_assets_cli/lib/src/api/hook_config.dart +++ b/pkgs/native_assets_cli/lib/src/api/hook_config.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:convert'; +import 'dart:io'; import 'package:cli_config/cli_config.dart'; import 'package:collection/collection.dart'; @@ -29,10 +30,30 @@ part '../model/hook_config.dart'; /// This abstraction makes it easier to design APIs intended for both kinds of /// build hooks, building and linking. abstract class HookConfig { - /// The directory in which all output and intermediate artifacts should be - /// placed. + /// The directory in which output and intermediate artifacts that are unique + /// to this configuration can be placed. + /// + /// This directory is unique per hook and per configuration. + /// + /// The contents of this directory will not be modified by anything else than + /// the hook itself. + /// + /// The invoker of the the hook will ensure concurrent invocations wait on + /// each other. Uri get outputDirectory; + /// The directory in which shared output and intermediate artifacts can be + /// placed. + /// + /// This directory is unique per hook. + /// + /// The contents of this directory will not be modified by anything else than + /// the hook itself. + /// + /// The invoker of the the hook will ensure concurrent invocations wait on + /// each other. + Uri get outputDirectoryShared; + /// The name of the package the assets are built for. String get packageName; diff --git a/pkgs/native_assets_cli/lib/src/api/link_config.dart b/pkgs/native_assets_cli/lib/src/api/link_config.dart index 612de3688..d5e4b71e8 100644 --- a/pkgs/native_assets_cli/lib/src/api/link_config.dart +++ b/pkgs/native_assets_cli/lib/src/api/link_config.dart @@ -44,6 +44,7 @@ abstract class LinkConfig implements HookConfig { factory LinkConfig.build({ required Uri outputDirectory, + required Uri outputDirectoryShared, required String packageName, required Uri packageRoot, Architecture? targetArchitecture, @@ -63,6 +64,7 @@ abstract class LinkConfig implements HookConfig { LinkConfigImpl( assets: assets.cast(), outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, buildMode: buildMode as BuildModeImpl, @@ -81,6 +83,7 @@ abstract class LinkConfig implements HookConfig { factory LinkConfig.dryRun({ required Uri outputDirectory, + required Uri outputDirectoryShared, required String packageName, required Uri packageRoot, required OS targetOS, @@ -92,6 +95,7 @@ abstract class LinkConfig implements HookConfig { LinkConfigImpl.dryRun( assets: assets.cast(), outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRoot, targetOS: targetOS as OSImpl, diff --git a/pkgs/native_assets_cli/lib/src/api/test.dart b/pkgs/native_assets_cli/lib/src/api/test.dart index 4ffca5ed1..e4b25c2d5 100644 --- a/pkgs/native_assets_cli/lib/src/api/test.dart +++ b/pkgs/native_assets_cli/lib/src/api/test.dart @@ -42,9 +42,12 @@ Future testBuildHook({ final outputDirectory = tempDir.resolve('output/'); await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempDir.resolve('output_shared/'); + await Directory.fromUri(outputDirectory).create(); final buildConfig = BuildConfig.build( outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: await _packageName(), packageRoot: Directory.current.uri, buildMode: buildMode ?? BuildMode.release, diff --git a/pkgs/native_assets_cli/lib/src/model/build_config.dart b/pkgs/native_assets_cli/lib/src/model/build_config.dart index 489417740..c58ef6e54 100644 --- a/pkgs/native_assets_cli/lib/src/model/build_config.dart +++ b/pkgs/native_assets_cli/lib/src/model/build_config.dart @@ -54,6 +54,7 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig { BuildConfigImpl({ required super.outputDirectory, + required super.outputDirectoryShared, required super.packageName, required super.packageRoot, Version? version, @@ -87,6 +88,7 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig { BuildConfigImpl.dryRun({ required super.outputDirectory, + required super.outputDirectoryShared, required super.packageName, required super.packageRoot, required super.targetOS, @@ -130,6 +132,7 @@ final class BuildConfigImpl extends HookConfigImpl implements BuildConfig { final targetOS = HookConfigImpl.parseTargetOS(config); return BuildConfigImpl( outputDirectory: HookConfigImpl.parseOutDir(config), + outputDirectoryShared: HookConfigImpl.parseOutDirShared(config), packageName: HookConfigImpl.parsePackageName(config), packageRoot: HookConfigImpl.parsePackageRoot(config), buildMode: HookConfigImpl.parseBuildMode(config, dryRun), diff --git a/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md b/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md index 0e4fce0d5..f3126361e 100644 --- a/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md +++ b/pkgs/native_assets_cli/lib/src/model/build_config_CHANGELOG.md @@ -1,3 +1,10 @@ +## 1.6.0 + +- `BuildConfig.outputDirectoryShared` for sharing between hook invocations. + Compatibility with older SDKs: Create a sibling dir next to the output + directory. This does not facilitate caching, but should not break the hook. + Compatibility with older hooks: These will not read this field. + ## 1.5.0 - No changes, but rev version due to BuildOutput change. diff --git a/pkgs/native_assets_cli/lib/src/model/build_output_CHANGELOG.md b/pkgs/native_assets_cli/lib/src/model/build_output_CHANGELOG.md index 4d825e062..43daa84e6 100644 --- a/pkgs/native_assets_cli/lib/src/model/build_output_CHANGELOG.md +++ b/pkgs/native_assets_cli/lib/src/model/build_output_CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.6.0 + +- No changes, but rev version due to BuildConfig change. + ## 1.5.0 - BuildOutput.dependencies no longer have to list Dart dependencies. diff --git a/pkgs/native_assets_cli/lib/src/model/data_asset.dart b/pkgs/native_assets_cli/lib/src/model/data_asset.dart index 9a05e7c97..6c298147d 100644 --- a/pkgs/native_assets_cli/lib/src/model/data_asset.dart +++ b/pkgs/native_assets_cli/lib/src/model/data_asset.dart @@ -35,14 +35,16 @@ final class DataAssetImpl implements DataAsset, AssetImpl { if (other is! DataAssetImpl) { return false; } - return other.package == package && other.file == file && other.name == name; + return other.package == package && + other.file.toFilePath() == file.toFilePath() && + other.name == name; } @override int get hashCode => Object.hash( package, name, - file, + file.toFilePath(), ); @override diff --git a/pkgs/native_assets_cli/lib/src/model/hook_config.dart b/pkgs/native_assets_cli/lib/src/model/hook_config.dart index f6ce8a1c6..be63881a5 100644 --- a/pkgs/native_assets_cli/lib/src/model/hook_config.dart +++ b/pkgs/native_assets_cli/lib/src/model/hook_config.dart @@ -7,11 +7,12 @@ part of '../api/hook_config.dart'; abstract class HookConfigImpl implements HookConfig { final Hook hook; - /// The folder in which all output and intermediate artifacts should be - /// placed. @override final Uri outputDirectory; + @override + final Uri outputDirectoryShared; + @override final String packageName; @@ -112,6 +113,7 @@ abstract class HookConfigImpl implements HookConfig { HookConfigImpl({ required this.hook, required this.outputDirectory, + required this.outputDirectoryShared, required this.packageName, required this.packageRoot, required this.version, @@ -137,6 +139,7 @@ abstract class HookConfigImpl implements HookConfig { HookConfigImpl.dryRun({ required this.hook, required this.outputDirectory, + required this.outputDirectoryShared, required this.packageName, required this.packageRoot, required this.version, @@ -165,6 +168,7 @@ abstract class HookConfigImpl implements HookConfig { String toJsonString() => const JsonEncoder.withIndent(' ').convert(toJson()); static const outDirConfigKey = 'out_dir'; + static const outDirSharedConfigKey = 'out_dir_shared'; static const packageNameConfigKey = 'package_name'; static const packageRootConfigKey = 'package_root'; static const _versionKey = 'version'; @@ -184,6 +188,7 @@ abstract class HookConfigImpl implements HookConfig { return { outDirConfigKey: outputDirectory.toFilePath(), + outDirSharedConfigKey: outputDirectoryShared.toFilePath(), packageNameConfigKey: packageName, packageRootConfigKey: packageRoot.toFilePath(), OSImpl.configKey: targetOS.toString(), @@ -234,6 +239,21 @@ abstract class HookConfigImpl implements HookConfig { static Uri parseOutDir(Config config) => config.path(outDirConfigKey, mustExist: true); + static Uri parseOutDirShared(Config config) { + final configResult = + config.optionalPath(outDirSharedConfigKey, mustExist: true); + if (configResult != null) { + return configResult; + } + // Backwards compatibility, create a directory next to the output dir. + // This is will not be shared so caching doesn't work, but it will make + // the newer hooks not crash. + final outDir = config.path(outDirConfigKey); + final outDirShared = outDir.resolve('../out_shared/'); + Directory.fromUri(outDirShared).createSync(); + return outDirShared; + } + static String parsePackageName(Config config) => config.string(packageNameConfigKey); @@ -457,6 +477,7 @@ can _only_ depend on OS.'''); return false; } if (other.outputDirectory != outputDirectory) return false; + if (other.outputDirectoryShared != outputDirectoryShared) return false; if (other.packageName != packageName) return false; if (other.packageRoot != packageRoot) return false; if (other.dryRun != dryRun) return false; @@ -479,6 +500,7 @@ can _only_ depend on OS.'''); @override int get hashCode => Object.hashAll([ outputDirectory, + outputDirectoryShared, packageName, packageRoot, targetOS, diff --git a/pkgs/native_assets_cli/lib/src/model/link_config.dart b/pkgs/native_assets_cli/lib/src/model/link_config.dart index eb32b7dfa..86765e9e3 100644 --- a/pkgs/native_assets_cli/lib/src/model/link_config.dart +++ b/pkgs/native_assets_cli/lib/src/model/link_config.dart @@ -25,6 +25,7 @@ class LinkConfigImpl extends HookConfigImpl implements LinkConfig { required this.assets, this.recordedUsagesFile, required super.outputDirectory, + required super.outputDirectoryShared, required super.packageName, required super.packageRoot, Version? version, @@ -49,6 +50,7 @@ class LinkConfigImpl extends HookConfigImpl implements LinkConfig { required this.assets, this.recordedUsagesFile, required super.outputDirectory, + required super.outputDirectoryShared, required super.packageName, required super.packageRoot, Version? version, @@ -97,6 +99,7 @@ class LinkConfigImpl extends HookConfigImpl implements LinkConfig { final targetOS = HookConfigImpl.parseTargetOS(config); return LinkConfigImpl( outputDirectory: HookConfigImpl.parseOutDir(config), + outputDirectoryShared: HookConfigImpl.parseOutDirShared(config), packageName: HookConfigImpl.parsePackageName(config), packageRoot: HookConfigImpl.parsePackageRoot(config), buildMode: HookConfigImpl.parseBuildMode(config, dryRun), diff --git a/pkgs/native_assets_cli/test/api/build_config_test.dart b/pkgs/native_assets_cli/test/api/build_config_test.dart index 564861c79..2488ab103 100644 --- a/pkgs/native_assets_cli/test/api/build_config_test.dart +++ b/pkgs/native_assets_cli/test/api/build_config_test.dart @@ -14,6 +14,8 @@ void main() async { late Uri tempUri; late Uri outDirUri; late Uri outDir2Uri; + late Uri outputDirectoryShared; + late Uri outputDirectoryShared2; late String packageName; late Uri packageRootUri; late Uri fakeClang; @@ -27,8 +29,12 @@ void main() async { outDirUri = tempUri.resolve('out1/'); await Directory.fromUri(outDirUri).create(); outDir2Uri = tempUri.resolve('out2/'); - packageName = 'my_package'; await Directory.fromUri(outDir2Uri).create(); + outputDirectoryShared = tempUri.resolve('out_shared1/'); + await Directory.fromUri(outputDirectoryShared).create(); + outputDirectoryShared2 = tempUri.resolve('out_shared2/'); + await Directory.fromUri(outputDirectoryShared2).create(); + packageName = 'my_package'; packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); fakeClang = tempUri.resolve('fake_clang'); @@ -50,6 +56,7 @@ void main() async { test('BuildConfig ==', () { final config1 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -68,6 +75,7 @@ void main() async { final config2 = BuildConfig.build( outputDirectory: outDir2Uri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -102,6 +110,7 @@ void main() async { test('BuildConfig fromConfig', () { final buildConfig2 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: Architecture.arm64, @@ -118,6 +127,7 @@ void main() async { 'linking_enabled': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, @@ -133,6 +143,7 @@ void main() async { test('BuildConfig.dryRun', () { final buildConfig2 = BuildConfig.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetOS: OS.android, @@ -146,6 +157,7 @@ void main() async { 'linking_enabled': true, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_os': 'android', @@ -159,6 +171,7 @@ void main() async { test('BuildConfig == dependency metadata', () { final buildConfig1 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -180,6 +193,7 @@ void main() async { final buildConfig2 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -208,6 +222,7 @@ void main() async { test('BuildConfig == hasLinkConfig', () { final buildConfig1 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.x64, @@ -219,6 +234,7 @@ void main() async { final buildConfig2 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.x64, @@ -236,6 +252,7 @@ void main() async { test('BuildConfig fromArgs', () async { final buildConfig = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, diff --git a/pkgs/native_assets_cli/test/api/build_test.dart b/pkgs/native_assets_cli/test/api/build_test.dart index ce62f8777..186aa7969 100644 --- a/pkgs/native_assets_cli/test/api/build_test.dart +++ b/pkgs/native_assets_cli/test/api/build_test.dart @@ -12,6 +12,7 @@ import 'package:test/test.dart'; void main() async { late Uri tempUri; late Uri outDirUri; + late Uri outputDirectoryShared; late String packageName; late Uri packageRootUri; late Uri fakeClang; @@ -26,6 +27,8 @@ void main() async { tempUri = (await Directory.systemTemp.createTemp()).uri; outDirUri = tempUri.resolve('out1/'); await Directory.fromUri(outDirUri).create(); + outputDirectoryShared = tempUri.resolve('out_shared1/'); + await Directory.fromUri(outputDirectoryShared).create(); packageName = 'my_package'; packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); @@ -42,6 +45,7 @@ void main() async { config1 = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, diff --git a/pkgs/native_assets_cli/test/api/link_config_test.dart b/pkgs/native_assets_cli/test/api/link_config_test.dart index 831278f75..a066acab1 100644 --- a/pkgs/native_assets_cli/test/api/link_config_test.dart +++ b/pkgs/native_assets_cli/test/api/link_config_test.dart @@ -12,6 +12,7 @@ void main() async { late Uri tempUri; late Uri outDirUri; late Uri outDir2Uri; + late Uri outputDirectoryShared; late String packageName; late Uri packageRootUri; late Uri fakeClang; @@ -25,8 +26,10 @@ void main() async { outDirUri = tempUri.resolve('out1/'); await Directory.fromUri(outDirUri).create(); outDir2Uri = tempUri.resolve('out2/'); - packageName = 'my_package'; await Directory.fromUri(outDir2Uri).create(); + outputDirectoryShared = tempUri.resolve('out_shared1/'); + await Directory.fromUri(outputDirectoryShared).create(); + packageName = 'my_package'; packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); fakeClang = tempUri.resolve('fake_clang'); @@ -48,6 +51,7 @@ void main() async { test('LinkConfig ==', () { final config1 = LinkConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -66,6 +70,7 @@ void main() async { final config2 = LinkConfig.build( outputDirectory: outDir2Uri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -98,6 +103,7 @@ void main() async { test('LinkConfig fromConfig', () { final linkConfig2 = LinkConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: Architecture.arm64, @@ -113,6 +119,7 @@ void main() async { 'dry_run': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, @@ -129,6 +136,7 @@ void main() async { test('LinkConfig.dryRun', () { final linkConfig2 = LinkConfig.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetOS: OS.android, @@ -141,6 +149,7 @@ void main() async { 'dry_run': true, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_os': 'android', @@ -155,6 +164,7 @@ void main() async { test('LinkConfig fromArgs', () async { final linkConfig = LinkConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, diff --git a/pkgs/native_assets_cli/test/example/local_asset_test.dart b/pkgs/native_assets_cli/test/example/local_asset_test.dart index 365eea413..000edb57f 100644 --- a/pkgs/native_assets_cli/test/example/local_asset_test.dart +++ b/pkgs/native_assets_cli/test/example/local_asset_test.dart @@ -33,11 +33,16 @@ void main() async { test('local_asset build$testSuffix', () async { final testTempUri = tempUri.resolve('test1/'); await Directory.fromUri(testTempUri).create(); + final outputDirectory = tempUri.resolve('out/'); + await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempUri.resolve('out_shared/'); + await Directory.fromUri(outputDirectoryShared).create(); final testPackageUri = packageUri.resolve('example/build/$name/'); final dartUri = Uri.file(Platform.resolvedExecutable); final config = BuildConfigImpl( - outputDirectory: tempUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: name, packageRoot: testPackageUri, targetOS: OSImpl.current, @@ -69,7 +74,7 @@ void main() async { } expect(processResult.exitCode, 0); - final buildOutputUri = tempUri.resolve('build_output.json'); + final buildOutputUri = outputDirectory.resolve('build_output.json'); final buildOutput = HookOutputImpl.fromJsonString( await File.fromUri(buildOutputUri).readAsString()); final assets = buildOutput.assets; diff --git a/pkgs/native_assets_cli/test/example/native_add_library_test.dart b/pkgs/native_assets_cli/test/example/native_add_library_test.dart index c78d87f58..ccec7203b 100644 --- a/pkgs/native_assets_cli/test/example/native_add_library_test.dart +++ b/pkgs/native_assets_cli/test/example/native_add_library_test.dart @@ -33,11 +33,16 @@ void main() async { test('native_add build$testSuffix', () async { final testTempUri = tempUri.resolve('test1/'); await Directory.fromUri(testTempUri).create(); + final outputDirectory = tempUri.resolve('out/'); + await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempUri.resolve('out_shared/'); + await Directory.fromUri(outputDirectoryShared).create(); final testPackageUri = packageUri.resolve('example/build/$name/'); final dartUri = Uri.file(Platform.resolvedExecutable); final config = BuildConfigImpl( - outputDirectory: tempUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: name, packageRoot: testPackageUri, targetOS: OSImpl.current, @@ -69,7 +74,7 @@ void main() async { } expect(processResult.exitCode, 0); - final buildOutputUri = tempUri.resolve('build_output.json'); + final buildOutputUri = outputDirectory.resolve('build_output.json'); final buildOutput = HookOutputImpl.fromJsonString( await File.fromUri(buildOutputUri).readAsString()); final assets = buildOutput.assets; diff --git a/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart b/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart index 1a91b5a6b..193dd159b 100644 --- a/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart +++ b/pkgs/native_assets_cli/test/example/native_dynamic_linking_test.dart @@ -42,11 +42,16 @@ void main() async { test('native_dynamic_linking build$testSuffix', () async { final testTempUri = tempUri.resolve('test1/'); await Directory.fromUri(testTempUri).create(); + final outputDirectory = tempUri.resolve('out/'); + await Directory.fromUri(outputDirectory).create(); + final outputDirectoryShared = tempUri.resolve('out_shared/'); + await Directory.fromUri(outputDirectoryShared).create(); final testPackageUri = packageUri.resolve('example/build/$name/'); final dartUri = Uri.file(Platform.resolvedExecutable); final config = BuildConfigImpl( - outputDirectory: tempUri, + outputDirectory: outputDirectory, + outputDirectoryShared: outputDirectoryShared, packageName: name, packageRoot: testPackageUri, targetOS: OSImpl.current, @@ -78,7 +83,7 @@ void main() async { } expect(processResult.exitCode, 0); - final buildOutputUri = tempUri.resolve('build_output.json'); + final buildOutputUri = outputDirectory.resolve('build_output.json'); final buildOutput = HookOutputImpl.fromJsonString( await File.fromUri(buildOutputUri).readAsString()); final assets = buildOutput.assets; diff --git a/pkgs/native_assets_cli/test/model/build_config_test.dart b/pkgs/native_assets_cli/test/model/build_config_test.dart index 1c93316b4..4eec51bde 100644 --- a/pkgs/native_assets_cli/test/model/build_config_test.dart +++ b/pkgs/native_assets_cli/test/model/build_config_test.dart @@ -16,6 +16,8 @@ void main() async { late Uri tempUri; late Uri outDirUri; late Uri outDir2Uri; + late Uri outputDirectoryShared; + late Uri outputDirectoryShared2; late Uri packageRootUri; late Uri fakeClang; late Uri fakeLd; @@ -29,6 +31,10 @@ void main() async { await Directory.fromUri(outDirUri).create(); outDir2Uri = tempUri.resolve('out2/'); await Directory.fromUri(outDir2Uri).create(); + outputDirectoryShared = tempUri.resolve('out_shared1/'); + await Directory.fromUri(outputDirectoryShared).create(); + outputDirectoryShared2 = tempUri.resolve('out_shared2/'); + await Directory.fromUri(outputDirectoryShared2).create(); packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); fakeClang = tempUri.resolve('fake_clang'); @@ -50,6 +56,7 @@ void main() async { test('BuildConfig ==', () { final config1 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -67,6 +74,7 @@ void main() async { final config2 = BuildConfigImpl( outputDirectory: outDir2Uri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -99,6 +107,7 @@ void main() async { test('BuildConfig fromConfig', () { final buildConfig2 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: ArchitectureImpl.arm64, @@ -115,6 +124,7 @@ void main() async { 'linking_enabled': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, @@ -130,6 +140,7 @@ void main() async { test('BuildConfig.dryRun', () { final buildConfig2 = BuildConfigImpl.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetOS: OSImpl.android, @@ -142,6 +153,7 @@ void main() async { 'linking_enabled': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_os': 'android', @@ -155,6 +167,7 @@ void main() async { test('BuildConfig toJson fromConfig', () { final buildConfig1 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: ArchitectureImpl.arm64, @@ -177,6 +190,7 @@ void main() async { test('BuildConfig == dependency metadata', () { final buildConfig1 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -198,6 +212,7 @@ void main() async { final buildConfig2 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -225,6 +240,7 @@ void main() async { final outDir = outDirUri; final buildConfig1 = BuildConfigImpl( outputDirectory: outDir, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -263,6 +279,7 @@ void main() async { 'linking_enabled': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'supported_asset_types': [NativeCodeAsset.type], @@ -304,6 +321,7 @@ target_os: ios version: 1.0.0'''; final buildConfig1 = BuildConfigImpl( outputDirectory: outDir, + outputDirectoryShared: outDir.resolve('../out_shared/'), packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -367,6 +385,7 @@ version: 1.0.0'''; () => BuildConfigImpl.fromJson({ 'version': HookConfigImpl.latestVersion.toString(), 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_architecture': 'arm64', @@ -391,6 +410,7 @@ version: 1.0.0'''; expect( () => BuildConfigImpl.fromJson({ 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'version': HookConfigImpl.latestVersion.toString(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), @@ -412,6 +432,7 @@ version: 1.0.0'''; test('BuildConfig toString', () { final config = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -431,6 +452,7 @@ version: 1.0.0'''; test('BuildConfig fromArgs', () async { final buildConfig = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -454,6 +476,7 @@ version: 1.0.0'''; test('envScript', () { final buildConfig1 = BuildConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: ArchitectureImpl.x64, @@ -479,6 +502,7 @@ version: 1.0.0'''; final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_root': tempUri.toFilePath(), 'target_os': 'linux', 'version': version, @@ -502,6 +526,7 @@ version: 1.0.0'''; final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -522,6 +547,7 @@ version: 1.0.0'''; final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -546,6 +572,7 @@ version: 1.0.0'''; 'linking_enabled': true, 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'android', @@ -567,6 +594,7 @@ version: 1.0.0'''; 'linking_enabled': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -579,6 +607,7 @@ version: 1.0.0'''; test('BuildConfig dry_run toString', () { final buildConfig = BuildConfigImpl.dryRun( packageName: packageName, + outputDirectoryShared: outputDirectoryShared, outputDirectory: outDirUri, packageRoot: tempUri, targetOS: OSImpl.windows, @@ -595,6 +624,7 @@ version: 1.0.0'''; 'dry_run': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, diff --git a/pkgs/native_assets_cli/test/model/build_output_test.dart b/pkgs/native_assets_cli/test/model/build_output_test.dart index 9d0b27d86..502f24641 100644 --- a/pkgs/native_assets_cli/test/model/build_output_test.dart +++ b/pkgs/native_assets_cli/test/model/build_output_test.dart @@ -202,11 +202,14 @@ version: 1.0.0'''; test('BuildOutput.readFromFile BuildOutput.writeToFile', () async { final outDir = tempUri.resolve('out_dir/'); + final outDirShared = tempUri.resolve('out_dir_shared/'); final packageRoot = tempUri.resolve('package_root/'); await Directory.fromUri(outDir).create(); + await Directory.fromUri(outDirShared).create(); await Directory.fromUri(packageRoot).create(); final config = BuildConfigImpl( outputDirectory: outDir, + outputDirectoryShared: outDirShared, packageName: 'dontcare', packageRoot: packageRoot, buildMode: BuildModeImpl.debug, @@ -223,11 +226,14 @@ version: 1.0.0'''; test('BuildOutput.readFromFile BuildOutput.writeToFile V1.1.0', () async { final outDir = tempUri.resolve('out_dir/'); + final outDirShared = tempUri.resolve('out_dir_shared/'); final packageRoot = tempUri.resolve('package_root/'); await Directory.fromUri(outDir).create(); + await Directory.fromUri(outDirShared).create(); await Directory.fromUri(packageRoot).create(); final config = BuildConfigImpl( outputDirectory: outDir, + outputDirectoryShared: outDirShared, packageName: 'dontcare', packageRoot: packageRoot, buildMode: BuildModeImpl.debug, diff --git a/pkgs/native_assets_cli/test/model/link_config_test.dart b/pkgs/native_assets_cli/test/model/link_config_test.dart index f28219c5d..ab09936c2 100644 --- a/pkgs/native_assets_cli/test/model/link_config_test.dart +++ b/pkgs/native_assets_cli/test/model/link_config_test.dart @@ -13,6 +13,8 @@ void main() async { late Uri tempUri; late Uri outDirUri; late Uri outDir2Uri; + late Uri outputDirectoryShared; + late Uri outputDirectoryShared2; const packageName = 'my_package'; late Uri packageRootUri; late Uri fakeClang; @@ -43,6 +45,10 @@ void main() async { await Directory.fromUri(outDirUri).create(); outDir2Uri = tempUri.resolve('out2/'); await Directory.fromUri(outDir2Uri).create(); + outputDirectoryShared = tempUri.resolve('out_shared1/'); + await Directory.fromUri(outputDirectoryShared).create(); + outputDirectoryShared2 = tempUri.resolve('out_shared2/'); + await Directory.fromUri(outputDirectoryShared2).create(); packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); fakeClang = tempUri.resolve('fake_clang'); @@ -66,6 +72,7 @@ void main() async { test('LinkConfig ==', () { final config1 = LinkConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -84,6 +91,7 @@ void main() async { final config2 = LinkConfigImpl( outputDirectory: outDir2Uri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -116,6 +124,7 @@ void main() async { test('LinkConfig fromConfig', () { final buildConfig2 = LinkConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: ArchitectureImpl.arm64, @@ -131,6 +140,7 @@ void main() async { 'dry_run': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, @@ -147,6 +157,7 @@ void main() async { test('LinkConfig.dryRun', () { final buildConfig2 = LinkConfigImpl.dryRun( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetOS: OSImpl.android, @@ -158,6 +169,7 @@ void main() async { 'dry_run': true, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_os': 'android', @@ -172,6 +184,7 @@ void main() async { test('LinkConfig toJson fromConfig', () { final buildConfig1 = LinkConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: packageRootUri, targetArchitecture: ArchitectureImpl.arm64, @@ -195,6 +208,7 @@ void main() async { final outDir = outDirUri; final buildConfig1 = LinkConfigImpl( outputDirectory: outDir, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -215,6 +229,7 @@ void main() async { 'build_mode': 'release', 'c_compiler': {'cc': fakeClang.toFilePath(), 'ld': fakeLd.toFilePath()}, 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'supported_asset_types': [NativeCodeAsset.type], @@ -262,6 +277,7 @@ void main() async { () => LinkConfigImpl.fromJson({ 'version': HookConfigImpl.latestVersion.toString(), 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_architecture': 'arm64', @@ -283,6 +299,7 @@ void main() async { expect( () => LinkConfigImpl.fromJson({ 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'version': HookConfigImpl.latestVersion.toString(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), @@ -304,6 +321,7 @@ void main() async { test('LinkConfig toString', () { final config = LinkConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -323,6 +341,7 @@ void main() async { test('LinkConfig fromArgs', () async { final buildConfig = LinkConfigImpl( outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageName: packageName, packageRoot: tempUri, targetArchitecture: ArchitectureImpl.arm64, @@ -348,6 +367,7 @@ void main() async { final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_root': tempUri.toFilePath(), 'target_os': 'linux', 'version': version, @@ -371,6 +391,7 @@ void main() async { final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -391,6 +412,7 @@ void main() async { final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -413,6 +435,7 @@ void main() async { final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'android', @@ -433,6 +456,7 @@ void main() async { final config = { 'link_mode_preference': 'prefer-static', 'out_dir': outDir.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': tempUri.toFilePath(), 'target_os': 'windows', @@ -447,6 +471,7 @@ void main() async { final buildConfig = LinkConfigImpl.dryRun( packageName: packageName, outputDirectory: outDirUri, + outputDirectoryShared: outputDirectoryShared, packageRoot: tempUri, targetOS: OSImpl.windows, assets: assets, @@ -461,6 +486,7 @@ void main() async { 'dry_run': false, 'link_mode_preference': 'prefer-static', 'out_dir': outDirUri.toFilePath(), + 'out_dir_shared': outputDirectoryShared.toFilePath(), 'package_name': packageName, 'package_root': packageRootUri.toFilePath(), 'target_android_ndk_api': 30, diff --git a/pkgs/native_assets_cli/test/validator/validator_test.dart b/pkgs/native_assets_cli/test/validator/validator_test.dart index 240d40688..5e6102d27 100644 --- a/pkgs/native_assets_cli/test/validator/validator_test.dart +++ b/pkgs/native_assets_cli/test/validator/validator_test.dart @@ -11,17 +11,17 @@ import 'package:test/test.dart'; void main() { late Uri tempUri; late Uri outDirUri; - late Uri outDir2Uri; + late Uri outDirSharedUri; late String packageName; late Uri packageRootUri; setUp(() async { tempUri = (await Directory.systemTemp.createTemp()).uri; - outDirUri = tempUri.resolve('out1/'); + outDirUri = tempUri.resolve('out/'); await Directory.fromUri(outDirUri).create(); - outDir2Uri = tempUri.resolve('out2/'); + outDirSharedUri = tempUri.resolve('out_shared/'); + await Directory.fromUri(outDirSharedUri).create(); packageName = 'my_package'; - await Directory.fromUri(outDir2Uri).create(); packageRootUri = tempUri.resolve('$packageName/'); await Directory.fromUri(packageRootUri).create(); }); @@ -33,6 +33,7 @@ void main() { test('linking not enabled', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -68,6 +69,7 @@ void main() { test('supported asset type', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -97,6 +99,7 @@ void main() { test('file exists', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -125,6 +128,7 @@ void main() { test('file not set', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -158,6 +162,7 @@ void main() { test('native code asset wrong linking $linkModePreference', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -195,6 +200,7 @@ void main() { test('native code wrong architecture', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -231,6 +237,7 @@ void main() { test('native code no architecture', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -266,6 +273,7 @@ void main() { test('native code asset wrong os', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -302,6 +310,7 @@ void main() { test('asset id in wrong package', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -331,6 +340,7 @@ void main() { test('duplicate asset id', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -367,6 +377,7 @@ void main() { test('link hook validation', () async { final config = LinkConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, @@ -396,6 +407,7 @@ void main() { test('duplicate dylib name', () async { final config = BuildConfig.build( outputDirectory: outDirUri, + outputDirectoryShared: outDirSharedUri, packageName: packageName, packageRoot: tempUri, targetArchitecture: Architecture.arm64, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart index 28fa203ed..e8f9182d1 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_build_failure_test.dart @@ -19,6 +19,7 @@ import '../helpers.dart'; void main() { test('build failure', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addCOriginalUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); final addCUri = tempUri.resolve('add.c'); @@ -31,6 +32,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart index a5558f939..021238663 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_android_test.dart @@ -108,8 +108,12 @@ Future buildLib( final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; + final tempUriShared = tempUri.resolve('shared/'); + await Directory.fromUri(tempUriShared).create(); + final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUriShared, packageName: name, packageRoot: tempUri, targetArchitecture: targetArchitecture, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart index 5b67876f2..6f4b08599 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_ios_test.dart @@ -55,6 +55,7 @@ void main() { ' ${installName ?? ''}' .trim(), () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final sourceUri = switch (language) { Language.c => packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'), @@ -64,6 +65,7 @@ void main() { }; final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: target, @@ -174,7 +176,15 @@ void main() { final tempUri = await tempDirForTest(); final out1Uri = tempUri.resolve('out1/'); await Directory.fromUri(out1Uri).create(); - final lib1Uri = await buildLib(out1Uri, target, iosVersion, linkMode); + final out2Uri = tempUri.resolve('out1/'); + await Directory.fromUri(out2Uri).create(); + final lib1Uri = await buildLib( + out1Uri, + out2Uri, + target, + iosVersion, + linkMode, + ); final otoolResult = await runProcess( executable: Uri.file('otool'), @@ -190,6 +200,7 @@ void main() { Future buildLib( Uri tempUri, + Uri tempUri2, Architecture targetArchitecture, int targetIOSVersion, LinkMode linkMode, @@ -199,6 +210,7 @@ Future buildLib( final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: targetArchitecture, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart index 389c4f5ba..9a3e42769 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_linux_host_test.dart @@ -31,12 +31,14 @@ void main() { for (final target in targets) { test('CBuilder $linkMode library $target', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: target, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart index 6856d334b..79ad82bd2 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_macos_host_test.dart @@ -39,6 +39,7 @@ void main() { for (final target in targets) { test('CBuilder $linkMode $language library $target', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final sourceUri = switch (language) { Language.c => packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'), @@ -50,6 +51,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: target, @@ -104,7 +106,15 @@ void main() { final tempUri = await tempDirForTest(); final out1Uri = tempUri.resolve('out1/'); await Directory.fromUri(out1Uri).create(); - final lib1Uri = await buildLib(out1Uri, target, macosVersion, linkMode); + final out2Uri = tempUri.resolve('out2/'); + await Directory.fromUri(out1Uri).create(); + final lib1Uri = await buildLib( + out1Uri, + out2Uri, + target, + macosVersion, + linkMode, + ); final otoolResult = await runProcess( executable: Uri.file('otool'), @@ -120,6 +130,7 @@ void main() { Future buildLib( Uri tempUri, + Uri tempUri2, Architecture targetArchitecture, int targetMacOSVersion, LinkMode linkMode, @@ -129,6 +140,7 @@ Future buildLib( final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: targetArchitecture, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart index 0af64e8c9..a68fa3ac9 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_cross_windows_host_test.dart @@ -50,12 +50,14 @@ void main() { for (final target in targets) { test('CBuilder $linkMode library $target', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetOS: OS.windows, diff --git a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart index 08f91df54..77e35132b 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/cbuilder_test.dart @@ -33,6 +33,7 @@ void main() { test('CBuilder executable$suffix', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final helloWorldCUri = packageUri .resolve('test/cbuilder/testfiles/hello_world/src/hello_world.c'); if (!await File.fromUri(helloWorldCUri).exists()) { @@ -45,6 +46,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -104,6 +106,7 @@ void main() { test('CBuilder dylib$suffix', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; @@ -114,6 +117,7 @@ void main() { final buildConfig = dryRun ? BuildConfig.dryRun( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetOS: OS.current, @@ -122,6 +126,7 @@ void main() { ) : BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -199,6 +204,7 @@ void main() { test('CBuilder flags', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final definesCUri = packageUri.resolve('test/cbuilder/testfiles/defines/src/defines.c'); if (!await File.fromUri(definesCUri).exists()) { @@ -211,6 +217,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -256,6 +263,7 @@ void main() { test('CBuilder includes', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final includeDirectoryUri = packageUri.resolve('test/cbuilder/testfiles/includes/include'); final includesHUri = packageUri @@ -266,6 +274,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -299,6 +308,7 @@ void main() { test('CBuilder std', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addCUri = packageUri.resolve('test/cbuilder/testfiles/add/src/add.c'); const name = 'add'; const std = 'c99'; @@ -308,6 +318,7 @@ void main() { final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -351,6 +362,7 @@ void main() { test('CBuilder compile c++', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final helloWorldCppUri = packageUri.resolve( 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc'); if (!await File.fromUri(helloWorldCppUri).exists()) { @@ -364,6 +376,7 @@ void main() { final buildConfig = BuildConfig.build( buildMode: BuildMode.release, outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -412,6 +425,7 @@ void main() { test('CBuilder cppLinkStdLib', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final helloWorldCppUri = packageUri.resolve( 'test/cbuilder/testfiles/hello_world_cpp/src/hello_world_cpp.cc'); if (!await File.fromUri(helloWorldCppUri).exists()) { @@ -425,6 +439,7 @@ void main() { final buildConfig = BuildConfig.build( buildMode: BuildMode.release, outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -483,6 +498,7 @@ Future testDefines({ bool? customDefineWithValue, }) async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final definesCUri = packageUri.resolve('test/cbuilder/testfiles/defines/src/defines.c'); if (!await File.fromUri(definesCUri).exists()) { @@ -492,6 +508,7 @@ Future testDefines({ final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, diff --git a/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart b/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart index 6c81c9455..86be27864 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/compiler_resolver_test.dart @@ -22,6 +22,7 @@ import '../helpers.dart'; void main() { test('Config provided compiler', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final ar = [ ...await appleAr.defaultResolver!.resolve(logger: logger), ...await msvc.lib.defaultResolver!.resolve(logger: logger), @@ -42,6 +43,7 @@ void main() { ].firstOrNull?.uri; final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: 'dummy', packageRoot: tempUri, targetArchitecture: Architecture.current, @@ -65,8 +67,10 @@ void main() { test('No compiler found', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: 'dummy', packageRoot: tempUri, targetArchitecture: Architecture.arm64, diff --git a/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart b/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart index 4d08cc4a8..50f725994 100644 --- a/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart +++ b/pkgs/native_toolchain_c/test/cbuilder/objective_c_test.dart @@ -25,6 +25,7 @@ void main() { test('CBuilder compile objective c', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final addMUri = packageUri.resolve('test/cbuilder/testfiles/add_objective_c/src/add.m'); if (!await File.fromUri(addMUri).exists()) { @@ -38,6 +39,7 @@ void main() { final buildConfig = BuildConfig.build( buildMode: BuildMode.release, outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: Architecture.current, diff --git a/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart b/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart index 763ba1e44..e215afb44 100644 --- a/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart +++ b/pkgs/native_toolchain_c/test/clinker/build_testfiles.dart @@ -11,6 +11,7 @@ import '../helpers.dart'; Future buildTestArchive( Uri tempUri, + Uri tempUri2, OS os, Architecture architecture, ) async { @@ -27,6 +28,7 @@ Future buildTestArchive( final buildConfig = BuildConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: name, packageRoot: tempUri, targetArchitecture: architecture, diff --git a/pkgs/native_toolchain_c/test/clinker/objects_test.dart b/pkgs/native_toolchain_c/test/clinker/objects_test.dart index 39ed0e041..22f30777a 100644 --- a/pkgs/native_toolchain_c/test/clinker/objects_test.dart +++ b/pkgs/native_toolchain_c/test/clinker/objects_test.dart @@ -29,10 +29,12 @@ Future main() async { test('link two objects', () async { final linkOutput = LinkOutput(); final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); - final uri = await buildTestArchive(tempUri, os, architecture); + final uri = await buildTestArchive(tempUri, tempUri2, os, architecture); final linkConfig = LinkConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: 'testpackage', packageRoot: tempUri, targetArchitecture: architecture, diff --git a/pkgs/native_toolchain_c/test/clinker/throws_test.dart b/pkgs/native_toolchain_c/test/clinker/throws_test.dart index ac11d53af..e69a39f9c 100644 --- a/pkgs/native_toolchain_c/test/clinker/throws_test.dart +++ b/pkgs/native_toolchain_c/test/clinker/throws_test.dart @@ -21,6 +21,7 @@ Future main() async { 'throws on some platforms', () async { final tempUri = await tempDirForTest(); + final tempUri2 = await tempDirForTest(); final cLinker = CLinker.library( name: 'mylibname', @@ -30,6 +31,7 @@ Future main() async { () => cLinker.run( config: LinkConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: 'testpackage', packageRoot: tempUri, targetArchitecture: Architecture.x64, diff --git a/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart b/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart index 198b81822..3abc2339f 100644 --- a/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart +++ b/pkgs/native_toolchain_c/test/clinker/treeshake_helper.dart @@ -54,12 +54,19 @@ Future runTests(List architectures) async { test('link test with CLinker ${clinker.name} and target $architecture', () async { final tempUri = await tempDirForTest(); - final testArchive = await buildTestArchive(tempUri, os, architecture); + final tempUri2 = await tempDirForTest(); + final testArchive = await buildTestArchive( + tempUri, + tempUri2, + os, + architecture, + ); final linkOutput = LinkOutput(); final config = LinkConfig.build( outputDirectory: tempUri, + outputDirectoryShared: tempUri2, packageName: 'testpackage', packageRoot: tempUri, targetArchitecture: architecture,