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