diff --git a/pkg/dart2native/lib/dart2native.dart b/pkg/dart2native/lib/dart2native.dart index 341ba54887d..621911c7e1f 100644 --- a/pkg/dart2native/lib/dart2native.dart +++ b/pkg/dart2native/lib/dart2native.dart @@ -107,7 +107,7 @@ Future markExecutable(String outputFile) { /// to static functions annotated with `@ResourceIdentifier` will be collected. Future generateKernelHelper({ required String dartaotruntime, - required String sourceFile, + String? sourceFile, required String kernelFile, String? packages, List defines = const [], @@ -140,7 +140,7 @@ Future generateKernelHelper({ if (resourcesFile != null) '--resources-file=$resourcesFile', '--output=$kernelFile', ...extraGenKernelOptions, - sourceFile, + if (sourceFile != null) sourceFile, ]; return Process.run(dartaotruntime, args); } diff --git a/pkg/dart2native/lib/generate.dart b/pkg/dart2native/lib/generate.dart index b2f86a7995d..5304ab7dec6 100644 --- a/pkg/dart2native/lib/generate.dart +++ b/pkg/dart2native/lib/generate.dart @@ -78,7 +78,7 @@ Future generateNative({ List 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 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 generateNative({ '--verbosity=$verbosity', '--${soundNullSafety ? '' : 'no-'}sound-null-safety', ], - nativeAssets: nativeAssets, resourcesFile: resourcesFile, aot: true, ); @@ -132,6 +131,46 @@ Future 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 = [ if (!soundNullSafety) '--no-sound-null-safety',