Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions BuildLogic/src/main/kotlin/utilities/registerJextractTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
package utilities

import org.gradle.api.Project
import org.gradle.api.file.Directory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Exec
import org.gradle.api.tasks.TaskProvider
import org.gradle.kotlin.dsl.register
Expand All @@ -26,6 +28,27 @@ private fun Project.swiftTargetsWithJExtractPlugin(): List<String> = swiftPMPack
it.name
}

/**
* The directory into which the SwiftPM JExtractSwiftPlugin emits generated Java sources
* for a given Swift target.
*
* The path is computed lazily as a `Provider<Directory>`, so callers can register it as a
* `srcDir` even before the `jextract` task has executed. We need that explicit registration
* so e.g. vscode or other IDEs can index the generated sources without first running the build.
*/
fun Project.jextractGeneratedJavaDir(targetName: String): Provider<Directory> =
layout.buildDirectory.dir(
"../.build/plugins/outputs/${layout.projectDirectory.asFile.name.lowercase()}/${targetName}/destination/JExtractSwiftPlugin/src/generated/java"
)

/**
* One generated-Java source directory per Swift target that uses the JExtractSwiftPlugin.
* Use this in `sourceSets { main { java { srcDir(...) } } }` alongside `srcDir(jextract)`
* so the dir is visible to IDEs regardless of task-execution order.
*/
fun Project.jextractGeneratedJavaDirs(): List<Provider<Directory>> =
swiftTargetsWithJExtractPlugin().map { jextractGeneratedJavaDir(it) }

private fun Project.registerSwiftCheckValidTask(): TaskProvider<*> = tasks.register<Exec>("swift-check-valid") {
commandLine("swift")
args("-version")
Expand All @@ -52,11 +75,7 @@ fun Project.registerJextractTask(
swiftTargetsWithJExtractPlugin().forEach { targetName ->
logger.info("[swift-java:jextract (Gradle)] Swift input target: ${targetName}")
inputs.dir(File(layout.projectDirectory.asFile, "Sources/${targetName}"))
outputs.dir(
layout.buildDirectory.dir(
"../.build/plugins/outputs/${layout.projectDirectory.asFile.getName().lowercase()}/${targetName}/destination/JExtractSwiftPlugin/src/generated/java"
)
)
outputs.dir(jextractGeneratedJavaDir(targetName))
}

workingDir = layout.projectDirectory.asFile
Expand Down
7 changes: 6 additions & 1 deletion Samples/SwiftAndJavaJarFFMSampleLib/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
//
//===----------------------------------------------------------------------===//

import utilities.jextractGeneratedJavaDirs
import utilities.registerJextractTask

plugins {
Expand Down Expand Up @@ -47,16 +48,20 @@ dependencies {

val jextract = registerJextractTask()

// Add the java-swift generated Java sources
// Add the java-swift generated Java sources.
// `srcDir(jextract)` wires the build dependency; the explicit dir registration
// below makes the source root visible to IDE project importers (vscode-java).
sourceSets {
main {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
test {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
}
Expand Down
8 changes: 7 additions & 1 deletion Samples/SwiftJavaExtractFFMSampleApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//

import utilities.javaLibraryPaths
import utilities.jextractGeneratedJavaDirs
import utilities.registerJextractTask

plugins {
Expand All @@ -36,21 +37,26 @@ java {

val jextract = registerJextractTask()

// Add the java-swift generated Java sources
// Add the java-swift generated Java sources.
// `srcDir(jextract)` wires the build dependency; the explicit dir registration
// below makes the source root visible to IDE project importers (vscode-java).
sourceSets {
main {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
test {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
this.jmh {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
}
Expand Down
9 changes: 8 additions & 1 deletion Samples/SwiftJavaExtractJNISampleApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
//===----------------------------------------------------------------------===//

import utilities.javaLibraryPaths
import utilities.jextractGeneratedJavaDirs
import utilities.registerJextractTask

plugins {
Expand Down Expand Up @@ -44,21 +45,27 @@ val jextract = registerJextractTask {
cmdArgs
}

// Add the java-swift generated Java sources
// Add the java-swift generated Java sources.
// `srcDir(jextract)` wires the build dependency (compile depends on jextract);
// `srcDir(it)` for each generated dir registers the path explicitly so IDEs
// (notably vscode-java) index the generated sources without having to run jextract first.
sourceSets {
main {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
test {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
this.jmh {
java {
srcDir(jextract)
jextractGeneratedJavaDirs().forEach { srcDir(it) }
}
}
}
Expand Down
Loading