blob: 047ac0d5c6ba00c765ba178e92a21587c0e2d889 [file] [log] [blame]
// Copyright (c) 2015, 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.
// Test generating and running a simple precompiled snapshot of this script.
import 'dart:io';
main(List args) {
if (args.length > 0 && args[0] == "--hello") {
print("Hello");
return;
}
var cc, cc_flags, shared, libname;
if (Platform.isLinux) {
cc = 'gcc';
shared = '-shared';
libname = 'libprecompiled.so';
} else if (Platform.isMacOS) {
cc = 'clang';
shared = '-dynamiclib';
libname = 'libprecompiled.dylib';
} else {
print("Test only supports Linux and Mac");
return;
}
if (Platform.version.contains("x64")) {
cc_flags = "-m64";
} else if (Platform.version.contains("simarm64")) {
cc_flags = "-m64";
} else if (Platform.version.contains("simarm")) {
cc_flags = "-m32";
} else if (Platform.version.contains("simmips")) {
cc_flags = "-m32";
} else if (Platform.version.contains("arm")) {
cc_flags = "";
} else if (Platform.version.contains("mips")) {
cc_flags = "-EL";
} else {
print("Architecture not supported: ${Platform.version}");
return;
}
var dart_executable =
Directory.current.path + Platform.pathSeparator + Platform.executable;
Directory tmp;
try {
tmp = Directory.current.createTempSync("temp_precompilation_test");
var result = Process.runSync(
"${dart_executable}_no_snapshot",
["--gen-precompiled-snapshot", Platform.script.path],
workingDirectory: tmp.path);
if (result.exitCode != 0) {
print(result.stdout);
print(result.stderr);
throw "Snapshot generation failed.";
}
// Check if gcc is present, and skip test if it is not.
try {
result = Process.runSync(
cc,
["--version"],
workingDirectory: tmp.path);
if (result.exitCode != 0) {
throw "$cc --version failed.";
}
} catch(e) {
print("Skipping test because $cc is not present: $e");
return;
}
result = Process.runSync(
cc,
[shared, cc_flags, "-o", libname, "precompiled.S"],
workingDirectory: tmp.path);
if (result.exitCode != 0) {
print(result.stdout);
print(result.stderr);
throw "Shared library creation failed!";
}
var ld_library_path = new String.fromEnvironment("LD_LIBRARY_PATH");
ld_library_path = "${ld_library_path}:${tmp.path}";
result = Process.runSync(
"${dart_executable}",
["--run-precompiled-snapshot", "ignored_script", "--hello"],
workingDirectory: tmp.path,
environment: {"LD_LIBRARY_PATH": ld_library_path});
if (result.exitCode != 0) {
print(result.stdout);
print(result.stderr);
throw "Precompiled binary failed.";
}
print(result.stdout);
if (result.stdout != "Hello\n") {
throw "Precompiled binary output mismatch.";
}
} finally {
tmp?.deleteSync(recursive: true);
}
}