Skip to content

Commit 60677c8

Browse files
committed
🚧 wip: reshape plugin to work like other Gradle supported languages
Signed-off-by: xtrm <[email protected]>
1 parent b90ea6e commit 60677c8

File tree

11 files changed

+273
-33
lines changed

11 files changed

+273
-33
lines changed

.github/workflows/gradle-build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ on:
44
push:
55
branches-ignore:
66
- docs
7+
paths-ignore:
8+
- '**.md'
79
workflow_dispatch:
810

911
jobs:

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
55
## Notice
66

7-
This project is currently being rewritten and is not ready for use. You can check out the [v3.x branch](https://github.com/stardust-enterprises/gradle-rust/tree/v3.x).
7+
> [!WARNING]
8+
> This project is currently being rewritten and is not ready for use. You can check out the [v3.x branch](https://github.com/stardust-enterprises/gradle-rust/tree/v3).
89
910
## License
1011

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package enterprises.stardust.gradle.api.internal.tasks.rust
2+
3+
import enterprises.stardust.gradle.api.plugins.rust.RustTarget
4+
import enterprises.stardust.gradle.api.plugins.rust.RustWrapperPluginExtension
5+
import enterprises.stardust.gradle.api.tasks.RustWrapperTask
6+
import groovy.lang.Closure
7+
import org.gradle.api.Action
8+
import org.gradle.api.NamedDomainObjectContainer
9+
import org.gradle.api.model.ObjectFactory
10+
import org.gradle.api.provider.ListProperty
11+
import org.gradle.api.provider.Property
12+
import org.gradle.api.provider.Provider
13+
import org.gradle.api.tasks.TaskContainer
14+
import javax.inject.Inject
15+
16+
/**
17+
* @author xtrm
18+
* @since 4.0.0
19+
*/
20+
open class DefaultRustWrapperPluginExtension
21+
@Inject constructor(
22+
objectFactory: ObjectFactory,
23+
val taskContainer: TaskContainer,
24+
) : RustWrapperPluginExtension {
25+
override val cargoExecutable: Property<String> =
26+
objectFactory.property(String::class.java).value("cargo")
27+
override val releaseMode: Property<Boolean> =
28+
objectFactory.property(Boolean::class.java).value(false)
29+
override val extraArguments: ListProperty<String> =
30+
objectFactory.listProperty(String::class.java).empty()
31+
override val targets: NamedDomainObjectContainer<RustTarget> =
32+
objectFactory.domainObjectContainer(RustTarget::class.java)
33+
34+
override fun registerTask(task: String): Provider<RustWrapperTask> =
35+
this.registerTask(task) {}
36+
37+
override fun registerTask(
38+
task: String,
39+
config: Action<in RustWrapperTask>
40+
): Provider<RustWrapperTask> =
41+
this.registerTask(task) { config.execute(this) }
42+
43+
override fun registerTask(
44+
task: String,
45+
config: Closure<in RustWrapperTask>
46+
): Provider<RustWrapperTask> =
47+
this.registerTask(task) {
48+
config.delegate = this
49+
config.call()
50+
}
51+
52+
override fun registerTask(
53+
task: String,
54+
config: RustWrapperTask.() -> Unit
55+
): Provider<RustWrapperTask> =
56+
taskContainer.register(task, RustWrapperTask::class.java) {
57+
group = "rust"
58+
config(this)
59+
}
60+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package enterprises.stardust.gradle.api.plugins.rust
2+
3+
import enterprises.stardust.gradle.api.plugins.AbstractDelegatingPlugin
4+
import org.gradle.api.Plugin
5+
import org.gradle.api.Project
6+
import org.gradle.kotlin.dsl.apply
7+
8+
/**
9+
* @author xtrm
10+
* @since 4.0.0
11+
*/
12+
open class RustPlugin : AbstractDelegatingPlugin(
13+
projectPlugin = ProjectRustPlugin::class
14+
) {
15+
/**
16+
* @author xtrm
17+
* @since 4.0.0
18+
*/
19+
open class ProjectRustPlugin : Plugin<Project> {
20+
override fun apply(target: Project) = target.run {
21+
logger.info("Hello from gradle-rust 4.0.0!")
22+
23+
setupImportingConfigurations()
24+
25+
val cargoFile = layout.projectDirectory.file("Cargo.toml")
26+
if (cargoFile.asFile.exists()) {
27+
logger.info("Cargo.toml found, setting up rust plugin")
28+
apply<RustWrapperPlugin>()
29+
}
30+
}
31+
32+
private fun Project.setupImportingConfigurations() {
33+
// val rust = configurations.register("rust")
34+
35+
//TODO: ideally something like
36+
// dependencies {
37+
// implementation(rust(project(":rust-lib))!!)
38+
// }
39+
40+
//TODO: maybe uhhhh
41+
// dependencies {
42+
// implementation(rust(project(":rust-lib")) {
43+
// target = "META-INF/natives"
44+
// })
45+
// }
46+
}
47+
}
48+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package enterprises.stardust.gradle.api.plugins.rust
2+
3+
import org.gradle.api.Named
4+
5+
data class RustTarget(
6+
private val name: String
7+
): Named {
8+
override fun getName() = name
9+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package enterprises.stardust.gradle.api.plugins.rust
2+
3+
import enterprises.stardust.gradle.api.internal.tasks.rust.DefaultRustWrapperPluginExtension
4+
import enterprises.stardust.gradle.api.tasks.RustWrapperTask
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.api.plugins.BasePlugin
8+
import org.gradle.api.plugins.JvmEcosystemPlugin
9+
import org.gradle.api.tasks.Internal
10+
import org.gradle.api.tasks.SourceSetContainer
11+
import org.gradle.kotlin.dsl.apply
12+
import org.gradle.kotlin.dsl.create
13+
import org.gradle.kotlin.dsl.register
14+
import javax.inject.Inject
15+
16+
const val RUST_EXTENSION_NAME = "rust"
17+
18+
/**
19+
* @author xtrm
20+
* @since 4.0.0
21+
*/
22+
open class RustWrapperPlugin : Plugin<Project> {
23+
@get:Internal
24+
private val defaultRustTasks = arrayOf("build", "check", "test", "clean", "run")
25+
@get:Inject
26+
private lateinit var sourceSet: SourceSetContainer
27+
28+
override fun apply(target: Project): Unit = target.run {
29+
logger.info("Hello from gradle-rust wrapper plugin!")
30+
31+
if (plugins.hasPlugin(JvmEcosystemPlugin::class.java)) {
32+
throw IllegalStateException("The \"java\" or \"java-library\" plugin cannot be applied together with gradle-rust. " +
33+
"Consider moving your java-related code to a separate project.")
34+
}
35+
36+
// First ensure the base plugin is applied
37+
apply<BasePlugin>()
38+
39+
// Then create ourselves the `sourceSets` extension
40+
extensions.add(SourceSetContainer::class.java, "sourceSets", sourceSet)
41+
42+
//TODO: Add our extensions for `rust` [enterprises.stardust.gradle.api.tasks.RustSourceDirectorySet]
43+
// see https://github.com/gradle/gradle/tree/master/platforms/jvm/scala/src/main/java/org/gradle/api/
44+
// as an example
45+
46+
// Create the `rust` extension
47+
val rust = extensions.create(
48+
RustWrapperPluginExtension::class,
49+
RUST_EXTENSION_NAME,
50+
DefaultRustWrapperPluginExtension::class
51+
)
52+
53+
// Create the default tasks
54+
defaultRustTasks.forEach { taskName ->
55+
rust.registerTask(taskName)
56+
}
57+
58+
val testTask = tasks.register("rustTesting", RustWrapperTask::class) {
59+
group = "rust"
60+
description = "Testing testing testing"
61+
}
62+
}
63+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package enterprises.stardust.gradle.api.plugins.rust
2+
3+
import enterprises.stardust.gradle.api.tasks.RustWrapperTask
4+
import groovy.lang.Closure
5+
import org.gradle.api.Action
6+
import org.gradle.api.NamedDomainObjectContainer
7+
import org.gradle.api.provider.ListProperty
8+
import org.gradle.api.provider.Property
9+
import org.gradle.api.provider.Provider
10+
11+
/**
12+
* @author xtrm
13+
* @since 4.0.0
14+
*/
15+
interface RustWrapperPluginExtension {
16+
/**
17+
* The name of the `cargo` executable to use.
18+
*
19+
* This can be changed for an absolute path to a specific version of `cargo`, or for another cargo-compatible tool
20+
* like `cross`.
21+
*
22+
* By default, this is `"cargo"`.
23+
*/
24+
val cargoExecutable: Property<String>
25+
26+
/**
27+
* Whether to run `cargo` in release mode.
28+
*
29+
* By default, this is `false`.
30+
*/
31+
val releaseMode: Property<Boolean>
32+
33+
/**
34+
* Extra arguments to pass to `cargo` when running any command.
35+
*
36+
* This can be finer tuned by adding extra arguments to specific gradle-rust wrapper tasks instead.
37+
*
38+
* By default, this is empty.
39+
*
40+
* @see [enterprises.stardust.gradle.api.tasks.RustWrapperTask]
41+
*/
42+
val extraArguments: ListProperty<String>
43+
44+
/**
45+
* A container of targets to run tasks against.
46+
*
47+
* By default, this is empty.
48+
*/
49+
val targets: NamedDomainObjectContainer<RustTarget>
50+
51+
fun registerTask(task: String): Provider<RustWrapperTask>
52+
53+
fun registerTask(task: String, config: Action<in RustWrapperTask>): Provider<RustWrapperTask>
54+
55+
fun registerTask(task: String, config: Closure<in RustWrapperTask>): Provider<RustWrapperTask>
56+
57+
fun registerTask(task: String, config: RustWrapperTask.() -> Unit): Provider<RustWrapperTask>
58+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package enterprises.stardust.gradle.api.tasks
2+
3+
import org.gradle.api.file.SourceDirectorySet
4+
5+
/**
6+
* @author xtrm
7+
* @since 4.0.0
8+
*/
9+
interface RustSourceDirectorySet : SourceDirectorySet
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package enterprises.stardust.gradle.api.tasks
2+
3+
import enterprises.stardust.gradle.api.plugins.rust.RustWrapperPluginExtension
4+
import org.gradle.api.DefaultTask
5+
import org.gradle.api.tasks.TaskAction
6+
import javax.inject.Inject
7+
8+
/**
9+
* @author xtrm
10+
* @since 4.0.0
11+
*/
12+
open class RustWrapperTask : DefaultTask() {
13+
@get:Inject
14+
private lateinit var rustExt: RustWrapperPluginExtension
15+
16+
@TaskAction
17+
fun run() {
18+
println("Hello from gradle-rust wrapper task!")
19+
println(rustExt.cargoExecutable.get())
20+
}
21+
}

gradle-plugin/src/main/kotlin/enterprises/stardust/gradle/rust/RustPlugin.kt

Lines changed: 0 additions & 31 deletions
This file was deleted.

0 commit comments

Comments
 (0)