diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt index 75bd6c55c41..c6fb4d91bdd 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt @@ -1148,7 +1148,7 @@ class StubGenerator( /** * Produces to [out] the contents of C source file to be compiled into JNI lib used for Kotlin bindings impl. */ - fun generateCFile(headerFiles: List) { + fun generateCFile(headerFiles: List, entryPoint: String?) { out("#include ") if (platform == KotlinPlatform.JVM) { out("#include ") @@ -1167,6 +1167,14 @@ class StubGenerator( System.err.println("Warning: cannot generate C JNI function definition ${func.name}") } } + + if (entryPoint != null) { + out("extern int Konan_main(int argc, char** argv);") + out("") + out("int $entryPoint(int argc, char** argv) {") + out(" return Konan_main(argc, argv);") + out("}") + } } private tailrec fun Type.unwrapTypedefs(): Type = if (this is Typedef) { diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 56dcf1bccb1..73e79770c1a 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -238,6 +238,7 @@ private fun processLib(konanHome: String, defaultOpts + additionalCompilerOpts val compiler = "clang" val language = Language.C + val entryPoint = config.getSpaceSeparated("entryPoint").singleOrNull() val linkerOpts = config.getSpaceSeparated("linkerOpts").toTypedArray() + defaultOpts + additionalLinkerOpts @@ -282,7 +283,7 @@ private fun processLib(konanHome: String, outCFile.bufferedWriter().use { out -> gen.withOutput({ out.appendln(it) }) { - gen.generateCFile(headerFiles) + gen.generateCFile(headerFiles, entryPoint) } } diff --git a/runtime/src/launcher/cpp/launcher.cpp b/runtime/src/launcher/cpp/launcher.cpp index e2b864d775b..fcbc098a306 100644 --- a/runtime/src/launcher/cpp/launcher.cpp +++ b/runtime/src/launcher/cpp/launcher.cpp @@ -18,9 +18,9 @@ OBJ_GETTER(setupArgs, int argc, char** argv) { } //--- main --------------------------------------------------------------------// -extern "C" KInt Konan_start(const ObjHeader* ); +extern "C" KInt Konan_start(const ObjHeader*); -int main(int argc, char** argv) { +extern "C" int Konan_main(int argc, char** argv) { RuntimeState* state = InitRuntime(); if (state == nullptr) { diff --git a/runtime/src/launcher/cpp/main.cpp b/runtime/src/launcher/cpp/main.cpp new file mode 100644 index 00000000000..34f3545e7f1 --- /dev/null +++ b/runtime/src/launcher/cpp/main.cpp @@ -0,0 +1,5 @@ +extern "C" int Konan_main(int argc, char** argv); + +int main(int argc, char** argv) { + return Konan_main(argc, argv); +} diff --git a/samples/tetris/build b/samples/tetris/build index 17f7c3895ec..7ced5eb42f9 100755 --- a/samples/tetris/build +++ b/samples/tetris/build @@ -4,6 +4,8 @@ DIR=. DIST=../../dist OSX_CFLAGS=-I/Library/Frameworks/SDL2.framework/Headers OSX_LINKER_ARGS="-F /Library/Frameworks -framework SDL2" +#OSX_CFLAGS=-I/opt/local/include/SDL2 +#OSX_LINKER_ARGS="-L/opt/local/lib -lSDL2" LINUX_CFLAGS=-I/usr/include/SDL2 LINUX_LINKER_ARGS="-L/usr/lib/x86_64-linux-gnu -lSDL2" diff --git a/samples/tetris/sdl.def b/samples/tetris/sdl.def index b8e18998011..65774b895ac 100644 --- a/samples/tetris/sdl.def +++ b/samples/tetris/sdl.def @@ -2,6 +2,7 @@ headers = SDL.h stdio.h string.h unistd.h stdlib.h time.h excludedFunctions = _IO_flockfile _IO_funlockfile _IO_ftrylockfile \ _IO_cleanup_region_start _IO_cleanup_region_end \ mkstemp_dprotected_np +entryPoint = SDL_main compilerOpts.osx = -D_POSIX_SOURCE -mxsave -mavx -mf16c compilerOpts.linux = -D_REENTRANT diff --git a/samples/tetris/tetris.kt b/samples/tetris/tetris.kt index 6d14d3e130d..fa65c86f440 100644 --- a/samples/tetris/tetris.kt +++ b/samples/tetris/tetris.kt @@ -491,10 +491,6 @@ class Game(width: Int, height: Int, val visualizer: GameFieldVisualizer, val use } -fun main(args: Array) { - SDL_main(args) -} - fun get_SDL_Error() = SDL_GetError()!!.asCString().toString() class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, UserInput { @@ -806,8 +802,7 @@ class SDL_Visualizer(val width: Int, val height: Int): GameFieldVisualizer, User } } -@ExportForCppRuntime("SDL_main") -fun SDL_main(args: Array) { +fun main(args: Array) { var startLevel = 0 var width = 10 var height = 20 @@ -828,4 +823,4 @@ fun SDL_main(args: Array) { game.startNewGame(startLevel) return -} \ No newline at end of file +}