aboutsummaryrefslogtreecommitdiff
path: root/src/main/groovy/frege/gradle/plugins
diff options
context:
space:
mode:
authorDierk König <dierk.koenig@canoo.com>2015-11-21 10:09:31 +0100
committerDierk König <dierk.koenig@canoo.com>2015-11-21 10:09:31 +0100
commitf0807811f48c50b6a5fe7816ef48c148be9f9903 (patch)
treec61df925b637d26c95086510ee471ac861a36731 /src/main/groovy/frege/gradle/plugins
parentfa6dce676590c83bc84d130e1241cf585f88a469 (diff)
parent73dd702743a5b4d8816e495e55c19f391669fc25 (diff)
downloadfrege-gradle-plugin-f0807811f48c50b6a5fe7816ef48c148be9f9903.tar.gz
frege-gradle-plugin-f0807811f48c50b6a5fe7816ef48c148be9f9903.tar.bz2
frege-gradle-plugin-f0807811f48c50b6a5fe7816ef48c148be9f9903.zip
Merge pull request #28 from breskeby/base-plugin
Base plugin
Diffstat (limited to 'src/main/groovy/frege/gradle/plugins')
-rw-r--r--src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java87
-rw-r--r--src/main/groovy/frege/gradle/plugins/FregeJarFile.java34
-rw-r--r--src/main/groovy/frege/gradle/plugins/FregePlugin.groovy34
-rw-r--r--src/main/groovy/frege/gradle/plugins/FregePluginExtension.groovy11
-rw-r--r--src/main/groovy/frege/gradle/plugins/FregeRuntime.java63
5 files changed, 229 insertions, 0 deletions
diff --git a/src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java b/src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java
new file mode 100644
index 0000000..8bf5399
--- /dev/null
+++ b/src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java
@@ -0,0 +1,87 @@
+package frege.gradle.plugins;
+
+import frege.gradle.DefaultFregeSourceSet;
+import frege.gradle.tasks.FregeCompile;
+import org.gradle.api.Action;
+import org.gradle.api.Plugin;
+import org.gradle.api.Project;
+import org.gradle.api.file.FileTreeElement;
+import org.gradle.api.internal.file.FileResolver;
+import org.gradle.api.internal.plugins.DslObject;
+import org.gradle.api.internal.tasks.DefaultSourceSet;
+import org.gradle.api.plugins.JavaBasePlugin;
+import org.gradle.api.plugins.JavaPluginConvention;
+import org.gradle.api.specs.Spec;
+import org.gradle.api.tasks.SourceSet;
+
+import javax.inject.Inject;
+import java.util.concurrent.Callable;
+
+public class FregeBasePlugin implements Plugin<Project> {
+ private FileResolver fileResolver;
+
+ private static String EXTENSION_NAME = "frege";
+ private FregePluginExtension fregePluginExtension;
+ private Project project;
+
+ @Inject
+ public FregeBasePlugin(FileResolver fileResolver) {
+ this.fileResolver = fileResolver;
+ }
+
+ @Override
+ public void apply(Project project) {
+ // Workaround to build proper jars on Windows, see https://github.com/Frege/frege-gradle-plugin/issues/9
+ this.project = project;
+ System.setProperty("file.encoding", "UTF-8");
+ project.getPluginManager().apply(JavaBasePlugin.class);
+ fregePluginExtension = project.getExtensions().create(EXTENSION_NAME, FregePluginExtension.class);
+ JavaBasePlugin javaBasePlugin = project.getPlugins().getPlugin(JavaBasePlugin.class);
+
+ configureCompileDefaults(new FregeRuntime(project));
+ configureSourceSetDefaults(javaBasePlugin);
+ }
+
+
+ private void configureSourceSetDefaults(final JavaBasePlugin javaBasePlugin) {
+ project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().all(new Action<SourceSet>() {
+ public void execute(SourceSet sourceSet) {
+ final DefaultFregeSourceSet fregeSourceSet = new DefaultFregeSourceSet(((DefaultSourceSet) sourceSet).getDisplayName(), fileResolver);
+ new DslObject(sourceSet).getConvention().getPlugins().put("frege", fregeSourceSet);
+
+ final String defaultSourcePath = String.format("src/%s/frege", sourceSet.getName());
+ fregeSourceSet.getFrege().srcDir(defaultSourcePath);
+ sourceSet.getResources().getFilter().exclude(new Spec<FileTreeElement>() {
+ public boolean isSatisfiedBy(FileTreeElement element) {
+ return fregeSourceSet.getFrege().contains(element.getFile());
+ }
+ });
+ sourceSet.getAllJava().source(fregeSourceSet.getFrege());
+ sourceSet.getAllSource().source(fregeSourceSet.getFrege());
+
+ String compileTaskName = sourceSet.getCompileTaskName("frege");
+ FregeCompile compile = project.getTasks().create(compileTaskName, FregeCompile.class);
+ compile.setModule(project.file(defaultSourcePath).getAbsolutePath());
+ javaBasePlugin.configureForSourceSet(sourceSet, compile);
+ compile.dependsOn(sourceSet.getCompileJavaTaskName());
+ compile.setDescription(String.format("Compiles the %s Frege source.", sourceSet.getName()));
+ compile.setSource(fregeSourceSet.getFrege());
+ project.getTasks().getByName(sourceSet.getClassesTaskName()).dependsOn(compileTaskName);
+ }
+ });
+ }
+
+ private void configureCompileDefaults(final FregeRuntime fregeRuntime) {
+ this.project.getTasks().withType(FregeCompile.class, new Action<FregeCompile>() {
+ public void execute(final FregeCompile compile) {
+ compile.getConventionMapping().map("fregeClasspath", new Callable() {
+ public Object call() throws Exception {
+ return fregeRuntime.inferFregeClasspath(compile.getClasspath());
+ }
+
+ });
+ }
+ });
+ }
+
+}
diff --git a/src/main/groovy/frege/gradle/plugins/FregeJarFile.java b/src/main/groovy/frege/gradle/plugins/FregeJarFile.java
new file mode 100644
index 0000000..eaf7d8f
--- /dev/null
+++ b/src/main/groovy/frege/gradle/plugins/FregeJarFile.java
@@ -0,0 +1,34 @@
+package frege.gradle.plugins;
+
+import org.gradle.util.VersionNumber;
+
+import java.io.File;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class FregeJarFile {
+ private static final Pattern FILE_NAME_PATTERN = Pattern.compile("(frege(?:-all)?)-(\\d.*?)(-indy)?.jar");
+ private final File file;
+ private final Matcher matcher;
+ private String version;
+
+ private FregeJarFile(File file, Matcher matcher) {
+ this.file = file;
+ this.matcher = matcher;
+ }
+
+
+ public static FregeJarFile parse(File file) {
+ Matcher matcher = FILE_NAME_PATTERN.matcher(file.getName());
+ return matcher.matches() ? new FregeJarFile(file, matcher) : null;
+ }
+
+ public String getDependencyNotation() {
+ return "org.frege-lang:frege:" + getVersion();
+
+ }
+
+ public VersionNumber getVersion() {
+ return VersionNumber.parse(matcher.group(2));
+ }
+}
diff --git a/src/main/groovy/frege/gradle/plugins/FregePlugin.groovy b/src/main/groovy/frege/gradle/plugins/FregePlugin.groovy
new file mode 100644
index 0000000..af05228
--- /dev/null
+++ b/src/main/groovy/frege/gradle/plugins/FregePlugin.groovy
@@ -0,0 +1,34 @@
+package frege.gradle.plugins
+
+import frege.gradle.tasks.FregeDoc
+import frege.gradle.tasks.FregeNativeGen
+import frege.gradle.tasks.FregeQuickCheck
+import frege.gradle.tasks.FregeRepl
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+
+class FregePlugin implements Plugin<Project> {
+
+ Project project
+
+ void apply(Project project) {
+ this.project = project
+
+ project.plugins.apply(FregeBasePlugin)
+ project.plugins.apply("java")
+
+ def replTask = project.task('fregeRepl', type: FregeRepl, group: 'Tools', dependsOn: 'compileFrege')
+ replTask.outputs.upToDateWhen { false } // always run, regardless of up to date checks
+
+ def checkTask = project.task('fregeQuickCheck', type: FregeQuickCheck, group: 'Verification', dependsOn: 'testClasses')
+ checkTask.outputs.upToDateWhen { false } // always run, regardless of up to date checks
+
+ project.tasks.test.dependsOn("fregeQuickCheck")
+
+ project.task('fregeDoc', type: FregeDoc, group: 'Documentation', dependsOn: 'compileFrege')
+
+ project.task('fregeNativeGen', type: FregeNativeGen, group: 'Tools')
+
+ }
+
+}
diff --git a/src/main/groovy/frege/gradle/plugins/FregePluginExtension.groovy b/src/main/groovy/frege/gradle/plugins/FregePluginExtension.groovy
new file mode 100644
index 0000000..ae180ec
--- /dev/null
+++ b/src/main/groovy/frege/gradle/plugins/FregePluginExtension.groovy
@@ -0,0 +1,11 @@
+package frege.gradle.plugins
+
+/**
+ * Created by mperry on 6/02/2015.
+ */
+class FregePluginExtension {
+
+
+ String key1
+
+}
diff --git a/src/main/groovy/frege/gradle/plugins/FregeRuntime.java b/src/main/groovy/frege/gradle/plugins/FregeRuntime.java
new file mode 100644
index 0000000..4265d0b
--- /dev/null
+++ b/src/main/groovy/frege/gradle/plugins/FregeRuntime.java
@@ -0,0 +1,63 @@
+package frege.gradle.plugins;
+
+import com.google.common.collect.Lists;
+import org.gradle.api.Buildable;
+import org.gradle.api.GradleException;
+import org.gradle.api.Project;
+import org.gradle.api.artifacts.Dependency;
+import org.gradle.api.file.FileCollection;
+import org.gradle.api.internal.file.collections.LazilyInitializedFileCollection;
+import org.gradle.api.internal.tasks.TaskDependencyResolveContext;
+
+import java.io.File;
+import java.util.List;
+
+public class FregeRuntime {
+
+ private final Project project;
+
+ public FregeRuntime(Project project) {
+ this.project = project;
+ }
+
+
+ public FileCollection inferFregeClasspath(final Iterable<File> classpath) {
+ return new LazilyInitializedFileCollection() {
+ public String getDisplayName() {
+ return "Frege runtime classpath";
+ }
+
+ public FileCollection createDelegate() {
+ final FregeJarFile fregeJar = FregeRuntime.this.findFregeJarFile(classpath);
+ if (fregeJar == null) {
+ throw new GradleException(String.format("Cannot infer Frege class path because no Frege Jar was found on class path: %s", classpath));
+ }
+ String notation = fregeJar.getDependencyNotation();
+ List<Dependency> dependencies = Lists.newArrayList();
+ dependencies.add(project.getDependencies().create(notation));
+ return project.getConfigurations().detachedConfiguration(dependencies.toArray(new Dependency[dependencies.size()]));
+ }
+
+ public void visitDependencies(TaskDependencyResolveContext context) {
+ if (classpath instanceof Buildable) {
+ context.add(classpath);
+ }
+ }
+
+ };
+ }
+
+ private FregeJarFile findFregeJarFile(Iterable<File> classpath) {
+ if (classpath == null) {
+ return null;
+ }
+ for (File file : classpath) {
+ FregeJarFile fregeJar = FregeJarFile.parse(file);
+ if (fregeJar != null) {
+ return fregeJar;
+ }
+ }
+ return null;
+ }
+
+}