Skip to content

Commit ca20af0

Browse files
committed
Migrate build scripts from Groovy to Kotlin
1 parent 5764bc2 commit ca20af0

24 files changed

Lines changed: 590 additions & 793 deletions

File tree

BuildLogic/build.gradle.kts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,16 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
plugins {
16+
`kotlin-dsl`
17+
embeddedKotlin("plugin.serialization")
18+
}
19+
1520
repositories {
1621
gradlePluginPortal()
1722
mavenCentral()
1823
}
1924

2025
dependencies {
21-
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3")
22-
}
23-
24-
plugins {
25-
`kotlin-dsl`
26-
}
26+
implementation(libs.kotlinx.serialization.json)
27+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../gradle/libs.versions.toml

BuildLogic/src/main/kotlin/build-logic.java-common-conventions.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fun getSwiftRuntimeLibraryPaths(): List<String> {
5151
/**
5252
* Find library paths for 'java.library.path' when running or testing projects inside this build.
5353
*/
54-
// TODO: can't figure out how to share this code between BuildLogic/ and buildSrc/
54+
// TODO: Deduplicate this code with javaLibraryPaths.kt
5555
fun javaLibraryPaths(rootDir: File): List<String> {
5656
val osName = System.getProperty("os.name").lowercase(Locale.getDefault())
5757
val osArch = System.getProperty("os.arch")
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import org.gradle.api.Project
2+
import org.gradle.api.tasks.Exec
3+
import org.gradle.kotlin.dsl.register
4+
import org.gradle.kotlin.dsl.support.serviceOf
5+
import org.gradle.process.ExecOperations
6+
import utilities.SwiftcTargetInfo
7+
import utilities.json
8+
import utilities.swiftPMPackage
9+
import java.io.ByteArrayOutputStream
10+
import java.io.File
11+
12+
fun Project.swiftProductDylibPaths(swiftBuildConfiguration: String): List<String> {
13+
// TODO: require that we depend on swift-java
14+
// TODO: all the products where the targets depend on swift-java plugin
15+
return swiftPMPackage().targets.map {
16+
it.productMemberships
17+
}.flatten().map {
18+
logger.info("[swift-java] Include Swift product: '${it}' in product resource paths.")
19+
"${layout.projectDirectory}/.build/${swiftBuildConfiguration}/lib${it}.dylib"
20+
}
21+
}
22+
23+
fun Project.registerCleanSwift(workingDir: File = layout.projectDirectory.asFile) {
24+
val cleanSwift = tasks.register<Exec>("cleanSwift") {
25+
this.workingDir = workingDir
26+
commandLine("swift")
27+
args("package", "clean")
28+
}
29+
tasks.named("clean").configure {
30+
dependsOn(cleanSwift)
31+
}
32+
}
33+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package utilities
2+
3+
import kotlinx.serialization.Serializable
4+
import org.gradle.api.Project
5+
import org.gradle.kotlin.dsl.support.serviceOf
6+
import org.gradle.process.ExecOperations
7+
import java.io.ByteArrayOutputStream
8+
9+
@Serializable
10+
internal data class SwiftPMPackage(
11+
val targets: List<SwiftPMTarget>,
12+
)
13+
14+
internal fun Project.swiftPMPackage(): SwiftPMPackage {
15+
val stdout = ByteArrayOutputStream()
16+
serviceOf<ExecOperations>().exec {
17+
workingDir(projectDir)
18+
commandLine("swift", "package", "describe", "--type", "json")
19+
standardOutput = stdout
20+
}
21+
return json.decodeFromString<SwiftPMPackage>(stdout.toString())
22+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package utilities
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
internal data class SwiftPMTarget(
8+
@SerialName("product_dependencies")
9+
val productDependencies: List<String> = emptyList(),
10+
@SerialName("product_memberships")
11+
val productMemberships: List<String> = emptyList(),
12+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package utilities
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
internal data class SwiftcTargetInfo(
7+
val paths: SwiftcTargetInfoPaths,
8+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package utilities
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
internal data class SwiftcTargetInfoPaths(
7+
val runtimeLibraryPaths: List<String>,
8+
)
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package utilities
2+
3+
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.support.serviceOf
5+
import org.gradle.process.ExecOperations
6+
import java.io.ByteArrayOutputStream
7+
import java.io.File
8+
9+
private fun Project.swiftRuntimeLibraryPaths(): List<String> {
10+
val stdout = ByteArrayOutputStream()
11+
serviceOf<ExecOperations>().exec {
12+
workingDir(projectDir)
13+
commandLine("swiftc", "-print-target-info")
14+
standardOutput = stdout
15+
}
16+
return json.decodeFromString<SwiftcTargetInfo>(stdout.toString()).paths.runtimeLibraryPaths
17+
}
18+
19+
fun Project.javaLibraryPaths(rootDir: File?): List<String> {
20+
val osName = System.getProperty("os.name")
21+
val osArch = System.getProperty("os.arch")
22+
val isLinux = osName.lowercase().contains("linux")
23+
val base = if (rootDir == null) "" else "${rootDir}/"
24+
25+
val triple = if (isLinux) {
26+
val arch = if (osArch == "amd64" || osArch == "x86_64") "x86_64" else osArch
27+
"${arch}-unknown-linux-gnu"
28+
} else {
29+
val arch = if (osArch == "aarch64") "arm64" else osArch
30+
"${arch}-apple-macosx"
31+
}
32+
33+
val paths: List<String> = listOf("release", "debug").flatMap { configuration ->
34+
listOf(
35+
"${base}.build/${triple}/$configuration/",
36+
"${base}../../.build/${triple}/$configuration/",
37+
)
38+
}
39+
val swiftRuntimePaths = swiftRuntimeLibraryPaths()
40+
41+
return paths + swiftRuntimePaths
42+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package utilities
2+
3+
import kotlinx.serialization.json.Json
4+
5+
internal val json = Json { ignoreUnknownKeys = true }

0 commit comments

Comments
 (0)