[deps] Roll dart-lang/native to new version

Cq-Include-Trybots: luci.dart.try:pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-linux-release-try,pkg-mac-release-arm64-try,pkg-mac-release-try,pkg-win-release-arm64-try,pkg-win-release-try
Change-Id: I78f0ece02c337b3b132f161fa7cc5e88db223b57
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/389500
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Moritz Sümmermann <mosum@google.com>
diff --git a/DEPS b/DEPS
index d9023f5..a840563 100644
--- a/DEPS
+++ b/DEPS
@@ -153,7 +153,7 @@
   "material_color_utilities_rev": "799b6ba2f3f1c28c67cc7e0b4f18e0c7d7f3c03e",
   "mockito_rev": "f72791d3dd5cb2acc4f5c7da065ffe70d2ad1e0b",
   # dart-native-interop-team@ is rolling breaking changes manually while the assets features are in experimental.
-  "native_rev": "659511886501bcce638c3966590df04984909ef0", # disable tools/rev_sdk_deps.dart
+  "native_rev": "51647776372aa9e1f839efb811aa959fe445c0cf", # disable tools/rev_sdk_deps.dart
   "package_config_rev": "bafff8e90be25e1985f7e3ee40ea1d22571a93e6",
   "pool_rev": "7bfc71b39742753a88688e56e55a828a2f5dc0bf",
   "protobuf_rev": "ccf104dbc36929c0f8708285d5f3a8fae206343e",
diff --git a/pkg/dartdev/lib/src/commands/build.dart b/pkg/dartdev/lib/src/commands/build.dart
index d909325..7e9f8a0 100644
--- a/pkg/dartdev/lib/src/commands/build.dart
+++ b/pkg/dartdev/lib/src/commands/build.dart
@@ -13,7 +13,8 @@
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show Verbosity;
 import 'package:native_assets_builder/native_assets_builder.dart';
-import 'package:native_assets_cli/native_assets_cli_internal.dart';
+import 'package:native_assets_cli/code_assets_builder.dart';
+import 'package:native_assets_cli/data_assets_builder.dart';
 import 'package:path/path.dart' as path;
 import 'package:vm/target_os.dart'; // For possible --target-os values.
 
@@ -141,13 +142,25 @@
       dartExecutable: Uri.file(sdk.dart),
       logger: logger(verbose),
     );
+
+    final cCompilerConfig = getCCompilerConfig();
+
     final buildResult = await nativeAssetsBuildRunner.build(
+      configCreator: () => BuildConfigBuilder()
+        ..setupCodeConfig(
+          linkModePreference: LinkModePreference.dynamic,
+          targetArchitecture: target.architecture,
+          targetMacOSVersion: targetMacOSVersion,
+          cCompilerConfig: cCompilerConfig,
+        ),
+      configValidator: (config) async => [
+        ...await validateDataAssetBuildConfig(config),
+        ...await validateCodeAssetBuildConfig(config),
+      ],
       workingDirectory: workingDirectory,
-      target: target,
-      linkModePreference: LinkModePreference.dynamic,
+      targetOS: target.os,
       buildMode: BuildMode.release,
       includeParentEnvironment: true,
-      targetMacOSVersion: targetMacOSVersion,
       linkingEnabled: true,
       supportedAssetTypes: [
         CodeAsset.type,
@@ -157,10 +170,10 @@
         ...await validateCodeAssetBuildOutput(config, output),
       ],
       applicationAssetValidator: (assets) async => [
-        ...await validateCodeAssetsInApplication(assets),
+        ...await validateCodeAssetInApplication(assets),
       ],
     );
-    if (!buildResult.success) {
+    if (buildResult == null) {
       stderr.writeln('Native assets build failed.');
       return 255;
     }
@@ -192,15 +205,24 @@
 
       // Start linking here.
       final linkResult = await nativeAssetsBuildRunner.link(
+        configCreator: () => LinkConfigBuilder()
+          ..setupCodeConfig(
+            targetArchitecture: target.architecture,
+            linkModePreference: LinkModePreference.dynamic,
+            targetMacOSVersion: targetMacOSVersion,
+            cCompilerConfig: cCompilerConfig,
+          ),
+        configValidator: (config) async => [
+          ...await validateDataAssetLinkConfig(config),
+          ...await validateCodeAssetLinkConfig(config),
+        ],
         resourceIdentifiers:
             recordUseEnabled ? Uri.file(recordedUsagesPath!) : null,
         workingDirectory: workingDirectory,
-        target: target,
-        linkModePreference: LinkModePreference.dynamic,
+        targetOS: target.os,
         buildMode: BuildMode.release,
         includeParentEnvironment: true,
         buildResult: buildResult,
-        targetMacOSVersion: targetMacOSVersion,
         supportedAssetTypes: [
           CodeAsset.type,
         ],
@@ -209,11 +231,11 @@
           ...await validateCodeAssetLinkOutput(config, output),
         ],
         applicationAssetValidator: (assets) async => [
-          ...await validateCodeAssetsInApplication(assets),
+          ...await validateCodeAssetInApplication(assets),
         ],
       );
 
-      if (!linkResult.success) {
+      if (linkResult == null) {
         stderr.writeln('Native assets link failed.');
         return 255;
       }
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index eca7077..54ad454 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -552,8 +552,8 @@
         return 255;
       }
     } else {
-      final (success, assets) = await compileNativeAssetsJit(verbose: verbose);
-      if (!success) {
+      final assets = await compileNativeAssetsJit(verbose: verbose);
+      if (assets == null) {
         stderr.writeln('Native assets build failed.');
         return 255;
       }
diff --git a/pkg/dartdev/lib/src/commands/run.dart b/pkg/dartdev/lib/src/commands/run.dart
index ef9f2712..5ae7891 100644
--- a/pkg/dartdev/lib/src/commands/run.dart
+++ b/pkg/dartdev/lib/src/commands/run.dart
@@ -375,15 +375,15 @@
       }
     } else {
       final runPackageName = getPackageForCommand(mainCommand);
-      final (success, assets) = await compileNativeAssetsJitYamlFile(
+      final assetsYamlFileUri = await compileNativeAssetsJitYamlFile(
         verbose: verbose,
         runPackageName: runPackageName,
       );
-      if (!success) {
+      if (assetsYamlFileUri == null) {
         log.stderr('Error: Compiling native assets failed.');
         return errorExitCode;
       }
-      nativeAssets = assets?.toFilePath();
+      nativeAssets = assetsYamlFileUri.toFilePath();
     }
 
     final String? residentCompilerInfoFileArg =
diff --git a/pkg/dartdev/lib/src/commands/test.dart b/pkg/dartdev/lib/src/commands/test.dart
index 8db2507..4fe8cbc 100644
--- a/pkg/dartdev/lib/src/commands/test.dart
+++ b/pkg/dartdev/lib/src/commands/test.dart
@@ -51,13 +51,13 @@
         return DartdevCommand.errorExitCode;
       }
     } else {
-      final (success, assets) =
+      final assetsYamlFileUri =
           await compileNativeAssetsJitYamlFile(verbose: verbose);
-      if (!success) {
+      if (assetsYamlFileUri == null) {
         log.stderr('Error: Compiling native assets failed.');
         return DartdevCommand.errorExitCode;
       }
-      nativeAssets = assets?.toFilePath();
+      nativeAssets = assetsYamlFileUri.toFilePath();
     }
 
     try {
diff --git a/pkg/dartdev/lib/src/native_assets.dart b/pkg/dartdev/lib/src/native_assets.dart
index ee33d19..dd1b835 100644
--- a/pkg/dartdev/lib/src/native_assets.dart
+++ b/pkg/dartdev/lib/src/native_assets.dart
@@ -9,6 +9,8 @@
 import 'package:dartdev/src/utils.dart';
 import 'package:logging/logging.dart';
 import 'package:native_assets_builder/native_assets_builder.dart';
+import 'package:native_assets_cli/code_assets_builder.dart';
+import 'package:native_assets_cli/data_assets_builder.dart';
 import 'package:native_assets_cli/native_assets_cli_internal.dart';
 
 import 'core.dart';
@@ -17,7 +19,7 @@
 ///
 /// If provided, only native assets of all transitive dependencies of
 /// [runPackageName] are built.
-Future<(bool success, List<EncodedAsset> assets)> compileNativeAssetsJit({
+Future<List<EncodedAsset>?> compileNativeAssetsJit({
   required bool verbose,
   String? runPackageName,
 }) async {
@@ -32,10 +34,10 @@
       // `getExecutableForCommand` later.
       final result = await Process.run(sdk.dart, ['pub', 'get']);
       if (result.exitCode != 0) {
-        return (true, <EncodedAsset>[]);
+        return null;
       }
     } else {
-      return (true, <EncodedAsset>[]);
+      return null;
     }
   }
   final nativeAssetsBuildRunner = NativeAssetsBuildRunner(
@@ -46,17 +48,26 @@
   final target = Target.current;
   final targetMacOSVersion =
       target.os == OS.macOS ? minimumSupportedMacOSVersion : null;
+  final cCompilerConfig = getCCompilerConfig();
   final buildResult = await nativeAssetsBuildRunner.build(
+    configCreator: () => BuildConfigBuilder()
+      ..setupCodeConfig(
+        targetArchitecture: target.architecture,
+        // When running in JIT mode, only dynamic libraries are supported.
+        linkModePreference: LinkModePreference.dynamic,
+        targetMacOSVersion: targetMacOSVersion,
+        cCompilerConfig: cCompilerConfig,
+      ),
+    configValidator: (config) async => [
+      ...await validateCodeAssetBuildConfig(config),
+      ...await validateDataAssetBuildConfig(config),
+    ],
     workingDirectory: workingDirectory,
-    // When running in JIT mode, only the host OS needs to be build.
-    target: target,
-    // When running in JIT mode, only dynamic libraries are supported.
-    linkModePreference: LinkModePreference.dynamic,
+    targetOS: target.os,
     // Dart has no concept of release vs debug, default to release.
     buildMode: BuildMode.release,
     includeParentEnvironment: true,
     runPackageName: runPackageName,
-    targetMacOSVersion: targetMacOSVersion,
     linkingEnabled: false,
     supportedAssetTypes: [
       CodeAsset.type,
@@ -66,14 +77,11 @@
       ...await validateCodeAssetBuildOutput(config, output),
     ],
     applicationAssetValidator: (assets) async => [
-      ...await validateCodeAssetsInApplication(assets),
+      ...await validateCodeAssetInApplication(assets),
     ],
   );
-
-  return (
-    buildResult.success,
-    buildResult.encodedAssets,
-  );
+  if (buildResult == null) return null;
+  return buildResult.encodedAssets;
 }
 
 /// Compiles all native assets for host OS in JIT mode, and creates the
@@ -83,17 +91,15 @@
 /// [runPackageName] are built.
 ///
 /// Used in `dart run` and `dart test`.
-Future<(bool success, Uri? nativeAssetsYaml)> compileNativeAssetsJitYamlFile({
+Future<Uri?> compileNativeAssetsJitYamlFile({
   required bool verbose,
   String? runPackageName,
 }) async {
-  final (success, assets) = await compileNativeAssetsJit(
+  final assets = await compileNativeAssetsJit(
     verbose: verbose,
     runPackageName: runPackageName,
   );
-  if (!success) {
-    return (false, null);
-  }
+  if (assets == null) return null;
   final codeAssets = assets
       .where((e) => e.type == CodeAsset.type)
       .map(CodeAsset.fromEncoded)
@@ -118,7 +124,7 @@
 ${kernelAssets.toNativeAssetsFile()}''';
   final assetFile = File(assetsUri.toFilePath());
   await assetFile.writeAsString(nativeAssetsYaml);
-  return (true, assetsUri);
+  return assetsUri;
 }
 
 KernelAsset _targetLocation(CodeAsset asset) {
@@ -199,3 +205,35 @@
       log.trace(record.message);
     }
   });
+
+CCompilerConfig? getCCompilerConfig() {
+  // Specifically for running our tests on Dart CI with the test runner, we
+  // recognize specific variables to setup the C Compiler configuration.
+  final env = Platform.environment;
+  final cc = env['DART_HOOK_TESTING_C_COMPILER__CC'];
+  final ar = env['DART_HOOK_TESTING_C_COMPILER__AR'];
+  final ld = env['DART_HOOK_TESTING_C_COMPILER__LD'];
+  final envScript = env['DART_HOOK_TESTING_C_COMPILER__ENV_SCRIPT'];
+  final envScriptArgs =
+      env['DART_HOOK_TESTING_C_COMPILER__ENV_SCRIPT_ARGUMENTS']
+          ?.split(' ')
+          .map((arg) => arg.trim())
+          .where((arg) => arg.isNotEmpty)
+          .toList();
+  final hasEnvScriptArgs = envScriptArgs != null && envScriptArgs.isNotEmpty;
+
+  if (cc != null ||
+      ar != null ||
+      ld != null ||
+      envScript != null ||
+      hasEnvScriptArgs) {
+    return CCompilerConfig(
+      archiver: ar != null ? Uri.file(ar) : null,
+      compiler: cc != null ? Uri.file(cc) : null,
+      envScript: envScript != null ? Uri.file(envScript) : null,
+      envScriptArgs: hasEnvScriptArgs ? envScriptArgs : null,
+      linker: ld != null ? Uri.file(ld) : null,
+    );
+  }
+  return null;
+}
diff --git a/pkg/dartdev/test/native_assets/build_test.dart b/pkg/dartdev/test/native_assets/build_test.dart
index cc5c696..20f1136 100644
--- a/pkg/dartdev/test/native_assets/build_test.dart
+++ b/pkg/dartdev/test/native_assets/build_test.dart
@@ -6,7 +6,7 @@
 
 import 'dart:io';
 
-import 'package:native_assets_cli/native_assets_cli_internal.dart';
+import 'package:native_assets_cli/code_assets_builder.dart';
 import 'package:test/test.dart';
 
 import '../utils.dart';
diff --git a/pkg/dartdev/test/native_assets/compile_test.dart b/pkg/dartdev/test/native_assets/compile_test.dart
index a05562d..8050aaf 100644
--- a/pkg/dartdev/test/native_assets/compile_test.dart
+++ b/pkg/dartdev/test/native_assets/compile_test.dart
@@ -55,12 +55,8 @@
         logger: logger,
         expectExitCodeZero: false,
       );
-      expect(
-        result.stderr,
-        contains(
-          'Native assets build failed.',
-        ),
-      );
+      expect(result.stderr,
+          contains('Building assets for package:native_add failed.'));
       expect(result.exitCode, 255);
     });
   });
diff --git a/pkg/record_use/test_data/drop_dylib_recording/hook/build.dart b/pkg/record_use/test_data/drop_dylib_recording/hook/build.dart
index 4103088..a924a9e 100644
--- a/pkg/record_use/test_data/drop_dylib_recording/hook/build.dart
+++ b/pkg/record_use/test_data/drop_dylib_recording/hook/build.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:logging/logging.dart';
-import 'package:native_assets_cli/native_assets_cli.dart';
+import 'package:native_assets_cli/code_assets.dart';
 import 'package:native_toolchain_c/native_toolchain_c.dart';
 
 void main(List<String> arguments) async {
diff --git a/pkg/record_use/test_data/drop_dylib_recording/hook/link.dart b/pkg/record_use/test_data/drop_dylib_recording/hook/link.dart
index 8fd5b7f..735133f 100644
--- a/pkg/record_use/test_data/drop_dylib_recording/hook/link.dart
+++ b/pkg/record_use/test_data/drop_dylib_recording/hook/link.dart
@@ -5,7 +5,7 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:native_assets_cli/native_assets_cli.dart';
+import 'package:native_assets_cli/code_assets.dart';
 import 'package:record_use/record_use.dart';
 
 final callIdAdd = const Identifier(
@@ -32,7 +32,7 @@
     final usages =
         RecordedUsages.fromJson(jsonDecode(string) as Map<String, dynamic>);
 
-    final codeAssets = config.codeAssets.all;
+    final codeAssets = config.codeAssets;
     print('Received assets: ${codeAssets.map((a) => a.id).join(', ')}.');
 
     final symbols = <String>{};