diff options
Diffstat (limited to 'compiler/tccgen.nim')
-rw-r--r-- | compiler/tccgen.nim | 59 |
1 files changed, 36 insertions, 23 deletions
diff --git a/compiler/tccgen.nim b/compiler/tccgen.nim index 8397185e8..9ee8516c4 100644 --- a/compiler/tccgen.nim +++ b/compiler/tccgen.nim @@ -8,12 +8,20 @@ # import - os, strutils, options, msgs, tinyc + os, strutils, options, msgs, tinyc, lineinfos, sequtils -{.compile: "../tinyc/libtcc.c".} +const tinyPrefix = "dist/nim-tinyc-archive".unixToNativePath +const nimRoot = currentSourcePath.parentDir.parentDir +const tinycRoot = nimRoot / tinyPrefix +when not dirExists(tinycRoot): + static: raiseAssert $(tinycRoot, "requires: ./koch installdeps tinyc") +{.compile: tinycRoot / "tinyc/libtcc.c".} + +var + gConf: ConfigRef # ugly but can be cleaned up if this is revived proc tinyCErrorHandler(closure: pointer, msg: cstring) {.cdecl.} = - rawMessage(errGenerated, $msg) + rawMessage(gConf, errGenerated, $msg) proc initTinyCState: PccState = result = openCCState() @@ -25,7 +33,7 @@ var proc addFile(filename: string) = if addFile(gTinyC, filename) != 0'i32: - rawMessage(errCannotOpenFile, filename) + rawMessage(gConf, errCannotOpenFile, filename) proc setupEnvironment = when defined(amd64): @@ -35,42 +43,47 @@ proc setupEnvironment = when defined(linux): defineSymbol(gTinyC, "__linux__", nil) defineSymbol(gTinyC, "__linux", nil) - var nimDir = getPrefixDir() - addIncludePath(gTinyC, libpath) + var nimDir = getPrefixDir(gConf).string + var tinycRoot = nimDir / tinyPrefix + let libpath = nimDir / "lib" + + addIncludePath(gTinyC, cstring(libpath)) when defined(windows): - addSysincludePath(gTinyC, nimDir / "tinyc/win32/include") - addSysincludePath(gTinyC, nimDir / "tinyc/include") + addSysincludePath(gTinyC, cstring(tinycRoot / "tinyc/win32/include")) + addSysincludePath(gTinyC, cstring(tinycRoot / "tinyc/include")) when defined(windows): defineSymbol(gTinyC, "_WIN32", nil) # we need Mingw's headers too: - var gccbin = getConfigVar("gcc.path") % ["nim", nimDir] - addSysincludePath(gTinyC, gccbin /../ "include") - #addFile(nimDir / r"tinyc\win32\wincrt1.o") - addFile(nimDir / r"tinyc\win32\alloca86.o") - addFile(nimDir / r"tinyc\win32\chkstk.o") - #addFile(nimDir / r"tinyc\win32\crt1.o") + var gccbin = getConfigVar("gcc.path") % ["nim", tinycRoot] + addSysincludePath(gTinyC, cstring(gccbin /../ "include")) + #addFile(tinycRoot / r"tinyc\win32\wincrt1.o") + addFile(tinycRoot / r"tinyc\win32\alloca86.o") + addFile(tinycRoot / r"tinyc\win32\chkstk.o") + #addFile(tinycRoot / r"tinyc\win32\crt1.o") - #addFile(nimDir / r"tinyc\win32\dllcrt1.o") - #addFile(nimDir / r"tinyc\win32\dllmain.o") - addFile(nimDir / r"tinyc\win32\libtcc1.o") + #addFile(tinycRoot / r"tinyc\win32\dllcrt1.o") + #addFile(tinycRoot / r"tinyc\win32\dllmain.o") + addFile(tinycRoot / r"tinyc\win32\libtcc1.o") - #addFile(nimDir / r"tinyc\win32\lib\crt1.c") - #addFile(nimDir / r"tinyc\lib\libtcc1.c") + #addFile(tinycRoot / r"tinyc\win32\lib\crt1.c") + #addFile(tinycRoot / r"tinyc\lib\libtcc1.c") else: addSysincludePath(gTinyC, "/usr/include") when defined(amd64): addSysincludePath(gTinyC, "/usr/include/x86_64-linux-gnu") -proc compileCCode*(ccode: string) = +proc compileCCode*(ccode: string, conf: ConfigRef) = + gConf = conf if not libIncluded: libIncluded = true setupEnvironment() discard compileString(gTinyC, ccode) -proc run*(args: string) = - var s = @[cstring(gProjectName)] & map(split(args), proc(x: string): cstring = cstring(x)) +proc run*(conf: ConfigRef, args: string) = + doAssert gConf == conf + var s = @[cstring(conf.projectName)] & map(split(args), proc(x: string): cstring = cstring(x)) var err = tinyc.run(gTinyC, cint(s.len), cast[cstringArray](addr(s[0]))) != 0'i32 closeCCState(gTinyC) - if err: rawMessage(errExecutionOfProgramFailed, "") + if err: rawMessage(conf, errUnknown, "") |