[dartdev] Use kernel concatenation in dart build for native assets

Note: This code will need more refactor with adding link hooks
https://dart-review.googlesource.com/c/sdk/+/338380.
I tried to keep the diff as local as possible for now, just to exercise
the kernel concatenation.

TEST=pkg/dartdev/test/native_assets/build_test.dart

Closes: https://github.com/dart-lang/sdk/issues/55377
Change-Id: I28417bf80946029173a1dc472d6c5972544d7064
Cq-Include-Trybots: dart/try:pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-mac-release-try,pkg-mac-release-arm64-try,pkg-win-release-try,pkg-win-release-arm64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/362384
Reviewed-by: Moritz Sümmermann <mosum@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
This commit is contained in:
Daco Harkes 2024-04-12 09:42:58 +00:00 committed by Commit Queue
parent 040b93757b
commit 5d3dd79d95
2 changed files with 44 additions and 5 deletions

View file

@ -107,7 +107,7 @@ Future<ProcessResult> markExecutable(String outputFile) {
/// to static functions annotated with `@ResourceIdentifier` will be collected.
Future<ProcessResult> generateKernelHelper({
required String dartaotruntime,
required String sourceFile,
String? sourceFile,
required String kernelFile,
String? packages,
List<String> defines = const [],
@ -140,7 +140,7 @@ Future<ProcessResult> generateKernelHelper({
if (resourcesFile != null) '--resources-file=$resourcesFile',
'--output=$kernelFile',
...extraGenKernelOptions,
sourceFile,
if (sourceFile != null) sourceFile,
];
return Process.run(dartaotruntime, args);
}

View file

@ -78,7 +78,7 @@ Future<void> generateNative({
List<String> extraOptions = const [],
}) async {
final tempDir = Directory.systemTemp.createTempSync();
final kernelFile = path.join(tempDir.path, 'kernel.dill');
final programKernelFile = path.join(tempDir.path, 'program.dill');
final sourcePath = _normalize(sourceFile)!;
final sourceWithoutDartOrDill = sourcePath.replaceFirst(
@ -112,7 +112,7 @@ Future<void> generateNative({
final kernelResult = await generateKernelHelper(
dartaotruntime: dartaotruntime,
sourceFile: sourcePath,
kernelFile: kernelFile,
kernelFile: programKernelFile,
packages: packages,
defines: defines,
fromDill: await isKernelFile(sourcePath),
@ -124,7 +124,6 @@ Future<void> generateNative({
'--verbosity=$verbosity',
'--${soundNullSafety ? '' : 'no-'}sound-null-safety',
],
nativeAssets: nativeAssets,
resourcesFile: resourcesFile,
aot: true,
);
@ -132,6 +131,46 @@ Future<void> generateNative({
if (kernelResult.exitCode != 0) {
throw StateError('Generating AOT kernel dill failed!');
}
String kernelFile;
if (nativeAssets == null) {
kernelFile = programKernelFile;
} else {
// TODO(dacoharkes): This method will need to be split in two parts. Then
// the link hooks can be run in between those two parts.
final nativeAssetsDillFile =
path.join(tempDir.path, 'native_assets.dill');
final kernelResult = await generateKernelHelper(
dartaotruntime: dartaotruntime,
kernelFile: nativeAssetsDillFile,
packages: packages,
defines: defines,
enableAsserts: enableAsserts,
enableExperiment: enableExperiment,
targetOS: targetOS,
extraGenKernelOptions: [
'--invocation-modes=compile',
'--verbosity=$verbosity',
'--${soundNullSafety ? '' : 'no-'}sound-null-safety',
],
nativeAssets: nativeAssets,
aot: true,
);
await _forwardOutput(kernelResult);
if (kernelResult.exitCode != 0) {
throw StateError('Generating AOT kernel dill failed!');
}
kernelFile = path.join(tempDir.path, 'kernel.dill');
final programKernelBytes = await File(programKernelFile).readAsBytes();
final nativeAssetKernelBytes =
await File(nativeAssetsDillFile).readAsBytes();
await File(kernelFile).writeAsBytes(
[
...programKernelBytes,
...nativeAssetKernelBytes,
],
flush: true,
);
}
final extraAotOptions = <String>[
if (!soundNullSafety) '--no-sound-null-safety',