From d47c934650540277c911514d4cf7ddf55a69492a Mon Sep 17 00:00:00 2001 From: Rene Groeschke Date: Sat, 21 Nov 2015 00:59:06 +0000 Subject: create frege compile task per sourceSet --- .../frege/gradle/plugins/FregeBasePlugin.java | 87 ++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java (limited to 'src/main/groovy/frege/gradle/plugins/FregeBasePlugin.java') 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 { + 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() { + 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() { + 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() { + public void execute(final FregeCompile compile) { + compile.getConventionMapping().map("fregeClasspath", new Callable() { + public Object call() throws Exception { + return fregeRuntime.inferFregeClasspath(compile.getClasspath()); + } + + }); + } + }); + } + +} -- cgit