4141package org .graalvm .python ;
4242
4343import org .graalvm .python .dsl .GraalPyExtension ;
44- import org .graalvm .python .tasks .GenerateManifestTask ;
45- import org .graalvm .python .tasks .InstallPackagesTask ;
44+ import org .graalvm .python .tasks .VFSFilesListTask ;
45+ import org .graalvm .python .tasks .NativeImageConfigTask ;
46+ import org .graalvm .python .tasks .ResourcesTask ;
4647import org .gradle .api .GradleException ;
4748import org .gradle .api .Plugin ;
4849import org .gradle .api .Project ;
4950import org .gradle .api .artifacts .Dependency ;
5051import org .gradle .api .artifacts .DependencySet ;
5152import org .gradle .api .plugins .JavaPlugin ;
53+ import org .gradle .api .tasks .TaskProvider ;
5254import org .gradle .jvm .tasks .Jar ;
5355import org .gradle .language .jvm .tasks .ProcessResources ;
5456
6163public abstract class GraalPyGradlePlugin implements Plugin <Project > {
6264 private static final String PYTHON_LAUNCHER_ARTIFACT_ID = "python-launcher" ;
6365 private static final String PYTHON_EMBEDDING_ARTIFACT_ID = "python-embedding" ;
64-
6566 private static final String POLYGLOT_GROUP_ID = "org.graalvm.polyglot" ;
6667 private static final String PYTHON_COMMUNITY_ARTIFACT_ID = "python-community" ;
6768 private static final String PYTHON_ARTIFACT_ID = "python" ;
68- private static final String GRAALPY_GRADLE_PLUGIN_TASK_GROUP = "graalpy" ;
69-
69+ private static final String GRAALPY_GRADLE_PLUGIN_TASK_GROUP = "graalPy" ;
7070 private static final String DEFAULT_WRAPPER_DIRECTORY = "python-generated" ;
71+ private static final String GRAALPY_RESOURCES_TASK = "graalPyResources" ;
72+ private static final String GRAALPY_NATIVE_IMAGE_CONFIG_TASK = "graalPyNativeImageConfig" ;
73+ private static final String GRAALPY_VFS_FILESLIST_TASK = "graalPyVFSFilesList" ;
74+
7175
7276 GraalPyExtension extension ;
7377 Project project ;
@@ -77,22 +81,12 @@ public void apply(Project project) {
7781 this .project = project ;
7882 project .getPluginManager ().apply (JavaPlugin .class );
7983
80-
8184 this .extension = project .getExtensions ().create ("graalPy" , GraalPyExtension .class );
8285 extension .getPythonHome ().getIncludes ().convention (List .of (".*" ));
8386 extension .getPythonHome ().getExcludes ().convention (Collections .emptyList ());
8487 extension .getPackages ().convention (Collections .emptyList ());
8588
86- var installPackagesTask = project .getTasks ().register ("installPackages" , InstallPackagesTask .class );
87-
88-
89- final var generateManifestTask = project .getTasks ().register ("generateManifest" , GenerateManifestTask .class );
90- project .getTasks ().getByName (JavaPlugin .JAR_TASK_NAME , t -> ((Jar ) t ).getMetaInf ().from (generateManifestTask ));
91- generateManifestTask .configure (t -> {
92- t .getManifestOutputDir ().convention (project .getLayout ().getBuildDirectory ().dir ("GRAAL-META-INF" ));
93- t .setGroup (GRAALPY_GRADLE_PLUGIN_TASK_GROUP );
94- });
95-
89+ TaskProvider <ResourcesTask > installPackagesTask = project .getTasks ().register (GRAALPY_RESOURCES_TASK , ResourcesTask .class );
9690 installPackagesTask .configure (t -> {
9791 t .getIncludes ().set (extension .getPythonHome ().getIncludes ());
9892 t .getExcludes ().set (extension .getPythonHome ().getExcludes ());
@@ -104,19 +98,33 @@ public void apply(Project project) {
10498 t .setGroup (GRAALPY_GRADLE_PLUGIN_TASK_GROUP );
10599 });
106100
101+ TaskProvider <NativeImageConfigTask > generateManifestTask = project .getTasks ().register (GRAALPY_NATIVE_IMAGE_CONFIG_TASK , NativeImageConfigTask .class );
102+ project .getTasks ().getByName (JavaPlugin .JAR_TASK_NAME , t -> ((Jar ) t ).getMetaInf ().from (generateManifestTask ));
103+ generateManifestTask .configure (t -> {
104+ t .getManifestOutputDir ().convention (project .getLayout ().getBuildDirectory ().dir ("GRAAL-META-INF" ));
105+ t .setGroup (GRAALPY_GRADLE_PLUGIN_TASK_GROUP );
106+ });
107+
108+ TaskProvider <VFSFilesListTask > generateVFSFilesListTask = project .getTasks ().register (GRAALPY_VFS_FILESLIST_TASK , VFSFilesListTask .class );
109+ generateVFSFilesListTask .configure (t -> {
110+ t .getResourcesDir ().convention ((((ProcessResources ) project .getTasks ().getByName (JavaPlugin .PROCESS_RESOURCES_TASK_NAME )).getDestinationDir ()));
111+ t .setGroup (GRAALPY_GRADLE_PLUGIN_TASK_GROUP );
112+ });
113+ project .getTasks ().getByName (JavaPlugin .PROCESS_RESOURCES_TASK_NAME , t -> t .finalizedBy (GRAALPY_VFS_FILESLIST_TASK ));
114+
107115 project .afterEvaluate (p -> {
108116 checkAndAddDependencies ();
109117
110- if (!extension .getPythonResourcesDirectory ().isPresent ())
118+ if (!extension .getPythonResourcesDirectory ().isPresent ()) {
111119 ((ProcessResources ) project .getTasks ().getByName (JavaPlugin .PROCESS_RESOURCES_TASK_NAME )).with (project .copySpec ().from (installPackagesTask ));
120+ }
112121
113122 // Provide the default value after the isPresent check, otherwise isPresent always returns true
114123 extension .getPythonResourcesDirectory ().convention (project .getLayout ().getBuildDirectory ().dir (DEFAULT_WRAPPER_DIRECTORY ));
115124 });
116125
117126 }
118127
119-
120128 private void checkAndAddDependencies () {
121129 project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , "%s:%s:%s" .formatted (GRAALPY_GROUP_ID , PYTHON_LAUNCHER_ARTIFACT_ID , getGraalPyVersion (project )));
122130 project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , "%s:%s:%s" .formatted (GRAALPY_GROUP_ID , PYTHON_EMBEDDING_ARTIFACT_ID , getGraalPyVersion (project )));
0 commit comments