diff options
Diffstat (limited to 'rod/options.nim')
-rwxr-xr-x | rod/options.nim | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/rod/options.nim b/rod/options.nim new file mode 100755 index 000000000..69c869263 --- /dev/null +++ b/rod/options.nim @@ -0,0 +1,196 @@ +# +# +# The Nimrod Compiler +# (c) Copyright 2009 Andreas Rumpf +# +# See the file "copying.txt", included in this +# distribution, for details about the copyright. +# + +import + os, lists, strutils, nstrtabs + +type # please make sure we have under 32 options + # (improves code efficiency a lot!) + TOption* = enum # **keep binary compatible** + optNone, optObjCheck, optFieldCheck, optRangeCheck, optBoundsCheck, + optOverflowCheck, optNilCheck, optAssert, optLineDir, optWarns, optHints, + optOptimizeSpeed, optOptimizeSize, optStackTrace, # stack tracing support + optLineTrace, # line tracing support (includes stack tracing) + optEndb, # embedded debugger + optByRef, # use pass by ref for objects (for interfacing with C) + optCheckpoints, # check for checkpoints (used for debugging) + optProfiler # profiler turned on + TOptions* = set[TOption] + TGlobalOption* = enum + gloptNone, optForceFullMake, optBoehmGC, optRefcGC, optDeadCodeElim, + optListCmd, optCompileOnly, optNoLinking, optSafeCode, # only allow safe code + optCDebug, # turn on debugging information + optGenDynLib, # generate a dynamic library + optGenGuiApp, # generate a GUI application + optGenScript, # generate a script file to compile the *.c files + optGenMapping, # generate a mapping file + optRun, # run the compiled project + optSymbolFiles, # use symbol files for speeding up compilation + optSkipConfigFile, # skip the general config file + optSkipProjConfigFile, # skip the project's config file + optNoMain # do not generate a "main" proc + TGlobalOptions* = set[TGlobalOption] + TCommands* = enum # Nimrod's commands + cmdNone, cmdCompileToC, cmdCompileToCpp, cmdCompileToEcmaScript, + cmdCompileToLLVM, cmdInterpret, cmdPretty, cmdDoc, cmdPas, cmdBoot, + cmdGenDepend, cmdListDef, cmdCheck, # semantic checking for whole project + cmdParse, # parse a single file (for debugging) + cmdScan, # scan a single file (for debugging) + cmdDebugTrans, # debug a transformation pass + cmdRst2html, # convert a reStructuredText file to HTML + cmdRst2tex, # convert a reStructuredText file to TeX + cmdInteractive # start interactive session + TStringSeq* = seq[string] + +const + ChecksOptions* = {optObjCheck, optFieldCheck, optRangeCheck, optNilCheck, + optOverflowCheck, optBoundsCheck, optAssert} + optionToStr*: array[TOption, string] = ["optNone", "optObjCheck", + "optFieldCheck", "optRangeCheck", "optBoundsCheck", "optOverflowCheck", + "optNilCheck", "optAssert", "optLineDir", "optWarns", "optHints", + "optOptimizeSpeed", "optOptimizeSize", "optStackTrace", "optLineTrace", + "optEmdb", "optByRef", "optCheckpoints", "optProfiler"] + +var + gOptions*: TOptions = {optObjCheck, optFieldCheck, optRangeCheck, + optBoundsCheck, optOverflowCheck, optAssert, optWarns, + optHints, optStackTrace, optLineTrace} + gGlobalOptions*: TGlobalOptions = {optRefcGC} + gExitcode*: int8 + searchPaths*: TLinkedList + outFile*: string = "" + gIndexFile*: string = "" + gCmd*: TCommands = cmdNone # the command + gVerbosity*: int # how verbose the compiler is + gNumberOfProcessors*: int # number of processors + +proc FindFile*(f: string): string + +const + genSubDir* = "nimcache" + NimExt* = "nim" + RodExt* = "rod" + HtmlExt* = "html" + TexExt* = "tex" + IniExt* = "ini" + DocConfig* = "nimdoc.cfg" + DocTexConfig* = "nimdoc.tex.cfg" + +proc completeGeneratedFilePath*(f: string, createSubDir: bool = true): string +proc toGeneratedFile*(path, ext: string): string + # converts "/home/a/mymodule.nim", "rod" to "/home/a/nimcache/mymodule.rod" +proc getPrefixDir*(): string + # gets the application directory + +# additional configuration variables: +var + gConfigVars*: PStringTable + libpath*: string = "" + projectPath*: string = "" + gKeepComments*: bool = true # whether the parser needs to keep comments + gImplicitMods*: TStringSeq = @ [] # modules that are to be implicitly imported + +proc existsConfigVar*(key: string): bool +proc getConfigVar*(key: string): string +proc setConfigVar*(key, val: string) +proc addImplicitMod*(filename: string) +proc getOutFile*(filename, ext: string): string +proc binaryStrSearch*(x: openarray[string], y: string): int +# implementation + +proc existsConfigVar(key: string): bool = + result = hasKey(gConfigVars, key) + +proc getConfigVar(key: string): string = + result = nstrtabs.get(gConfigVars, key) + +proc setConfigVar(key, val: string) = + nstrtabs.put(gConfigVars, key, val) + +proc getOutFile(filename, ext: string): string = + if options.outFile != "": result = options.outFile + else: result = changeFileExt(filename, ext) + +proc addImplicitMod(filename: string) = + var length: int + length = len(gImplicitMods) + setlen(gImplicitMods, length + 1) + gImplicitMods[length] = filename + +proc getPrefixDir(): string = + result = SplitPath(getApplicationDir()).head + +proc shortenDir(dir: string): string = + # returns the interesting part of a dir + var prefix = getPrefixDir() & dirSep + if startsWith(dir, prefix): + return copy(dir, len(prefix) + 0) + prefix = getCurrentDir() & dirSep + if startsWith(dir, prefix): + return copy(dir, len(prefix) + 0) + prefix = projectPath & dirSep #writeln(output, prefix); + #writeln(output, dir); + if startsWith(dir, prefix): + return copy(dir, len(prefix) + 0) + result = dir + +proc removeTrailingDirSep(path: string): string = + if (len(path) > 0) and (path[len(path) + 0 - 1] == dirSep): + result = copy(path, 0, len(path) + 0 - 2) + else: + result = path + +proc toGeneratedFile(path, ext: string): string = + var (head, tail) = splitPath(path) + if len(head) > 0: head = shortenDir(head & dirSep) + result = joinPath([projectPath, genSubDir, head, changeFileExt(tail, ext)]) + +proc completeGeneratedFilePath(f: string, createSubDir: bool = true): string = + var (head, tail) = splitPath(f) + if len(head) > 0: head = removeTrailingDirSep(shortenDir(head & dirSep)) + var subdir = joinPath([projectPath, genSubDir, head]) + if createSubDir: + try: + createDir(subdir) + except EOS: + writeln(stdout, "cannot create directory: " & subdir) + quit(1) + result = joinPath(subdir, tail) + +proc rawFindFile(f: string): string = + var it: PStrEntry + if ExistsFile(f): + result = f + else: + it = PStrEntry(SearchPaths.head) + while it != nil: + result = JoinPath(it.data, f) + if ExistsFile(result): return + it = PStrEntry(it.Next) + result = "" + +proc FindFile(f: string): string = + result = rawFindFile(f) + if len(result) == 0: result = rawFindFile(toLower(f)) + +proc binaryStrSearch(x: openarray[string], y: string): int = + var a = 0 + var b = len(x) - 1 + while a <= b: + var mid = (a + b) div 2 + var c = cmpIgnoreCase(x[mid], y) + if c < 0: + a = mid + 1 + elif c > 0: + b = mid - 1 + else: + return mid + result = - 1 + +gConfigVars = newStringTable([], modeStyleInsensitive) |