Skip to content

Commit cf56a33

Browse files
committed
[GR-33052] Make mx native-unittest work with builder running on module-path.
PullRequest: graal/9529
2 parents 8041ea5 + 5d53854 commit cf56a33

File tree

15 files changed

+177
-136
lines changed

15 files changed

+177
-136
lines changed

compiler/src/org.graalvm.compiler.options.jdk11/src/org/graalvm/compiler/options/ModuleSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public class ModuleSupport {
3030

31-
static final boolean USE_NI_JPMS = System.getenv().getOrDefault("USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM", "false").toLowerCase().equals("true");
31+
public static final boolean USE_NI_JPMS = System.getenv().getOrDefault("USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM", "false").toLowerCase().equals("true");
3232

3333
static Iterable<OptionDescriptors> getOptionsLoader() {
3434
/*

compiler/src/org.graalvm.compiler.options/src/org/graalvm/compiler/options/ModuleSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
public class ModuleSupport {
3030

31-
static final boolean USE_NI_JPMS;
31+
public static final boolean USE_NI_JPMS;
3232

3333
static {
3434
USE_NI_JPMS = false;

sdk/mx.sdk/suite.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@
366366
"org.graalvm.nativeimage.c.constant",
367367
"org.graalvm.nativeimage.c",
368368
"org.graalvm.nativeimage",
369+
"org.graalvm.nativeimage.impl", # Uses of org.graalvm.nativeimage.impl.RuntimeSerializationSupport
369370
"org.graalvm.nativeimage.impl.clinit", # class initialization instrumentation
370371
"org.graalvm.polyglot.proxy",
371372
"org.graalvm.polyglot.io",

substratevm/ci_includes/gate.hocon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ builds += [
4949
USE_NATIVE_IMAGE_JAVA_PLATFORM_MODULE_SYSTEM : "true"
5050
}
5151
run: [
52-
${svm-cmd-gate} ["build,hellomodule"]
52+
${svm-cmd-gate} ["build,hellomodule,test"]
5353
]
5454
}
5555
${oraclejdk8} ${svm-common-linux-gate} ${eclipse} ${jdt} ${linux-deploy} {

substratevm/mx.substratevm/macro-junit.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
ImageName = svmjunit
44

5+
ImageClasspath = ${.}/junit-tool.jar:${.}/junit.jar:${.}/hamcrest.jar
6+
57
Args = -H:Features=com.oracle.svm.junit.JUnitFeature \
68
-H:Class=com.oracle.svm.junit.SVMJUnitRunner \
79
-H:TestFile=${*} \

substratevm/mx.substratevm/mx_substratevm.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ def dummy_harness(test_deps, vm_launcher, vm_args):
465465
mx.abort('No matching unit tests found. Skip image build and execution.')
466466
with open(unittest_file, 'r') as f:
467467
mx.log('Building junit image for matching: ' + ' '.join(l.rstrip() for l in f))
468-
extra_image_args = mx.get_runtime_jvm_args(unittest_deps, jdk=mx_compiler.jdk)
468+
extra_image_args = mx.get_runtime_jvm_args(unittest_deps, jdk=mx_compiler.jdk, exclude_names=['substratevm:LIBRARY_SUPPORT'])
469469
unittest_image = native_image(['-ea', '-esa'] + build_args + extra_image_args + ['--macro:junit=' + unittest_file, '-H:Path=' + junit_test_dir])
470470
mx.log('Running: ' + ' '.join(map(pipes.quote, [unittest_image] + run_args)))
471471
mx.run([unittest_image] + run_args)
@@ -953,7 +953,7 @@ def _native_image_launcher_extra_jvm_args():
953953
license_files=[],
954954
third_party_license_files=[],
955955
dependencies=['SubstrateVM'],
956-
builder_jar_distributions=['mx:JUNIT_TOOL', 'mx:JUNIT', 'mx:HAMCREST'],
956+
jar_distributions=['mx:JUNIT_TOOL', 'mx:JUNIT', 'mx:HAMCREST'],
957957
support_distributions=['substratevm:NATIVE_IMAGE_JUNIT_SUPPORT'],
958958
jlink=False,
959959
))

substratevm/mx.substratevm/suite.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# pylint: disable=line-too-long
22
suite = {
3-
"mxversion": "5.301.0",
3+
"mxversion": "5.308.1",
44
"name": "substratevm",
55
"version" : "21.3.0",
66
"release" : False,
@@ -1078,16 +1078,21 @@
10781078
"moduleInfo" : {
10791079
"name" : "org.graalvm.nativeimage.builder",
10801080
"exports" : [
1081+
"com.oracle.svm.core.configure", # even Feature impls on class-path need access, thus unqualified
1082+
"com.oracle.svm.core.jdk", # Uses of com.oracle.svm.core.jdk.StackTraceUtils
1083+
"com.oracle.svm.core.snippets", # Uses of com.oracle.svm.core.snippets.KnownIntrinsics
1084+
"com.oracle.svm.core", # Uses of com.oracle.svm.core.TypeResult
1085+
"com.oracle.svm.core.util", # Uses of com.oracle.svm.core.util.VMError
10811086
"com.oracle.svm.hosted to java.base",
10821087
"com.oracle.svm.hosted.agent to java.instrument",
1083-
"com.oracle.svm.core.graal.thread to jdk.internal.vm.compiler",
1084-
"com.oracle.svm.core.classinitialization to jdk.internal.vm.compiler",
10851088
"com.oracle.svm.truffle.api to org.graalvm.truffle",
1086-
"* to org.graalvm.nativeimage.driver,org.graalvm.nativeimage.configure,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.llvm,org.graalvm.nativeimage.agent.jvmtibase,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.agent.diagnostics,com.oracle.svm.svm_enterprise",
1089+
"* to jdk.internal.vm.compiler,org.graalvm.nativeimage.driver,org.graalvm.nativeimage.configure,org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.llvm,org.graalvm.nativeimage.agent.jvmtibase,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.agent.diagnostics,com.oracle.svm.svm_enterprise",
10871090
],
10881091
"opens" : [
10891092
"com.oracle.svm.core.nodes to jdk.internal.vm.compiler",
10901093
"com.oracle.svm.core.graal.nodes to jdk.internal.vm.compiler",
1094+
"com.oracle.svm.core.graal.snippets to jdk.internal.vm.compiler",
1095+
"com.oracle.svm.hosted.fieldfolding to jdk.internal.vm.compiler",
10911096
],
10921097
"requires": [
10931098
"java.management",

substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/config/SignatureUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
import java.util.ArrayList;
2828
import java.util.List;
2929

30+
import org.graalvm.nativeimage.hosted.Feature;
31+
32+
import com.oracle.svm.core.annotate.AutomaticFeature;
33+
import com.oracle.svm.util.ModuleSupport;
34+
3035
import jdk.vm.ci.meta.JavaKind;
3136
import jdk.vm.ci.meta.MetaUtil;
3237

@@ -95,3 +100,13 @@ public static String toInternalClassName(String qualifiedForNameString) {
95100
return s;
96101
}
97102
}
103+
104+
@AutomaticFeature
105+
class SignatureUtilFeature implements Feature {
106+
@Override
107+
public void afterRegistration(AfterRegistrationAccess access) {
108+
if (!access.getApplicationClassPath().isEmpty()) {
109+
ModuleSupport.exportAndOpenPackageToClass("jdk.internal.vm.ci", "jdk.vm.ci.meta", false, SignatureUtil.class);
110+
}
111+
}
112+
}

substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/MacroOptionHandler.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
package com.oracle.svm.driver;
2626

2727
import java.io.File;
28-
import java.nio.file.Files;
2928
import java.nio.file.Path;
3029
import java.util.HashSet;
3130

@@ -85,19 +84,20 @@ private void applyEnabled(MacroOption.EnabledOption enabledOption, String argume
8584
enabledOption.forEachPropertyValue(config, "ImageBuilderBootClasspath8", entry -> nativeImage.addImageBuilderBootClasspath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX);
8685
}
8786

88-
if (!enabledOption.forEachPropertyValue(config, "ImageBuilderClasspath", entry -> nativeImage.addImageBuilderClasspath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX)) {
89-
Path builderJarsDirectory = imageJarsDirectory.resolve("builder");
90-
if (Files.isDirectory(builderJarsDirectory)) {
91-
NativeImage.getJars(builderJarsDirectory).forEach(nativeImage::addImageBuilderClasspath);
87+
enabledOption.forEachPropertyValue(config, "ImageBuilderClasspath", entry -> nativeImage.addImageBuilderClasspath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX);
88+
89+
boolean explicitImageModulePath = enabledOption.forEachPropertyValue(
90+
config, "ImageModulePath", entry -> nativeImage.addImageModulePath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX);
91+
boolean explicitImageClasspath = enabledOption.forEachPropertyValue(
92+
config, "ImageClasspath", entry -> nativeImage.addImageClasspath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX);
93+
if (!explicitImageModulePath && !explicitImageClasspath) {
94+
if (NativeImage.USE_NI_JPMS) {
95+
NativeImage.getJars(imageJarsDirectory).forEach(nativeImage::addImageModulePath);
96+
} else {
97+
NativeImage.getJars(imageJarsDirectory).forEach(nativeImage::addImageClasspath);
9298
}
9399
}
94100

95-
if (!enabledOption.forEachPropertyValue(config, "ImageClasspath", entry -> nativeImage.addImageClasspath(ClasspathUtils.stringToClasspath(entry)), PATH_SEPARATOR_REGEX)) {
96-
NativeImage.getJars(imageJarsDirectory).forEach(nativeImage::addImageClasspath);
97-
}
98-
99-
enabledOption.forEachPropertyValue(config, "ImageModulePath", entry -> nativeImage.addImageModulePath(ClasspathUtils.stringToClasspath(entry), true), PATH_SEPARATOR_REGEX);
100-
101101
String imageName = enabledOption.getProperty(config, "ImageName");
102102
if (imageName != null) {
103103
nativeImage.addPlainImageBuilderArg(nativeImage.oHName + imageName);

substratevm/src/com.oracle.svm.driver/src/com/oracle/svm/driver/NativeImage.java

Lines changed: 33 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -233,11 +233,11 @@ private static <T> String oR(OptionKey<T> option) {
233233
private static final String pKeyNativeImageArgs = "NativeImageArgs";
234234

235235
private final ArrayList<String> imageBuilderArgs = new ArrayList<>();
236+
private final LinkedHashSet<Path> imageBuilderModulePath = new LinkedHashSet<>();
236237
private final LinkedHashSet<Path> imageBuilderClasspath = new LinkedHashSet<>();
237238
private final LinkedHashSet<Path> imageBuilderBootClasspath = new LinkedHashSet<>();
238239
private final ArrayList<String> imageBuilderJavaArgs = new ArrayList<>();
239240
private final LinkedHashSet<Path> imageClasspath = new LinkedHashSet<>();
240-
private final LinkedHashSet<Path> imageProvidedClasspath = new LinkedHashSet<>();
241241
private final LinkedHashSet<Path> imageModulePath = new LinkedHashSet<>();
242242
private final ArrayList<String> customJavaArgs = new ArrayList<>();
243243
private final ArrayList<String> customImageBuilderArgs = new ArrayList<>();
@@ -564,15 +564,16 @@ public List<Path> getBuilderCLibrariesPaths() {
564564

565565
@Override
566566
public List<Path> getImageProvidedClasspath() {
567-
return getJars(rootDir.resolve(Paths.get("lib", "svm")));
567+
return getImageProvidedJars();
568568
}
569569

570570
@Override
571571
public List<Path> getImageProvidedModulePath() {
572-
if (USE_NI_JPMS) {
573-
return getJars(rootDir.resolve(Paths.get("lib", "svm")));
574-
}
575-
return Collections.emptyList();
572+
return getImageProvidedJars();
573+
}
574+
575+
private List<Path> getImageProvidedJars() {
576+
return getJars(rootDir.resolve(Paths.get("lib", "svm")));
576577
}
577578

578579
@Override
@@ -888,19 +889,13 @@ private void prepareImageBuildArgs() {
888889
*/
889890
addImageBuilderJavaArgs("-Xshare:off");
890891
config.getBuilderClasspath().forEach(this::addImageBuilderClasspath);
891-
config.getImageProvidedClasspath().forEach(this::addImageProvidedClasspath);
892892

893893
if (config.getBuilderInspectServerPath() != null) {
894894
addPlainImageBuilderArg(oHInspectServerContentPath + config.getBuilderInspectServerPath());
895895
}
896896

897897
if (config.useJavaModules()) {
898-
String modulePath = config.getBuilderModulePath().stream()
899-
.map(this::canonicalize).map(Path::toString)
900-
.collect(Collectors.joining(File.pathSeparator));
901-
if (!modulePath.isEmpty()) {
902-
addImageBuilderJavaArgs(Arrays.asList("--module-path", modulePath));
903-
}
898+
config.getBuilderModulePath().forEach(this::addImageBuilderModulePath);
904899
String upgradeModulePath = config.getBuilderUpgradeModulePath().stream()
905900
.map(p -> canonicalize(p).toString())
906901
.collect(Collectors.joining(File.pathSeparator));
@@ -1223,22 +1218,25 @@ private int completeImageBuild() {
12231218
showError(leftoverArgs.stream().collect(Collectors.joining(", ", prefix, "")));
12241219
}
12251220

1221+
LinkedHashSet<Path> finalImageModulePath = new LinkedHashSet<>(imageModulePath);
12261222
LinkedHashSet<Path> finalImageClasspath = new LinkedHashSet<>(imageBuilderBootClasspath);
12271223
finalImageClasspath.addAll(imageClasspath);
1228-
if (!finalImageClasspath.isEmpty()) {
1229-
finalImageClasspath.addAll(imageProvidedClasspath);
1230-
}
12311224

1232-
LinkedHashSet<Path> finalImageModulePath = new LinkedHashSet<>(imageModulePath);
1233-
if (!finalImageModulePath.isEmpty()) {
1234-
finalImageModulePath.addAll(config.getImageProvidedModulePath());
1225+
List<Path> imageProvidedJars;
1226+
if (USE_NI_JPMS) {
1227+
imageProvidedJars = config.getImageProvidedModulePath();
1228+
finalImageModulePath.addAll(imageProvidedJars);
1229+
} else {
1230+
imageProvidedJars = config.getImageProvidedClasspath();
1231+
finalImageClasspath.addAll(imageProvidedJars);
12351232
}
1233+
imageProvidedJars.forEach(this::processClasspathNativeImageMetaInf);
12361234

12371235
if (!config.buildFallbackImage() && imageBuilderArgs.contains(oHFallbackThreshold + SubstrateOptions.ForceFallback)) {
12381236
/* Bypass regular build and proceed with fallback image building */
12391237
return 2;
12401238
}
1241-
return buildImage(imageBuilderJavaArgs, imageBuilderBootClasspath, imageBuilderClasspath, imageBuilderArgs, finalImageClasspath, finalImageModulePath);
1239+
return buildImage(imageBuilderJavaArgs, imageBuilderBootClasspath, imageBuilderClasspath, imageBuilderModulePath, imageBuilderArgs, finalImageClasspath, finalImageModulePath);
12421240
}
12431241

12441242
private static String getLocationAgnosticArgPrefix(String argPrefix) {
@@ -1395,7 +1393,8 @@ public void run() {
13951393
}
13961394
}
13971395

1398-
protected int buildImage(List<String> javaArgs, LinkedHashSet<Path> bcp, LinkedHashSet<Path> cp, ArrayList<String> imageArgs, LinkedHashSet<Path> imagecp, LinkedHashSet<Path> imagemp) {
1396+
protected int buildImage(List<String> javaArgs, LinkedHashSet<Path> bcp, LinkedHashSet<Path> cp, LinkedHashSet<Path> mp, ArrayList<String> imageArgs, LinkedHashSet<Path> imagecp,
1397+
LinkedHashSet<Path> imagemp) {
13991398
/* Construct ProcessBuilder command from final arguments */
14001399
List<String> command = new ArrayList<>();
14011400
command.add(canonicalize(config.getJavaExecutable()).toString());
@@ -1407,6 +1406,11 @@ protected int buildImage(List<String> javaArgs, LinkedHashSet<Path> bcp, LinkedH
14071406
if (!cp.isEmpty()) {
14081407
command.addAll(Arrays.asList("-cp", cp.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator))));
14091408
}
1409+
if (!mp.isEmpty()) {
1410+
List<String> strings = Arrays.asList("--module-path", mp.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator)));
1411+
command.addAll(strings);
1412+
}
1413+
14101414
if (USE_NI_JPMS) {
14111415
command.addAll(Arrays.asList("--module", DEFAULT_GENERATOR_MODULE_NAME + "/" + DEFAULT_GENERATOR_CLASS_NAME));
14121416
} else {
@@ -1544,6 +1548,10 @@ Path canonicalize(Path path, boolean strict) {
15441548
}
15451549
}
15461550

1551+
public void addImageBuilderModulePath(Path modulePathEntry) {
1552+
imageBuilderModulePath.add(canonicalize(modulePathEntry));
1553+
}
1554+
15471555
void addImageBuilderClasspath(Path classpath) {
15481556
imageBuilderClasspath.add(canonicalize(classpath));
15491557
}
@@ -1602,20 +1610,6 @@ void addPlainImageBuilderArg(String plainArg) {
16021610
imageBuilderArgs.add(plainArg);
16031611
}
16041612

1605-
/**
1606-
* For adding classpath elements that are only on the classpath in the context of native-image
1607-
* building. I.e. that are not on the classpath when the application would be run with the java
1608-
* command. (library-support.jar)
1609-
*/
1610-
private void addImageProvidedClasspath(Path classpath) {
1611-
VMError.guarantee(imageClasspath.isEmpty() && customImageClasspath.isEmpty());
1612-
Path classpathEntry = canonicalize(classpath);
1613-
if (imageProvidedClasspath.add(classpathEntry)) {
1614-
processManifestMainAttributes(classpathEntry, this::handleClassPathAttribute);
1615-
processClasspathNativeImageMetaInf(classpathEntry);
1616-
}
1617-
}
1618-
16191613
/**
16201614
* For adding classpath elements that are automatically put on the image-classpath.
16211615
*/
@@ -1666,6 +1660,10 @@ LinkedHashSet<String> getBuilderModuleNames() {
16661660
return builderModuleNames;
16671661
}
16681662

1663+
void addImageModulePath(Path modulePathEntry) {
1664+
addImageModulePath(modulePathEntry, true);
1665+
}
1666+
16691667
void addImageModulePath(Path modulePathEntry, boolean strict) {
16701668
Path mpEntry;
16711669
try {

0 commit comments

Comments
 (0)