Skip to content

Commit 7c52564

Browse files
committed
Rework how disabling of toolchain detection works
Disabling the toolchain detection by tasks wasn't sufficient, because Gradle would use the nested `BaseImageOptions` as an input, and even if the particular `JavaLauchner` input wasn't used if that flag was disabled, it would still be used internally by Gradle to snapshot inputs. As a consequence, the fix only worked if Gradle actually detected a GraalVM installation somewhere, even if it didn't use it! To fix this, this commit introduces a top-level DSL method called `disableToolchainDetection()` which effectively sets the toolchain to `null` by convention. By making the toolchain optional and null now Gradle wouldn't complain anymore. Fixes #183
1 parent 00a8cc3 commit 7c52564

File tree

7 files changed

+50
-17
lines changed

7 files changed

+50
-17
lines changed

docs/src/docs/asciidoc/index.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ If you are interested in contributing, please refer to our https://github.com/gr
2020
==== Gradle plugin
2121

2222
* Fixed resource inference not working on custom binaries
23+
* Fixed `disableToolchainDetection` not working if a GraalVM installation isn't present. Please use `graalvmNative.disableToolchainDetection()` instead.
2324

2425
=== Release 0.9.8
2526

docs/src/docs/snippets/gradle/groovy/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ graalvmNative {
5959

6060
if (providers.environmentVariable("DISABLE_TOOLCHAIN").isPresent()) {
6161
// tag::disabling-toolchain[]
62-
tasks.withType(org.graalvm.buildtools.gradle.tasks.BuildNativeImageTask).configureEach {
63-
disableToolchainDetection = true
62+
graalvmNative {
63+
disableToolchainDetection()
6464
}
6565
// end::disabling-toolchain[]
6666
}

docs/src/docs/snippets/gradle/kotlin/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ graalvmNative {
6060

6161
if (providers.environmentVariable("DISABLE_TOOLCHAIN").isPresent()) {
6262
// tag::disabling-toolchain[]
63-
tasks.withType<org.graalvm.buildtools.gradle.tasks.BuildNativeImageTask>().configureEach {
64-
disableToolchainDetection.set(true)
63+
graalvmNative {
64+
disableToolchainDetection()
6565
}
6666
// end::disabling-toolchain[]
6767
}

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/dsl/GraalVMExtension.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,18 @@ public interface GraalVMExtension {
8484
*/
8585
void registerTestBinary(String name, Action<? super TestBinaryConfig> spec);
8686

87+
/**
88+
* Enables detection of toolchains which support building native images.
89+
* This is the default unless {@link #disableToolchainDetection()} was called.
90+
*/
91+
void enableToolchainDetection();
92+
93+
/**
94+
* Disables detection of toolchains, which is useful when the default detection
95+
* mechanism isn't capable of handling your toolchain.
96+
*/
97+
void disableToolchainDetection();
98+
8799
interface TestBinaryConfig {
88100
/**
89101
* Sets the JVM test task which corresponds to the

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/BaseNativeImageOptions.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
import org.graalvm.buildtools.gradle.dsl.NativeResourcesOptions;
4646
import org.graalvm.buildtools.utils.SharedConstants;
4747
import org.gradle.api.Action;
48-
import org.gradle.api.JavaVersion;
4948
import org.gradle.api.file.ConfigurableFileCollection;
5049
import org.gradle.api.model.ObjectFactory;
5150
import org.gradle.api.provider.ListProperty;
@@ -60,10 +59,8 @@
6059
import org.gradle.api.tasks.Nested;
6160
import org.gradle.api.tasks.Optional;
6261
import org.gradle.api.tasks.TaskContainer;
63-
import org.gradle.jvm.toolchain.JavaLanguageVersion;
6462
import org.gradle.jvm.toolchain.JavaLauncher;
6563
import org.gradle.jvm.toolchain.JavaToolchainService;
66-
import org.gradle.jvm.toolchain.JvmVendorSpec;
6764

6865
import javax.inject.Inject;
6966
import java.util.Arrays;
@@ -185,6 +182,7 @@ public String getName() {
185182
* to a Java launcher due to Gradle limitations.
186183
*/
187184
@Nested
185+
@Optional
188186
public abstract Property<JavaLauncher> getJavaLauncher();
189187

190188
/**
@@ -218,14 +216,6 @@ public BaseNativeImageOptions(String name,
218216
getSharedLibrary().convention(false);
219217
getImageName().convention(defaultImageName);
220218
getUseFatJar().convention(SharedConstants.IS_WINDOWS);
221-
getJavaLauncher().convention(
222-
toolchains.launcherFor(spec -> {
223-
spec.getLanguageVersion().set(JavaLanguageVersion.of(JavaVersion.current().getMajorVersion()));
224-
if (GradleUtils.isAtLeastGradle7()) {
225-
spec.getVendor().set(JvmVendorSpec.matching("GraalVM"));
226-
}
227-
})
228-
);
229219
}
230220

231221
private static Provider<Boolean> property(ProviderFactory providers, String name) {

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/internal/DefaultGraalVmExtension.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,15 @@
4545
import org.graalvm.buildtools.gradle.dsl.GraalVMExtension;
4646
import org.graalvm.buildtools.gradle.dsl.NativeImageOptions;
4747
import org.gradle.api.Action;
48+
import org.gradle.api.JavaVersion;
4849
import org.gradle.api.NamedDomainObjectContainer;
4950
import org.gradle.api.Project;
51+
import org.gradle.api.provider.Property;
5052
import org.gradle.api.provider.Provider;
53+
import org.gradle.jvm.toolchain.JavaLanguageVersion;
54+
import org.gradle.jvm.toolchain.JavaLauncher;
55+
import org.gradle.jvm.toolchain.JavaToolchainService;
56+
import org.gradle.jvm.toolchain.JvmVendorSpec;
5157

5258
import javax.inject.Inject;
5359
import java.util.HashMap;
@@ -58,17 +64,41 @@ public abstract class DefaultGraalVmExtension implements GraalVMExtension {
5864
private final NativeImagePlugin plugin;
5965
private final Project project;
6066
private final Map<String, Provider<Boolean>> agentProperties = new HashMap<>();
67+
private final Property<JavaLauncher> defaultJavaLauncher;
68+
private final JavaToolchainService toolchainService;
6169

6270
@Inject
6371
public DefaultGraalVmExtension(NamedDomainObjectContainer<NativeImageOptions> nativeImages,
6472
NativeImagePlugin plugin,
65-
Project project) {
73+
Project project,
74+
JavaToolchainService toolchains) {
6675
this.nativeImages = nativeImages;
6776
this.plugin = plugin;
6877
this.project = project;
78+
this.toolchainService = toolchains;
79+
this.defaultJavaLauncher = project.getObjects().property(JavaLauncher.class);
80+
enableToolchainDetection();
81+
nativeImages.configureEach(options -> options.getJavaLauncher().convention(defaultJavaLauncher));
6982
getTestSupport().convention(true);
7083
}
7184

85+
@Override
86+
public void enableToolchainDetection() {
87+
defaultJavaLauncher.convention(
88+
toolchainService.launcherFor(spec -> {
89+
spec.getLanguageVersion().set(JavaLanguageVersion.of(JavaVersion.current().getMajorVersion()));
90+
if (GradleUtils.isAtLeastGradle7()) {
91+
spec.getVendor().set(JvmVendorSpec.matching("GraalVM"));
92+
}
93+
})
94+
);
95+
}
96+
97+
@Override
98+
public void disableToolchainDetection() {
99+
defaultJavaLauncher.convention((JavaLauncher) null);
100+
}
101+
72102
@Override
73103
public NamedDomainObjectContainer<NativeImageOptions> getBinaries() {
74104
return nativeImages;

native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public void exec() {
163163
logger.lifecycle("Args are: " + args);
164164
}
165165
File executablePath = null;
166-
if (getDisableToolchainDetection().get()) {
166+
if (getDisableToolchainDetection().get() || !options.getJavaLauncher().isPresent()) {
167167
if (getGraalVMHome().isPresent()) {
168168
String graalvmHome = getGraalVMHome().get();
169169
getLogger().lifecycle("Toolchain detection is disabled, will use GraalVM from {}.", graalvmHome);

0 commit comments

Comments
 (0)