import org.jetbrains.compose.compose import org.jetbrains.compose.desktop.application.dsl.TargetFormat import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.compose.experimental.dsl.IOSDevices plugins { id("com.android.application") kotlin("multiplatform") id("org.jetbrains.compose") } version = "1.0-SNAPSHOT" repositories { mavenLocal() google() mavenCentral() maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") } kotlin { android() jvm("desktop") js(IR) { browser() binaries.executable() } macosX64 { binaries { executable { entryPoint = "main" freeCompilerArgs += listOf( "-linker-option", "-framework", "-linker-option", "Metal" ) } } } macosArm64 { binaries { executable { entryPoint = "main" freeCompilerArgs += listOf( "-linker-option", "-framework", "-linker-option", "Metal" ) } } } // Workaround for an issue: // https://youtrack.jetbrains.com/issue/KT-53561/Invalid-LLVM-module-inlinable-function-call-in-a-function-with-debug-info-must-have-a-dbg-location // Compose compiler produces nodes without line information sometimes that provokes Kotlin native compiler to report errors. // TODO: remove workaround when switch to Kotlin 1.8 val disableKonanVerification = "-Xverify-compiler=false" iosX64("uikitX64") { binaries { executable() { entryPoint = "main" freeCompilerArgs += listOf( "-linker-option", "-framework", "-linker-option", "Metal", "-linker-option", "-framework", "-linker-option", "CoreText", "-linker-option", "-framework", "-linker-option", "CoreGraphics", disableKonanVerification ) } } } iosArm64("uikitArm64") { binaries { executable() { entryPoint = "main" freeCompilerArgs += listOf( "-linker-option", "-framework", "-linker-option", "Metal", "-linker-option", "-framework", "-linker-option", "CoreText", "-linker-option", "-framework", "-linker-option", "CoreGraphics", disableKonanVerification ) } } } sourceSets { val commonMain by getting { dependencies { implementation(compose.ui) implementation(compose.foundation) implementation(compose.material) implementation(compose.runtime) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.3") } } val commonTest by getting { dependencies { implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) } } val androidMain by getting { dependsOn(commonMain) kotlin.srcDirs("src/jvmMain/kotlin") dependencies { implementation("androidx.appcompat:appcompat:1.5.1") implementation("androidx.activity:activity-compose:1.5.0") } } val desktopMain by getting { dependencies { implementation(compose.desktop.currentOs) } } val jsMain by getting { dependencies { implementation(compose.web.core) } } val nativeMain by creating { dependsOn(commonMain) } val macosMain by creating { dependsOn(nativeMain) } val macosX64Main by getting { dependsOn(macosMain) } val macosArm64Main by getting { dependsOn(macosMain) } val uikitMain by creating { dependsOn(nativeMain) } val uikitX64Main by getting { dependsOn(uikitMain) } val uikitArm64Main by getting { dependsOn(uikitMain) } } } compose.desktop { application { mainClass = "Main_desktopKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "Minesweeper" packageVersion = "1.0.0" windows { menuGroup = "Compose Examples" // see https://wixtoolset.org/documentation/manual/v3/howtos/general/generate_guids.html upgradeUuid = "2bf169f9-d851-49f0-b3a1-308966d473ca" } } } } compose.experimental { web.application {} uikit.application { bundleIdPrefix = "org.jetbrains" projectName = "ComposeMinesweeper" deployConfigurations { simulator("IPhone8") { //Usage: ./gradlew iosDeployIPhone8Debug device = IOSDevices.IPHONE_8 } simulator("IPad") { //Usage: ./gradlew iosDeployIPadDebug device = IOSDevices.IPAD_MINI_6th_Gen } connectedDevice("Device") { //First need specify your teamId here, or in local.properties (compose.ios.teamId=***) //teamId="***" //Usage: ./gradlew iosDeployDeviceRelease } } } } tasks.withType { kotlinOptions.jvmTarget = "11" } // a temporary workaround for a bug in jsRun invocation - see https://youtrack.jetbrains.com/issue/KT-48273 afterEvaluate { rootProject.extensions.configure { versions.webpackDevServer.version = "4.0.0" versions.webpackCli.version = "4.9.0" nodeVersion = "16.0.0" } } android { compileSdk = 32 defaultConfig { minSdk = 26 targetSdk = 32 } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } sourceSets { named("main") { manifest.srcFile("src/androidMain/AndroidManifest.xml") res.srcDirs("src/androidMain/res", "src/commonMain/resources") } } }