diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java index 2ad7ad8d7..8e046730d 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/NativeImagePlugin.java @@ -82,7 +82,10 @@ import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.JavaExec; +import org.gradle.api.tasks.PathSensitive; +import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; import org.gradle.api.tasks.TaskContainer; @@ -92,12 +95,14 @@ import org.gradle.api.tasks.testing.Test; import org.gradle.jvm.toolchain.JavaToolchainService; import org.gradle.language.base.plugins.LifecycleBasePlugin; +import org.gradle.process.CommandLineArgumentProvider; import org.gradle.process.JavaForkOptions; import org.gradle.util.GFileUtils; import javax.inject.Inject; import java.io.File; import java.util.Arrays; +import java.util.Collections; import java.util.Locale; import java.util.Map; import java.util.concurrent.Callable; @@ -363,7 +368,9 @@ public void registerTestBinary(Project project, test.getOutputs().dir(testResultsDir); // Set system property read by the UniqueIdTrackingListener. test.systemProperty(JUNIT_PLATFORM_LISTENERS_UID_TRACKING_ENABLED, true); - test.systemProperty(JUNIT_PLATFORM_LISTENERS_UID_TRACKING_OUTPUT_DIR, testListDirectory.getAsFile().get()); + TrackingDirectorySystemPropertyProvider directoryProvider = project.getObjects().newInstance(TrackingDirectorySystemPropertyProvider.class); + directoryProvider.getDirectory().set(testListDirectory); + test.getJvmArgumentProviders().add(directoryProvider); test.doFirst("cleanup test ids", new CleanupTestIdsDirectory(testListDirectory)); }); @@ -372,6 +379,7 @@ public void registerTestBinary(Project project, TaskProvider testImageBuilder = tasks.named(deriveTaskName(name, "native", "Compile"), BuildNativeImageTask.class, task -> { task.setOnlyIf(t -> graalExtension.getTestSupport().get()); + task.getTestListDirectory().set(testListDirectory); testTask.get(); ConfigurableFileCollection testList = project.getObjects().fileCollection(); // Later this will be replaced by a dedicated task not requiring execution of tests @@ -489,8 +497,6 @@ private static NativeImageOptions createTestOptions(GraalVMExtension graalExtens runtimeArgs.add("--xml-output-dir"); runtimeArgs.add(project.getLayout().getBuildDirectory().dir("test-results/" + binaryName + "-native").map(d -> d.getAsFile().getAbsolutePath())); testExtension.buildArgs("--features=org.graalvm.junit.platform.JUnitPlatformFeature"); - // Set system property read indirectly by the JUnitPlatformFeature. - testExtension.getBuildArgs().add(project.provider(() -> "-Djunit.platform.listeners.uid.tracking.output.dir=" + testListDirectory.getAsFile().get().getAbsolutePath())); ConfigurableFileCollection classpath = testExtension.getClasspath(); classpath.from(configs.getImageClasspathConfiguration()); classpath.from(sourceSet.getOutput().getClassesDirs()); @@ -553,4 +559,17 @@ public void execute(Task task) { } } + public abstract static class TrackingDirectorySystemPropertyProvider implements CommandLineArgumentProvider { + @InputFiles + @PathSensitive(PathSensitivity.RELATIVE) + public abstract DirectoryProperty getDirectory(); + + /** + * The arguments which will be provided to the process. + */ + @Override + public Iterable asArguments() { + return Collections.singleton("-D" + JUNIT_PLATFORM_LISTENERS_UID_TRACKING_OUTPUT_DIR + "=" + getDirectory().getAsFile().get().getAbsolutePath()); + } + } } diff --git a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java index bb3f2fd72..a93b97ad7 100644 --- a/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java +++ b/native-gradle-plugin/src/main/java/org/graalvm/buildtools/gradle/tasks/BuildNativeImageTask.java @@ -41,6 +41,7 @@ package org.graalvm.buildtools.gradle.tasks; +import org.graalvm.buildtools.gradle.NativeImagePlugin; import org.graalvm.buildtools.gradle.dsl.NativeImageOptions; import org.graalvm.buildtools.gradle.internal.GraalVMLogger; import org.graalvm.buildtools.gradle.internal.NativeImageCommandLineProvider; @@ -49,12 +50,14 @@ import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFile; -import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.model.ObjectFactory; +import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.provider.ProviderFactory; import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.Nested; @@ -92,6 +95,10 @@ public abstract class BuildNativeImageTask extends DefaultTask { @OutputDirectory public abstract DirectoryProperty getOutputDirectory(); + @InputDirectory + @Optional + public abstract DirectoryProperty getTestListDirectory(); + @Optional @Input protected Provider getGraalVMHome() { @@ -117,6 +124,9 @@ public Provider getOutputFile() { @Inject protected abstract ProviderFactory getProviders(); + @Inject + protected abstract ObjectFactory getObjects(); + @InputFile @Optional public abstract RegularFileProperty getClasspathJar(); @@ -206,6 +216,11 @@ public void exec() { if (outputDir.isDirectory() || outputDir.mkdirs()) { getExecOperations().exec(spec -> { spec.setWorkingDir(getWorkingDirectory()); + if (getTestListDirectory().isPresent()) { + NativeImagePlugin.TrackingDirectorySystemPropertyProvider directoryProvider = getObjects().newInstance(NativeImagePlugin.TrackingDirectorySystemPropertyProvider.class); + directoryProvider.getDirectory().set(getTestListDirectory()); + spec.getArgumentProviders().add(directoryProvider); + } spec.args(args); getService().get(); spec.setExecutable(executable);