1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #
- #
- # The Nim Compiler
- # (c) Copyright 2017 Andreas Rumpf
- #
- # See the file "copying.txt", included in this
- # distribution, for details about the copyright.
- #
- ## Module that implements ``gorge`` for the compiler.
- import msgs, std / sha1, os, osproc, streams, strutils, options,
- lineinfos, pathutils
- proc readOutput(p: Process): (string, int) =
- result[0] = ""
- var output = p.outputStream
- while not output.atEnd:
- result[0].add(output.readLine)
- result[0].add("\n")
- if result[0].len > 0:
- result[0].setLen(result[0].len - "\n".len)
- result[1] = p.waitForExit
- proc opGorge*(cmd, input, cache: string, info: TLineInfo; conf: ConfigRef): (string, int) =
- let workingDir = parentDir(toFullPath(conf, info))
- if cache.len > 0:# and optForceFullMake notin gGlobalOptions:
- let h = secureHash(cmd & "\t" & input & "\t" & cache)
- let filename = toGeneratedFile(conf, AbsoluteFile("gorge_" & $h), "txt").string
- var f: File
- if open(f, filename):
- result = (f.readAll, 0)
- f.close
- return
- var readSuccessful = false
- try:
- var p = startProcess(cmd, workingDir,
- options={poEvalCommand, poStderrToStdout})
- if input.len != 0:
- p.inputStream.write(input)
- p.inputStream.close()
- result = p.readOutput
- readSuccessful = true
- # only cache successful runs:
- if result[1] == 0:
- writeFile(filename, result[0])
- except IOError, OSError:
- if not readSuccessful: result = ("", -1)
- else:
- try:
- var p = startProcess(cmd, workingDir,
- options={poEvalCommand, poStderrToStdout})
- if input.len != 0:
- p.inputStream.write(input)
- p.inputStream.close()
- result = p.readOutput
- except IOError, OSError:
- result = ("", -1)
|