diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/groovy/frege/gradle/FregePlugin.groovy | 92 | ||||
-rw-r--r-- | src/main/groovy/frege/gradle/FregePluginExtension.groovy | 3 | ||||
-rw-r--r-- | src/main/groovy/frege/gradle/FregeSourceSet.groovy | 25 | ||||
-rw-r--r-- | src/main/groovy/frege/gradle/FregeTask.groovy | 35 |
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 |