Skip to content

Commit a04a213

Browse files
Karmgsmet
authored andcommitted
Graal's ForeignAPISupport is amd64 only
1 parent 746f5eb commit a04a213

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

core/deployment/src/main/java/io/quarkus/deployment/builditem/nativeimage/UnsupportedOSBuildItem.java

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@
1111
* extension on a given OS or architecture.
1212
*/
1313
public final class UnsupportedOSBuildItem extends MultiBuildItem {
14+
15+
public static String ARCH = System.getProperty("os.arch");
16+
1417
public enum Os {
1518
WINDOWS(IS_WINDOWS),
1619
MAC(IS_MAC),
17-
LINUX(IS_LINUX);
20+
LINUX(IS_LINUX),
21+
NONE(false);
1822

1923
public final boolean active;
2024

@@ -23,22 +27,52 @@ public enum Os {
2327
}
2428
}
2529

30+
public enum Arch {
31+
AMD64("amd64".equalsIgnoreCase(ARCH)),
32+
AARCH64("aarch64".equalsIgnoreCase(ARCH)),
33+
NONE(false);
34+
35+
public final boolean active;
36+
37+
Arch(boolean active) {
38+
this.active = active;
39+
}
40+
}
41+
2642
public final Os os;
43+
public final Arch arch;
2744
public final String error;
2845

2946
public UnsupportedOSBuildItem(Os os, String error) {
3047
this.os = os;
48+
this.arch = Arch.NONE;
49+
this.error = error;
50+
}
51+
52+
public UnsupportedOSBuildItem(Arch arch, String error) {
53+
this.os = Os.NONE;
54+
this.arch = arch;
55+
this.error = error;
56+
}
57+
58+
public UnsupportedOSBuildItem(Os os, Arch arch, String error) {
59+
this.os = os;
60+
this.arch = arch;
3161
this.error = error;
3262
}
3363

3464
public boolean triggerError(boolean isContainerBuild) {
3565
return
3666
// When the host OS is unsupported, it could have helped to
3767
// run in a Linux builder image (e.g. an extension unsupported on Windows).
38-
(os.active && !isContainerBuild) ||
68+
((os.active && !isContainerBuild) ||
3969
// If Linux is the OS the extension does not support,
4070
// it fails in a container build regardless the host OS,
4171
// because we have only Linux based builder images.
42-
(isContainerBuild && os == Os.LINUX);
72+
(isContainerBuild && os == Os.LINUX)) ||
73+
// We don't do cross-compilation, even builder images have to be
74+
// of the same arch, e.g. aarch64 Mac using aarch64 Linux builder image.
75+
// So if the arch is unsupported, it fails.
76+
arch.active;
4377
}
4478
}

core/deployment/src/main/java/io/quarkus/deployment/pkg/steps/NativeImageBuildStep.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.quarkus.deployment.pkg.steps;
22

3+
import static io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem.Arch.AMD64;
4+
35
import java.io.File;
46
import java.io.IOException;
57
import java.io.UncheckedIOException;
@@ -855,12 +857,15 @@ public NativeImageInvokerInfo build() {
855857
addExperimentalVMOption(nativeImageArgs, "-H:+AllowFoldMethods");
856858

857859
/*
860+
* @formatter:off
858861
* Foreign Function and Memory API in Native Image, JDK's JEP 454
859862
* This is needed for JDK 24+ internal native calls due to AWT,
860863
* e.g. JDK-8337237 et al.
861-
*
864+
* Note GraalVM FFI/FFM support per platform:
865+
* https://www.graalvm.org/latest/reference-manual/native-image/native-code-interoperability/foreign-interface/#foreign-functions
866+
* @formatter:on
862867
*/
863-
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_24_2_0) >= 0) {
868+
if (graalVMVersion.compareTo(GraalVM.Version.VERSION_24_2_0) >= 0 && AMD64.active) {
864869
addExperimentalVMOption(nativeImageArgs, "-H:+ForeignAPISupport");
865870
}
866871

core/runtime/src/main/java/io/quarkus/runtime/graal/GraalVM.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public static class Version implements Comparable<Version> {
6868

6969
public static final Version VERSION_23_0_0 = new Version("GraalVM 23.0.0", "23.0.0", "17", Distribution.GRAALVM);
7070
public static final Version VERSION_23_1_0 = new Version("GraalVM 23.1.0", "23.1.0", "21", Distribution.GRAALVM);
71+
public static final Version VERSION_24_2_0 = new Version("GraalVM 24.2.0", "24.2.0", "24", Distribution.GRAALVM);
7172

7273
// Temporarily work around https://github.com/quarkusio/quarkus/issues/36246,
7374
// till we have a consensus on how to move forward in

extensions/awt/deployment/src/main/java/io/quarkus/awt/deployment/AwtProcessor.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package io.quarkus.awt.deployment;
22

3+
import static io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem.Arch.AARCH64;
4+
import static io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem.Os.MAC;
35
import static io.quarkus.deployment.builditem.nativeimage.UnsupportedOSBuildItem.Os.WINDOWS;
6+
import static io.quarkus.runtime.graal.GraalVM.Version.CURRENT;
47

58
import java.util.ArrayList;
69
import java.util.List;
@@ -27,6 +30,8 @@
2730
import io.quarkus.deployment.pkg.builditem.ProcessInheritIODisabled;
2831
import io.quarkus.deployment.pkg.builditem.ProcessInheritIODisabledBuildItem;
2932
import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
33+
import io.quarkus.deployment.pkg.steps.NoopNativeImageBuildRunner;
34+
import io.quarkus.runtime.graal.GraalVM;
3035

3136
class AwtProcessor {
3237

@@ -44,10 +49,28 @@ void nativeImageFeatures(BuildProducer<NativeImageFeatureBuildItem> nativeImageF
4449
}
4550

4651
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)
47-
UnsupportedOSBuildItem osSupportCheck() {
48-
return new UnsupportedOSBuildItem(WINDOWS,
49-
"Windows AWT integration is not ready in native-image and would result in " +
50-
"java.lang.UnsatisfiedLinkError: no awt in java.library.path.");
52+
void supportCheck(BuildProducer<UnsupportedOSBuildItem> unsupported,
53+
NativeImageRunnerBuildItem nativeImageRunnerBuildItem) {
54+
unsupported.produce(new UnsupportedOSBuildItem(WINDOWS,
55+
"Windows AWT integration is not ready in Quarkus native-image and would result in " +
56+
"java.lang.UnsatisfiedLinkError: no awt in java.library.path."));
57+
unsupported.produce(new UnsupportedOSBuildItem(MAC,
58+
"MacOS AWT integration is not ready in Quarkus native-image and would result in " +
59+
"java.lang.UnsatisfiedLinkError: Can't load library: awt | java.library.path = [.]."));
60+
final GraalVM.Version v;
61+
if (nativeImageRunnerBuildItem.getBuildRunner() instanceof NoopNativeImageBuildRunner) {
62+
v = CURRENT;
63+
log.warnf("native-image is not installed. " +
64+
"Using the default %s version as a reference to build native-sources step.", v.getVersionAsString());
65+
} else {
66+
v = nativeImageRunnerBuildItem.getBuildRunner().getGraalVMVersion();
67+
}
68+
if (v.compareTo(GraalVM.Version.VERSION_24_2_0) >= 0) {
69+
unsupported.produce(new UnsupportedOSBuildItem(AARCH64,
70+
"AWT needs JDK's JEP 454 FFI/FFM support and that is not available for AArch64 with " +
71+
"GraalVM's native-image, see: " +
72+
"https://www.graalvm.org/latest/reference-manual/native-image/native-code-interoperability/foreign-interface/#foreign-functions"));
73+
}
5174
}
5275

5376
@BuildStep(onlyIf = NativeOrNativeSourcesBuild.class)

0 commit comments

Comments
 (0)