Skip to content

Commit

Permalink
Fix "collect reachability metadata" with config cache (#438)
Browse files Browse the repository at this point in the history
This commit fixes the compatbilility of the "collect reachability metadata"
task with Gradle's configuration cache. It does so by moving from a
configuration as input to a resolved component result.
  • Loading branch information
melix committed May 12, 2023
1 parent 18c88a2 commit 4ae316a
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 29 deletions.
Expand Up @@ -287,6 +287,7 @@ private void configureJavaProject(Project project, Provider<NativeImageService>
project.getTasks().register("collectReachabilityMetadata", CollectReachabilityMetadata.class, task -> {
task.setGroup(LifecycleBasePlugin.BUILD_GROUP);
task.setDescription("Obtains native reachability metdata for the runtime classpath configuration");
task.setClasspath(project.getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME));
});

GraalVMReachabilityMetadataRepositoryExtension metadataRepositoryExtension = reachabilityExtensionOn(graalExtension);
Expand Down
Expand Up @@ -41,49 +41,41 @@

package org.graalvm.buildtools.gradle.tasks;

import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import org.graalvm.buildtools.gradle.internal.GraalVMReachabilityMetadataService;
import org.graalvm.reachability.DirectoryConfiguration;
import org.gradle.api.DefaultTask;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ModuleVersionIdentifier;
import org.gradle.api.artifacts.result.DependencyResult;
import org.gradle.api.artifacts.result.ResolvedComponentResult;
import org.gradle.api.artifacts.result.ResolvedDependencyResult;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.provider.MapProperty;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.SetProperty;
import org.gradle.api.tasks.Classpath;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;

public abstract class CollectReachabilityMetadata extends DefaultTask {

private Configuration classpath;
import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
* The classpath for which the metadata should be copied.
* @return the classpath to use
*/
@Classpath
@Optional
public Configuration getClasspath() {
return classpath;
}
public abstract class CollectReachabilityMetadata extends DefaultTask {

public void setClasspath(Configuration classpath) {
this.classpath = classpath;
getRootComponent().set(classpath.getIncoming().getResolutionResult().getRootComponent());
}

@Input
@Optional
protected abstract Property<ResolvedComponentResult> getRootComponent();

@Internal
public abstract Property<GraalVMReachabilityMetadataService> getMetadataService();

Expand Down Expand Up @@ -136,16 +128,28 @@ public void setClasspath(Configuration classpath) {

@TaskAction
void copyReachabilityMetadata() throws IOException {
GraalVMReachabilityMetadataService service = getMetadataService().get();
Configuration classpath = (this.classpath != null) ? this.classpath
: getProject().getConfigurations().getByName(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME);
Objects.requireNonNull(classpath);
Set<String> excludedModules = getExcludedModules().getOrElse(Collections.emptySet());
Map<String, String> forcedVersions = getModuleToConfigVersion().getOrElse(Collections.emptyMap());
for (ResolvedComponentResult component : classpath.getIncoming().getResolutionResult().getAllComponents()) {
if (getRootComponent().isPresent()) {
GraalVMReachabilityMetadataService service = getMetadataService().get();
Set<String> excludedModules = getExcludedModules().getOrElse(Collections.emptySet());
Map<String, String> forcedVersions = getModuleToConfigVersion().getOrElse(Collections.emptyMap());
visit(getRootComponent().get(), service, excludedModules, forcedVersions, new HashSet<>());
}
}

private void visit(ResolvedComponentResult component,
GraalVMReachabilityMetadataService service,
Set<String> excludedModules,
Map<String, String> forcedVersions,
Set<ResolvedComponentResult> visited) throws IOException {
if (visited.add(component)) {
ModuleVersionIdentifier moduleVersion = component.getModuleVersion();
Set<DirectoryConfiguration> configurations = service.findConfigurationsFor(excludedModules, forcedVersions, moduleVersion);
DirectoryConfiguration.copy(configurations, getInto().get().getAsFile().toPath());
for (DependencyResult dependency : component.getDependencies()) {
if (dependency instanceof ResolvedDependencyResult) {
visit(((ResolvedDependencyResult) dependency).getSelected(), service, excludedModules, forcedVersions, visited);
}
}
}
}

Expand Down

0 comments on commit 4ae316a

Please sign in to comment.