aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2018-04-06 23:30:09 +0300
committerOskari Timperi <oskari.timperi@iki.fi>2018-04-06 23:30:09 +0300
commit1372a23eac29d91657c7796f14a0817417630ad6 (patch)
tree17b5b8d89e8c0c77749d73aa1ee378e756edbd1a /src
parentd0d7fd08f350389ced2b39700aacc6fd96b38cfd (diff)
downloadnimpb_protoc-1372a23eac29d91657c7796f14a0817417630ad6.tar.gz
nimpb_protoc-1372a23eac29d91657c7796f14a0817417630ad6.zip
Refactor to use FileDescriptorSet
This should make the implementation a bit simpler. It should be easier also to use nimpb_build as a library!
Diffstat (limited to 'src')
-rw-r--r--src/nimpb_build.nim86
-rw-r--r--src/nimpb_buildpkg/plugin.nim38
2 files changed, 46 insertions, 78 deletions
diff --git a/src/nimpb_build.nim b/src/nimpb_build.nim
index 660f374..ed4a07a 100644
--- a/src/nimpb_build.nim
+++ b/src/nimpb_build.nim
@@ -5,7 +5,7 @@ import strformat
import strtabs
import strutils
-from nimpb_buildpkg/plugin import pluginMain
+from nimpb_buildpkg/plugin import processFileDescriptorSet
when defined(windows):
const compilerId = "win32"
@@ -54,71 +54,55 @@ template verboseEcho(x: untyped): untyped =
if verbose:
echo(x)
-proc compileProtos*(protos: openArray[string], outdir: string,
- includes: openArray[string], verbose: bool) =
+proc myTempDir(): string =
+ result = getTempDir() / "nimpb_build_tmp"
+
+proc compileProtos*(protos: openArray[string],
+ includes: openArray[string],
+ outdir: string) =
let command = findCompiler()
- var baseArgs: seq[string] = @[]
+ var args: seq[string] = @[]
- add(baseArgs, &"--plugin=protoc-gen-nim={getAppFilename()}")
+ var outputFilename = myTempDir() / "file-descriptor-set"
+ createDir(myTempDir())
- for incdir in includes:
- verboseEcho(&"Adding include directory: {incdir}")
- add(baseArgs, &"-I{incdir}")
+ # add(args, "--include_imports")
+ add(args, "--include_source_info")
+ add(args, &"-o{outputFilename}")
- add(baseArgs, &"-I{builtinIncludeDir(command)}")
- verboseEcho(&"Adding include directory: {builtinIncludeDir(command)}")
+ for incdir in includes:
+ add(args, &"-I{incdir}")
- add(baseArgs, &"--nim_out={outdir}")
- verboseEcho(&"Output directory: {outdir}")
+ add(args, &"-I{builtinIncludeDir(command)}")
for proto in protos:
- var args = baseArgs
add(args, proto)
- var options = {poStdErrToStdOut}
- if verbose:
- incl(options, poEchoCmd)
-
- let env = newStringTable("NIMPB_BUILD_PLUGIN", "1", modeCaseSensitive)
-
- let process = startProcess(command, workingDir="", args=args, env=env,
- options=options)
- var outp = outputStream(process)
- var outputData: string = ""
- var line = newStringOfCap(120)
- while true:
- if outp.readLine(line):
- add(outputData, line)
- add(outputData, "\n")
- elif not running(process):
- break
- var rc = peekExitCode(process)
- close(process)
-
- if rc != 0:
- echo(outputData)
- quit(QuitFailure)
- else:
- verboseEcho(outputData)
+ var cmdline: string = quoteShell(command)
+ for arg in args:
+ cmdline &= " " & quoteShell(arg)
-proc usage() {.noreturn.} =
- echo(&"""
-{getAppFilename()} --out=OUTDIR [-IPATH [-IPATH]...] PROTOFILE...
+ let (outp, rc) = execCmdEx(cmdline)
+
+ if rc != 0:
+ raise newException(Exception, outp)
+
+ processFileDescriptorSet(outputFilename, outdir)
- --out The output directory for the generated files
- -I Add a path to the set of include paths
-""")
- quit(QuitFailure)
when isMainModule:
- if getEnv("NIMPB_BUILD_PLUGIN", "") == "1":
- pluginMain()
- quit(QuitSuccess)
+ proc usage() {.noreturn.} =
+ echo(&"""
+ {getAppFilename()} --out=OUTDIR [-IPATH [-IPATH]...] PROTOFILE...
+
+ --out The output directory for the generated files
+ -I Add a path to the set of include paths
+ """)
+ quit(QuitFailure)
var includes: seq[string] = @[]
var protos: seq[string] = @[]
var outdir: string
- var verbose = false
if paramCount() == 0:
usage()
@@ -130,8 +114,6 @@ when isMainModule:
add(includes, param[2..^1])
elif param.startsWith("--out="):
outdir = param[6..^1]
- elif param == "--verbose":
- verbose = true
elif param == "--help":
usage()
else:
@@ -145,4 +127,4 @@ when isMainModule:
echo("error: no input files")
quit(QuitFailure)
- compileProtos(protos, outdir, includes, verbose)
+ compileProtos(protos, includes, outdir)
diff --git a/src/nimpb_buildpkg/plugin.nim b/src/nimpb_buildpkg/plugin.nim
index 1691e6b..284a40b 100644
--- a/src/nimpb_buildpkg/plugin.nim
+++ b/src/nimpb_buildpkg/plugin.nim
@@ -858,18 +858,17 @@ iterator genProcs(msg: Message): string =
yield indent(&"result = read{msg.names}(pbs)", 4)
yield ""
-proc processFile(filename: string, fdesc: google_protobuf_FileDescriptorProto,
- otherFiles: TableRef[string, ProtoFile]): ProcessedFile =
- var (dir, name, _) = splitFile(filename)
+proc processFile(fdesc: google_protobuf_FileDescriptorProto): ProcessedFile =
+ var (dir, name, _) = splitFile(fdesc.name)
var pbfilename = (dir / name) & "_pb.nim"
- log(&"processing {filename}: {pbfilename}")
+ log(&"processing {fdesc.name}: {pbfilename}")
new(result)
result.name = pbfilename
result.data = ""
- let parsed = parseFile(filename, fdesc)
+ let parsed = parseFile(fdesc.name, fdesc)
var hasMaps = false
for message in parsed.messages:
@@ -919,28 +918,15 @@ proc processFile(filename: string, fdesc: google_protobuf_FileDescriptorProto,
addLine(result.data, line)
addLine(result.data, "")
-proc generateCode(request: google_protobuf_compiler_CodeGeneratorRequest, response: google_protobuf_compiler_CodeGeneratorResponse) =
- let otherFiles = newTable[string, ProtoFile]()
+proc processFileDescriptorSet*(filename: string, outdir: string) =
+ let s = newProtobufStream(newFileStream(filename, fmRead))
- for file in request.proto_file:
- add(otherFiles, file.name, parseFile(file.name, file))
+ let fileSet = readgoogle_protobuf_FileDescriptorSet(s)
- for filename in request.file_to_generate:
- for fdesc in request.proto_file:
- if fdesc.name == filename:
- let results = processFile(filename, fdesc, otherFiles)
- let f = newgoogle_protobuf_compiler_CodeGeneratorResponse_File()
- setName(f, results.name)
- setContent(f, results.data)
- addFile(response, f)
+ for file in fileSet.file:
+ let parsedFile = processFile(file)
+ let fullPath = outdir / parsedFile.name
-proc pluginMain*() =
- let pbsi = newProtobufStream(newFileStream(stdin))
- let pbso = newProtobufStream(newFileStream(stdout))
+ createDir(parentDir(fullPath))
- let request = readgoogle_protobuf_compiler_CodeGeneratorRequest(pbsi)
- let response = newgoogle_protobuf_compiler_CodeGeneratorResponse()
-
- generateCode(request, response)
-
- writegoogle_protobuf_compiler_CodeGeneratorResponse(pbso, response)
+ writeFile(fullPath, parsedFile.data)