diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/cgen.nim | 4 | ||||
-rw-r--r-- | compiler/main.nim | 2 | ||||
-rw-r--r-- | compiler/nim.nim | 2 | ||||
-rw-r--r-- | compiler/tccgen.nim | 55 |
4 files changed, 38 insertions, 25 deletions
diff --git a/compiler/cgen.nim b/compiler/cgen.nim index e93465d73..a8045e054 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -1941,8 +1941,8 @@ proc writeModule(m: BModule, pending: bool) = var code = genModule(m, cf) if code != nil or m.config.symbolFiles != disabledSf: when hasTinyCBackend: - if conf.cmd == cmdRun: - tccgen.compileCCode($code) + if m.config.cmd == cmdRun: + tccgen.compileCCode($code, m.config) onExit() return diff --git a/compiler/main.nim b/compiler/main.nim index 0b538cb5a..217858137 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -200,7 +200,7 @@ proc mainCommand*(graph: ModuleGraph) = of "run": conf.cmd = cmdRun when hasTinyCBackend: - extccomp.setCC("tcc") + extccomp.setCC(conf, "tcc", unknownLineInfo) commandCompileToC(graph) else: rawMessage(conf, errGenerated, "'run' command not available; rebuild with -d:tinyc") diff --git a/compiler/nim.nim b/compiler/nim.nim index b916f0d85..4bcb1b510 100644 --- a/compiler/nim.nim +++ b/compiler/nim.nim @@ -98,7 +98,7 @@ proc handleCmdLine(cache: IdentCache; conf: ConfigRef) = if conf.errorCounter != 0: return when hasTinyCBackend: if conf.cmd == cmdRun: - tccgen.run(conf.arguments) + tccgen.run(conf, conf.arguments) if optRun in conf.globalOptions: var ex = quoteShell conf.absOutFile if conf.cmd == cmdCompileToJS: diff --git a/compiler/tccgen.nim b/compiler/tccgen.nim index 8397185e8..ba553906a 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: doAssert false, $(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() + + var nimDir = getPrefixDir(gConf).string + var tinycRoot = nimDir / tinyPrefix + let libpath = nimDir / "lib" addIncludePath(gTinyC, libpath) when defined(windows): - addSysincludePath(gTinyC, nimDir / "tinyc/win32/include") - addSysincludePath(gTinyC, nimDir / "tinyc/include") + addSysincludePath(gTinyC, tinycRoot / "tinyc/win32/include") + addSysincludePath(gTinyC, tinycRoot / "tinyc/include") when defined(windows): defineSymbol(gTinyC, "_WIN32", nil) # we need Mingw's headers too: - var gccbin = getConfigVar("gcc.path") % ["nim", nimDir] + var gccbin = getConfigVar("gcc.path") % ["nim", tinycRoot] 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") + #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, "") |