diff options
author | Mark Perry <maperry78@yahoo.com.au> | 2015-09-23 02:16:14 +1000 |
---|---|---|
committer | Mark Perry <maperry78@yahoo.com.au> | 2015-09-23 02:16:14 +1000 |
commit | c26ffd229166faf89588c74f83529707553e1d29 (patch) | |
tree | 0136a8a78de856fe2ae42c58114bdc33ca2a2028 | |
parent | b0731a8488d16821be1f5d7d0a19ac0e9c506d89 (diff) | |
download | frege-gradle-plugin-SourceSet3.tar.gz frege-gradle-plugin-SourceSet3.tar.bz2 frege-gradle-plugin-SourceSet3.zip |
Almost finished source setsSourceSet3
-rw-r--r-- | src/main/groovy/frege/gradle/CompileTask.groovy | 8 | ||||
-rw-r--r-- | src/main/groovy/frege/gradle/FregePlugin.groovy | 136 | ||||
-rw-r--r-- | src/main/groovy/frege/gradle/FregeSourceSet.groovy | 32 |
3 files changed, 159 insertions, 17 deletions
diff --git a/src/main/groovy/frege/gradle/CompileTask.groovy b/src/main/groovy/frege/gradle/CompileTask.groovy index 07bc384..02a3228 100644 --- a/src/main/groovy/frege/gradle/CompileTask.groovy +++ b/src/main/groovy/frege/gradle/CompileTask.groovy @@ -9,12 +9,13 @@ import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.tasks.* +import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.process.internal.DefaultJavaExecAction import org.gradle.process.internal.JavaExecAction import org.gradle.api.internal.file.FileResolver @TypeChecked -class CompileTask extends DefaultTask { +class CompileTask extends AbstractCompile { // see help at https://github.com/Frege/frege/wiki/Compiler-Manpage @@ -112,10 +113,10 @@ class CompileTask extends DefaultTask { deduceSourceDir(project.projectDir, DEFAULT_TEST_SRC_DIR) } - + @Override @TaskAction @TypeChecked(TypeCheckingMode.SKIP) - void executeCompile() { + void compile() { if (! outputDir.exists() ) { logger.info "Creating output directory '${outputDir.absolutePath}'." @@ -256,4 +257,5 @@ class CompileTask extends DefaultTask { args } + }
\ No newline at end of file diff --git a/src/main/groovy/frege/gradle/FregePlugin.groovy b/src/main/groovy/frege/gradle/FregePlugin.groovy index 3daf743..b872f5e 100644 --- a/src/main/groovy/frege/gradle/FregePlugin.groovy +++ b/src/main/groovy/frege/gradle/FregePlugin.groovy @@ -1,36 +1,84 @@ package frege.gradle import groovy.transform.TypeChecked +import org.gradle.api.InvalidUserDataException import org.gradle.api.Plugin import org.gradle.api.Project import fj.data.Option +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 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 + + //@TypeChecked 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 + + CompileTask compileTask + + + @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") project.apply(plugin: 'base') - def e = (FregePluginExtension) project.extensions.create("frege", FregePluginExtension) - - project.task('compileFrege', type: CompileTask, group: 'Build') << { +// def e = (FregePluginExtension) project.extensions.create("frege", FregePluginExtension) - } +// project.task('compileFrege', type: CompileTask, group: 'Build') project.tasks["classes"].dependsOn("compileFrege") project.tasks["compileFrege"].dependsOn("compileJava") - project.task('compileTestFrege', type: CompileTask, group: 'Build') { -// sourcePaths = [CompileTask.deduceTestSrcDir(project)] - outputDir = CompileTask.deduceTestClassesDir(project) -// logger.info("compileTestFrege debug") -// logger.info("projectDir ${project.projectDir}") -// logger.info("defaultSrc ${CompileTask.DEFAULT_SRC_DIR}") - fregePaths = Option.fromNull( - CompileTask.deduceClassesDir(project) - ).map{d -> [d]}.orSome([]) - } +// project.task('compileTestFrege', type: CompileTask, group: 'Build') { +// outputDir = CompileTask.deduceTestClassesDir(project) +// fregePaths = Option.fromNull( +// CompileTask.deduceClassesDir(project) +// ).map{d -> [d]}.orSome([]) +// } project.tasks.testClasses.dependsOn("compileTestFrege") project.tasks.compileTestFrege.dependsOn("compileTestJava") @@ -49,4 +97,64 @@ 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) + + compileTask = project.tasks.create(compileTaskName, CompileTask) + javaBasePlugin.configureForSourceSet(sourceSet, compileTask) + compileTask.dependsOn(sourceSet.compileJavaTaskName) + compileTask.setDescription("Compiles the ${sourceSet.name} Frege sources.") + compileTask.setSource(fregeSourceSet.frege) + + project.tasks.getByName(sourceSet.classesTaskName).dependsOn(compileTaskName) + } + } + + + private void configureApplicationPlugin() { + def run = project.tasks.getByName(TASK_RUN_NAME) + run.conventionMapping.main = { "${compileTask.module}".toString() } + run.doFirst { + ensureMainModuleConfigured() + } + + def startScripts = project.tasks.getByName(TASK_START_SCRIPTS_NAME) + startScripts.conventionMapping.mainClassName = { "${compileTask.module}".toString() } + startScripts.doFirst { + ensureMainModuleConfigured() + } + } + + + private void ensureMainModuleConfigured() { + // TODO: no op - should probably be removed +// if (!pluginExtension.module) { +// 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(CompileTask) { CompileTask fregeCompile -> + // TODO + +// fregeCompile.conventionMapping.map(CompileTask.FREGE_CLASSPATH_FIELD) { fregeConfiguration } + } + } + + private void addFregePluginExtension() { + pluginExtension = project.extensions.create(FREGE_PLUGIN_NAME, FregePluginExtension) + } + } diff --git a/src/main/groovy/frege/gradle/FregeSourceSet.groovy b/src/main/groovy/frege/gradle/FregeSourceSet.groovy new file mode 100644 index 0000000..75d2ad9 --- /dev/null +++ b/src/main/groovy/frege/gradle/FregeSourceSet.groovy @@ -0,0 +1,32 @@ +package frege.gradle + +/** + * Created by MarkPerry on 23/09/2015. + */ + + +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 + } + +} |