From 09b2975fd4ecbecad69361c55229da1af3bef3e1 Mon Sep 17 00:00:00 2001 From: xz-dev Date: Wed, 19 Nov 2025 20:39:55 +0800 Subject: [PATCH] fix: Add Gradle 9 compatibility - Replace deprecated Project.exec() with ExecOperations - Inject ExecOperations in AndroidRustPlugin, RustBuildTask, and RustTestTask - Update RustInstaller functions to use ExecOperations - Upgrade Gradle wrapper to 9.2.1 This fixes the build failure with Gradle 9.x where Project.exec() method was removed. The plugin now properly uses the ExecOperations service which is the recommended approach in Gradle 9+. --- gradle/wrapper/gradle-wrapper.properties | 2 +- .../dev/matrix/agp/rust/AndroidRustPlugin.kt | 8 +++-- .../dev/matrix/agp/rust/RustBuildTask.kt | 7 +++- .../dev/matrix/agp/rust/RustInstaller.kt | 36 ++++++++++--------- .../dev/matrix/agp/rust/RustTestTask.kt | 7 +++- 5 files changed, 38 insertions(+), 22 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff0956a..d08858a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Dec 04 11:21:35 EET 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt index 6bfba4e..3a5710f 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt @@ -9,15 +9,19 @@ import dev.matrix.agp.rust.utils.getAndroidExtension import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider +import org.gradle.process.ExecOperations import java.io.File import java.util.Locale +import javax.inject.Inject // // TODO: migrate to variant API with artifacts when JNI will be supported // https://developer.android.com/studio/build/extend-agp#access-modify-artifacts // @Suppress("unused") -class AndroidRustPlugin : Plugin { +abstract class AndroidRustPlugin @Inject constructor( + private val execOperations: ExecOperations +) : Plugin { override fun apply(project: Project) { val rustBinaries = RustBinaries(project) val extension = project.extensions.create("androidRust", AndroidRustExtension::class.java) @@ -86,7 +90,7 @@ class AndroidRustPlugin : Plugin { } val minimumSupportedRustVersion = SemanticVersion(extension.minimumSupportedRustVersion) - installRustComponentsIfNeeded(project, minimumSupportedRustVersion, allRustAbiSet, rustBinaries) + installRustComponentsIfNeeded(project, execOperations, minimumSupportedRustVersion, allRustAbiSet, rustBinaries) } androidComponents.onVariants { variant -> diff --git a/src/main/kotlin/dev/matrix/agp/rust/RustBuildTask.kt b/src/main/kotlin/dev/matrix/agp/rust/RustBuildTask.kt index cac1dd5..18d73af 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/RustBuildTask.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/RustBuildTask.kt @@ -8,9 +8,14 @@ import org.gradle.api.DefaultTask import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction +import org.gradle.process.ExecOperations import java.io.File +import javax.inject.Inject internal abstract class RustBuildTask : DefaultTask() { + @get:Inject + abstract val execOperations: ExecOperations + @get:Input abstract val rustBinaries: Property @@ -66,7 +71,7 @@ internal abstract class RustBuildTask : DefaultTask() { .replace('-', '_') .uppercase() - project.exec { + execOperations.exec { standardOutput = System.out errorOutput = System.out workingDir = rustProjectDirectory diff --git a/src/main/kotlin/dev/matrix/agp/rust/RustInstaller.kt b/src/main/kotlin/dev/matrix/agp/rust/RustInstaller.kt index 7dbf782..a4a6717 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/RustInstaller.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/RustInstaller.kt @@ -7,10 +7,12 @@ import dev.matrix.agp.rust.utils.RustBinaries import dev.matrix.agp.rust.utils.SemanticVersion import dev.matrix.agp.rust.utils.log import org.gradle.api.Project +import org.gradle.process.ExecOperations import java.io.ByteArrayOutputStream internal fun installRustComponentsIfNeeded( project: Project, + execOperations: ExecOperations, minimalVersion: SemanticVersion?, abiSet: Collection, rustBinaries: RustBinaries, @@ -20,29 +22,29 @@ internal fun installRustComponentsIfNeeded( } if (minimalVersion != null && minimalVersion.isValid) { - val actualVersion = readRustCompilerVersion(project, rustBinaries) + val actualVersion = readRustCompilerVersion(execOperations, rustBinaries) if (actualVersion < minimalVersion) { - installRustUp(project, rustBinaries) - updateRust(project, rustBinaries) + installRustUp(execOperations, rustBinaries) + updateRust(execOperations, rustBinaries) } } if (abiSet.isNotEmpty()) { - installRustUp(project, rustBinaries) + installRustUp(execOperations, rustBinaries) - val installedAbiSet = readRustUpInstalledTargets(project, rustBinaries) + val installedAbiSet = readRustUpInstalledTargets(execOperations, rustBinaries) for (abi in abiSet) { if (installedAbiSet.contains(abi)) { continue } - installRustTarget(project, abi, rustBinaries) + installRustTarget(execOperations, abi, rustBinaries) } } } -private fun installRustUp(project: Project, rustBinaries: RustBinaries) { +private fun installRustUp(execOperations: ExecOperations, rustBinaries: RustBinaries) { try { - val result = project.exec { + val result = execOperations.exec { standardOutput = NullOutputStream errorOutput = NullOutputStream executable(rustBinaries.rustup) @@ -57,17 +59,17 @@ private fun installRustUp(project: Project, rustBinaries: RustBinaries) { log("installing rustup") - project.exec { + execOperations.exec { standardOutput = NullOutputStream errorOutput = NullOutputStream commandLine("bash", "-c", "\"curl\" --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y") }.assertNormalExitValue() } -private fun updateRust(project: Project, rustBinaries: RustBinaries) { +private fun updateRust(execOperations: ExecOperations, rustBinaries: RustBinaries) { log("updating rust version") - project.exec { + execOperations.exec { standardOutput = NullOutputStream errorOutput = NullOutputStream executable(rustBinaries.rustup) @@ -75,10 +77,10 @@ private fun updateRust(project: Project, rustBinaries: RustBinaries) { }.assertNormalExitValue() } -private fun installRustTarget(project: Project, abi: Abi, rustBinaries: RustBinaries) { +private fun installRustTarget(execOperations: ExecOperations, abi: Abi, rustBinaries: RustBinaries) { log("installing rust target $abi (${abi.rustTargetTriple})") - project.exec { + execOperations.exec { standardOutput = NullOutputStream errorOutput = NullOutputStream executable(rustBinaries.rustup) @@ -86,9 +88,9 @@ private fun installRustTarget(project: Project, abi: Abi, rustBinaries: RustBina }.assertNormalExitValue() } -private fun readRustCompilerVersion(project: Project, rustBinaries: RustBinaries): SemanticVersion { +private fun readRustCompilerVersion(execOperations: ExecOperations, rustBinaries: RustBinaries): SemanticVersion { val output = ByteArrayOutputStream() - project.exec { + execOperations.exec { standardOutput = output errorOutput = NullOutputStream executable(rustBinaries.rustc) @@ -104,9 +106,9 @@ private fun readRustCompilerVersion(project: Project, rustBinaries: RustBinaries return SemanticVersion(match.groupValues[1]) } -private fun readRustUpInstalledTargets(project: Project, rustBinaries: RustBinaries): Set { +private fun readRustUpInstalledTargets(execOperations: ExecOperations, rustBinaries: RustBinaries): Set { val output = ByteArrayOutputStream() - project.exec { + execOperations.exec { standardOutput = output errorOutput = NullOutputStream executable(rustBinaries.rustup) diff --git a/src/main/kotlin/dev/matrix/agp/rust/RustTestTask.kt b/src/main/kotlin/dev/matrix/agp/rust/RustTestTask.kt index a06e53f..46abfe8 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/RustTestTask.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/RustTestTask.kt @@ -4,9 +4,14 @@ import org.gradle.api.DefaultTask import org.gradle.api.provider.Property import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction +import org.gradle.process.ExecOperations import java.io.File +import javax.inject.Inject internal abstract class RustTestTask : DefaultTask() { + @get:Inject + abstract val execOperations: ExecOperations + @get:Input abstract val rustProjectDirectory: Property @@ -18,7 +23,7 @@ internal abstract class RustTestTask : DefaultTask() { val rustProjectDirectory = rustProjectDirectory.get() val cargoTargetDirectory = cargoTargetDirectory.get() - project.exec { + execOperations.exec { standardOutput = System.out errorOutput = System.out workingDir = rustProjectDirectory