Skip to content

Commit 3d07b81

Browse files
committed
Bump to version 0.1.0; add support for "default" toolchain.
The "default" toolchain runs `cargo build` without a `--toolchain` parameter, and therefore needs some configuration to address the inconsistency in cargo's output.
1 parent 5dda1f3 commit 3d07b81

File tree

5 files changed

+52
-24
lines changed

5 files changed

+52
-24
lines changed

Diff for: plugin/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ gradlePlugin {
1616
}
1717

1818
group 'org.mozilla.rust-android-gradle'
19-
version '0.0.4'
19+
version '0.1.0'
2020

2121
publishing {
2222
repositories {
@@ -28,7 +28,7 @@ publishing {
2828
maven(MavenPublication) {
2929
groupId 'org.mozilla.rust-android-gradle'
3030
artifactId 'rust-android'
31-
version '0.0.4'
31+
version '0.1.0'
3232

3333
from components.java
3434
}

Diff for: plugin/src/main/kotlin/com/nishtahir/CargoBuildTask.kt

+31-19
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.nishtahir;
22

33
import org.gradle.api.DefaultTask
4+
import org.gradle.api.GradleException
45
import org.gradle.api.Project
56
import org.gradle.api.tasks.TaskAction
67
import java.io.File
@@ -13,43 +14,54 @@ open class CargoBuildTask : DefaultTask() {
1314
extensions[CargoExtension::class].apply {
1415
targets.forEach { target ->
1516
val toolchain = toolchains.find { (arch) -> arch == target }
16-
if (toolchain != null) {
17-
buildProjectForTarget(project, toolchain, this)
1817

19-
val targetDirectory = targetDirectory ?: "${module}/target"
18+
if (toolchain == null) {
19+
throw GradleException("No such target $target")
20+
}
21+
22+
buildProjectForTarget(project, toolchain, this)
2023

21-
copy { spec ->
24+
val targetDirectory = targetDirectory ?: "${module}/target"
25+
26+
copy { spec ->
27+
if (toolchain.target != null) {
2228
spec.from(File(project.projectDir, "${targetDirectory}/${toolchain.target}/${profile}"))
23-
spec.include(targetInclude)
2429
spec.into(File(buildDir, "rustJniLibs/${toolchain.folder}"))
30+
} else {
31+
spec.from(File(project.projectDir, "${targetDirectory}/${profile}"))
32+
spec.into(File(buildDir, "rustResources/${defaultToolchainBuildPrefixDir}"))
2533
}
26-
} else {
27-
println("No such target $target")
34+
spec.include(targetIncludes.asIterable())
2835
}
2936
}
3037
}
3138
}
3239

3340
private fun buildProjectForTarget(project: Project, toolchain: Toolchain, cargoExtension: CargoExtension) {
3441
project.exec { spec ->
35-
val cc = "${project.getToolchainDirectory()}/${toolchain.cc()}"
36-
val ar = "${project.getToolchainDirectory()}/${toolchain.ar()}"
37-
println("using CC: $cc")
38-
println("using AR: $ar")
3942
with(spec) {
4043
standardOutput = System.out
4144
workingDir = File(project.project.projectDir, cargoExtension.module)
42-
environment("CC", cc)
43-
environment("AR", ar)
44-
environment("RUSTFLAGS", "-C linker=$cc")
4545

46-
val theCommandLine = mutableListOf("cargo", "build", "--target=${toolchain.target}")
46+
val theCommandLine = mutableListOf("cargo", "build");
47+
4748
if (cargoExtension.profile != "debug") {
48-
// Cargo is rigid: it accepts "--release" for release (and
49-
// nothing for dev). This is a cheap way of allowing only
50-
// two values.
51-
theCommandLine.add("--${cargoExtension.profile}")
49+
// Cargo is rigid: it accepts "--release" for release (and
50+
// nothing for dev). This is a cheap way of allowing only
51+
// two values.
52+
theCommandLine.add("--${cargoExtension.profile}")
5253
}
54+
55+
if (toolchain.target != null) {
56+
theCommandLine.add("--target=${toolchain.target}")
57+
58+
val cc = "${project.getToolchainDirectory()}/${toolchain.cc()}"
59+
val ar = "${project.getToolchainDirectory()}/${toolchain.ar()}"
60+
environment("CC", cc)
61+
environment("AR", ar)
62+
environment("RUSTFLAGS", "-C linker=$cc")
63+
}
64+
5365
commandLine = theCommandLine
5466
}
5567
}.assertNormalExitValue()

Diff for: plugin/src/main/kotlin/com/nishtahir/CargoExtension.kt

+11-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,16 @@ open class CargoExtension {
2121
/**
2222
* Which Cargo built outputs to consider JNI libraries.
2323
*
24-
* Defaults to `"*.so"`.
24+
* Defaults to `["*.so", "*.dylib", "*.dll"]`.
2525
*/
26-
var targetInclude: String = "*.so"
26+
var targetIncludes: Array<String> = arrayOf("*.so", "*.dylib", "*.dll")
27+
28+
/**
29+
* Android toolchains know where to put their outputs; it's a well-known value like
30+
* `armeabi-v7a` or `x86`. The default toolchain outputs don't know where to put their output;
31+
* use this to say where.
32+
*
33+
* Defaults to `""`.
34+
*/
35+
var defaultToolchainBuildPrefixDir: String? = ""
2736
}

Diff for: plugin/src/main/kotlin/com/nishtahir/GenerateToolchainsTask.kt

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ open class GenerateToolchainsTask : DefaultTask() {
2828
val targets = project.extensions[CargoExtension::class].targets
2929

3030
toolchains
31+
.filter { it.target != null }
3132
.filterNot { (arch) -> minApi < 21 && arch.endsWith("64") }
3233
.filter { (arch) -> targets.contains(arch) }
3334
.forEach { (arch) ->

Diff for: plugin/src/main/kotlin/com/nishtahir/RustAndroidPlugin.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ import java.io.File
1010
const val RUST_TASK_GROUP = "rust"
1111

1212
val toolchains = listOf(
13+
Toolchain("default",
14+
null,
15+
"<cc>",
16+
"<ar>",
17+
"default"),
1318
Toolchain("arm",
1419
"arm-linux-androideabi",
1520
"bin/arm-linux-androideabi-clang",
@@ -38,7 +43,7 @@ val toolchains = listOf(
3843
)
3944

4045
data class Toolchain(val platform: String,
41-
val target: String,
46+
val target: String?,
4247
val cc: String,
4348
val ar: String,
4449
val folder: String) {
@@ -69,6 +74,7 @@ open class RustAndroidPlugin : Plugin<Project> {
6974
private inline fun <reified T : BaseExtension> configurePlugin(project: Project) = with(project) {
7075
extensions[T::class].apply {
7176
sourceSets.getByName("main").jniLibs.srcDir(File("$buildDir/rustJniLibs/"))
77+
sourceSets.getByName("test").resources.srcDir(File("$buildDir/rustResources/"))
7278
}
7379

7480
val generateToolchain = tasks.maybeCreate("generateToolchains",

0 commit comments

Comments
 (0)