Skip to content

Commit

Permalink
undo
Browse files Browse the repository at this point in the history
  • Loading branch information
Mr3zee committed Sep 23, 2024
1 parent 2db829c commit 897d7dc
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 130 deletions.
2 changes: 0 additions & 2 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import util.applyAtomicfuPlugin

plugins {
alias(libs.plugins.conventions.kmp)
alias(libs.plugins.kotlinx.rpc)
alias(libs.plugins.serialization)
}

applyAtomicfuPlugin()
Expand Down
72 changes: 24 additions & 48 deletions gradle-conventions-settings/src/main/kotlin/util/JsTarget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,77 +4,53 @@

package util

import org.gradle.api.Action
import org.gradle.kotlin.dsl.getValue
import org.gradle.kotlin.dsl.getting
import org.gradle.kotlin.dsl.invoke
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import java.io.File

fun ProjectKotlinConfig.configureJsAndWasmJs() {
configureJsAndWasmJsTasks()
if (!js) {
return
}

kotlin {
sourceSets {
if (js) {
jsTest {
puppeteer()
}
}

if (wasmJs) {
wasmJsMain {
dependencies {
implementation(libs.kotlinx.browser)
}
}
js(IR) {
configureJsAndWasmJsTasks()
}

wasmJsTest {
puppeteer()
}
sourceSets {
val jsTest by getting {
puppeteer()
}
}
}
}

private fun KotlinSourceSet.puppeteer() {
fun KotlinSourceSet.puppeteer() {
dependencies {
implementation(npm("puppeteer", "*"))
}
}

private fun ProjectKotlinConfig.configureJsAndWasmJsTasks() {
kotlin {
jsAnsWasmJs(this@configureJsAndWasmJsTasks) {
nodejs {
testTask {
useMocha {
timeout = "10000"
}
}
fun KotlinJsTargetDsl.configureJsAndWasmJsTasks() {
nodejs {
testTask {
useMocha {
timeout = "10000"
}
}
}

(this as KotlinJsIrTarget).whenBrowserConfigured {
testTask {
useKarma {
useChromeHeadless()
useConfigDirectory(File(project.rootProject.projectDir, "karma"))
}
}
(this as KotlinJsIrTarget).whenBrowserConfigured {
testTask {
useKarma {
useChromeHeadless()
useConfigDirectory(File(project.rootProject.projectDir, "karma"))
}
}
}
}

@OptIn(ExperimentalWasmDsl::class)
private fun KotlinMultiplatformExtension.jsAnsWasmJs(
config: ProjectKotlinConfig,
configure: Action<KotlinJsTargetDsl>,
) {
listOfNotNull(
if (config.js) js(IR) else null,
if (config.wasmJs) wasmJs() else null,
).forEach { configure(it) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,80 @@

package util

import groovy.json.JsonSlurper
import org.gradle.api.Project
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.provideDelegate
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import java.io.File
import kotlin.reflect.full.memberFunctions

const val UNSUPPORTED_TARGET = "-"
const val FULLY_SUPPORTED_TARGET = "*"
const val TARGETS_SINCE_KOTLIN_LOOKUP_PATH = "versions-root/targets-since-kotlin-lookup.json"

/**
* In the lookup table:
* "*" – target supported any Kotlin compiler version
* "-" – target supported none of Kotlin compiler versions
* "<some_version>" – target supported since a <some_version> Kotlin version including that version
*/
@Suppress("UNCHECKED_CAST")
private fun loadTargetsSinceKotlinLookupTable(rootDir: String): Map<String, String> {
val file = File("$rootDir/$TARGETS_SINCE_KOTLIN_LOOKUP_PATH")
val table = JsonSlurper()
.parseText(file.readText(Charsets.UTF_8)) as Map<String, String>

return table.filterValues { value -> value != UNSUPPORTED_TARGET }
}

class ProjectKotlinConfig(
project: Project,
val kotlinVersion: KotlinVersion,
val jvm: Boolean = true,
val js: Boolean = true,
val wasmJs: Boolean = true,
val wasmWasi: Boolean = true,
jvm: Boolean = true,
js: Boolean = true,
wasmJs: Boolean = true,
wasmWasi: Boolean = true,
val native: Boolean = true,
) : Project by project
) : Project by project {
private val targetsLookup by lazy {
val globalRootDir: String by extra
loadTargetsSinceKotlinLookupTable(globalRootDir)
}

private fun isIncluded(
targetName: String,
kotlinVersion: KotlinVersion,
lookupTable: Map<String, String>,
): Boolean {
return lookupTable[targetName]?.let { sinceKotlin ->
sinceKotlin == FULLY_SUPPORTED_TARGET || sinceKotlin.kotlinVersionParsed() <= kotlinVersion
} ?: false
}

val jvm: Boolean by lazy { jvm && isIncluded("jvm", kotlinVersion, targetsLookup) }
val js: Boolean by lazy { js && isIncluded("js", kotlinVersion, targetsLookup) }
val wasmJs: Boolean by lazy { wasmJs && isIncluded("wasmJs", kotlinVersion, targetsLookup) }
val wasmWasi: Boolean by lazy { wasmWasi && isIncluded("wasmWasi", kotlinVersion, targetsLookup) }

private val nativeLookup by lazy {
targetsLookup.filterKeys { key ->
key != "jvm" && key != "js" && !key.startsWith("wasm")
}
}

fun nativeTargets(kmp: KotlinMultiplatformExtension) = kmp::class.memberFunctions
.filter { targetFunction ->
targetFunction.parameters.size == 1 && isIncluded(
targetName = targetFunction.name,
kotlinVersion = kotlinVersion,
lookupTable = nativeLookup,
)
}.map { function ->
function.call(kmp) as KotlinTarget
}
}

fun Project.withKotlinConfig(configure: ProjectKotlinConfig.() -> Unit) {
val kotlinVersion: KotlinVersion by extra
Expand Down
76 changes: 5 additions & 71 deletions gradle-conventions-settings/src/main/kotlin/util/TargetUtils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,66 +4,19 @@

package util

import groovy.json.JsonSlurper
import io.gitlab.arturbosch.detekt.extensions.DetektExtension
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.kotlin.dsl.the
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
import java.io.File
import kotlin.reflect.full.memberFunctions

const val UNSUPPORTED_TARGET = "-"
const val FULLY_SUPPORTED_TARGET = "*"
const val TARGETS_SINCE_KOTLIN_LOOKUP_PATH = "versions-root/targets-since-kotlin-lookup.json"

/**
* In the lookup table:
* "*" – target supported any Kotlin compiler version
* "-" – target supported none of Kotlin compiler versions
* "<some_version>" – target supported since a <some_version> Kotlin version including that version
*/
@Suppress("UNCHECKED_CAST")
private fun loadTargetsSinceKotlinLookupTable(rootDir: String): Map<String, String> {
val file = File("$rootDir/$TARGETS_SINCE_KOTLIN_LOOKUP_PATH")
val table = JsonSlurper()
.parseText(file.readText(Charsets.UTF_8)) as Map<String, String>

return table.filterValues { value -> value != UNSUPPORTED_TARGET }
}

private fun isIncluded(targetName: String, kotlinVersion: KotlinVersion, lookupTable: Map<String, String>): Boolean {
return lookupTable[targetName]?.let { sinceKotlin ->
sinceKotlin == FULLY_SUPPORTED_TARGET || sinceKotlin.kotlinVersionParsed() <= kotlinVersion
} ?: false
}

@OptIn(ExperimentalWasmDsl::class)
private fun KotlinMultiplatformExtension.configureTargets(
targetsLookup: Map<String, String>,
config: ProjectKotlinConfig,
): List<KotlinTarget> {
private fun KotlinMultiplatformExtension.configureTargets(config: ProjectKotlinConfig): List<KotlinTarget> {
val targets = mutableListOf<KotlinTarget>()

if (config.native) {
val nativeLookup = targetsLookup.filterKeys { key ->
key != "jvm" && key != "js" && !key.startsWith("wasm")
}

val nativeTargets = this::class.memberFunctions
.filter { targetFunction ->
targetFunction.parameters.size == 1 && isIncluded(
targetName = targetFunction.name,
kotlinVersion = config.kotlinVersion,
lookupTable = nativeLookup,
)
}.map { function ->
function.call(this) as KotlinTarget
}

val nativeTargets = config.nativeTargets(this)
targets.addAll(nativeTargets)

// TLDR: Default hierarchy template is enabled by default since 1.9.20
Expand All @@ -85,11 +38,11 @@ private fun KotlinMultiplatformExtension.configureTargets(
}
}

if (config.jvm && isIncluded("jvm", config.kotlinVersion, targetsLookup)) {
if (config.jvm) {
jvm().also { targets.add(it) }
}

if (config.js && isIncluded("js", config.kotlinVersion, targetsLookup)) {
if (config.js) {
js(IR) {
nodejs()
browser()
Expand All @@ -98,23 +51,6 @@ private fun KotlinMultiplatformExtension.configureTargets(
}.also { targets.add(it) }
}

if (config.wasmJs && isIncluded("wasmJs", config.kotlinVersion, targetsLookup)) {
wasmJs {
browser()
nodejs()

binaries.library()
}
}

if (config.wasmWasi && isIncluded("wasmWasi", config.kotlinVersion, targetsLookup)) {
wasmWasi {
nodejs()

binaries.library()
}
}

targets.forEach { target ->
target.mavenPublication {
setPublicArtifactId(config.project)
Expand All @@ -133,12 +69,10 @@ private fun Project.configureDetekt(targets: List<KotlinTarget>) {
}

fun ProjectKotlinConfig.configureKotlin(action: Action<KotlinMultiplatformExtension> = Action { }) {
val lookupTable = loadTargetsSinceKotlinLookupTable(rootProject.rootDir.absolutePath)

configureJsAndWasmJs()

kotlin {
val includedTargets = configureTargets(lookupTable, this@configureKotlin)
val includedTargets = configureTargets(this@configureKotlin)

configureDetekt(includedTargets)

Expand Down
6 changes: 2 additions & 4 deletions gradle-conventions/src/main/kotlin/conventions-kmp.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
*/

import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import util.configureJvm
import util.configureKotlin
import util.optInForRPCApi
import util.withKotlinConfig
import util.*

plugins {
id("conventions-common")
Expand All @@ -21,6 +18,7 @@ configure<KotlinMultiplatformExtension> {

withKotlinConfig {
configureKotlin()
configureWasm()
}

configureJvm(isKmp = true)
45 changes: 45 additions & 0 deletions gradle-conventions/src/main/latest/util/wasm.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package util

import org.gradle.kotlin.dsl.invoke
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl

@OptIn(ExperimentalWasmDsl::class)
fun ProjectKotlinConfig.configureWasm() {
kotlin {
if (wasmJs) {
wasmJs {
configureJsAndWasmJsTasks()

browser()
nodejs()
d8()

binaries.library()
}

sourceSets {
wasmJsMain {
dependencies {
implementation(libs.kotlinx.browser)
}
}

wasmJsTest {
puppeteer()
}
}
}

if (wasmWasi) {
wasmWasi {
nodejs()

binaries.library()
}
}
}
}
9 changes: 9 additions & 0 deletions gradle-conventions/src/main/pre_1_9_25/util/wasm.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package util

fun ProjectKotlinConfig.configureWasm() {
// do nothing
}

0 comments on commit 897d7dc

Please sign in to comment.