Comment by archargelod
3 months ago
> Never used Nim before so I might be doing something wrong though.
With Nim on weird targets you usually want:
- OS target = any
- Memory Management = ARC
- malloc instead of default Nim allocator
- turn off signal handler (if not POSIX)
- disable threads (most of the time)
Then look at how C is compiled and copy all compiler+linker flags to your Nim configuration. Here's an absolute minimal `config.nims` I used to compile Nim for C64 with LLVM-MOS[1] toolchain:
import std/strutils
--cc:clang
--clang.exe:"mos-c64-clang"
--os:any
--cpu:avr
--mm:arc
--threads:off
--define:usemalloc
--define:noSignalHandler
let args = [
"-isystem $PWD/../mos-platform/c64/include",
"-I$PWD/../mos-platform/c64/asminc",
"-L$PWD/../mos-platform/c64/lib",
"-mlto-zp=110",
"-D__C64__",
"-isystem $PWD/../mos-platform/commodore/include",
"-I$PWD/../mos-platform/commodore/asminc",
"-L$PWD/../mos-platform/commodore/lib",
"-D__CBM__",
"-isystem $PWD/../mos-platform/common/include",
"-I$PWD/../mos-platform/common/asminc",
"-L$PWD/../mos-platform/common/lib",
"--target=mos",
"-flto",
"-Os",
].join(" ")
switch("passC", args)
switch("passL", args)
Nim side was easy, because I have already compiled Nim to WASM at that point and the flags are similar. Hard part was figuring out the C compiler flags: e.g. cmake structure and why compiler complains about missing symbols, when they're not missing (answer: include/lib order is very important).
No comments yet
Contribute on Hacker News ↗