Skip to content
Closed
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
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
8 changes: 6 additions & 2 deletions src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<Project> {
abstract class AndroidRustPlugin @Inject constructor(
private val execOperations: ExecOperations
) : Plugin<Project> {
override fun apply(project: Project) {
val rustBinaries = RustBinaries(project)
val extension = project.extensions.create("androidRust", AndroidRustExtension::class.java)
Expand Down Expand Up @@ -86,7 +90,7 @@ class AndroidRustPlugin : Plugin<Project> {
}

val minimumSupportedRustVersion = SemanticVersion(extension.minimumSupportedRustVersion)
installRustComponentsIfNeeded(project, minimumSupportedRustVersion, allRustAbiSet, rustBinaries)
installRustComponentsIfNeeded(project, execOperations, minimumSupportedRustVersion, allRustAbiSet, rustBinaries)
}

androidComponents.onVariants { variant ->
Expand Down
7 changes: 6 additions & 1 deletion src/main/kotlin/dev/matrix/agp/rust/RustBuildTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<RustBinaries>

Expand Down Expand Up @@ -66,7 +71,7 @@ internal abstract class RustBuildTask : DefaultTask() {
.replace('-', '_')
.uppercase()

project.exec {
execOperations.exec {
standardOutput = System.out
errorOutput = System.out
workingDir = rustProjectDirectory
Expand Down
36 changes: 19 additions & 17 deletions src/main/kotlin/dev/matrix/agp/rust/RustInstaller.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<Abi>,
rustBinaries: RustBinaries,
Expand All @@ -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)
Expand All @@ -57,38 +59,38 @@ 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)
args("update")
}.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)
args("target", "add", abi.rustTargetTriple)
}.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)
Expand All @@ -104,9 +106,9 @@ private fun readRustCompilerVersion(project: Project, rustBinaries: RustBinaries
return SemanticVersion(match.groupValues[1])
}

private fun readRustUpInstalledTargets(project: Project, rustBinaries: RustBinaries): Set<Abi> {
private fun readRustUpInstalledTargets(execOperations: ExecOperations, rustBinaries: RustBinaries): Set<Abi> {
val output = ByteArrayOutputStream()
project.exec {
execOperations.exec {
standardOutput = output
errorOutput = NullOutputStream
executable(rustBinaries.rustup)
Expand Down
7 changes: 6 additions & 1 deletion src/main/kotlin/dev/matrix/agp/rust/RustTestTask.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<File>

Expand All @@ -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
Expand Down