build.gradle.kts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. @file:Suppress("UnstableApiUsage", "UNUSED_VARIABLE")
  2. import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
  3. import org.jetbrains.dokka.gradle.DokkaTask
  4. import org.jetbrains.kotlin.gradle.dsl.*
  5. import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
  6. import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
  7. import org.jetbrains.kotlin.utils.addToStdlib.safeAs
  8. buildscript {
  9. repositories {
  10. mavenLocal()
  11. // maven(url = "https://mirrors.huaweicloud.com/repository/maven")
  12. mavenCentral()
  13. jcenter()
  14. google()
  15. maven(url = "https://dl.bintray.com/kotlin/kotlin-eap")
  16. maven(url = "https://kotlin.bintray.com/kotlinx")
  17. }
  18. dependencies {
  19. classpath("com.android.tools.build:gradle:${Versions.androidGradlePlugin}")
  20. classpath("org.jetbrains.kotlinx:atomicfu-gradle-plugin:${Versions.atomicFU}")
  21. classpath("org.jetbrains.kotlinx:binary-compatibility-validator:${Versions.binaryValidator}")
  22. }
  23. }
  24. plugins {
  25. kotlin("jvm") version Versions.kotlinCompiler
  26. kotlin("plugin.serialization") version Versions.kotlinCompiler
  27. id("org.jetbrains.dokka") version Versions.dokka apply false
  28. id("net.mamoe.kotlin-jvm-blocking-bridge") version Versions.blockingBridge apply false
  29. id("com.jfrog.bintray") version Versions.bintray
  30. }
  31. // https://github.com/kotlin/binary-compatibility-validator
  32. //apply(plugin = "binary-compatibility-validator")
  33. project.ext.set("isAndroidSDKAvailable", false)
  34. // until
  35. // https://youtrack.jetbrains.com/issue/KT-37152,
  36. // are fixed.
  37. /*
  38. runCatching {
  39. val keyProps = Properties().apply {
  40. file("local.properties").takeIf { it.exists() }?.inputStream()?.use { load(it) }
  41. }
  42. if (keyProps.getProperty("sdk.dir", "").isNotEmpty()) {
  43. project.ext.set("isAndroidSDKAvailable", true)
  44. } else {
  45. project.ext.set("isAndroidSDKAvailable", false)
  46. }
  47. }.exceptionOrNull()?.run {
  48. project.ext.set("isAndroidSDKAvailable", false)
  49. }*/
  50. allprojects {
  51. group = "net.mamoe"
  52. version = Versions.project
  53. repositories {
  54. mavenLocal()
  55. // maven(url = "https://mirrors.huaweicloud.com/repository/maven")
  56. maven(url = "https://dl.bintray.com/kotlin/kotlin-eap")
  57. maven(url = "https://kotlin.bintray.com/kotlinx")
  58. jcenter()
  59. google()
  60. mavenCentral()
  61. }
  62. afterEvaluate {
  63. configureJvmTarget()
  64. configureMppShadow()
  65. configureEncoding()
  66. configureKotlinTestSettings()
  67. configureKotlinCompilerSettings()
  68. configureKotlinExperimentalUsages()
  69. if (isKotlinJvmProject) {
  70. configureFlattenSourceSets()
  71. }
  72. configureDokka()
  73. }
  74. }
  75. fun Project.configureDokka() {
  76. apply(plugin = "org.jetbrains.dokka")
  77. tasks {
  78. val dokka by getting(DokkaTask::class) {
  79. outputFormat = "html"
  80. outputDirectory = "$buildDir/dokka"
  81. }
  82. val dokkaMarkdown by creating(DokkaTask::class) {
  83. outputFormat = "markdown"
  84. outputDirectory = "$buildDir/dokka-markdown"
  85. }
  86. val dokkaGfm by creating(DokkaTask::class) {
  87. outputFormat = "gfm"
  88. outputDirectory = "$buildDir/dokka-gfm"
  89. }
  90. }
  91. for (task in tasks.filterIsInstance<DokkaTask>()) {
  92. task.configuration {
  93. perPackageOption {
  94. prefix = "net.mamoe.mirai"
  95. skipDeprecated = true
  96. }
  97. for (suppressedPackage in arrayOf(
  98. "net.mamoe.mirai.internal",
  99. "net.mamoe.mirai.event.internal",
  100. "net.mamoe.mirai.utils.internal",
  101. "net.mamoe.mirai.internal"
  102. )) {
  103. perPackageOption {
  104. prefix = suppressedPackage
  105. suppress = true
  106. }
  107. }
  108. }
  109. }
  110. }
  111. @Suppress("NOTHING_TO_INLINE") // or error
  112. fun Project.configureJvmTarget() {
  113. tasks.withType(KotlinJvmCompile::class.java) {
  114. kotlinOptions.jvmTarget = "11"
  115. }
  116. extensions.findByType(JavaPluginExtension::class.java)?.run {
  117. sourceCompatibility = JavaVersion.VERSION_11
  118. targetCompatibility = JavaVersion.VERSION_11
  119. }
  120. }
  121. fun Project.configureMppShadow() {
  122. val kotlin =
  123. runCatching {
  124. (this as ExtensionAware).extensions.getByName("kotlin") as? KotlinMultiplatformExtension
  125. }.getOrNull() ?: return
  126. val shadowJvmJar by tasks.creating(ShadowJar::class) sd@{
  127. group = "mirai"
  128. archiveClassifier.set("-all")
  129. val compilations =
  130. kotlin.targets.filter { it.platformType == KotlinPlatformType.jvm }
  131. .map { it.compilations["main"] }
  132. compilations.forEach {
  133. dependsOn(it.compileKotlinTask)
  134. from(it.output)
  135. }
  136. println(project.configurations.joinToString())
  137. from(project.configurations.getByName("jvmRuntimeClasspath"))
  138. this.exclude { file ->
  139. file.name.endsWith(".sf", ignoreCase = true)
  140. }
  141. /*
  142. this.manifest {
  143. this.attributes(
  144. "Manifest-Version" to 1,
  145. "Implementation-Vendor" to "Mamoe Technologies",
  146. "Implementation-Title" to this.name.toString(),
  147. "Implementation-Version" to this.version.toString()
  148. )
  149. }*/
  150. }
  151. }
  152. fun Project.configureEncoding() {
  153. tasks.withType(JavaCompile::class.java) {
  154. options.encoding = "UTF8"
  155. }
  156. }
  157. fun Project.configureKotlinTestSettings() {
  158. tasks.withType(Test::class) {
  159. useJUnitPlatform()
  160. }
  161. when {
  162. isKotlinJvmProject -> {
  163. dependencies {
  164. testImplementation(kotlin("test-junit5"))
  165. testApi("org.junit.jupiter:junit-jupiter-api:5.2.0")
  166. testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.2.0")
  167. }
  168. }
  169. isKotlinMpp -> {
  170. kotlinSourceSets?.forEach { sourceSet ->
  171. if (sourceSet.name == "common") {
  172. sourceSet.dependencies {
  173. implementation(kotlin("test"))
  174. implementation(kotlin("test-annotations-common"))
  175. }
  176. } else {
  177. sourceSet.dependencies {
  178. implementation(kotlin("test-junit5"))
  179. implementation("org.junit.jupiter:junit-jupiter-api:5.2.0")
  180. implementation("org.junit.jupiter:junit-jupiter-engine:5.2.0")
  181. }
  182. }
  183. }
  184. }
  185. }
  186. }
  187. fun Project.configureKotlinCompilerSettings() {
  188. val kotlinCompilations = kotlinCompilations ?: return
  189. for (kotlinCompilation in kotlinCompilations) with(kotlinCompilation) {
  190. if (isKotlinJvmProject) {
  191. @Suppress("UNCHECKED_CAST")
  192. this as KotlinCompilation<KotlinJvmOptions>
  193. }
  194. kotlinOptions.freeCompilerArgs += "-Xjvm-default=all"
  195. }
  196. }
  197. val experimentalAnnotations = arrayOf(
  198. "kotlin.RequiresOptIn",
  199. "kotlin.contracts.ExperimentalContracts",
  200. "kotlin.experimental.ExperimentalTypeInference",
  201. "net.mamoe.mirai.utils.MiraiInternalAPI",
  202. "net.mamoe.mirai.utils.MiraiExperimentalAPI",
  203. "net.mamoe.mirai.LowLevelAPI",
  204. "kotlinx.serialization.ExperimentalSerializationApi"
  205. )
  206. fun Project.configureKotlinExperimentalUsages() {
  207. val sourceSets = kotlinSourceSets ?: return
  208. for (target in sourceSets) {
  209. experimentalAnnotations.forEach { a ->
  210. target.languageSettings.useExperimentalAnnotation(a)
  211. target.languageSettings.progressiveMode = true
  212. target.languageSettings.enableLanguageFeature("InlineClasses")
  213. }
  214. }
  215. }
  216. fun Project.configureFlattenSourceSets() {
  217. sourceSets {
  218. findByName("main")?.apply {
  219. resources.setSrcDirs(listOf(projectDir.resolve("resources")))
  220. java.setSrcDirs(listOf(projectDir.resolve("src")))
  221. }
  222. findByName("test")?.apply {
  223. resources.setSrcDirs(listOf(projectDir.resolve("resources")))
  224. java.setSrcDirs(listOf(projectDir.resolve("test")))
  225. }
  226. }
  227. }
  228. val Project.kotlinSourceSets get() = extensions.findByName("kotlin").safeAs<KotlinProjectExtension>()?.sourceSets
  229. val Project.kotlinTargets
  230. get() =
  231. extensions.findByName("kotlin").safeAs<KotlinSingleTargetExtension>()?.target?.let { listOf(it) }
  232. ?: extensions.findByName("kotlin").safeAs<KotlinMultiplatformExtension>()?.targets
  233. val Project.isKotlinJvmProject: Boolean get() = extensions.findByName("kotlin") is KotlinJvmProjectExtension
  234. val Project.isKotlinMpp: Boolean get() = extensions.findByName("kotlin") is KotlinMultiplatformExtension
  235. val Project.kotlinCompilations
  236. get() = kotlinTargets?.flatMap { it.compilations }