composeApp.gradle.kts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. //<editor-fold desc="imports">----------------------------------------------------------------------
  2. import org.jetbrains.compose.ComposeExtension
  3. import org.jetbrains.compose.desktop.DesktopExtension
  4. import org.jetbrains.compose.desktop.application.dsl.TargetFormat
  5. import org.jetbrains.compose.resources.ResourcesExtension
  6. import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
  7. import org.jetbrains.kotlin.gradle.dsl.JvmTarget
  8. import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
  9. import org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithPresetFunctions
  10. import org.jetbrains.kotlin.gradle.dsl.KotlinTargetContainerWithWasmPresetFunctions
  11. import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
  12. import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWasmJsTargetDsl
  13. import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
  14. import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
  15. //</editor-fold>------------------------------------------------------------------------------------
  16. //<editor-fold desc="plugins">----------------------------------------------------------------------
  17. plugins {
  18. alias(libs.plugins.kotlin.multiplatform)
  19. alias(libs.plugins.android.application)
  20. alias(libs.plugins.compose)
  21. alias(libs.plugins.compose.compiler)
  22. alias(libs.plugins.openjfx)
  23. }
  24. //</editor-fold>------------------------------------------------------------------------------------
  25. //<editor-fold desc="helpers">----------------------------------------------------------------------
  26. fun NamedDomainObjectContainer<KotlinSourceSet>.getOrCreate(
  27. name: String
  28. ): KotlinSourceSet = findByName(name) ?: create(name)
  29. fun NamedDomainObjectContainer<KotlinSourceSet>.desktopMain(
  30. block: KotlinSourceSet.() -> Unit = {}
  31. ): KotlinSourceSet = getOrCreate("desktopMain").apply(block)
  32. fun KotlinTargetContainerWithPresetFunctions.desktopTarget(
  33. configure: Action<KotlinJvmTarget>
  34. ) = jvm("desktop").apply {
  35. configure.execute(this)
  36. }
  37. @OptIn(ExperimentalWasmDsl::class)
  38. fun KotlinTargetContainerWithWasmPresetFunctions.wasmJsTarget(
  39. configure: Action<KotlinWasmJsTargetDsl>
  40. ) = wasmJs(configure)
  41. val Project.compose: ComposeExtension
  42. get() = extensions.getByType()
  43. fun Project.desktop(
  44. config: DesktopExtension.() -> Unit
  45. ) = compose.desktop(config)
  46. fun Project.composeResources(
  47. config: ResourcesExtension.() -> Unit
  48. ) = compose.resources(config)
  49. fun targets(
  50. config: Action<KotlinMultiplatformExtension>
  51. ) = kotlin(config)
  52. // todo
  53. @Suppress("UNUSED_PARAMETER", "UnusedReceiverParameter")
  54. fun Project.wasmjs(config: DesktopExtension.() -> Unit) {
  55. // todo
  56. // compose.wasmJs(config)
  57. }
  58. // todo
  59. fun Project.kotlinSourceSets(
  60. config: Action<NamedDomainObjectContainer<KotlinSourceSet>>
  61. ) = with(kotlin) {
  62. sourceSets(config)
  63. }
  64. //</editor-fold>------------------------------------------------------------------------------------
  65. //<editor-fold desc="configurations">---------------------------------------------------------------
  66. // java version
  67. setJavaLanguageVersion(libs.versions.java.language.version)
  68. // resources config
  69. composeResources {
  70. publicResClass = true
  71. packageOfResClass = "org.mjdev.desktop.resources"
  72. generateResClass = always
  73. }
  74. javafx {
  75. version = "21.0.3"
  76. modules = listOf(
  77. "javafx.controls",
  78. "javafx.web",
  79. "javafx.graphics",
  80. "javafx.media"
  81. )
  82. }
  83. //</editor-fold>------------------------------------------------------------------------------------
  84. //<editor-fold desc="targets">----------------------------------------------------------------------
  85. targets {
  86. desktopTarget {
  87. }
  88. androidTarget {
  89. compilerOptions {
  90. jvmTarget.set(JvmTarget.JVM_17)
  91. }
  92. }
  93. wasmJsTarget {
  94. outputModuleName = "composeApp"
  95. browser {
  96. val rootDirPath = project.rootDir.path
  97. val projectDirPath = project.projectDir.path
  98. commonWebpackConfig {
  99. outputFileName = "composeApp.js"
  100. devServer = (devServer ?: KotlinWebpackConfig.DevServer()).apply {
  101. static = (static ?: mutableListOf()).apply {
  102. // Serve sources to debug inside browser
  103. add(rootDirPath)
  104. add(projectDirPath)
  105. }
  106. }
  107. }
  108. }
  109. binaries.executable()
  110. }
  111. }
  112. //</editor-fold>------------------------------------------------------------------------------------
  113. //<editor-fold desc="source sets / dependencies">---------------------------------------------------
  114. kotlin {
  115. sourceSets {
  116. // common dependencies
  117. commonMain {
  118. dependencies {
  119. // reflection
  120. implementation(kotlin("reflect"))
  121. // preview
  122. implementation(compose.components.uiToolingPreview)
  123. // base
  124. implementation(compose.runtime)
  125. implementation(compose.foundation)
  126. implementation(compose.material)
  127. implementation(compose.material3)
  128. implementation(compose.materialIconsExtended)
  129. implementation(compose.ui)
  130. implementation(compose.animation)
  131. implementation(compose.animationGraphics)
  132. implementation(compose.components.resources)
  133. implementation(libs.androidx.lifecycle.viewmodel)
  134. implementation(libs.androidx.lifecycle.runtime.compose)
  135. // date time
  136. implementation(libs.kotlinx.datetime)
  137. implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
  138. // images
  139. implementation(libs.coil.compose)
  140. implementation(libs.coil.svg)
  141. implementation(libs.coil.mp)
  142. // charts
  143. implementation(libs.charts)
  144. // qr code
  145. implementation(libs.qrose)
  146. // json
  147. implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.1")
  148. // desktop file linux
  149. implementation(libs.ini4j)
  150. // tts
  151. implementation(libs.tts)
  152. implementation(libs.tts.compose)
  153. // notification
  154. // implementation("io.github.shadmanadman:knotif:0.56.0")
  155. // media player
  156. implementation("io.github.shadmanadman:kmpShaPlayer:1.0.2")
  157. // sensors
  158. //implementation("io.github.shadmanadman:KSensor:0.59.0")
  159. // flowmvi
  160. // implementation(libs.flowmvi.core)
  161. // implementation(libs.flowmvi.compose)
  162. // implementation(libs.flowmvi.android)
  163. // implementation(libs.flowmvi.savedstate)
  164. // implementation(libs.flowmvi.debugger)
  165. // locale
  166. // implementation(libs.i18n4k)
  167. // mo po gettext
  168. implementation(libs.gettext.lib)
  169. // timeline
  170. implementation(libs.jetlime)
  171. // anims kottie
  172. // implementation("io.github.ismai117:kottie:2.0.1")
  173. // kbd
  174. // implementation("com.github.animeshz:keyboard-kt-jvm:0.3.3")
  175. // mouse
  176. // implementation("com.github.animeshz:mouse-kt-jvm:0.3.3")
  177. // rss
  178. // implementation("com.prof18.rssparser:rssparser:6.0.8")
  179. // korlibs
  180. // implementation("com.soywiz:korlibs-io:6.0.0")
  181. // implementation("com.soywiz:korlibs-io-fs:6.0.0")
  182. // rich text editor
  183. // implementation("com.mohamedrejeb.richeditor:richeditor-compose:1.0.0-rc10")
  184. // implementation (libs.popkorn)
  185. // kapt(libs.popkorn.compiler)
  186. // implementation("io.github.khubaibkhan4:mediaplayer-kmp:2.0.6")
  187. // strings
  188. implementation(libs.human.readable)
  189. // alerts
  190. implementation(libs.alert.kmp)
  191. // tor
  192. // implementation("io.matthewnelson.kmp-tor:runtime:2.1.0")
  193. // files
  194. implementation("com.squareup.okio:okio:3.10.2")
  195. }
  196. }
  197. // android dependencies
  198. androidMain {
  199. dependencies {
  200. // reflection
  201. implementation(kotlin("reflect"))
  202. // preview
  203. implementation(compose.components.uiToolingPreview)
  204. // activity
  205. implementation(libs.androidx.activity.compose)
  206. // network client
  207. implementation(libs.okhttp3.client)
  208. // images
  209. implementation(libs.coil.okhttp)
  210. // splash
  211. implementation(libs.androidx.core.splashscreen)
  212. // permissions
  213. implementation(libs.accompanist.permissions)
  214. // ai gemini
  215. implementation(libs.sh.google.generative.ai)
  216. // sensors
  217. //implementation("io.github.shadmanadman:KSensor:0.59.0")
  218. }
  219. }
  220. // wasm dependencies
  221. wasmJsMain {
  222. dependencies {
  223. // reflection
  224. implementation(kotlin("reflect"))
  225. // preview
  226. implementation(compose.components.uiToolingPreview)
  227. // ai gemini
  228. implementation(libs.sh.google.generative.ai)
  229. }
  230. }
  231. // desktop dependencies
  232. desktopMain {
  233. dependencies {
  234. // reflection
  235. implementation(kotlin("reflect"))
  236. // preview
  237. implementation(compose.components.uiToolingPreview)
  238. // desktop
  239. implementation(compose.desktop.currentOs)
  240. // coroutines
  241. implementation(libs.kotlinx.coroutines.swing)
  242. // okhttp
  243. implementation(libs.okhttp3.client)
  244. // images okhttp
  245. implementation(libs.coil.okhttp)
  246. // ai gemini
  247. implementation(libs.sh.google.generative.ai)
  248. // chatgpt
  249. implementation(libs.ychat)
  250. // desktop files
  251. implementation(libs.ini4j)
  252. }
  253. }
  254. }
  255. }
  256. //</editor-fold>------------------------------------------------------------------------------------
  257. //<editor-fold desc="platforms">--------------------------------------------------------------------
  258. // android app config
  259. android {
  260. namespace = "org.mjdev.desktop"
  261. compileSdk = libs.versions.android.compile.sdk.get().toInt()
  262. sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
  263. sourceSets["main"].res.srcDirs("src/androidMain/res")
  264. sourceSets["main"].resources.srcDirs("src/commonMain/composeResources")
  265. sourceSets["main"].assets.srcDirs("src/commonMain/resources")
  266. defaultConfig {
  267. applicationId = "org.mjdev.desktop"
  268. minSdk = libs.versions.android.min.sdk.get().toInt()
  269. versionCode = libs.versions.app.pkg.version.get().replace(".", "").toInt()
  270. versionName = libs.versions.app.pkg.version.get()
  271. resValue("string", "app_name", libs.versions.app.name.get())
  272. }
  273. packaging {
  274. resources {
  275. excludes += "/META-INF/{AL2.0,LGPL2.1}"
  276. }
  277. }
  278. buildTypes {
  279. getByName("release") {
  280. isMinifyEnabled = false
  281. }
  282. }
  283. compileOptions {
  284. sourceCompatibility = JavaVersion.VERSION_17
  285. targetCompatibility = JavaVersion.VERSION_17
  286. }
  287. buildFeatures {
  288. compose = true
  289. buildConfig = true
  290. }
  291. dependencies {
  292. debugImplementation(libs.androidx.ui.tooling)
  293. }
  294. }
  295. // desktop app config
  296. desktop {
  297. group = libs.versions.app.pkg.name.get()
  298. version = libs.versions.app.pkg.version.get()
  299. application {
  300. mainClass = "org.mjdev.desktop.main.MainKt"
  301. nativeDistributions {
  302. packageName = libs.versions.app.name.get()
  303. packageVersion = libs.versions.app.pkg.version.get()
  304. description = libs.versions.app.description.get()
  305. copyright = libs.versions.app.copyright.get()
  306. outputBaseDir.set(project.rootDir.resolve("packages"))
  307. // macOS {
  308. // iconFile.set(project.rootDir.resolve("icons").resolve("icon.icns"))
  309. // }
  310. // windows {
  311. // iconFile.set(project.rootDir.resolve("icons").resolve("icon.ico"))
  312. // exePackageVersion = "1.0.0"
  313. // msiPackageVersion = "1.0.0"
  314. // }
  315. linux {
  316. // iconFile.set(
  317. // project.rootDir
  318. // .resolve("composeApp")
  319. // .resolve("src")
  320. // .resolve("commonMain")
  321. // .resolve("resources")
  322. // .resolve("drawable")
  323. // .resolve("icon.png")
  324. // )
  325. // licenseFile.set(project.rootDir.resolve("LICENSE.txt"))
  326. appCategory = libs.versions.app.category.get()
  327. debMaintainer = libs.versions.app.maintainer.get()
  328. menuGroup = libs.versions.app.menu.group.get()
  329. vendor = libs.versions.app.vendor.get()
  330. }
  331. targetFormats(
  332. TargetFormat.Dmg,
  333. TargetFormat.Msi,
  334. TargetFormat.Deb,
  335. TargetFormat.Exe,
  336. TargetFormat.AppImage,
  337. TargetFormat.Pkg,
  338. TargetFormat.Rpm
  339. )
  340. buildTypes.release.proguard {
  341. configurationFiles.from("composeApp.pro")
  342. }
  343. // appResourcesRootDir.set(project.rootDir.resolve("resources"))
  344. }
  345. }
  346. }
  347. // wasm config
  348. wasmjs {
  349. }
  350. //</editor-fold>------------------------------------------------------------------------------------