diff options
author | Dierk König <dierk.koenig@canoo.com> | 2015-11-21 10:09:31 +0100 |
---|---|---|
committer | Dierk König <dierk.koenig@canoo.com> | 2015-11-21 10:09:31 +0100 |
commit | f0807811f48c50b6a5fe7816ef48c148be9f9903 (patch) | |
tree | c61df925b637d26c95086510ee471ac861a36731 /src/main/groovy/frege/gradle/plugins | |
parent | fa6dce676590c83bc84d130e1241cf585f88a469 (diff) | |
parent | 73dd702743a5b4d8816e495e55c19f391669fc25 (diff) | |
download | frege-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')
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; + } + +} |