Skip to content

Commit a62819b

Browse files
committed
Fixed source sets locations and task inputs
1 parent 3009c30 commit a62819b

File tree

14 files changed

+327
-63
lines changed

14 files changed

+327
-63
lines changed

docs/environment.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ Go to `Settings` -> `Build, Execution, Deployment` -> `Build Tools` -> `Gradle`
6161
- `Distribution` is set to `Wrapper`
6262
- `Gradle JVM` is set to `JAVA_HOME` and the value is correct
6363

64+
## Android SDK
65+
In the root of the project you should create a `local.properties` file with the location of the Android SDK:
66+
```properties
67+
sdk.dir=/Users/<user>/Library/Android/sdk
68+
```
69+
6470
## Git and GitHub
6571

6672
Make sure your commit signing is set up. Check the

gradle-plugin/build.gradle.kts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
66
import util.other.generateSource
7+
import kotlin.io.path.Path
8+
import kotlin.io.path.absolutePathString
9+
import kotlin.io.path.readLines
710

811
plugins {
912
`kotlin-dsl`
@@ -105,14 +108,24 @@ generateSource(
105108

106109
val globalRootDir: String by extra
107110

111+
val androidHome = System.getenv("ANDROID_HOME")
112+
?: Path(globalRootDir, "local.properties")
113+
.readLines()
114+
.find { it.startsWith("sdk.dir=") }
115+
?.substringAfter("=")
116+
?.trim()
117+
?: error("ANDROID_HOME is not set")
118+
108119
generateSource(
109120
name = "TestVersions",
110121
text = """
111122
package kotlinx.rpc
112123
113124
const val RPC_VERSION: String = "${libs.versions.kotlinx.rpc.get()}"
114125
115-
const val BUILD_REPO: String = "${File(globalRootDir).resolve("build/repo").absolutePath}"
126+
const val ANDROID_HOME_DIR: String = "$androidHome"
127+
128+
const val BUILD_REPO: String = "${Path(globalRootDir, "build", "repo").absolutePathString()}"
116129
""".trimIndent(),
117130
chooseSourceSet = { test }
118131
)

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/BufExecTask.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ public abstract class BufExecTask @Inject constructor(
5050
@get:InputFile
5151
internal abstract val bufExecutable: Property<File>
5252

53+
/**
54+
* Whether to enable debug logging for the `buf` command using `--debug` option.
55+
*
56+
* @see <a href="https://buf.build/docs/reference/cli/buf/#debug">Debugging</a>
57+
*/
5358
@get:Input
54-
internal abstract val debug: Property<Boolean>
59+
public abstract val debug: Property<Boolean>
5560

5661
/**
5762
* The `buf` command to execute.
@@ -127,14 +132,14 @@ internal fun <T : BufExecTask> Project.registerBufExecTask(
127132
): TaskProvider<T> = tasks.register(name, clazz, properties).apply {
128133
configure {
129134
val executableConfiguration = configurations.named(BUF_EXECUTABLE_CONFIGURATION)
130-
bufExecutable.set(project.provider { executableConfiguration.get().singleFile })
131-
this.workingDir.set(workingDir)
135+
bufExecutable.convention(project.provider { executableConfiguration.get().singleFile })
136+
this.workingDir.convention(workingDir)
132137

133138
val buf = provider { rpcExtension().protoc.get().buf }
134-
configFile.set(buf.flatMap { it.configFile })
135-
logFormat.set(buf.flatMap { it.logFormat })
136-
bufTimeoutInWholeSeconds.set(buf.flatMap { it.timeout.map { duration -> duration.inWholeSeconds } })
137-
debug.set(gradle.startParameter.logLevel == LogLevel.DEBUG)
139+
configFile.convention(buf.flatMap { it.configFile })
140+
logFormat.convention(buf.flatMap { it.logFormat })
141+
bufTimeoutInWholeSeconds.convention(buf.flatMap { it.timeout.map { duration -> duration.inWholeSeconds } })
142+
debug.convention(gradle.startParameter.logLevel == LogLevel.DEBUG)
138143

139144
configuration()
140145
}

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/BufGenerateTask.kt

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package kotlinx.rpc.buf.tasks
66

77
import kotlinx.rpc.protoc.PROTO_GROUP
8-
import kotlinx.rpc.rpcExtension
98
import kotlinx.rpc.protoc.ProtocPlugin
109
import org.gradle.api.Project
1110
import org.gradle.api.provider.ListProperty
@@ -17,6 +16,7 @@ import org.gradle.api.tasks.TaskProvider
1716
import java.io.File
1817
import kotlinx.rpc.buf.BufGenerateExtension
1918
import kotlinx.rpc.protoc.DefaultProtoSourceSet
19+
import kotlinx.rpc.protoc.DefaultProtocExtension
2020
import kotlinx.rpc.protoc.ProtoTask
2121
import org.gradle.api.file.SourceDirectorySet
2222
import org.gradle.api.provider.Provider
@@ -32,16 +32,22 @@ import javax.inject.Inject
3232
public abstract class BufGenerateTask @Inject internal constructor(
3333
properties: ProtoTask.Properties,
3434
) : BufExecTask(properties) {
35-
// used to properly calculate output directories
35+
/**
36+
* List of plugin names used during `buf generate` command execution.
37+
*
38+
* @see kotlinx.rpc.protoc.ProtoSourceSet.plugins
39+
* @see kotlinx.rpc.protoc.ProtocExtension.plugins
40+
* @see ProtocPlugin
41+
*/
3642
@get:Input
37-
internal abstract val pluginNames: ListProperty<String>
43+
public abstract val pluginNames: ListProperty<String>
3844

3945
/**
4046
* List of executable files used during `buf generate` command execution.
4147
*
4248
* @see [ProtocPlugin.Artifact.Local.executableFiles]
4349
*/
44-
// unsued, but required for Gradle to properly recognise inputs
50+
// unsued, but required for Gradle to properly recognize inputs
4551
@get:InputFiles
4652
public abstract val executableFiles: ListProperty<File>
4753

@@ -132,6 +138,7 @@ public abstract class BufGenerateTask @Inject internal constructor(
132138
}
133139

134140
internal fun Project.registerBufGenerateTask(
141+
protocExtension: DefaultProtocExtension,
135142
protoSourceSet: DefaultProtoSourceSet,
136143
workingDir: File,
137144
outputDirectory: File,
@@ -146,15 +153,15 @@ internal fun Project.registerBufGenerateTask(
146153
group = PROTO_GROUP
147154
description = "Generates code from .proto files using 'buf generate'"
148155

149-
val generate = provider { rpcExtension().protoc.get().buf.generate }
156+
val generate = protocExtension.buf.generate
150157

151-
includeImports.set(generate.flatMap { it.includeImports })
152-
includeWkt.set(generate.flatMap { it.includeWkt })
153-
errorFormat.set(generate.flatMap { it.errorFormat })
158+
includeImports.convention(generate.includeImports)
159+
includeWkt.convention(generate.includeWkt)
160+
errorFormat.convention(generate.errorFormat)
154161

155-
this.outputDirectory.set(outputDirectory)
162+
this.outputDirectory.convention(outputDirectory)
156163

157-
this.pluginNames.set(includedPlugins.map { it.map { plugin -> plugin.name } })
164+
pluginNames.convention(includedPlugins.map { it.map { plugin -> plugin.name } })
158165

159166
configure()
160167
}

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/GenerateBufGenYaml.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,13 +169,13 @@ internal fun Project.registerGenerateBufGenYamlTask(
169169
}
170170
}
171171

172-
plugins.set(pluginsProvider)
172+
plugins.convention(pluginsProvider)
173173

174174
val bufGenYamlFile = buildSourceSetsDir
175175
.resolve(BUF_GEN_YAML)
176176
.ensureRegularFileExists()
177177

178-
bufGenFile.set(bufGenYamlFile)
178+
bufGenFile.convention(bufGenYamlFile)
179179

180180
configure()
181181
}

gradle-plugin/src/main/kotlin/kotlinx/rpc/buf/tasks/GenerateBufYaml.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,15 @@ internal fun Project.registerGenerateBufYamlTask(
9696
val task = tasks.register("${GenerateBufYaml.NAME_PREFIX}$capitalizeName", GenerateBufYaml::class, properties)
9797

9898
task.configure {
99-
protoSourceDir.set(buildSourceSetsProtoDir.name)
100-
importSourceDir.set(buildSourceSetsImportDir.name)
101-
this.withImport.set(withImport)
99+
protoSourceDir.convention(buildSourceSetsProtoDir.name)
100+
importSourceDir.convention(buildSourceSetsImportDir.name)
101+
this.withImport.convention(withImport)
102102

103103
val bufYamlFile = buildSourceSetsDir
104104
.resolve(BUF_YAML)
105105
.ensureRegularFileExists()
106106

107-
bufFile.set(bufYamlFile)
107+
bufFile.convention(bufYamlFile)
108108

109109
configure()
110110
}

gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtoSourceSet.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ internal open class DefaultProtoSourceSet(
7777
)
7878

7979
private val explicitApiModeEnabled = project.provider {
80-
project.the<KotlinProjectExtension>().explicitApi != ExplicitApiMode.Disabled
80+
val isMain = androidProperties.orNull?.isTest?.not() ?: name.lowercase().endsWith("main")
81+
82+
isMain && project.the<KotlinProjectExtension>().explicitApi != ExplicitApiMode.Disabled
8183
}
8284

8385
override val plugins = project.objects.setProperty<ProtocPlugin>()
@@ -104,9 +106,7 @@ internal open class DefaultProtoSourceSet(
104106
}
105107

106108
private fun initPlugin(copy: ProtocPlugin, configure: Action<ProtocPlugin>?) {
107-
if (this@DefaultProtoSourceSet.name.lowercase().endsWith("main")) {
108-
copy.options.put("explicitApiModeEnabled", explicitApiModeEnabled)
109-
}
109+
copy.options.put("explicitApiModeEnabled", explicitApiModeEnabled)
110110

111111
configure?.execute(copy)
112112
}
@@ -158,9 +158,9 @@ internal open class DefaultProtoSourceSet(
158158
imports.addAll(protoSourceSet.flatMap { it.imports.checkSelfImport() })
159159
}
160160

161-
override fun importsAllFrom(protoSourceSet: Provider<List<ProtoSourceSet>>) {
162-
imports.addAll(protoSourceSet.checkSelfImport())
163-
imports.addAll(protoSourceSet.map { list -> list.flatMap { it.imports.checkSelfImport().get() } })
161+
override fun importsAllFrom(protoSourceSets: Provider<List<ProtoSourceSet>>) {
162+
imports.addAll(protoSourceSets.checkSelfImport())
163+
imports.addAll(protoSourceSets.map { list -> list.flatMap { it.imports.checkSelfImport().get() } })
164164
}
165165

166166
override fun importsFrom(protoSourceSet: NamedDomainObjectProvider<ProtoSourceSet>) {
@@ -190,6 +190,8 @@ internal open class DefaultProtoSourceSet(
190190

191191
source(protoSourceSet.sourceDirectorySet)
192192
imports.addAll(protoSourceSet.imports.checkSelfImport())
193+
194+
plugins.addAll(protoSourceSet.plugins)
193195
}
194196

195197
@JvmName("checkSelfImport_provider")

gradle-plugin/src/main/kotlin/kotlinx/rpc/protoc/DefaultProtocExtension.kt

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ internal open class DefaultProtocExtension @Inject constructor(
248248
val sourceSetsProtoDirFileTree = project.fileTree(buildSourceSetsProtoDir)
249249

250250
val bufGenerateTask = project.registerBufGenerateTask(
251+
protocExtension = this,
251252
protoSourceSet = protoSourceSet,
252253
workingDir = buildSourceSetsDir,
253254
outputDirectory = project.protoBuildDirGenerated.resolve(baseName),
@@ -268,8 +269,8 @@ internal open class DefaultProtocExtension @Inject constructor(
268269
}
269270
)
270271

271-
protoFiles.set(processProtoTask.map { it.outputs.files })
272-
importProtoFiles.set(processImportProtoTask.map { it.outputs.files })
272+
protoFiles.convention(processProtoTask.map { it.outputs.files })
273+
importProtoFiles.convention(processImportProtoTask.map { it.outputs.files })
273274

274275
dependsOn(generateBufGenYamlTask)
275276
dependsOn(generateBufYamlTask)
@@ -303,8 +304,8 @@ internal open class DefaultProtocExtension @Inject constructor(
303304
sourceSetsProtoDirFileTree = sourceSetsProtoDirFileTree,
304305
properties = properties,
305306
) {
306-
protoFiles.set(processProtoTask.map { it.outputs.files })
307-
importProtoFiles.set(processImportProtoTask.map { it.outputs.files })
307+
protoFiles.convention(processProtoTask.map { it.outputs.files })
308+
importProtoFiles.convention(processImportProtoTask.map { it.outputs.files })
308309
}
309310

310311
protoSourceSet.tasksConfigured.set(true)
@@ -333,7 +334,19 @@ internal open class DefaultProtocExtension @Inject constructor(
333334
project.withLegacyAndroid {
334335
// android + kotlin is always done in withKotlin above
335336
languageSets.filterIsInstance<AndroidSourceSet>().forEach { sourceSet ->
336-
sourceSet.java.srcDirs(javaOutputs)
337+
// todo fails with
338+
//
339+
// Caused by: org.gradle.internal.typeconversion.UnsupportedNotationException: Cannot convert the provided notation to a File: [].
340+
// The following types/formats are supported:
341+
// - A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
342+
// - A String or CharSequence URI, for example 'file:/usr/include'.
343+
// - A File instance.
344+
// - A Path instance.
345+
// - A Directory instance.
346+
// - A RegularFile instance.
347+
// - A URI or URL instance of file.
348+
// - A TextResource instance.
349+
// sourceSet.java.srcDir(javaOutputs)
337350
}
338351
}
339352
}
@@ -347,9 +360,9 @@ internal open class DefaultProtocExtension @Inject constructor(
347360
plugins.filter(pluginFilter).map { it.name }.toSet()
348361
}
349362

350-
return bufGenerateTask.flatMap { task ->
363+
return bufGenerateTask.map { task ->
351364
val pluginsSet = plugins.get()
352-
task.outputSourceDirectories.map { list -> list.filter { it.name in pluginsSet } }
365+
task.outputSourceDirectories.get().filter { it.name in pluginsSet }
353366
}
354367
}
355368

0 commit comments

Comments
 (0)