[dart2native] Use Sdk for paths to host artifacts.
This allows `dart compile` to be used from the build root without a
fully built SDK.
Abstract out executable and dill retrieval in Sdk getters similar to how
snapshot retrieval was abstracted out.
Remove the hostDartAotRuntime parameter to generateKernelHelper, since
all callers always passed the same variable from generate.dart, and
instead retrieve it using Sdk.dartAotRuntime.
Remove all the top-level variables that contained paths in
dart2native.dart and generate.dart and replace their uses with
the appropriate Sdk getter.
TEST=ci
Cq-Include-Trybots: luci.dart.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,dart-sdk-linux-riscv64-try,dart-sdk-linux-arm64-try,dart-sdk-linux-try,dart-sdk-mac-try,dart-sdk-win-arm64-try,dart-sdk-win-try,dart-sdk-mac-arm64-try
Change-Id: I92d8110faff135263a9fdf1c395759a52dab914b
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/442181
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
diff --git a/pkg/dart2native/lib/dart2native.dart b/pkg/dart2native/lib/dart2native.dart
index a9b9a4a..a046afa 100644
--- a/pkg/dart2native/lib/dart2native.dart
+++ b/pkg/dart2native/lib/dart2native.dart
@@ -8,35 +8,10 @@
import 'package:code_assets/code_assets.dart' show OS;
import 'package:collection/collection.dart';
import 'package:kernel/binary/tag.dart' show Tag;
-import 'package:path/path.dart' as path;
import 'dart2native_macho.dart' show writeAppendedMachOExecutable;
import 'dart2native_pe.dart' show writeAppendedPortableExecutable;
-
-final binDir = File(Platform.resolvedExecutable).parent;
-final executableSuffix = Platform.isWindows ? '.exe' : '';
-final genKernel = path.join(
- binDir.path,
- 'snapshots',
- 'gen_kernel_aot.dart.snapshot',
-);
-final genSnapshotHost = path.join(
- binDir.path,
- 'utils',
- 'gen_snapshot$executableSuffix',
-);
-final platformDill = path.join(
- binDir.parent.path,
- 'lib',
- '_internal',
- 'vm_platform.dill',
-);
-final productPlatformDill = path.join(
- binDir.parent.path,
- 'lib',
- '_internal',
- 'vm_platform_product.dill',
-);
+import 'sdk.dart';
// Maximum page size across all supported architectures (arm64 macOS has 16K
// pages, some arm64 Linux distributions have 64K pages).
@@ -104,12 +79,11 @@
return Process.run('chmod', ['+x', outputFile]);
}
-/// Generates kernel by running the provided [genKernel] path.
+/// Generates kernel using the host machine's kernel generator.
///
/// Also takes a path to the [recordedUsagesFile] JSON file, where the method
/// calls to static functions annotated with `@RecordUse` will be collected.
Future<ProcessResult> generateKernelHelper({
- required String hostDartAotRuntime,
String? sourceFile,
required String kernelFile,
String? packages,
@@ -128,8 +102,8 @@
bool product = true,
}) {
final args = [
- genKernel,
- '--platform=${product ? productPlatformDill : platformDill}',
+ sdk.genKernelSnapshot,
+ '--platform=${product ? sdk.vmPlatformProductDill : sdk.vmPlatformDill}',
if (product) '-Ddart.vm.product=true',
if (enableExperiment.isNotEmpty) '--enable-experiment=$enableExperiment',
if (targetOS != null) '--target-os=$targetOS',
@@ -148,7 +122,7 @@
...extraGenKernelOptions,
if (sourceFile != null) sourceFile,
];
- return Process.run(hostDartAotRuntime, args);
+ return Process.run(sdk.dartAotRuntime, args);
}
Future<ProcessResult> generateAotSnapshotHelper(
diff --git a/pkg/dart2native/lib/generate.dart b/pkg/dart2native/lib/generate.dart
index f42f242..107df0f 100644
--- a/pkg/dart2native/lib/generate.dart
+++ b/pkg/dart2native/lib/generate.dart
@@ -10,13 +10,6 @@
import 'dart2native.dart';
import 'src/generate_utils.dart';
-export 'dart2native.dart' show genKernel, genSnapshotHost;
-
-final hostDartAotRuntime = path.join(
- binDir.path,
- 'dartaotruntime$executableSuffix',
-);
-
/// The kinds of native executables supported by [KernelGenerator].
enum Kind {
aot,
@@ -215,7 +208,6 @@
}
final kernelResult = await generateKernelHelper(
- hostDartAotRuntime: hostDartAotRuntime,
sourceFile: _sourcePath,
kernelFile: _programKernelFile,
packages: _packages,
@@ -316,7 +308,6 @@
final nativeAssetsDillFile =
path.join(_tempDir.path, 'native_assets.dill');
final kernelResult = await generateKernelHelper(
- hostDartAotRuntime: hostDartAotRuntime,
kernelFile: nativeAssetsDillFile,
packages: _packages,
defines: _defines,
@@ -405,7 +396,6 @@
packages = _normalize(packages);
final kernelResult = await generateKernelHelper(
- hostDartAotRuntime: hostDartAotRuntime,
sourceFile: sourcePath,
kernelFile: outputPath,
packages: packages,
diff --git a/pkg/dart2native/lib/sdk.dart b/pkg/dart2native/lib/sdk.dart
index 2946fb9..73c5104 100644
--- a/pkg/dart2native/lib/sdk.dart
+++ b/pkg/dart2native/lib/sdk.dart
@@ -30,51 +30,28 @@
// Assume that we want to use the same Dart executable that we used to spawn
// DartDev. We should be able to run programs with out/ReleaseX64/dart even
// if the SDK isn't completely built.
- String get dart {
- var basename = path.basename(Platform.executable);
- // It's possible that Platform.executable won't include the .exe extension
- // on Windows (e.g., launching `dart` from cmd.exe where `dart` is on the
- // PATH). Append .exe in this case so the `checkArtifactExists` check won't
- // fail.
- if (Platform.isWindows && !basename.endsWith('.exe')) {
- basename += '.exe';
- }
- return path.absolute(
- runFromBuildRoot
- ? sdkPath
- : path.absolute(
- sdkPath,
- 'bin',
- ),
- basename,
- );
- }
+ String get dart => _executablePathFor(
+ path.basename(Platform.executable),
+ );
- String get dartvm {
- final basename = Platform.isWindows ? 'dartvm.exe' : 'dartvm';
- return path.absolute(
- runFromBuildRoot
- ? sdkPath
- : path.absolute(
- sdkPath,
- 'bin',
- ),
- basename,
- );
- }
+ String get dartvm => _executablePathFor(
+ 'dartvm',
+ );
- String get dartAotRuntime => runFromBuildRoot
- ? path.absolute(
- sdkPath,
- Platform.isWindows
- ? 'dartaotruntime_product.exe'
- : 'dartaotruntime_product',
- )
- : path.absolute(
- sdkPath,
- 'bin',
- Platform.isWindows ? 'dartaotruntime.exe' : 'dartaotruntime',
- );
+ String get dartAotRuntime => _executablePathFor(
+ 'dartaotruntime',
+ forceProductInBuildRoot: true,
+ );
+
+ String get genSnapshot => _executablePathFor(
+ 'gen_snapshot',
+ forceProductInBuildRoot: true,
+ sdkRelativePath: 'utils',
+ );
+
+ String get genKernelSnapshot => _snapshotPathFor(
+ 'gen_kernel_aot.dart.snapshot',
+ );
String get analysisServerAotSnapshot => _snapshotPathFor(
'analysis_server_aot.dart.snapshot',
@@ -150,10 +127,52 @@
// non-SDK build targets.
String get librariesJson => path.absolute(sdkPath, 'lib', 'libraries.json');
- // This file is only generated when building the SDK and isn't generated for
- // non-SDK build targets.
- String get wasmPlatformDill =>
- path.absolute(sdkPath, 'lib', '_internal', 'dart2wasm_platform.dill');
+ String get vmPlatformDill => _dillPathFor(
+ 'vm_platform.dill',
+ );
+
+ String get vmPlatformProductDill => _dillPathFor(
+ 'vm_platform_product.dill',
+ );
+
+ String get wasmPlatformDill => _dillPathFor(
+ 'dart2wasm_platform.dill',
+ );
+
+ String _dillPathFor(String dillName) => path.absolute(
+ runFromBuildRoot
+ ? sdkPath
+ : path.join(
+ sdkPath,
+ 'lib',
+ '_internal',
+ ),
+ dillName);
+
+ String _executablePathFor(String executableName,
+ {bool forceProductInBuildRoot = false, String? sdkRelativePath}) {
+ if (Platform.isWindows && executableName.endsWith('.exe')) {
+ // Don't modify the executable name on Windows if it already includes
+ // the extension.
+ assert(!forceProductInBuildRoot);
+ } else {
+ if (runFromBuildRoot && forceProductInBuildRoot) {
+ executableName = '${executableName}_product';
+ }
+ if (Platform.isWindows) {
+ executableName = '$executableName.exe';
+ }
+ }
+ return path.absolute(
+ runFromBuildRoot
+ ? sdkPath
+ : path.absolute(
+ sdkPath,
+ 'bin',
+ sdkRelativePath,
+ ),
+ executableName);
+ }
String _snapshotPathFor(String snapshotName) => path.absolute(
runFromBuildRoot
diff --git a/pkg/dartdev/lib/src/commands/build.dart b/pkg/dartdev/lib/src/commands/build.dart
index 8baaa9b..c2e895c 100644
--- a/pkg/dartdev/lib/src/commands/build.dart
+++ b/pkg/dartdev/lib/src/commands/build.dart
@@ -115,8 +115,9 @@
@override
Future<int> run() async {
- if (!checkArtifactExists(genKernel) ||
- !checkArtifactExists(genSnapshotHost) ||
+ if (!checkArtifactExists(sdk.genKernelSnapshot) ||
+ !checkArtifactExists(sdk.genSnapshot) ||
+ !checkArtifactExists(sdk.dartAotRuntime) ||
!checkArtifactExists(sdk.dart)) {
return 255;
}
@@ -199,8 +200,8 @@
recordedUsagesPath = path.join(tempDir.path, 'recorded_usages.json');
}
final generator = KernelGenerator(
- genSnapshot: genSnapshotHost,
- targetDartAotRuntime: hostDartAotRuntime,
+ genSnapshot: sdk.genSnapshot,
+ targetDartAotRuntime: sdk.dartAotRuntime,
kind: Kind.exe,
sourceFile: sourceUri.toFilePath(),
outputFile: outputExeUri.toFilePath(),
diff --git a/pkg/dartdev/lib/src/commands/compile.dart b/pkg/dartdev/lib/src/commands/compile.dart
index bb598fe..81c89f7 100644
--- a/pkg/dartdev/lib/src/commands/compile.dart
+++ b/pkg/dartdev/lib/src/commands/compile.dart
@@ -553,7 +553,10 @@
"'dart compile $commandName' is not supported on x86 architectures.\n");
return 64;
}
- if (!checkArtifactExists(genKernel)) {
+ // Kernel is always generated using the host's dartaotruntime and
+ // gen_kernel_aot.dart.snapshot, even during cross compilation.
+ if (!checkArtifactExists(sdk.genKernelSnapshot) ||
+ !checkArtifactExists(sdk.dartAotRuntime)) {
return 255;
}
final args = argResults!;
@@ -574,8 +577,8 @@
return compileErrorExitCode;
}
- var genSnapshotBinary = genSnapshotHost;
- var dartAotRuntimeBinary = hostDartAotRuntime;
+ var genSnapshotBinary = sdk.genSnapshot;
+ var dartAotRuntimeBinary = sdk.dartAotRuntime;
final target = crossCompilationTarget(args);
diff --git a/runtime/tests/vm/dart/run_appended_aot_snapshot_test.dart b/runtime/tests/vm/dart/run_appended_aot_snapshot_test.dart
index 54e3046..ff1898e 100644
--- a/runtime/tests/vm/dart/run_appended_aot_snapshot_test.dart
+++ b/runtime/tests/vm/dart/run_appended_aot_snapshot_test.dart
@@ -5,7 +5,7 @@
import 'dart:async';
import 'dart:io';
-import 'package:dart2native/dart2native.dart' hide platformDill, genSnapshot;
+import 'package:dart2native/dart2native.dart';
import 'package:path/path.dart' as path;
import 'package:expect/expect.dart';
import 'package:code_assets/code_assets.dart' show OS;