< prev index next >

buildSrc/images/src/main/java/org/openjdk/skara/gradle/images/ImagesPlugin.java

Print this page

 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 package org.openjdk.skara.gradle.images;
 25 
 26 import org.gradle.api.*;
 27 import org.gradle.api.file.Directory;
 28 import org.gradle.api.tasks.bundling.*;
 29 import org.gradle.api.artifacts.UnknownConfigurationException;
 30 
 31 import java.util.ArrayList;

 32 import java.io.File;
 33 
 34 public class ImagesPlugin implements Plugin<Project> {







































 35     @Override
 36     public void apply(Project project) {
 37         NamedDomainObjectContainer<ImageEnvironment> imageEnvironmentContainer =
 38             project.container(ImageEnvironment.class, new NamedDomainObjectFactory<ImageEnvironment>() {
 39                 public ImageEnvironment create(String name) {
 40                     return new ImageEnvironment(name, project.getObjects());
 41                 }
 42             });
 43         project.getExtensions().add("images", imageEnvironmentContainer);
 44 
 45         var projectPath = project.getPath();
 46         var taskNames = new ArrayList<String>();
 47         var rootDir = project.getRootDir().toPath().toAbsolutePath();
 48         var buildDir = project.getBuildDir().toPath().toAbsolutePath();
 49 
 50         imageEnvironmentContainer.all(new Action<ImageEnvironment>() {
 51             public void execute(ImageEnvironment env) {
 52                 var name = env.getName();
 53                 var subName = name.substring(0, 1).toUpperCase() + name.substring(1);






 54 
 55                 var downloadTaskName = "download" + subName + "JDK";
 56                 project.getTasks().register(downloadTaskName, DownloadJDKTask.class, (task) -> {
 57                     task.getUrl().set(env.getUrl());
 58                     task.getSha256().set(env.getSha256());
 59                     task.getToDir().set(rootDir.resolve(".jdk"));
 60                 });


 61 
 62                 var linkTaskName = "link" + subName;
 63                 project.getTasks().register(linkTaskName, LinkTask.class, (task) -> {
 64                     for (var jarTask : project.getTasksByName("jar", true)) {
 65                         if (jarTask instanceof Jar) {
 66                             task.getModulePath().add(((Jar) jarTask).getArchiveFile());
 67                         }
 68                     }
 69 
 70                     try {
 71                         var runtimeClasspath = project.getConfigurations().getByName("runtimeClasspath");
 72                         task.getRuntimeModules().addAll(runtimeClasspath.getElements());
 73                         task.dependsOn(runtimeClasspath);
 74                     } catch (UnknownConfigurationException e) {
 75                         // ignored
 76                     }
 77 
 78                     task.dependsOn(projectPath + ":" + downloadTaskName);





 79                     task.getToDir().set(buildDir.resolve("images"));
 80                     task.getUrl().set(env.getUrl());
 81                     task.getOS().set(name);
 82                     task.getLaunchers().set(env.getLaunchers());
 83                     task.getModules().set(env.getModules());
 84                 });
 85 
 86                 var launchersTaskName = "launchers" + subName;
 87                 project.getTasks().register(launchersTaskName, LaunchersTask.class, (task) -> {
 88                     task.getLaunchers().set(env.getLaunchers());
 89                     task.getOptions().set(env.getOptions());
 90                     task.getToDir().set(buildDir.resolve("launchers"));
 91                     task.getOS().set(name);

 92                 });
 93 
 94                 var zipTaskName = "bundleZip" + subName;
 95                 project.getTasks().register(zipTaskName, Zip.class, (task) -> {
 96                     task.dependsOn(projectPath + ":" + linkTaskName);
 97                     task.dependsOn(projectPath + ":" + launchersTaskName);
 98 
 99                     task.setPreserveFileTimestamps(false);
100                     task.setReproducibleFileOrder(true);
101                     task.getArchiveBaseName().set(project.getName());
102                     task.getArchiveClassifier().set(name);
103                     task.getArchiveExtension().set("zip");
104 
105                     if (env.getMan().isPresent()) {
106                         var root = project.getRootProject().getRootDir().toPath().toAbsolutePath();
107                         task.from(root.resolve(env.getMan().get()).toString(), (s) -> {
108                             s.into("bin/man");
109                         });
110                     }
111 
112                     task.from(buildDir.resolve("images").resolve(name), (s) -> {

113                         s.into("image");
114                     });
115                     task.from(buildDir.resolve("launchers").resolve(name), (s) -> {
116                         s.into("bin");
117                     });
118                 });
119 
120                 var gzipTaskName = "bundleTarGz" + subName;
121                 project.getTasks().register(gzipTaskName, Tar.class, (task) -> {
122                     task.dependsOn(projectPath + ":" + linkTaskName);
123                     task.dependsOn(projectPath + ":" + launchersTaskName);
124 
125                     task.setPreserveFileTimestamps(false);
126                     task.setReproducibleFileOrder(true);
127                     task.getArchiveBaseName().set(project.getName());
128                     task.getArchiveClassifier().set(name);
129                     task.getArchiveExtension().set("tar.gz");
130                     task.setCompression(Compression.GZIP);
131 
132                     if (env.getMan().isPresent()) {
133                         var root = project.getRootProject().getRootDir().toPath().toAbsolutePath();
134                         task.from(root.resolve(env.getMan().get()).toString(), (s) -> {
135                             s.into("bin/man");
136                         });
137                     }
138 
139                     task.from(buildDir.resolve("images").resolve(name), (s) -> {

140                         s.into("image");
141                     });
142                     task.from(buildDir.resolve("launchers").resolve(name), (s) -> {
143                         s.into("bin");
144                     });
145                 });
146 
147                 var imageTaskName = "image" + subName;
148                 project.getTasks().register(imageTaskName, DefaultTask.class, (task) -> {
149                     for (var bundle : env.getBundles().get()) {
150                         if (bundle.equals("zip")) {
151                             task.dependsOn(projectPath + ":" + zipTaskName);
152                         } else if (bundle.equals("tar.gz")) {
153                             task.dependsOn(projectPath + ":" + gzipTaskName);
154                         }
155                     }
156                 });
157 
158                 taskNames.add(imageTaskName);
159             }
160         });
161 
162         project.getTasks().register("images", DefaultTask.class, (task) -> {

 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 package org.openjdk.skara.gradle.images;
 25 
 26 import org.gradle.api.*;
 27 import org.gradle.api.file.Directory;
 28 import org.gradle.api.tasks.bundling.*;
 29 import org.gradle.api.artifacts.UnknownConfigurationException;
 30 
 31 import java.util.ArrayList;
 32 import java.util.HashSet;
 33 import java.io.File;
 34 
 35 public class ImagesPlugin implements Plugin<Project> {
 36     private static String getOS() {
 37         var p = System.getProperty("os.name").toLowerCase();
 38         if (p.startsWith("win")) {
 39             return "windows";
 40         }
 41         if (p.startsWith("mac")) {
 42             return "macos";
 43         }
 44         if (p.startsWith("linux")) {
 45             return "linux";
 46         }
 47         if (p.startsWith("sunos")) {
 48             return "solaris";
 49         }
 50 
 51         throw new RuntimeException("Unknown operating system: " + System.getProperty("os.name"));
 52     }
 53 
 54     private static String getCPU() {
 55         var p = System.getProperty("os.arch").toLowerCase();
 56         if (p.startsWith("amd64") || p.startsWith("x86_64") || p.startsWith("x64")) {
 57             return "x64";
 58         }
 59         if (p.startsWith("x86") || p.startsWith("i386")) {
 60             return "x86";
 61         }
 62         if (p.startsWith("sparc")) {
 63             return "sparc";
 64         }
 65         if (p.startsWith("ppc")) {
 66             return "ppc";
 67         }
 68         if (p.startsWith("arm")) {
 69             return "arm";
 70         }
 71 
 72         throw new RuntimeException("Unknown CPU: " + System.getProperty("os.arch"));
 73     }
 74 
 75     @Override
 76     public void apply(Project project) {
 77         NamedDomainObjectContainer<ImageEnvironment> imageEnvironmentContainer =
 78             project.container(ImageEnvironment.class, new NamedDomainObjectFactory<ImageEnvironment>() {
 79                 public ImageEnvironment create(String name) {
 80                     return new ImageEnvironment(name, project.getObjects());
 81                 }
 82             });
 83         project.getExtensions().add("images", imageEnvironmentContainer);
 84 
 85         var projectPath = project.getPath();
 86         var taskNames = new ArrayList<String>();
 87         var rootDir = project.getRootDir().toPath().toAbsolutePath();
 88         var buildDir = project.getBuildDir().toPath().toAbsolutePath();
 89 
 90         imageEnvironmentContainer.all(new Action<ImageEnvironment>() {
 91             public void execute(ImageEnvironment env) {
 92                 var parts = env.getName().split("_");;
 93                 var isLocal = parts.length == 1 && parts[0].equals("local");
 94                 var os = isLocal ? getOS() : parts[0];
 95                 var cpu = isLocal ? getCPU() : parts[1];
 96                 var osAndCpuPascalCased =
 97                     os.substring(0, 1).toUpperCase() + os.substring(1) +
 98                     cpu.substring(0, 1).toUpperCase() + cpu.substring(1);
 99                 var subName = isLocal ? "Local" : osAndCpuPascalCased;
100 
101                 var downloadTaskName = "download" + subName + "JDK";
102                 if (!isLocal) {
103                     project.getTasks().register(downloadTaskName, DownloadJDKTask.class, (task) -> {
104                         task.getUrl().set(env.getUrl());
105                         task.getSha256().set(env.getSha256());
106                         task.getToDir().set(rootDir.resolve(".jdk"));
107                     });
108                 }
109 
110                 var linkTaskName = "link" + subName;
111                 project.getTasks().register(linkTaskName, LinkTask.class, (task) -> {
112                     for (var jarTask : project.getTasksByName("jar", true)) {
113                         if (jarTask instanceof Jar) {
114                             task.getModulePath().add(((Jar) jarTask).getArchiveFile());
115                         }
116                     }
117 
118                     try {
119                         var runtimeClasspath = project.getConfigurations().getByName("runtimeClasspath");
120                         task.getRuntimeModules().addAll(runtimeClasspath.getElements());
121                         task.dependsOn(runtimeClasspath);
122                     } catch (UnknownConfigurationException e) {
123                         // ignored
124                     }
125 
126                     if (!isLocal) {
127                         task.dependsOn(projectPath + ":" + downloadTaskName);
128                         task.getUrl().set(env.getUrl());
129                     } else {
130                         task.getUrl().set("local");
131                     }
132                     task.getToDir().set(buildDir.resolve("images"));
133                     task.getOS().set(os);
134                     task.getCPU().set(cpu);
135                     task.getLaunchers().set(env.getLaunchers());
136                     task.getModules().set(env.getModules());
137                 });
138 
139                 var launchersTaskName = "launchers" + subName;
140                 project.getTasks().register(launchersTaskName, LaunchersTask.class, (task) -> {
141                     task.getLaunchers().set(env.getLaunchers());
142                     task.getOptions().set(env.getOptions());
143                     task.getToDir().set(buildDir.resolve("launchers"));
144                     task.getOS().set(os);
145                     task.getCPU().set(cpu);
146                 });
147 
148                 var zipTaskName = "bundleZip" + subName;
149                 project.getTasks().register(zipTaskName, Zip.class, (task) -> {
150                     task.dependsOn(projectPath + ":" + linkTaskName);
151                     task.dependsOn(projectPath + ":" + launchersTaskName);
152 
153                     task.setPreserveFileTimestamps(false);
154                     task.setReproducibleFileOrder(true);
155                     task.getArchiveBaseName().set(project.getName());
156                     task.getArchiveClassifier().set(os + "-" + cpu);
157                     task.getArchiveExtension().set("zip");
158 
159                     if (env.getMan().isPresent()) {
160                         var root = project.getRootProject().getRootDir().toPath().toAbsolutePath();
161                         task.from(root.resolve(env.getMan().get()).toString(), (s) -> {
162                             s.into("bin/man");
163                         });
164                     }
165 
166                     var subdir = os + "-" + cpu;
167                     task.from(buildDir.resolve("images").resolve(subdir), (s) -> {
168                         s.into("image");
169                     });
170                     task.from(buildDir.resolve("launchers").resolve(subdir), (s) -> {
171                         s.into("bin");
172                     });
173                 });
174 
175                 var gzipTaskName = "bundleTarGz" + subName;
176                 project.getTasks().register(gzipTaskName, Tar.class, (task) -> {
177                     task.dependsOn(projectPath + ":" + linkTaskName);
178                     task.dependsOn(projectPath + ":" + launchersTaskName);
179 
180                     task.setPreserveFileTimestamps(false);
181                     task.setReproducibleFileOrder(true);
182                     task.getArchiveBaseName().set(project.getName());
183                     task.getArchiveClassifier().set(os + "-" + cpu);
184                     task.getArchiveExtension().set("tar.gz");
185                     task.setCompression(Compression.GZIP);
186 
187                     if (env.getMan().isPresent()) {
188                         var root = project.getRootProject().getRootDir().toPath().toAbsolutePath();
189                         task.from(root.resolve(env.getMan().get()).toString(), (s) -> {
190                             s.into("bin/man");
191                         });
192                     }
193 
194                     var subdir = os + "-" + cpu;
195                     task.from(buildDir.resolve("images").resolve(subdir), (s) -> {
196                         s.into("image");
197                     });
198                     task.from(buildDir.resolve("launchers").resolve(subdir), (s) -> {
199                         s.into("bin");
200                     });
201                 });
202 
203                 var imageTaskName = "image" + subName;
204                 project.getTasks().register(imageTaskName, DefaultTask.class, (task) -> {
205                     for (var bundle : env.getBundles().get()) {
206                         if (bundle.equals("zip")) {
207                             task.dependsOn(projectPath + ":" + zipTaskName);
208                         } else if (bundle.equals("tar.gz")) {
209                             task.dependsOn(projectPath + ":" + gzipTaskName);
210                         }
211                     }
212                 });
213 
214                 taskNames.add(imageTaskName);
215             }
216         });
217 
218         project.getTasks().register("images", DefaultTask.class, (task) -> {
< prev index next >