Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Importing (some of) Standard.Base works from NI runner #9866

Merged
merged 23 commits into from
May 17, 2024
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
dbd5253
Adjust path to engine/runner
JaroslavTulach May 6, 2024
8cc1b2d
Regenerated with env JAVA_OPTS="-agentlib:native-image-agent=config-m…
JaroslavTulach May 6, 2024
a62f747
Include all Standard/Base JARs on classpath when building NI of engin…
JaroslavTulach May 6, 2024
b9f8fec
Importing from Standard.Base works in NI mode again
JaroslavTulach May 6, 2024
46b48d6
base-polyglot-root may not exist
JaroslavTulach May 7, 2024
2556a2c
Compute additional path at invocation of the buildNativeImage task
JaroslavTulach May 7, 2024
0d24b3e
Useful perf and debug switches
JaroslavTulach May 7, 2024
0d7a11b
Merging removal of java.desktop to this branch
JaroslavTulach May 8, 2024
9d75c72
Configuration for NI debugging of the runner
JaroslavTulach May 13, 2024
c507a47
NI is built from -cp - we need other method of detecting presence of …
JaroslavTulach May 13, 2024
2473812
Script to generate 'small JDK' with native-image in jdk directory
JaroslavTulach May 13, 2024
1933c77
Exclude Graal.js and Graal Python when using Espresso, as they don't …
JaroslavTulach May 14, 2024
593e9b0
Avoid special Graal.js settings
JaroslavTulach May 15, 2024
e20308b
Patching SnakeYaml to run without java.desktop
JaroslavTulach May 15, 2024
38fca73
Copy all JARs to polyglot/java directory in Espresso mode
JaroslavTulach May 15, 2024
87a15e0
Shelve SnakeYaml patches into a single project
JaroslavTulach May 15, 2024
d29c9a1
Build smalljdk before buildNativeImage
JaroslavTulach May 15, 2024
e4cb551
Merge remote-tracking branch 'origin/develop' into wip/jtulach/NIwith…
JaroslavTulach May 15, 2024
2e3b0ed
Hide access to various Pkgs constants
JaroslavTulach May 15, 2024
4d90834
Rewrite SBT support
hubertp May 16, 2024
9cf1543
fix NPE
hubertp May 16, 2024
c627c0f
Correctly detect new javaHome for NI
hubertp May 16, 2024
58ed0bc
nit
hubertp May 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@
"command": "npm run dev",
// "env": {"NODE_OPTIONS": "--inspect"},
"cwd": "${workspaceFolder}/app/gui2"
},
{
"type": "nativeimage",
"request": "launch",
"name": "Launch Native Image",
"nativeImagePath": "${workspaceFolder}/runner",
"args": "--help"
}
]
}
27 changes: 21 additions & 6 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2246,6 +2246,9 @@ lazy val `runtime-fat-jar` =
MergeStrategy.concat
case PathList("module-info.class") =>
MergeStrategy.preferProject
// remove once https://github.com/snakeyaml/snakeyaml/pull/12 gets integrated
case PathList("org", "yaml", "snakeyaml", "introspector", xs @ _*) =>
MergeStrategy.preferProject
case PathList(xs @ _*) if xs.last.contains("module-info.class") =>
MergeStrategy.discard
case _ => MergeStrategy.first
Expand Down Expand Up @@ -2344,16 +2347,25 @@ lazy val `engine-runner` = project
additionalOptions = Seq(
"-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog",
"-H:IncludeResources=.*Main.enso$",
// useful perf & debug switches:
// "-g",
// "-H:+DashboardAll",
// "-H:DashboardDump=runner.bgv"
// "-H:+SourceLevelDebug",
// "-H:-DeleteLocalSymbols",
"-Dnic=nic"
),
mainClass = Some("org.enso.runner.Main"),
additionalCp = Seq(
"runtime.jar",
"runner.jar"
),
additionalCp = () => {
JaroslavTulach marked this conversation as resolved.
Show resolved Hide resolved
val core = Seq(
"runtime.jar",
"runner.jar"
)
val jars = `base-polyglot-root`.listFiles("*.jar")
JaroslavTulach marked this conversation as resolved.
Show resolved Hide resolved
if (jars == null) {
core
} else {
core ++ jars.map(_.getAbsolutePath())
}
},
initializeAtRuntime = Seq(
"org.jline.nativ.JLineLibrary",
"org.jline.terminal.impl.jna",
Expand All @@ -2372,6 +2384,9 @@ lazy val `engine-runner` = project
)
)
.dependsOn(assembly)
.dependsOn(
buildEngineDistribution
)
.value,
buildNativeImage := NativeImage
.incrementalNativeImageBuild(
Expand Down
4 changes: 2 additions & 2 deletions docs/infrastructure/native-image.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ Note that for convenience, you can run the launcher/engine runner via
`bin/enso`, e.g.

```bash
env JAVA_OPTS="-agentlib:native-image-agent=config-merge-dir=./engine/runner-native/src/main/resources/META-INF/native-image/org/enso/runner" ./built-distribution/enso-engine-0.0.0-dev-linux-amd64/enso-0.0.0-dev/bin/enso --run tmp.enso
env JAVA_OPTS="-agentlib:native-image-agent=config-merge-dir=./engine/runner/src/main/resources/META-INF/native-image/org/enso/runner" ./built-distribution/enso-engine-0.0.0-dev-linux-amd64/enso-0.0.0-dev/bin/enso --run tmp.enso
```

The command may need to be re-run with different arguments to ensure that all
Expand Down Expand Up @@ -210,7 +210,7 @@ sbt> engine-runner/buildNativeImage
and execute the binary on a sample factorial test program

```bash
> runner --run engine/runner-native/src/test/resources/Factorial.enso 6
> runner --run engine/runner/src/test/resources/Factorial.enso 6
```

The task that generates the Native Image, along with all the necessary
Expand Down
18 changes: 10 additions & 8 deletions engine/runner/src/main/java/org/enso/runner/ContextFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ PolyglotContext build() {
.options(options)
.option(RuntimeOptions.ENABLE_AUTO_PARALLELISM, Boolean.toString(enableAutoParallelism))
.option(RuntimeOptions.WARNINGS_LIMIT, Integer.toString(warningsLimit))
.option("js.foreign-object-prototype", "true")
JaroslavTulach marked this conversation as resolved.
Show resolved Hide resolved
.out(out)
.in(in)
.serverTransport(
Expand Down Expand Up @@ -181,17 +180,13 @@ PolyglotContext build() {
}
if (ENGINE_HAS_JAVA) {
var javaHome = System.getProperty("java.home");
if (javaHome == null) {
javaHome = System.getenv("JAVA_HOME");
}
if (javaHome == null) {
throw new IllegalStateException("Specify JAVA_HOME environment property");
if (javaHome != null) {
builder.option("java.JavaHome", javaHome);
}
builder
.option("java.ExposeNativeJavaVM", "true")
.option("java.Polyglot", "true")
.option("java.UseBindingsLoader", "true")
.option("java.JavaHome", javaHome)
.allowCreateThread(true);
}
return new PolyglotContext(builder.build());
Expand All @@ -205,6 +200,13 @@ PolyglotContext build() {

static {
var modules = ModuleLayer.boot().modules().stream();
ENGINE_HAS_JAVA = modules.anyMatch(m -> "org.graalvm.espresso".equals(m.getName()));
var found = modules.anyMatch(m -> "org.graalvm.espresso".equals(m.getName()));
if (!found) {
var url =
ContextFactory.class.getResource(
"/META-INF/native-image/com.oracle.truffle.espresso/native-image.properties");
found = url != null;
}
ENGINE_HAS_JAVA = found;
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,191 @@
[
{
"name": "java.lang.ClassLoader",
"methods": [
{ "name": "getPlatformClassLoader", "parameterTypes": [] },
{ "name": "loadClass", "parameterTypes": ["java.lang.String"] }
]
},
{
"name": "java.lang.ClassNotFoundException"
},
{
"name": "java.lang.NoSuchMethodError"
}
{
"name":"[Lcom.sun.management.internal.DiagnosticCommandArgumentInfo;"
},
{
"name":"[Lcom.sun.management.internal.DiagnosticCommandInfo;"
},
{
"name":"com.sun.jna.Callback"
},
{
"name":"com.sun.jna.CallbackReference",
"methods":[{"name":"getCallback","parameterTypes":["java.lang.Class","com.sun.jna.Pointer","boolean"] }, {"name":"getFunctionPointer","parameterTypes":["com.sun.jna.Callback","boolean"] }, {"name":"getNativeString","parameterTypes":["java.lang.Object","boolean"] }, {"name":"initializeThread","parameterTypes":["com.sun.jna.Callback","com.sun.jna.CallbackReference$AttachOptions"] }]
},
{
"name":"com.sun.jna.CallbackReference$AttachOptions"
},
{
"name":"com.sun.jna.FromNativeConverter",
"methods":[{"name":"nativeType","parameterTypes":[] }]
},
{
"name":"com.sun.jna.IntegerType",
"fields":[{"name":"value"}]
},
{
"name":"com.sun.jna.JNIEnv"
},
{
"name":"com.sun.jna.Native",
"methods":[{"name":"dispose","parameterTypes":[] }, {"name":"fromNative","parameterTypes":["com.sun.jna.FromNativeConverter","java.lang.Object","java.lang.reflect.Method"] }, {"name":"fromNative","parameterTypes":["java.lang.Class","java.lang.Object"] }, {"name":"fromNative","parameterTypes":["java.lang.reflect.Method","java.lang.Object"] }, {"name":"nativeType","parameterTypes":["java.lang.Class"] }, {"name":"toNative","parameterTypes":["com.sun.jna.ToNativeConverter","java.lang.Object"] }]
},
{
"name":"com.sun.jna.Native$ffi_callback",
"methods":[{"name":"invoke","parameterTypes":["long","long","long"] }]
},
{
"name":"com.sun.jna.NativeMapped",
"methods":[{"name":"toNative","parameterTypes":[] }]
},
{
"name":"com.sun.jna.Pointer",
"fields":[{"name":"peer"}],
"methods":[{"name":"<init>","parameterTypes":["long"] }]
},
{
"name":"com.sun.jna.PointerType",
"fields":[{"name":"pointer"}]
},
{
"name":"com.sun.jna.Structure",
"fields":[{"name":"memory"}, {"name":"typeInfo"}],
"methods":[{"name":"autoRead","parameterTypes":[] }, {"name":"autoWrite","parameterTypes":[] }, {"name":"getTypeInfo","parameterTypes":[] }, {"name":"newInstance","parameterTypes":["java.lang.Class","long"] }]
},
{
"name":"com.sun.jna.Structure$ByValue"
},
{
"name":"com.sun.jna.Structure$FFIType$FFITypes",
"fields":[{"name":"ffi_type_double"}, {"name":"ffi_type_float"}, {"name":"ffi_type_longdouble"}, {"name":"ffi_type_pointer"}, {"name":"ffi_type_sint16"}, {"name":"ffi_type_sint32"}, {"name":"ffi_type_sint64"}, {"name":"ffi_type_sint8"}, {"name":"ffi_type_uint16"}, {"name":"ffi_type_uint32"}, {"name":"ffi_type_uint64"}, {"name":"ffi_type_uint8"}, {"name":"ffi_type_void"}]
},
{
"name":"com.sun.jna.WString",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String"] }]
},
{
"name":"com.sun.management.internal.DiagnosticCommandArgumentInfo",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","boolean","boolean","int"] }]
},
{
"name":"com.sun.management.internal.DiagnosticCommandInfo",
"methods":[{"name":"<init>","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","boolean","java.util.List"] }]
},
{
"name":"java.lang.Boolean",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["boolean"] }, {"name":"getBoolean","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.lang.Byte",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["byte"] }]
},
{
"name":"java.lang.Character",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["char"] }]
},
{
"name":"java.lang.Class",
"methods":[{"name":"getClassLoader","parameterTypes":[] }, {"name":"getComponentType","parameterTypes":[] }]
},
{
"name":"java.lang.ClassLoader",
"methods":[{"name":"getPlatformClassLoader","parameterTypes":[] }, {"name":"loadClass","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.lang.ClassNotFoundException"
},
{
"name":"java.lang.Double",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["double"] }]
},
{
"name":"java.lang.Float",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["float"] }]
},
{
"name":"java.lang.Integer",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["int"] }]
},
{
"name":"java.lang.Long",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["long"] }]
},
{
"name":"java.lang.NoSuchMethodError"
},
{
"name":"java.lang.Object",
"methods":[{"name":"toString","parameterTypes":[] }]
},
{
"name":"java.lang.Short",
"fields":[{"name":"TYPE"}, {"name":"value"}],
"methods":[{"name":"<init>","parameterTypes":["short"] }]
},
{
"name":"java.lang.String",
"methods":[{"name":"<init>","parameterTypes":["byte[]"] }, {"name":"<init>","parameterTypes":["byte[]","java.lang.String"] }, {"name":"getBytes","parameterTypes":[] }, {"name":"getBytes","parameterTypes":["java.lang.String"] }, {"name":"toCharArray","parameterTypes":[] }]
},
{
"name":"java.lang.System",
"methods":[{"name":"getProperty","parameterTypes":["java.lang.String"] }]
},
{
"name":"java.lang.Void",
"fields":[{"name":"TYPE"}]
},
{
"name":"java.lang.reflect.Method",
"methods":[{"name":"getParameterTypes","parameterTypes":[] }, {"name":"getReturnType","parameterTypes":[] }]
},
{
"name":"java.nio.Buffer",
"methods":[{"name":"position","parameterTypes":[] }]
},
{
"name":"java.nio.ByteBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.CharBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.DoubleBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.FloatBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.IntBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.LongBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.nio.ShortBuffer",
"methods":[{"name":"array","parameterTypes":[] }, {"name":"arrayOffset","parameterTypes":[] }]
},
{
"name":"java.util.Arrays",
"methods":[{"name":"asList","parameterTypes":["java.lang.Object[]"] }]
},
{
"name":"jdk.internal.loader.ClassLoaders$AppClassLoader"
},
{
"name":"sun.management.VMManagementImpl",
"fields":[{"name":"compTimeMonitoringSupport"}, {"name":"currentThreadCpuTimeSupport"}, {"name":"objectMonitorUsageSupport"}, {"name":"otherThreadCpuTimeSupport"}, {"name":"remoteDiagnosticCommandsSupport"}, {"name":"synchronizerUsageSupport"}, {"name":"threadAllocatedMemorySupport"}, {"name":"threadContentionMonitoringSupport"}]
}
]
Original file line number Diff line number Diff line change
@@ -1 +1,5 @@
[]
[
{
"interfaces":["org.jline.terminal.impl.jna.linux.CLibrary"]
}
]