From 349a54d52825ba5a6000ff573b0ddb4f4bdf9f19 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Fri, 6 Nov 2015 09:59:52 -0800 Subject: [PATCH] Application plug-in. --- src/main/kotlin/com/beust/kobalt/Plugins.kt | 4 +- .../com/beust/kobalt/api/KobaltPluginXml.kt | 2 +- .../com/beust/kobalt/internal/JvmCompiler.kt | 6 +-- .../beust/kobalt/kotlin/BuildFileCompiler.kt | 27 +++++++----- .../kobalt/plugin/android/AndroidPlugin.kt | 8 +++- .../plugin/application/ApplicationPlugin.kt | 43 +++++++++++++++++++ .../kobalt/plugin/kotlin/KotlinPlugin.kt | 8 ++-- 7 files changed, 75 insertions(+), 23 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt diff --git a/src/main/kotlin/com/beust/kobalt/Plugins.kt b/src/main/kotlin/com/beust/kobalt/Plugins.kt index 130055a7..ffa14a23 100644 --- a/src/main/kotlin/com/beust/kobalt/Plugins.kt +++ b/src/main/kotlin/com/beust/kobalt/Plugins.kt @@ -13,6 +13,7 @@ import com.beust.kobalt.misc.KobaltExecutors import com.beust.kobalt.misc.log import com.beust.kobalt.plugin.DefaultPlugin import com.beust.kobalt.plugin.android.AndroidPlugin +import com.beust.kobalt.plugin.application.ApplicationPlugin import com.beust.kobalt.plugin.java.JavaPlugin import com.beust.kobalt.plugin.kotlin.KotlinPlugin import com.beust.kobalt.plugin.packaging.PackagingPlugin @@ -70,7 +71,8 @@ public class Plugins @Inject constructor (val taskManagerProvider : Provider) * Plugins that export classpath entries need to implement this interface. */ interface IClasspathContributor { - fun entriesFor(project: Project) : Collection + fun entriesFor(project: Project?) : Collection } /** diff --git a/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt b/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt index b3ed7af3..c46b9261 100644 --- a/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/internal/JvmCompiler.kt @@ -45,14 +45,12 @@ class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) allDependencies.forEach { dependencies -> result.addAll(dependencyManager.transitiveClosure(dependencies)) } - if (project != null) { - result.addAll(runClasspathContributors(context, project)) - } + result.addAll(runClasspathContributors(project, context)) return result } - private fun runClasspathContributors(context: KobaltContext?, project: Project) : + private fun runClasspathContributors(project: Project?, context: KobaltContext?) : Collection { val result = arrayListOf() context!!.pluginInfo.classpathContributors.forEach { it: IClasspathContributor -> diff --git a/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt b/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt index 3ecae1f4..8f8f015d 100644 --- a/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/kotlin/BuildFileCompiler.kt @@ -4,6 +4,8 @@ import com.beust.kobalt.Args import com.beust.kobalt.Plugins import com.beust.kobalt.api.* import com.beust.kobalt.api.annotation.Task +import com.beust.kobalt.internal.JvmCompiler +import com.beust.kobalt.maven.IClasspathDependency import com.beust.kobalt.maven.KobaltException import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.Topological @@ -26,7 +28,7 @@ import javax.inject.Inject public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val buildFiles: List, @Assisted val pluginInfo: PluginInfo, val files: KFiles, val plugins: Plugins, - val pluginProperties: PluginProperties) { + val jvmCompiler: JvmCompiler, val pluginProperties: PluginProperties) { interface IFactory { fun create(@Assisted("buildFiles") buildFiles: List, pluginInfo: PluginInfo) : BuildFileCompiler @@ -42,19 +44,19 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b context.pluginProperties = pluginProperties Kobalt.context = context - val allProjects = findProjects() + val allProjects = findProjects(context) plugins.applyPlugins(context, allProjects) return allProjects } - private fun findProjects(): List { + private fun findProjects(context: KobaltContext): List { val result = arrayListOf() buildFiles.forEach { buildFile -> - val pluginUrls = findPlugInUrls(buildFile) + val pluginUrls = findPlugInUrls(context, buildFile) val buildScriptJarFile = File(KFiles.findBuildScriptLocation(buildFile, SCRIPT_JAR)) - maybeCompileBuildFile(buildFile, buildScriptJarFile, pluginUrls) + maybeCompileBuildFile(context, buildFile, buildScriptJarFile, pluginUrls) val buildScriptInfo = parseBuildScriptJarFile(buildScriptJarFile, pluginUrls) result.addAll(buildScriptInfo.projects) } @@ -65,7 +67,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b buildFile.exists() && jarFile.exists() && buildFile.lastModified < jarFile.lastModified() - private fun maybeCompileBuildFile(buildFile: BuildFile, buildScriptJarFile: File, + private fun maybeCompileBuildFile(context: KobaltContext, buildFile: BuildFile, buildScriptJarFile: File, pluginUrls: List) { log(2, "Running build file ${buildFile.name} jar: $buildScriptJarFile") @@ -79,7 +81,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b classpath(pluginUrls.map { it.file }) sourceFiles(listOf(buildFile.path.toFile().absolutePath)) output = buildScriptJarFile - }.compile() + }.compile(context = context) } } @@ -87,7 +89,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b * Generate the script file with only the plugins()/repos() directives and run it. Then return * the URL's of all the plug-ins that were found. */ - private fun findPlugInUrls(buildFile: BuildFile): List { + private fun findPlugInUrls(context: KobaltContext, buildFile: BuildFile): List { val result = arrayListOf() val pluginCode = arrayListOf( "import com.beust.kobalt.*", @@ -124,7 +126,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b val buildScriptJarFile = File(buildScriptJar) if (! isUpToDate(buildFile, File(buildScriptJar))) { buildScriptJarFile.parentFile.mkdirs() - generateJarFile(BuildFile(Paths.get(pluginSourceFile.path), "Plugins"), buildScriptJarFile) + generateJarFile(context, BuildFile(Paths.get(pluginSourceFile.path), "Plugins"), buildScriptJarFile) } // @@ -142,12 +144,15 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b return result } - private fun generateJarFile(buildFile: BuildFile, buildScriptJarFile: File) { + private fun generateJarFile(context: KobaltContext, buildFile: BuildFile, buildScriptJarFile: File) { + val kotlintDeps = jvmCompiler.calculateDependencies(null, context, listOf()) + val deps: List = kotlintDeps.map { it.jarFile.get().absolutePath } kotlinCompilePrivate { classpath(files.kobaltJar) + classpath(deps) sourceFiles(buildFile.path.toFile().absolutePath) output = File(buildScriptJarFile.absolutePath) - }.compile() + }.compile(context = context) } class BuildScriptInfo(val projects: List, val classLoader: ClassLoader) diff --git a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt index df54198b..7fafe165 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/android/AndroidPlugin.kt @@ -245,8 +245,12 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) : private val classpathEntries = HashMultimap.create() - override fun entriesFor(project: Project): Collection { - return classpathEntries.get(project.name!!) ?: listOf() + override fun entriesFor(project: Project?): Collection { + if (project != null) { + return classpathEntries.get(project.name!!) ?: listOf() + } else { + return listOf() + } } } diff --git a/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt new file mode 100644 index 00000000..e6fb0d3c --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/plugin/application/ApplicationPlugin.kt @@ -0,0 +1,43 @@ +package com.beust.kobalt.plugin.application + +import com.beust.kobalt.Plugins +import com.beust.kobalt.api.BasePlugin +import com.beust.kobalt.api.Project +import com.beust.kobalt.api.annotation.Directive +import com.beust.kobalt.maven.DependencyManager +import com.beust.kobalt.maven.LocalRepo +import com.beust.kobalt.misc.KobaltExecutors +import com.google.inject.Inject +import com.google.inject.Singleton + +@Directive +class ApplicationConfig { + var mainClass: String? = null + var jvmArgs = arrayListOf() + + fun jvmArgs(vararg args: String) = args.forEach { jvmArgs.add(it) } +} + +@Directive +fun Project.application(init: ApplicationConfig.() -> Unit) { + ApplicationConfig().let { config -> + config.init() + (Plugins.findPlugin(ApplicationPlugin.NAME) as ApplicationPlugin).addConfig(this, config) + } +} + +@Singleton +class ApplicationPlugin @Inject constructor(val dependencyManager : DependencyManager, + val executors: KobaltExecutors, val localRepo: LocalRepo) : BasePlugin() { + + companion object { + const val NAME = "application" + } + + override val name = NAME + + fun addConfig(project: Project, config: ApplicationConfig) { + println("Adding config $config") + } +} + diff --git a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt index 9c2d446b..45cfffa0 100644 --- a/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt +++ b/src/main/kotlin/com/beust/kobalt/plugin/kotlin/KotlinPlugin.kt @@ -93,13 +93,13 @@ class KotlinPlugin @Inject constructor( // interface IClasspathContributor - override fun entriesFor(project: Project) : List = - if (project is KotlinProject) { + override fun entriesFor(project: Project?) : List = + if (project == null || project is KotlinProject) { // All Kotlin projects automatically get the Kotlin runtime added to their class path - arrayListOf(getKotlinCompilerJar("kotlin-stdlib"), getKotlinCompilerJar("kotlin-compiler-embeddable")) + listOf(getKotlinCompilerJar("kotlin-stdlib"), getKotlinCompilerJar("kotlin-compiler-embeddable")) .map { FileDependency(it) } } else { - arrayListOf() + listOf() } }