summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/groovy/frege/gradle/FregePlugin.groovy92
-rw-r--r--src/main/groovy/frege/gradle/FregePluginExtension.groovy3
-rw-r--r--src/main/groovy/frege/gradle/FregeSourceSet.groovy25
-rw-r--r--src/main/groovy/frege/gradle/FregeTask.groovy35
4 files changed, 148 insertions, 7 deletions
diff --git a/src/main/groovy/frege/gradle/FregePlugin.groovy b/src/main/groovy/frege/gradle/FregePlugin.groovy
index 21958b0..ba8b7ba 100644
--- a/src/main/groovy/frege/gradle/FregePlugin.groovy
+++ b/src/main/groovy/frege/gradle/FregePlugin.groovy
@@ -1,11 +1,48 @@
package frege.gradle
+import org.gradle.api.InvalidUserDataException
import org.gradle.api.Plugin
import org.gradle.api.Project
+import org.gradle.api.artifacts.Configuration
+import org.gradle.api.internal.file.FileResolver
+import org.gradle.api.internal.plugins.DslObject
+import org.gradle.api.plugins.ApplicationPlugin
+import org.gradle.api.plugins.JavaBasePlugin
+import org.gradle.api.plugins.JavaPlugin
+import org.gradle.api.plugins.JavaPluginConvention
+
+import javax.inject.Inject
+
+import static org.gradle.api.plugins.ApplicationPlugin.TASK_RUN_NAME
+import static org.gradle.api.plugins.ApplicationPlugin.TASK_START_SCRIPTS_NAME
+import static org.gradle.api.plugins.JavaPlugin.RUNTIME_CONFIGURATION_NAME
class FregePlugin implements Plugin<Project> {
+ public static final String FREGE_PLUGIN_NAME = 'frege'
+ public static final String FREGE_CONFIGURATION_NAME = FREGE_PLUGIN_NAME
+
+ Project project
+ FileResolver fileResolver
+ Configuration fregeConfiguration
+ FregePluginExtension pluginExtension
+
+ @Inject
+ FregePlugin(FileResolver fileResolver) {
+ this.fileResolver = fileResolver
+ }
+
void apply(Project project) {
+ this.project = project
+ project.plugins.apply(JavaPlugin)
+ project.plugins.apply(ApplicationPlugin)
+
+ configureSourceSetDefaults(project.plugins.getPlugin(JavaBasePlugin))
+ configureFregeConfigurationAndClasspath()
+
+ configureApplicationPlugin()
+ addFregePluginExtension()
+
// Workaround to build proper jars on Windows, see https://github.com/Frege/frege-gradle-plugin/issues/9
System.setProperty("file.encoding", "UTF-8")
@@ -13,7 +50,6 @@ class FregePlugin implements Plugin<Project> {
def e = (FregePluginExtension) project.extensions.create("frege", FregePluginExtension)
project.task('compileFrege', type: FregeTask, group: 'Build') << {
-
}
project.tasks.classes.dependsOn("compileFrege")
@@ -29,4 +65,58 @@ class FregePlugin implements Plugin<Project> {
}
+ private void configureSourceSetDefaults(JavaBasePlugin javaBasePlugin) {
+ project.convention.getPlugin(JavaPluginConvention).sourceSets.all { sourceSet ->
+ def fregeSourceSet = new FregeSourceSet(sourceSet.displayName, fileResolver)
+ new DslObject(sourceSet).convention.plugins.put(FREGE_PLUGIN_NAME, fregeSourceSet)
+
+ fregeSourceSet.frege.srcDir("src/${sourceSet.name}/frege")
+
+ def compileTaskName = sourceSet.getCompileTaskName(FREGE_PLUGIN_NAME)
+
+ def fregeCompile = project.tasks.create(compileTaskName, FregeTask)
+ javaBasePlugin.configureForSourceSet(sourceSet, fregeCompile)
+ fregeCompile.dependsOn(sourceSet.compileJavaTaskName)
+ fregeCompile.setDescription("Compiles the ${sourceSet.name} Frege sources.")
+ fregeCompile.setSource(fregeSourceSet.frege)
+
+ project.tasks.getByName(sourceSet.classesTaskName).dependsOn(compileTaskName)
+ }
+ }
+
+ private void configureApplicationPlugin() {
+ def run = project.tasks.getByName(TASK_RUN_NAME)
+ run.conventionMapping.main = { "${pluginExtension.mainModule}".toString() }
+ run.doFirst {
+ ensureMainModuleConfigured()
+ }
+
+ def startScripts = project.tasks.getByName(TASK_START_SCRIPTS_NAME)
+ startScripts.conventionMapping.mainClassName = { "${pluginExtension.mainModule}".toString() }
+ startScripts.doFirst {
+ ensureMainModuleConfigured()
+ }
+ }
+
+ private void ensureMainModuleConfigured() {
+ if (!pluginExtension.mainModule) {
+ throw new InvalidUserDataException('You must specify the mainModule using frege extension.')
+ }
+ }
+
+ private void configureFregeConfigurationAndClasspath() {
+ fregeConfiguration = project.configurations.create(FREGE_CONFIGURATION_NAME)
+ .setVisible(false)
+ .setDescription('The Frege libraries to be used for this Frege project.')
+
+ project.configurations.getByName(RUNTIME_CONFIGURATION_NAME).extendsFrom(fregeConfiguration)
+
+ project.tasks.withType(FregeTask) { FregeTask fregeCompile ->
+ fregeCompile.conventionMapping.map(FregeTask.FREGE_CLASSPATH_FIELD) { fregeConfiguration }
+ }
+ }
+
+ private void addFregePluginExtension() {
+ pluginExtension = project.extensions.create(FREGE_PLUGIN_NAME, FregePluginExtension)
+ }
}
diff --git a/src/main/groovy/frege/gradle/FregePluginExtension.groovy b/src/main/groovy/frege/gradle/FregePluginExtension.groovy
index dbf0d2a..043b15c 100644
--- a/src/main/groovy/frege/gradle/FregePluginExtension.groovy
+++ b/src/main/groovy/frege/gradle/FregePluginExtension.groovy
@@ -5,7 +5,8 @@ package frege.gradle
*/
class FregePluginExtension {
-
String key1
+ String mainModule
+
}
diff --git a/src/main/groovy/frege/gradle/FregeSourceSet.groovy b/src/main/groovy/frege/gradle/FregeSourceSet.groovy
new file mode 100644
index 0000000..50c42b9
--- /dev/null
+++ b/src/main/groovy/frege/gradle/FregeSourceSet.groovy
@@ -0,0 +1,25 @@
+package frege.gradle
+
+import org.gradle.api.file.SourceDirectorySet
+import org.gradle.api.internal.file.DefaultSourceDirectorySet
+import org.gradle.api.internal.file.FileResolver
+
+import static org.gradle.util.ConfigureUtil.configure
+
+class FregeSourceSet {
+ private final SourceDirectorySet frege
+
+ FregeSourceSet(String displayName, FileResolver fileResolver) {
+ frege = new DefaultSourceDirectorySet(String.format('%s Frege source', displayName), fileResolver)
+ frege.filter.include('**/*.fr')
+ }
+
+ SourceDirectorySet getFrege() {
+ frege
+ }
+
+ FregeSourceSet frege(Closure closure) {
+ configure(closure, frege)
+ this
+ }
+}
diff --git a/src/main/groovy/frege/gradle/FregeTask.groovy b/src/main/groovy/frege/gradle/FregeTask.groovy
index a85b4cc..969f31b 100644
--- a/src/main/groovy/frege/gradle/FregeTask.groovy
+++ b/src/main/groovy/frege/gradle/FregeTask.groovy
@@ -1,13 +1,29 @@
package frege.gradle
-import org.gradle.api.DefaultTask
import org.gradle.api.tasks.*
import org.gradle.process.internal.DefaultJavaExecAction
import org.gradle.process.internal.JavaExecAction
import org.gradle.api.internal.file.FileResolver
-import org.gradle.tooling.BuildException
+import org.gradle.api.InvalidUserDataException
+import org.gradle.api.file.FileCollection
+import org.gradle.api.internal.tasks.compile.CompilationFailedException
+import org.gradle.api.tasks.TaskAction
+import org.gradle.api.tasks.compile.AbstractCompile
+import org.gradle.api.tasks.incremental.IncrementalTaskInputs
+
+import static org.apache.commons.io.FilenameUtils.removeExtension
+
+
+class FregeTask extends AbstractCompile {
+
+
+ // todo set names
+ private static final String FREGE_COMPILER_CLASS_NAME = 'frege.compiler.Main'
+ public static final String FREGE_CLASSPATH_FIELD = 'fregeClasspath'
+ FileCollection fregeClasspath
+
+
-class FregeTask extends DefaultTask {
static String DEFAULT_CLASSES_SUBDIR = "classes/main" // TODO: should this come from a convention?
static String DEFAULT_SRC_DIR = "src/main/frege" // TODO: should this come from a source set?
@@ -46,7 +62,9 @@ class FregeTask extends DefaultTask {
File outputDir = new File(project.buildDir, DEFAULT_CLASSES_SUBDIR)
@TaskAction
- void executeCompile() {
+ void compile() {
+ ensureFregeConfigurationSpecified()
+
if (! outputDir.exists() ) {
logger.info "Creating output directory '${outputDir.absolutePath}'."
outputDir.mkdirs()
@@ -56,7 +74,7 @@ class FregeTask extends DefaultTask {
FileResolver fileResolver = getServices().get(FileResolver.class)
JavaExecAction action = new DefaultJavaExecAction(fileResolver)
- action.setMain("frege.compiler.Main")
+ action.setMain(FREGE_COMPILER_CLASS_NAME)
action.setClasspath(project.files(project.configurations.compile))
List jvmargs = []
@@ -106,4 +124,11 @@ class FregeTask extends DefaultTask {
}
args
}
+
+ protected void ensureFregeConfigurationSpecified() {
+ if (getFregeClasspath().empty) {
+ throw new InvalidUserDataException('You must assign a Frege library to the "frege" configuration.')
+ }
+ }
+
} \ No newline at end of file