diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/nimpb_build.nim | 86 | ||||
| -rw-r--r-- | src/nimpb_buildpkg/plugin.nim | 38 |
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) |
