-
Notifications
You must be signed in to change notification settings - Fork 288
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Generating common code #567
Comments
I think the |
Hi @belyaev-mikhail. I'm facing a similar issue, but when trying to generate JS code while processing JVM code. My issue is that |
Maybe, depends on the way it's implemented. Basically, one could run ksp on any platform and generate code to common part, that would work for me, but for true MPP projects where there exists some some code in all supported platforms' folders, it may not work. |
I'm not sure I understand why it may not work. Can you explain? |
Because if you have, say, a library that contains: a common part, a JVM-specific part and a JS-specific part, you definitely want to generate common code from common part and common part only, which is impossible atm. |
Well, it's possible, just not that straightforward. I was able to achieve common-only execution of KSP with the following Gradle configuration: tasks.withType<com.google.devtools.ksp.gradle.KspTaskJS> {
enabled = false
}
tasks.withType<com.google.devtools.ksp.gradle.KspTaskJvm> {
enabled = false
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
dependsOn(tasks.withType<com.google.devtools.ksp.gradle.KspTaskMetadata>())
} |
Note: been testing with the new dependencies {
add("kspMetadata", "...")
} would generate common code, but instead it does not run. Was able to get it working by hooking up task dependencies & source sets manually: kotlin.sourceSets.commonMain {
kotlin.srcDir("build/generated/ksp/commonMain/kotlin")
}
tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>>().all {
if (name != "kspKotlinMetadata") {
dependsOn("kspKotlinMetadata")
}
} |
Another note for how the
However, let's say you have a non-pure project, where some platform(s) have unique code (code underneath If each platform only processed code unique to that plaform, and generated code at the same level, I think this situation would be more natural. Under that scenario, This is only a guess, but I'm guessing that would also help the situation for hierarchical source sets, where you might want to generate |
Currently, there is also no |
This breaks our use case and forces us to revert to processing only "kspJvmTest" and having the generated directory be added to the commonTest source set. |
The code snippet above is not working for me. Is there a better way for generating common code? |
However what does exist is "kspCommonMainMetadata`, but you cannot add any dependency to that configuration because it can't be resolved |
The workaround apparently is outdated. The metadata task and configuration apparently has a new name. This is currently solution that I found for Kotlin 1.8.10 + (maybe is the same for older versions)
|
tasks.withType() doesn't work for me if I have KMM with Android and iOS platforms. Getting error:
(and bunch of others for another ios* components)
But not sure how to achieve this. Any ideas? |
I had some trouble with some build tasks being run unnecessarily. I found only applying the dependsOn conditionally helped. Disclaimer: I'm primarily an iOS dev, I got here by process of elimination, I'm not really sure why the workarounds in this thread are needed, nor exactly what they do. But maybe this helps someone.
|
We are trying to generate expect/actual declarations with KSP. We are able to generate expect declaration in common code and actual declarations in the specific platforms, however the gradle tasks dependencies are not correct, so kotlin tries to compile the generated actual code without generating the expected declaration in common first, resulting in an compilation error. If we try to apply the solution from #567 (comment) we get the error as described in #567 (comment). We are using kotlin 1.8.0. |
Note that this workaround can lead to this problem with apple targets, the solution is to replace |
I used this with unsafe gradle cache and this error triggerd
with gradle cache I mean adding this code to gradle.properties
|
Unfortunately, none of the workarounds seem to work with
I use a KSP processor added as project dependency. The My current workaround to make the generated files available in How does one properly specify the task dependency with KSP 1.9.21? |
Is there a specific reason why it seems that commonMain is explicitly not in the list of ksp targets? |
I noticed something:
kotlin {
jvm {
}
// second target needed so that kspCommonMainKotlinMetadata is added
mingwX64 {
}
// ...
sourceSets {
commonMain {
// ...
kotlin {
// needed so that common sources are picked up
srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
}
}
}
dependencies {
add("kspCommonMainMetadata", "<dependency>")
}
tasks.getByName("compileKotlinMingwX64").dependsOn("kspCommonMainKotlinMetadata")
tasks.getByName("compileKotlinJvm").dependsOn("kspCommonMainKotlinMetadata")
|
If I understand it correctly, "supporting MPP" currently means that KSP can run on all platforms separately, but what if I want to generate common code?
Currently running ksp on an MPP project with common code results in generating the exact same generated code for each platform separately, without any common code generated (or able to generate).
Is generating common code in plans?
The text was updated successfully, but these errors were encountered: