diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ce5fa9979d8..420d94959687 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,7 +74,7 @@ jobs: - uses: graalvm/setup-graalvm@v1 with: distribution: 'graalvm' - java-version: 21 + java-version: 25 github-token: ${{ secrets.GITHUB_TOKEN }} native-image-job-reports: true @@ -276,7 +276,7 @@ jobs: - uses: graalvm/setup-graalvm@v1 with: distribution: 'graalvm' - java-version: 24 + java-version: 25 github-token: ${{ secrets.GITHUB_TOKEN }} native-image-job-reports: true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f4888c20cc42..c1ffb3080959 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ de-mannodermaus-junit5 = "2.0.1" dokka = "2.2.0" eclipse-osgi = "3.24.100" graalvm = "25.0.2" -graalvm-plugin = "0.11.5" +graalvm-plugin = "1.0.0" guava = "33.5.0-jre" hamcrest-library = "3.0" http-client5 = "5.6" diff --git a/okcurl/build.gradle.kts b/okcurl/build.gradle.kts index 3eaf4080a059..fbef093ed42e 100644 --- a/okcurl/build.gradle.kts +++ b/okcurl/build.gradle.kts @@ -1,9 +1,11 @@ import kotlinx.validation.ApiValidationExtension import okhttp3.buildsupport.testJavaVersion import org.graalvm.buildtools.gradle.dsl.GraalVMExtension +import org.graalvm.buildtools.gradle.tasks.BuildNativeImageTask import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import ru.vyarus.gradle.plugin.animalsniffer.AnimalSnifferExtension +import java.nio.file.Files plugins { kotlin("jvm") @@ -90,6 +92,46 @@ configure { } else { buildArgs("--no-fallback") } + + javaLauncher.set( + javaToolchains.launcherFor { + languageVersion.set(JavaLanguageVersion.of(25)) + vendor.set(JvmVendorSpec.GRAAL_VM) + }, + ) + } + } +} + +// https://github.com/gradle/gradle/issues/28583 +tasks.named("nativeCompile") { + // Gradle's "Copy" task cannot handle symbolic links, see https://github.com/gradle/gradle/issues/3982. That is why + // links contained in the GraalVM distribution archive get broken during provisioning and are replaced by empty + // files. Address this by recreating the links in the toolchain directory. + val toolchainDir = + options.get().javaLauncher.get().executablePath.asFile.parentFile.run { + if (name == "bin") parentFile else this + } + + val toolchainFiles = toolchainDir.walkTopDown().filter { it.isFile } + val emptyFiles = toolchainFiles.filter { it.length() == 0L } + + // Find empty toolchain files that are named like other toolchain files and assume these should have been links. + val links = + toolchainFiles.mapNotNull { file -> + emptyFiles.singleOrNull { it != file && it.name == file.name }?.let { + file to it + } + } + + // Fix up symbolic links. + links.forEach { (target, link) -> + logger.quiet("Fixing up '$link' to link to '$target'.") + + if (link.delete()) { + Files.createSymbolicLink(link.toPath(), target.toPath()) + } else { + logger.warn("Unable to delete '$link'.") } } }