1*af87fb4bSXin Li import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2*af87fb4bSXin Li
3*af87fb4bSXin Li description = "Kotlin Symbol Processor"
4*af87fb4bSXin Li
5*af87fb4bSXin Li val kotlinBaseVersion: String by project
6*af87fb4bSXin Li val junitVersion: String by project
7*af87fb4bSXin Li val googleTruthVersion: String by project
8*af87fb4bSXin Li val agpBaseVersion: String by project
9*af87fb4bSXin Li val signingKey: String? by project
10*af87fb4bSXin Li val signingPassword: String? by project
11*af87fb4bSXin Li
<lambda>null12*af87fb4bSXin Li tasks.withType<KotlinCompile> {
13*af87fb4bSXin Li compilerOptions.freeCompilerArgs.add("-Xjvm-default=all-compatibility")
14*af87fb4bSXin Li }
15*af87fb4bSXin Li
<lambda>null16*af87fb4bSXin Li plugins {
17*af87fb4bSXin Li kotlin("jvm")
18*af87fb4bSXin Li id("java-gradle-plugin")
19*af87fb4bSXin Li `maven-publish`
20*af87fb4bSXin Li signing
21*af87fb4bSXin Li id("org.jetbrains.dokka") version ("1.7.20")
22*af87fb4bSXin Li }
23*af87fb4bSXin Li
<lambda>null24*af87fb4bSXin Li dependencies {
25*af87fb4bSXin Li implementation("org.jetbrains.kotlin:kotlin-gradle-plugin-api:$kotlinBaseVersion")
26*af87fb4bSXin Li implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinBaseVersion")
27*af87fb4bSXin Li compileOnly("org.jetbrains.kotlin:kotlin-compiler-embeddable:$kotlinBaseVersion")
28*af87fb4bSXin Li // replace AGP dependency w/ gradle-api when we have source registering API available.
29*af87fb4bSXin Li compileOnly("com.android.tools.build:gradle:$agpBaseVersion")
30*af87fb4bSXin Li compileOnly(gradleApi())
31*af87fb4bSXin Li testImplementation(gradleApi())
32*af87fb4bSXin Li testImplementation(project(":api"))
33*af87fb4bSXin Li testImplementation("junit:junit:$junitVersion")
34*af87fb4bSXin Li testImplementation("com.google.truth:truth:$googleTruthVersion")
35*af87fb4bSXin Li testImplementation(gradleTestKit())
36*af87fb4bSXin Li }
37*af87fb4bSXin Li
<lambda>null38*af87fb4bSXin Li tasks.named("validatePlugins").configure {
39*af87fb4bSXin Li onlyIf {
40*af87fb4bSXin Li // while traversing classpath, this hits a class not found issue.
41*af87fb4bSXin Li // Disabled until gradle kotlin version and our kotlin version matches
42*af87fb4bSXin Li // java.lang.ClassNotFoundException: org/jetbrains/kotlin/compilerRunner/KotlinLogger
43*af87fb4bSXin Li false
44*af87fb4bSXin Li }
45*af87fb4bSXin Li }
46*af87fb4bSXin Li
<lambda>null47*af87fb4bSXin Li gradlePlugin {
48*af87fb4bSXin Li plugins {
49*af87fb4bSXin Li create("symbol-processing-gradle-plugin") {
50*af87fb4bSXin Li id = "com.google.devtools.ksp"
51*af87fb4bSXin Li displayName = "com.google.devtools.ksp.gradle.plugin"
52*af87fb4bSXin Li implementationClass = "com.google.devtools.ksp.gradle.KspGradleSubplugin"
53*af87fb4bSXin Li description = "Kotlin symbol processing integration for Gradle"
54*af87fb4bSXin Li }
55*af87fb4bSXin Li }
56*af87fb4bSXin Li }
57*af87fb4bSXin Li
<lambda>null58*af87fb4bSXin Li tasks {
59*af87fb4bSXin Li val sourcesJar by creating(Jar::class) {
60*af87fb4bSXin Li archiveClassifier.set("sources")
61*af87fb4bSXin Li from(project.sourceSets.main.get().allSource)
62*af87fb4bSXin Li }
63*af87fb4bSXin Li }
64*af87fb4bSXin Li
<lambda>null65*af87fb4bSXin Li val dokkaJavadocJar by tasks.register<Jar>("dokkaJavadocJar") {
66*af87fb4bSXin Li dependsOn(tasks.dokkaJavadoc)
67*af87fb4bSXin Li from(tasks.dokkaJavadoc.flatMap { it.outputDirectory })
68*af87fb4bSXin Li archiveClassifier.set("javadoc")
69*af87fb4bSXin Li }
70*af87fb4bSXin Li
<lambda>null71*af87fb4bSXin Li publishing {
72*af87fb4bSXin Li publications {
73*af87fb4bSXin Li // the name of this publication should match the name java-gradle-plugin looks up
74*af87fb4bSXin Li // https://github.com/gradle/gradle/blob/master/subprojects/plugin-development/src/main/java/org/gradle/plugin/devel/plugins/MavenPluginPublishPlugin.java#L73
75*af87fb4bSXin Li this.create<MavenPublication>("pluginMaven") {
76*af87fb4bSXin Li artifactId = "symbol-processing-gradle-plugin"
77*af87fb4bSXin Li artifact(tasks["sourcesJar"])
78*af87fb4bSXin Li artifact(tasks["dokkaJavadocJar"])
79*af87fb4bSXin Li pom {
80*af87fb4bSXin Li name.set("symbol-processing-gradle-plugin")
81*af87fb4bSXin Li description.set("Kotlin symbol processing integration for Gradle")
82*af87fb4bSXin Li }
83*af87fb4bSXin Li }
84*af87fb4bSXin Li }
85*af87fb4bSXin Li }
86*af87fb4bSXin Li
<lambda>null87*af87fb4bSXin Li signing {
88*af87fb4bSXin Li isRequired = hasProperty("signingKey")
89*af87fb4bSXin Li useInMemoryPgpKeys(signingKey, signingPassword)
90*af87fb4bSXin Li sign(extensions.getByType<PublishingExtension>().publications)
91*af87fb4bSXin Li }
92*af87fb4bSXin Li
93*af87fb4bSXin Li /**
94*af87fb4bSXin Li * Create a properties file with that can be read from the gradle-plugin tests to setup test
95*af87fb4bSXin Li * projects.
96*af87fb4bSXin Li */
97*af87fb4bSXin Li val testPropsOutDir = project.layout.buildDirectory.dir("test-config")
<lambda>null98*af87fb4bSXin Li val writeTestPropsTask = tasks.register<WriteProperties>("prepareTestConfiguration") {
99*af87fb4bSXin Li description = "Generates a properties file with the current environment for gradle integration tests"
100*af87fb4bSXin Li this.setOutputFile(
101*af87fb4bSXin Li testPropsOutDir.map {
102*af87fb4bSXin Li it.file("testprops.properties")
103*af87fb4bSXin Li }
104*af87fb4bSXin Li )
105*af87fb4bSXin Li property("kspVersion", version)
106*af87fb4bSXin Li property("mavenRepoDir", File(rootProject.buildDir, "repos/test").absolutePath)
107*af87fb4bSXin Li property("kspProjectRootDir", rootProject.projectDir.absolutePath)
108*af87fb4bSXin Li property("processorClasspath", project.tasks["compileTestKotlin"].outputs.files.asPath)
109*af87fb4bSXin Li }
110*af87fb4bSXin Li
<lambda>null111*af87fb4bSXin Li java {
112*af87fb4bSXin Li sourceSets {
113*af87fb4bSXin Li test {
114*af87fb4bSXin Li resources.srcDir(testPropsOutDir)
115*af87fb4bSXin Li }
116*af87fb4bSXin Li }
117*af87fb4bSXin Li }
118*af87fb4bSXin Li
<lambda>null119*af87fb4bSXin Li tasks.named("compileTestKotlin").configure {
120*af87fb4bSXin Li dependsOn(writeTestPropsTask)
121*af87fb4bSXin Li }
122*af87fb4bSXin Li
<lambda>null123*af87fb4bSXin Li tasks.named<Test>("test").configure {
124*af87fb4bSXin Li dependsOn(":api:publishAllPublicationsToTestRepository")
125*af87fb4bSXin Li dependsOn(":gradle-plugin:publishAllPublicationsToTestRepository")
126*af87fb4bSXin Li dependsOn(":symbol-processing:publishAllPublicationsToTestRepository")
127*af87fb4bSXin Li }
128*af87fb4bSXin Li
129*af87fb4bSXin Li abstract class WriteVersionSrcTask @Inject constructor(
130*af87fb4bSXin Li @get:Input val kspVersion: String,
131*af87fb4bSXin Li @get:Input val kotlinVersion: String,
132*af87fb4bSXin Li @get:org.gradle.api.tasks.OutputDirectory val outputSrcDir: File
133*af87fb4bSXin Li ) : DefaultTask() {
134*af87fb4bSXin Li @TaskAction
generatenull135*af87fb4bSXin Li fun generate() {
136*af87fb4bSXin Li File(outputSrcDir, "KSPVersions.kt").writeText(
137*af87fb4bSXin Li """
138*af87fb4bSXin Li package com.google.devtools.ksp.gradle
139*af87fb4bSXin Li val KSP_KOTLIN_BASE_VERSION = "$kotlinVersion"
140*af87fb4bSXin Li val KSP_VERSION = "$kspVersion"
141*af87fb4bSXin Li """.trimIndent()
142*af87fb4bSXin Li )
143*af87fb4bSXin Li }
144*af87fb4bSXin Li }
145*af87fb4bSXin Li
146*af87fb4bSXin Li val kspVersionDir = File(project.buildDir, "generated/ksp-versions")
147*af87fb4bSXin Li val writeVersionSrcTask = tasks.register<WriteVersionSrcTask>(
148*af87fb4bSXin Li "generateKSPVersions",
149*af87fb4bSXin Li version.toString(),
150*af87fb4bSXin Li kotlinBaseVersion,
151*af87fb4bSXin Li kspVersionDir
152*af87fb4bSXin Li )
153*af87fb4bSXin Li
<lambda>null154*af87fb4bSXin Li kotlin {
155*af87fb4bSXin Li sourceSets {
156*af87fb4bSXin Li main {
157*af87fb4bSXin Li kotlin.srcDir(writeVersionSrcTask.map { it.outputSrcDir })
158*af87fb4bSXin Li }
159*af87fb4bSXin Li }
160*af87fb4bSXin Li }
161