Skip to content

How to configure the gradle plugin if the rust project files are siblings? #7

@mainrs

Description

@mainrs

This is my project layout:

$ tree -L 1
.
├── Cargo.lock
├── Cargo.toml
├── desktop
│   ├── build.gradle.kts
│   ├── composeApp
│   ├── gradle
│   ├── gradle.properties
│   ├── gradlew
│   ├── gradlew.bat
│   ├── local.properties
│   ├── README.md
│   ├── settings.gradle.kts
│   └── uniffi-kotlin-multiplatform-bindings
├── target
├── ugl-core

The crate that uses the uniffi proc macros is ugl-core. I added the uniffi gradle plugin as a git submodule. These are the gradle files:

// settings.gradle.kts
rootProject.name = "UnifiedGameLauncher"
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

pluginManagement {
    includeBuild("uniffi-kotlin-multiplatform-bindings/build-logic")
    repositories {
        google {
            mavenContent {
                includeGroupAndSubgroups("androidx")
                includeGroupAndSubgroups("com.android")
                includeGroupAndSubgroups("com.google")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositories {
        google {
            mavenContent {
                includeGroupAndSubgroups("androidx")
                includeGroupAndSubgroups("com.android")
                includeGroupAndSubgroups("com.google")
            }
        }
        mavenCentral()
    }
}

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

include(":composeApp")

// build.gradle.kts
plugins {
    // this is necessary to avoid the plugins to be loaded multiple times
    // in each subproject's classloader
    alias(libs.plugins.composeMultiplatform) apply false
    alias(libs.plugins.composeCompiler) apply false
    alias(libs.plugins.kotlinMultiplatform) apply false
}

// composeApp/settings.gradle.kts
import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
    alias(libs.plugins.kotlinMultiplatform)
    alias(libs.plugins.composeMultiplatform)
    alias(libs.plugins.composeCompiler)
    alias(libs.plugins.composeHotReload)

    // Required for FFI bindings.
    id("org.jetbrains.kotlin.plugin.atomicfu") version "2.1.21"
    id("io.gitlab.trixnity.cargo.kotlin.multiplatform") version "0.6.0"
    id("io.gitlab.trixnity.uniffi.kotlin.multiplatform") version "0.6.0"
}

// Configures the linking process between Rust and Kotlin.
cargo {
    // The Cargo package is located in a `rust` subdirectory.
    packageDirectory = layout.projectDirectory.dir("..")
}

uniffi {
    formatCode = true
    generateFromLibrary {
        namespace = "ugl-core"
    }
}

kotlin {
    jvm("desktop")
    
    sourceSets {
        val desktopMain by getting
        
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(compose.foundation)
            implementation(compose.material3)
            implementation(compose.ui)
            implementation(compose.components.resources)
            implementation(compose.components.uiToolingPreview)
            implementation(libs.androidx.lifecycle.viewmodel)
            implementation(libs.androidx.lifecycle.runtimeCompose)
        }
        commonTest.dependencies {
            implementation(libs.kotlin.test)
        }
        desktopMain.dependencies {
            implementation(compose.desktop.currentOs)
            implementation(libs.kotlinx.coroutinesSwing)
        }
    }
}


compose.desktop {
    application {
        mainClass = "io.MainKt"

        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
            packageName = "io"
            packageVersion = "1.0.0"
        }
    }
}

I get this error:

* Exception is:
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':composeApp'.
[...]
Caused by: java.util.NoSuchElementException: Collection contains no element matching the predicate.
	at io.gitlab.trixnity.gradle.cargo.CargoPackage.<init>(CargoPackage.kt:162)
	at io.gitlab.trixnity.gradle.cargo.dsl.CargoExtension.cargoPackage$lambda$1(CargoExtension.kt:47)
	at io.gitlab.trixnity.gradle.cargo.dsl.CargoExtension.cargoPackage$lambda$2(CargoExtension.kt:46)
	at org.gradle.api.internal.provider.BiProvider.calculateOwnValue(BiProvider.java:79)
	at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
	at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:81)
	at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateValue(AbstractMinimalProvider.java:115)
	at org.gradle.api.internal.provider.AbstractMinimalProvider.withFinalValue(AbstractMinimalProvider.java:168)
	at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:162)
	at org.gradle.api.internal.provider.DefaultProperty.finalValue(DefaultProperty.java:33)
	at org.gradle.api.internal.provider.AbstractProperty.finalizeNow(AbstractProperty.java:281)
	at org.gradle.api.internal.provider.AbstractProperty.lambda$beforeRead$0(AbstractProperty.java:276)
	at org.gradle.api.internal.provider.ValueState.finalizeOnReadIfNeeded(ValueState.java:139)
	at org.gradle.api.internal.provider.AbstractProperty.beforeRead(AbstractProperty.java:276)
	at org.gradle.api.internal.provider.AbstractProperty.beforeRead(AbstractProperty.java:268)
	at org.gradle.api.internal.provider.AbstractProperty.calculateOwnValue(AbstractProperty.java:162)
	at org.gradle.api.internal.provider.AbstractMinimalProvider.calculateOwnPresentValue(AbstractMinimalProvider.java:80)
	at org.gradle.api.internal.provider.AbstractMinimalProvider.get(AbstractMinimalProvider.java:100)
	at io.gitlab.trixnity.gradle.cargo.CargoPlugin.checkRequiredCrateTypes(CargoPlugin.kt:176)
	at io.gitlab.trixnity.gradle.cargo.CargoPlugin.applyAfterEvaluate(CargoPlugin.kt:86)
	at io.gitlab.trixnity.gradle.cargo.CargoPlugin.apply$lambda$6(CargoPlugin.kt:81)
	at io.gitlab.trixnity.gradle.cargo.CargoPlugin.apply$lambda$7(CargoPlugin.kt:78)

It looks like the plugin cannot resolve: 1) the cargo workspace properly 2) the fact that the workspace is in the parent folder. I tried symlinking the workspace itself into desktop, but that did also through errno=2 file not found errors.
Any idea what is going wrong here?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions