diff --git a/plugins/scripting/scripting-gradle/build.gradle.kts b/plugins/scripting/scripting-gradle/build.gradle.kts new file mode 100644 index 00000000000..e1d5db6d77a --- /dev/null +++ b/plugins/scripting/scripting-gradle/build.gradle.kts @@ -0,0 +1,57 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +description = "Kotlin Scripting Compiler Plugin for Gradle" + +apply { plugin("kotlin") } + +plugins { + id("com.gradle.plugin-publish") + `java-gradle-plugin` +} + +val packedJars by configurations.creating + +dependencies { + compile(project(":kotlin-gradle-plugin-api")) + compileOnly(project(":kotlin-scripting-compiler-plugin")) + packedJars(project(":kotlin-scripting-compiler-plugin")) { isTransitive = false } + runtime(project(":kotlin-scripting-common")) + runtime(project(":kotlin-scripting-jvm")) +} + +sourceSets { + "main" { projectDefault() } + "test" { projectDefault() } +} + +val jar: Jar by tasks +jar.apply { + classifier = "base" +} + +runtimeJar(rewriteDepsToShadedCompiler( + task("shadowJar") { + from(packedJars) + from(the().sourceSets.getByName("main").output) + } +)) +sourcesJar() +javadocJar() + +val gradlePluginId = "org.jetbrains.kotlin.plugin.scripting" + +pluginBundle { + (plugins) { + gradlePluginId { + id = gradlePluginId + displayName = "Gradle plugin for kotlin scripting" + description = displayName + } + } +} + +publish() + +projectTest { + workingDir = rootDir +} diff --git a/plugins/scripting/scripting-gradle/plugin-marker/build.gradle b/plugins/scripting/scripting-gradle/plugin-marker/build.gradle new file mode 100644 index 00000000000..630ec691435 --- /dev/null +++ b/plugins/scripting/scripting-gradle/plugin-marker/build.gradle @@ -0,0 +1,3 @@ +apply from: "$rootDir/libraries/tools/gradle-tools/pluginMarkers.gradle" + +pluginMarkerProject('kotlin-scripting-gradle-plugin') diff --git a/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/kotlin-scripting.properties b/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/kotlin-scripting.properties new file mode 100644 index 00000000000..75dc0c2b3e1 --- /dev/null +++ b/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/kotlin-scripting.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.scripting.gradle.ScriptingGradleSubplugin \ No newline at end of file diff --git a/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.scripting.properties b/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.scripting.properties new file mode 100644 index 00000000000..75dc0c2b3e1 --- /dev/null +++ b/plugins/scripting/scripting-gradle/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.scripting.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.scripting.gradle.ScriptingGradleSubplugin \ No newline at end of file diff --git a/plugins/scripting/scripting-gradle/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin b/plugins/scripting/scripting-gradle/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin new file mode 100644 index 00000000000..eb5d7cc87c4 --- /dev/null +++ b/plugins/scripting/scripting-gradle/resources/META-INF/services/org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin @@ -0,0 +1 @@ +org.jetbrains.kotlin.scripting.gradle.ScriptingKotlinGradleSubplugin diff --git a/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingExtension.kt b/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingExtension.kt new file mode 100644 index 00000000000..2dc5d02515a --- /dev/null +++ b/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingExtension.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.scripting.gradle + +open class ScriptingExtension { + internal val myScriptDefinitions = mutableListOf() + internal val myScriptDefinitionsClasspath = mutableListOf() + internal var myDisableScriptDefinitionsFromClasspath = false + internal val myScriptResolverEnvironment = mutableMapOf() + + open fun scriptDefinition(fqName: String) { + myScriptDefinitions.add(fqName) + } + + open fun scriptDefinitions(fqNames: List) { + myScriptDefinitions.addAll(fqNames) + } + + open fun scriptDefinitions(vararg fqNames: String) { + myScriptDefinitions.addAll(fqNames) + } + + open fun scriptDefinitionsClasspath(vararg paths: String) { + myScriptDefinitionsClasspath.addAll(paths) + } + + open fun scriptDefinitionsClasspath(paths: List) { + myScriptDefinitionsClasspath.addAll(paths) + } + + open fun disableScriptDefinitionsFromClasspath(disable: Boolean) { + myDisableScriptDefinitionsFromClasspath = disable + } + + open fun scriptResolverEnvironment(vararg pairs: Pair) { + myScriptResolverEnvironment.putAll(pairs) + } + + open fun scriptResolverEnvironment(pairs: List>) { + myScriptResolverEnvironment.putAll(pairs) + } +} diff --git a/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingGradleSubplugin.kt b/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingGradleSubplugin.kt new file mode 100644 index 00000000000..2e5b680587e --- /dev/null +++ b/plugins/scripting/scripting-gradle/src/org/jetbrains/kotlin/scripting/gradle/ScriptingGradleSubplugin.kt @@ -0,0 +1,70 @@ +/* + * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.scripting.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.compile.AbstractCompile +import org.jetbrains.kotlin.gradle.plugin.KotlinGradleSubplugin +import org.jetbrains.kotlin.gradle.plugin.SubpluginOption + +class ScriptingGradleSubplugin : Plugin +{ + companion object { + fun isEnabled(project: Project) = project.plugins.findPlugin(ScriptingGradleSubplugin::class.java) != null + } + + override fun apply(project: Project) {} +} + +class ScriptingKotlinGradleSubplugin : KotlinGradleSubplugin { + companion object { + val SCRIPTING_GROUP_NAME = "org.jetbrains.kotlin" + val SCRIPTING_ARTIFACT_NAME = "kotlin-scripting" + + val SCRIPT_DEFINITIONS_OPTION = "script-definitions" + val SCRIPT_DEFINITIONS_CLASSPATH_OPTION = "script-definitions-classpath" + val DISABLE_SCRIPT_DEFINITIONS_FROM_CLSSPATH_OPTION = "disable-script-definitions-from-classpath" + val LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION = "script-resolver-environment" + } + + override fun isApplicable(project: Project, task: AbstractCompile) = ScriptingGradleSubplugin.isEnabled(project) + + override fun apply( + project: Project, + kotlinCompile: AbstractCompile, + javaCompile: AbstractCompile, + variantData: Any?, + androidProjectHandler: Any?, + javaSourceSet: SourceSet? + ): List { + if (!ScriptingGradleSubplugin.isEnabled(project)) return emptyList() + + val scriptingExtension = project.extensions.findByType(ScriptingExtension::class.java) ?: return emptyList() + + val options = mutableListOf() + + for (scriptDef in scriptingExtension.myScriptDefinitions) { + options += SubpluginOption(SCRIPT_DEFINITIONS_OPTION, scriptDef) + } + for (path in scriptingExtension.myScriptDefinitionsClasspath) { + options += SubpluginOption(SCRIPT_DEFINITIONS_CLASSPATH_OPTION, path) + } + if (scriptingExtension.myDisableScriptDefinitionsFromClasspath) { + options += SubpluginOption(DISABLE_SCRIPT_DEFINITIONS_FROM_CLSSPATH_OPTION, "true") + } + for (pair in scriptingExtension.myScriptResolverEnvironment) { + options += SubpluginOption(LEGACY_SCRIPT_RESOLVER_ENVIRONMENT_OPTION, "${pair.key}=${pair.value}") + } + + return options + } + + override fun getArtifactName() = "kotlin-scripting-gradle" + override fun getGroupName() = "org.jetbrains.kotlin" + override fun getCompilerPluginId() = "kotlin.scripting" +} diff --git a/settings.gradle b/settings.gradle index 307c63b3dcd..c1675fa5f7e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -155,6 +155,7 @@ include ":kotlin-build-common", ":kotlin-scripting-jvm-host", ":kotlin-scripting-compiler-plugin", ":kotlin-scripting-idea-plugin", + ":kotlin-scripting-gradle-plugin", ":examples:scripting-jvm-simple-script", ":examples:scripting-jvm-maven-deps", ":pill:generate-all-tests", @@ -164,6 +165,7 @@ include ":kotlin-build-common", ':kotlin-gradle-plugin:plugin-marker', ':kotlin-allopen:plugin-marker', ':kotlin-noarg:plugin-marker', + ':kotlin-scripting-gradle-plugin:plugin-marker', ":test-instrumenter" def isTeamcityBuild = hasProperty("teamcity") || System.getenv("TEAMCITY_VERSION") != null @@ -255,6 +257,7 @@ project(':kotlin-scripting-jvm').projectDir = "$rootDir/libraries/scripting/jvm" project(':kotlin-scripting-jvm-host').projectDir = "$rootDir/libraries/scripting/jvm-host" as File project(':kotlin-scripting-compiler-plugin').projectDir = "$rootDir/plugins/scripting/scripting-cli" as File project(':kotlin-scripting-idea-plugin').projectDir = "$rootDir/plugins/scripting/scripting-idea" as File +project(':kotlin-scripting-gradle-plugin').projectDir = "$rootDir/plugins/scripting/scripting-gradle" as File project(':examples:scripting-jvm-simple-script').projectDir = "$rootDir/libraries/examples/scripting/jvm-simple-script" as File project(':examples:scripting-jvm-maven-deps').projectDir = "$rootDir/libraries/examples/scripting/jvm-maven-deps" as File project(':pill:generate-all-tests').projectDir = "$rootDir/plugins/pill/generate-all-tests" as File @@ -263,4 +266,5 @@ project(':pill:generate-all-tests').projectDir = "$rootDir/plugins/pill/generate project(':kotlin-gradle-plugin:plugin-marker').projectDir = file("$rootDir/libraries/tools/kotlin-gradle-plugin/plugin-marker") project(':kotlin-allopen:plugin-marker').projectDir = file("$rootDir/libraries/tools/kotlin-allopen/plugin-marker") project(':kotlin-noarg:plugin-marker').projectDir = file("$rootDir/libraries/tools/kotlin-noarg/plugin-marker") +project(':kotlin-scripting-gradle-plugin:plugin-marker').projectDir = file("$rootDir/plugins/scripting/scripting-gradle/plugin-marker")