41
41
package org .graalvm .python ;
42
42
43
43
import 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 ;
46
47
import org .gradle .api .GradleException ;
47
48
import org .gradle .api .Plugin ;
48
49
import org .gradle .api .Project ;
49
50
import org .gradle .api .artifacts .Dependency ;
50
51
import org .gradle .api .artifacts .DependencySet ;
51
52
import org .gradle .api .plugins .JavaPlugin ;
53
+ import org .gradle .api .tasks .TaskProvider ;
52
54
import org .gradle .jvm .tasks .Jar ;
53
55
import org .gradle .language .jvm .tasks .ProcessResources ;
54
56
61
63
public abstract class GraalPyGradlePlugin implements Plugin <Project > {
62
64
private static final String PYTHON_LAUNCHER_ARTIFACT_ID = "python-launcher" ;
63
65
private static final String PYTHON_EMBEDDING_ARTIFACT_ID = "python-embedding" ;
64
-
65
66
private static final String POLYGLOT_GROUP_ID = "org.graalvm.polyglot" ;
66
67
private static final String PYTHON_COMMUNITY_ARTIFACT_ID = "python-community" ;
67
68
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" ;
70
70
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
+
71
75
72
76
GraalPyExtension extension ;
73
77
Project project ;
@@ -77,22 +81,12 @@ public void apply(Project project) {
77
81
this .project = project ;
78
82
project .getPluginManager ().apply (JavaPlugin .class );
79
83
80
-
81
84
this .extension = project .getExtensions ().create ("graalPy" , GraalPyExtension .class );
82
85
extension .getPythonHome ().getIncludes ().convention (List .of (".*" ));
83
86
extension .getPythonHome ().getExcludes ().convention (Collections .emptyList ());
84
87
extension .getPackages ().convention (Collections .emptyList ());
85
88
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 );
96
90
installPackagesTask .configure (t -> {
97
91
t .getIncludes ().set (extension .getPythonHome ().getIncludes ());
98
92
t .getExcludes ().set (extension .getPythonHome ().getExcludes ());
@@ -104,19 +98,33 @@ public void apply(Project project) {
104
98
t .setGroup (GRAALPY_GRADLE_PLUGIN_TASK_GROUP );
105
99
});
106
100
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
+
107
115
project .afterEvaluate (p -> {
108
116
checkAndAddDependencies ();
109
117
110
- if (!extension .getPythonResourcesDirectory ().isPresent ())
118
+ if (!extension .getPythonResourcesDirectory ().isPresent ()) {
111
119
((ProcessResources ) project .getTasks ().getByName (JavaPlugin .PROCESS_RESOURCES_TASK_NAME )).with (project .copySpec ().from (installPackagesTask ));
120
+ }
112
121
113
122
// Provide the default value after the isPresent check, otherwise isPresent always returns true
114
123
extension .getPythonResourcesDirectory ().convention (project .getLayout ().getBuildDirectory ().dir (DEFAULT_WRAPPER_DIRECTORY ));
115
124
});
116
125
117
126
}
118
127
119
-
120
128
private void checkAndAddDependencies () {
121
129
project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , "%s:%s:%s" .formatted (GRAALPY_GROUP_ID , PYTHON_LAUNCHER_ARTIFACT_ID , getGraalPyVersion (project )));
122
130
project .getDependencies ().add (JavaPlugin .IMPLEMENTATION_CONFIGURATION_NAME , "%s:%s:%s" .formatted (GRAALPY_GROUP_ID , PYTHON_EMBEDDING_ARTIFACT_ID , getGraalPyVersion (project )));
0 commit comments