Skip to content

Commit 1dc05aa

Browse files
committed
chore: kotlin native refactorings
1 parent dbfac1f commit 1dc05aa

File tree

14 files changed

+112
-228
lines changed

14 files changed

+112
-228
lines changed

backend/native/build.gradle.kts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ val appBinName = "app"
2121
description = "Ktor native application"
2222

2323
kotlin {
24-
allNativeTargets()
24+
nativeTargets(project)
2525

2626
targets.withType<KotlinNativeTarget>().configureEach {
2727
binaries {
@@ -49,12 +49,11 @@ kotlin {
4949
commonMain { dependencies { api(projects.shared) } }
5050
nativeMain {
5151
dependencies {
52-
api(libs.ktor.client.cio)
5352
api(libs.kaml)
5453
api(libs.kmp.appdirs)
5554
api(libs.kfswatch)
5655
api(libs.chasm)
57-
// api(libs.arrow.suspendapp.ktor)
56+
api(libs.kmp.process)
5857
}
5958
}
6059

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import kotlinx.cinterop.toKString
2+
import platform.posix.getpass
3+
4+
actual fun readPassword(prompt: String) = getpass(prompt)?.toKString()

backend/native/src/appleMain/kotlin/Process.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import kotlinx.cinterop.toKString
2+
import platform.posix.getpass
3+
4+
actual fun readPassword(prompt: String) = getpass(prompt)?.toKString()

backend/native/src/linuxMain/kotlin/Process.kt

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import kotlinx.cinterop.*
2+
import platform.windows.*
3+
4+
actual fun readPassword(prompt: String): String? = memScoped {
5+
print(prompt)
6+
7+
val handle = GetStdHandle(STD_INPUT_HANDLE)
8+
if (handle == INVALID_HANDLE_VALUE) {
9+
error("Standard input not available!")
10+
}
11+
12+
val record = alloc<INPUT_RECORD>()
13+
val read = alloc<DWORDVar>()
14+
15+
buildString {
16+
while (true) {
17+
val numberOfRecordsToRead = 1.convert<DWORD>()
18+
if (ReadConsoleInput?.let { it(handle, record.ptr, numberOfRecordsToRead, read.ptr) } == 0) {
19+
error("Could not read console input")
20+
}
21+
22+
if (record.EventType == KEY_EVENT.toUShort() && record.Event.KeyEvent.bKeyDown != 0) {
23+
val char = record.Event.KeyEvent.uChar.UnicodeChar
24+
if (char == '\r'.code.toUShort()) {
25+
break
26+
} else if (char != 0.toUShort()) {
27+
append(char)
28+
}
29+
}
30+
}
31+
}
32+
}

backend/native/src/mingwMain/kotlin/Process.kt

Lines changed: 0 additions & 83 deletions
This file was deleted.

backend/native/src/nativeMain/kotlin/Main.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,17 @@ import com.charleskorn.kaml.Yaml
22
import dev.suresh.Greeting
33
import dev.suresh.flow.timerComposeFlow
44
import dev.suresh.http.MediaApiClient
5+
import io.matthewnelson.kmp.process.*
56
import kotlin.reflect.typeOf
67
import kotlin.time.Duration
8+
import kotlin.time.Duration.Companion.seconds
79
import kotlinx.coroutines.flow.take
810
import kotlinx.coroutines.runBlocking
911
import kotlinx.io.files.Path
10-
import kotlinx.serialization.*
12+
import kotlinx.serialization.Serializable
13+
import kotlinx.serialization.decodeFromString
1114
import wasm.execWasm
1215

13-
data class ProcessResult(val code: Int, val rawOutput: String?)
14-
15-
expect fun execute(command: String, vararg args: String): ProcessResult
16-
1716
expect fun readPassword(prompt: String): String?
1817

1918
fun main(args: Array<String>): Unit = runBlocking {
@@ -25,8 +24,15 @@ fun main(args: Array<String>): Unit = runBlocking {
2524
timerComposeFlow().take(count).collect(::println)
2625

2726
println("Executing command...")
28-
runCatching { execute("ls", "-l").also(::println) }
29-
.onFailure { println("Failed to execute command: ${it.message}") }
27+
val ps =
28+
Process.Builder(command = "ls")
29+
.args("-l")
30+
.destroySignal(Signal.SIGKILL)
31+
.stdout(Stdio.Inherit)
32+
.stderr(Stdio.Inherit)
33+
34+
val exit = ps.spawn { it.waitForAsync(2.seconds) ?: -1 }
35+
println("Process exited: $exit")
3036

3137
println("Reflection Simple name ${this::class.simpleName}")
3238
println("Reflection Simple name ${this::class.qualifiedName}")

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ kotlin.build.report.output=build_scan
2222
kotlinx.atomicfu.enableJvmIrTransformation=true
2323
kotlinx.atomicfu.enableNativeIrTransformation=true
2424
kotlinx.atomicfu.enableJsIrTransformation=true
25-
kapt.use.k2=true
2625

2726
## Kotlin/JS
2827
kotlin.js.yarn=false
@@ -31,6 +30,7 @@ kotlin.js.yarn=false
3130
kotlin.incremental.native=true
3231
kotlin.native.binary.gc=cms
3332
kotlin.native.ignoreDisabledTargets=true
33+
kotlin.native.enableKlibsCrossCompilation=true
3434
# kotlin.mpp.enableCInteropCommonization=true
3535

3636
## Dokka

gradle/build-logic/src/main/kotlin/common/Multiplatform.kt

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import org.gradle.api.GradleException
44
import org.gradle.api.Project
55
import org.gradle.kotlin.dsl.*
66
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
7-
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeCompilerOptions
87
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
98
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
109
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
@@ -260,32 +259,47 @@ fun KotlinMultiplatformExtension.hostNativeTarget(configure: KotlinNativeTarget.
260259
throw GradleException("Host OS '${Platform.currentOS}' is not supported in Kotlin/Native")
261260
}
262261

263-
fun KotlinNativeCompilerOptions.configureKotlinNative() {
264-
// freeCompilerArgs.addAll("-Xverbose-phases=Linker", "-Xruntime-logs=gc=info")
265-
}
266-
267-
fun KotlinMultiplatformExtension.allNativeTargets(winTarget: Boolean = false, configure: KotlinNativeTarget.() -> Unit = {}) {
268-
fun KotlinNativeTarget.configureAll() {
269-
// KotlinNativeTargetWithHostTests
270-
compilerOptions { configureKotlinNative() }
271-
configure()
272-
}
273-
274-
compilerOptions {
275-
optIn.addAll(
276-
"kotlinx.cinterop.ExperimentalForeignApi",
277-
"kotlin.experimental.ExperimentalNativeApi",
278-
)
279-
}
280-
281-
macosX64 { configureAll() }
282-
macosArm64 { configureAll() }
283-
linuxX64 { configureAll() }
284-
linuxArm64 { configureAll() }
285-
if(winTarget) {
286-
mingwX64 { configureAll() }
287-
}
288-
}
262+
fun KotlinMultiplatformExtension.nativeTargets(
263+
project: Project,
264+
configure: KotlinNativeTarget.() -> Unit = {}
265+
) =
266+
with(project) {
267+
val nativeBuild: String? by project
268+
val nativeWinTarget: String? by project
269+
270+
if (nativeBuild.toBoolean()) {
271+
fun KotlinNativeTarget.configureAll() {
272+
compilerOptions {
273+
// freeCompilerArgs.addAll("-Xverbose-phases=Linker", "-Xruntime-logs=gc=info")
274+
}
275+
configure()
276+
}
277+
278+
compilerOptions {
279+
optIn.addAll(
280+
"kotlinx.cinterop.ExperimentalForeignApi",
281+
"kotlin.experimental.ExperimentalNativeApi",
282+
)
283+
}
284+
285+
macosX64 { configureAll() }
286+
macosArm64 { configureAll() }
287+
linuxX64 { configureAll() }
288+
linuxArm64 { configureAll() }
289+
if (nativeWinTarget.toBoolean()) {
290+
mingwX64 { configureAll() }
291+
}
292+
293+
sourceSets {
294+
nativeMain {
295+
dependencies {
296+
api(libs.ktor.client.cio)
297+
// api(libs.arrow.suspendapp.ktor)
298+
}
299+
}
300+
}
301+
}
302+
}
289303

290304
fun KotlinMultiplatformExtension.addKspDependencyForAllTargets(
291305
project: Project,

0 commit comments

Comments
 (0)