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
4 changes: 2 additions & 2 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ jobs:
'JavaKitSampleApp',
'JavaProbablyPrime',
'JavaSieve',
'SwiftAndJavaJarSampleLib',
'SwiftAndJavaJarFFMSampleLib',
'SwiftJavaExtractFFMSampleApp',
'SwiftJavaExtractJNISampleApp',
]
Expand Down Expand Up @@ -249,7 +249,7 @@ jobs:
'JavaKitSampleApp',
'JavaProbablyPrime',
'JavaSieve',
'SwiftAndJavaJarSampleLib',
'SwiftAndJavaJarFFMSampleLib',
'SwiftJavaExtractFFMSampleApp',
'SwiftJavaExtractJNISampleApp',
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ plugins {

java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
languageVersion = JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 25)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import CompilerPluginSupport
import PackageDescription

let package = Package(
name: "SwiftAndJavaJarSampleLib",
name: "SwiftAndJavaJarFFMSampleLib",
platforms: [
.macOS(.v15),
.iOS(.v18),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(25))
languageVersion.set(JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 17))
}
}

Expand Down Expand Up @@ -85,13 +85,13 @@ tasks.jar.configure {
}

base {
archivesName = "swift-and-java-jar-sample-lib"
archivesName = "swift-and-java-jar-ffm-sample-lib"
}

publishing {
publications {
create<MavenPublication>("maven") {
artifactId = "swift-and-java-jar-sample-lib"
artifactId = "swift-and-java-jar-ffm-sample-lib"
from(components["java"])
}
}
Expand Down
1 change: 1 addition & 0 deletions Samples/SwiftAndJavaJarFFMSampleLib/gradle.properties
2 changes: 1 addition & 1 deletion Samples/SwiftJavaExtractFFMSampleApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(25))
languageVersion.set(JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 25))
}
}

Expand Down
2 changes: 1 addition & 1 deletion Samples/SwiftJavaExtractJNISampleApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ repositories {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(25))
languageVersion.set(JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 17))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import org.swift.swiftkit.core.ConfinedSwiftMemorySession;
import org.swift.swiftkit.core.SwiftArena;

import java.lang.foreign.Arena;
import java.util.Optional;
import java.util.OptionalInt;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import org.swift.swiftkit.core.ConfinedSwiftMemorySession;
import org.swift.swiftkit.core.SwiftArena;

import java.lang.foreign.Arena;
import java.util.Optional;
import java.util.OptionalInt;

Expand Down
4 changes: 2 additions & 2 deletions SwiftKitCore/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ publishing {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(25))
languageVersion.set(JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 25))
}
}

tasks.withType<JavaCompile>().configureEach {
// Support Java 11
// SwiftKitCore is consumable down to Java 11
options.release.set(11)
}

Expand Down
2 changes: 1 addition & 1 deletion SwiftKitFFM/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ publishing {

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(25))
languageVersion.set(JavaLanguageVersion.of((gradle.extra.properties["swiftJavaJdk"] as? Int) ?: 25))
}
}

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
org.gradle.java.installations.fromEnv=JAVA_HOME_25,JAVA_HOME_25_X64,JAVA_HOME_25_ARM64
org.gradle.java.installations.fromEnv=JAVA_HOME_25,JAVA_HOME_25_X64,JAVA_HOME_25_ARM64,JAVA_HOME_21,JAVA_HOME_21_X64,JAVA_HOME_21_ARM64,JAVA_HOME_17,JAVA_HOME_17_X64,JAVA_HOME_17_ARM64
68 changes: 65 additions & 3 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,78 @@ pluginManagement {

rootProject.name = "swift-java"

// ==== -----------------------------------------------------------------------
// MARK: JDK detection
//
// Some modules require JDK 25+ (FFM API). When the active toolchain is
// older we exclude those modules so developers with only JDK 17 can still
// build the JDK-17-compatible subset (currently SwiftKitCore).
//
// Resolution order:
// 1. -PswiftJavaJdk=<n> Gradle property (explicit override)
// 2. JAVA_HOME_25* env vars listed in gradle.properties (treated as 25)
// 3. JAVA_HOME/release file's JAVA_VERSION
// 4. Default: 25

fun detectJdkMajor(): Int {
settings.providers.gradleProperty("swiftJavaJdk").orNull?.toIntOrNull()?.let { return it }

val env = System.getenv()
if (listOf("JAVA_HOME_25", "JAVA_HOME_25_X64", "JAVA_HOME_25_ARM64").any { env[it] != null }) {
return 25
}

env["JAVA_HOME"]?.let { javaHome ->
val release = File(javaHome, "release")
if (release.isFile) {
release.readLines().firstOrNull { it.startsWith("JAVA_VERSION=") }?.let { line ->
val raw = line.substringAfter("=").trim().trim('"')
val major = raw.substringBefore(".").toIntOrNull()
?: raw.substringBefore("-").toIntOrNull()
if (major != null) return major
}
}
}
return 25
}

val swiftJavaJdk = detectJdkMajor()
gradle.extra["swiftJavaJdk"] = swiftJavaJdk

val ffmCapable = swiftJavaJdk >= 22

// Modules and samples that depend on the FFM API (java.lang.foreign.*)
val ffmModules = setOf(
"SwiftKitFFM",
"SwiftJavaExtractFFMSampleApp",
"SwiftAndJavaJarFFMSampleLib",
)

val skipped = mutableListOf<String>()

include("SwiftKitCore")
include("SwiftKitFFM")
if (ffmCapable) {
include("SwiftKitFFM")
} else {
skipped += "SwiftKitFFM"
}

// Include sample apps -- you can run them via `gradle Name:run`
if (!(settings.providers.gradleProperty("skipSamples").orNull.toBoolean())) {
File(rootDir, "Samples").listFiles().forEach {
File(rootDir, "Samples").listFiles()?.forEach {
if (it.isDirectory && (File(it, "build.gradle").exists() || File(it, "build.gradle.kts").exists())) {
include(":Samples:${it.name}")
val name = it.name
if (name in ffmModules && !ffmCapable) {
skipped += "Samples:$name"
} else {
include(":Samples:$name")
}
}
}
}

if (skipped.isNotEmpty()) {
println("[swift-java] JDK $swiftJavaJdk detected — skipping: ${skipped.joinToString(", ")}")
}

enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
Loading