3

Hi I am getting started with KotlinJS on Node and I've put a very simple kotlin file and I want to compile it using the raw kotlinc-js compiler. Without using gradle

package main

fun heavy() {
    (1..10_000_000).forEach { it*it }
}

fun main() {
    heavy()
    println("Bye JS")
}

Here's the make command I've tried yet without success:

build-js:
    kotlinc-js main.kt -output main.kt.js

It compiles fine, but when I attempt to run node main.kt.js:

throw new Error("Error loading module 'main.kt'. Its dependency 'kotlin' was not found. Please, check whether 'kotlin' is loaded prior to 'main.kt'."); ^

Error: Error loading module 'main.kt'. Its dependency 'kotlin' was not found. Please, check whether 'kotlin' is loaded prior to 'main.kt'. at Object. (/home/nanospicer/KotlinProjects/KotlinScripting/main.kt.js:2:9) at Module._compile (node:internal/modules/cjs/loader:1101:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12) at node:internal/main/run_main_module:17:47

Ok, so I figured it's missing the kotlin runtime. I'll try same argument as the JVM compiler: -include-runtime which leads to the error:

error: invalid argument: -include-runtime info: use -help for more information

Then I tried:

build-js:
    kotlinc-js main.kt -kotlin-home "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/" -libraries "/mnt/c/Program Files/JetBrains/IntelliJ IDEA Community Edition 2021.2.1/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar" -module-kind commonjs -main call -output main.kt.js

But it still leads to the same error. I also tried removing the libraries flag and it didnt work either

Some random IT boy
  • 7,569
  • 2
  • 21
  • 47
  • This isn't really a makefile issue. Run the build command at your shell prompt and it will fail the same way, so you know it has nothing to do with the makefile. Once you figure out how to get it to work from the command line, you can put that same working command into your makefile. – MadScientist Oct 03 '21 at 19:38
  • Yea, the problem is the `kotlinc-js` and that's what I am asking. I know makefile just executes the commands there – Some random IT boy Oct 03 '21 at 19:40

1 Answers1

6

I've found the culprits.

I basically created a nodejs project from IntelliJ IDEA and took a quick read through the gradle tasks which hinted me that it was preparing a node environment for me under the hood.

I took a quick glance at npm.js and found that in fact there's a package called kotlin which is the javascript's stdlib for the compiler.

I finally tweaked the build command on my Makefile to use a module-kind of common-js and it worked out!

//Definitive main.kt I ended up using
fun heavy() {
    (1..100_000_000).forEach { it*it }
}

fun main() {
    heavy()
    println("Bye JS")
}

Install kotlin's stdlib using npm:

$ npm i kotlin --save

And my Makefile build command looks like:

$ kotlinc-js main.kt -module-kind commonjs -main call -output main.kt.js

A small breakdown of the arguments:

  • -module-kind commonjs it's telling the compiler to generate the code-style for a node project (not quite, but you get the gist)
  • -main call determines whether the compiled module should invoke the main function. This is because if we set the value to noCall we're not gonna run the main function and it may behave just like a library.
  • -output main.kt.js the name I chose myself without any reason, as long as it's a .js file you'll be able to run it but I wanted to keep it like this to compare it to another main.js file I was generating!
Some random IT boy
  • 7,569
  • 2
  • 21
  • 47