You'd need to download the source code zip and build from there, to get the necessary include files, as well as building libprotoc and libprotobuf. As a quick exercise, I ported my example plugin to C++ https://github.com/thesamet/protoc-plugin-in-cpp hopefully it's going to be useful to anyone struggling with this!
On Tue, Nov 27, 2018 at 10:42 PM Michael Powell <[email protected]> wrote: > On Wed, Nov 28, 2018 at 1:03 AM Nadav Samet <[email protected]> wrote: > > > > In Java, the dependencies you mentioned are provided by Gradle. We pull > protobuf-java in here. > > I see... Been a little while since I dove that deep in any Java > stacks, so that's a new one to me, but good to know. > > > In C++, the equivalent files would come from descriptor.h which is > shipped with protobuf sources, and the implementation is provided by > libprotobuf, which you can build yourself of the sources. > > > > The plugin is going to be an executable (.EXE on Windows) file. > > Thanks, I appreciate the clarification. I'm not sure which download I > saw, but it did not include sources, or I downloaded the minimal one. > If memory serves there was a full source one, so I'll have a look > there. Thanks! > > > On Tue, Nov 27, 2018 at 9:46 PM Michael Powell <[email protected]> > wrote: > >> > >> So... > >> > >> You've got a magic set of imports (in Java). > >> > >> import com.google.protobuf.DescriptorProtos; > >> import com.google.protobuf.Descriptors; > >> import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse; > >> import com.google.protobuf.compiler.PluginProtos.CodeGeneratorRequest; > >> > >> Where do you get these from? > >> > >> Or Assemblies or NuGet Package References in .NET / C#, or > >> source/libraries, ostensibly, for C/C++. > >> > >> This is the question I have in getting started. > >> > >> The nearest assumption I could derive is that I start with protoc.exe > >> (Windows) and the bundled .proto files, "compile" those to target > >> plugin language, and build them with the project? > >> > >> Again, as a what? .DLL? .EXE? > >> > >> On Wed, Nov 28, 2018 at 12:31 AM Nadav Samet <[email protected]> > wrote: > >> > > >> > Hi Rahul and Michael, > >> > > >> > I put together a basic example of a protoc plugin in Java that > generates text files: https://github.com/thesamet/protoc-plugin-in-java > >> > > >> > The plugin itself is an executable that gets executed by protoc, it > can be written in any language. In this instance, the plugin is written in > Java, so we use gradle to generate a shell script (or bat file for windows) > that protoc will execute to run our plugin inside a JVM. The exact > instructions to run it are in the provided README.md > >> > > >> > > >> > On Tue, Nov 27, 2018 at 6:01 AM Michael Powell <[email protected]> > wrote: > >> >> > >> >> > >> >> > >> >> On Saturday, November 10, 2018 at 5:33:11 PM UTC-5, Nadav Samet > wrote: > >> >>> > >> >>> Michael, > >> >>> > >> >>> A protoc plugin is a program that receives a serialized > CodeGeneratorRequest message via its stdin, and writes a > CodeGeneratorResponse to its stdout. > >> >>> > >> >>> You asked where the CodeGeneratorRequest comes from. The answer is > that the message is defined here. Assuming your plugin is named > protoc-gen-boilerplate, then when you invoke protoc like this: > >> >>> protoc --boilerplate_out=outdir file1.proto [...] > >> >>> > >> >>> Then protoc would parse the proto files, prepare a > CodeGeneratorRequest and pipe it into your plugin. That request object > contains a representation of all the files you passed in the command line > as well as the files their transitively import. Your plugin should parse > the request and print out a serialized CodeGeneratorResponse. Unless you > set an error message, protoc would create the files you specified in your > response. The plugin can be written in any language, but if you use some of > the supported languages (at least C++, Python and Java, but probably > others), you'll find a method named something like DescriptorPool.BuildFile > which would convert a FileDescriptorProto to an higher-level object > (FileDescriptor) which is easier to work with. > >> >>> > >> >>> Plugins are pretty simple to write (look online for examples). I > would advise not writing a parser for proto files manually, since you'll be > chasing a moving target - over time language features get added albeit not > very often. It would also be hard to match the language spec perfectly. > >> >> > >> >> > >> >> I guess I am not sure quite where to begin. I've downloaded the > protoc compiler, which itself has a set of proto files, but no target > language level generated code. > >> >> > >> >> Am I accurate in assuming I run those through protoc itself to my > target language, in this case I suppose C++? > >> >> > >> >> On Windows, what form does the plugin need to take? DLL? Executable > file? > >> >> > >> >> These are the sort of nibblets I think that would make it more > evident where to pick up and run with it. > >> >> > >> >> Examples of this appear to be few and far between, if at all. > >> >> > >> >> Absent examples, I am working on a Boost Spirit Qi parser in the > meantime, which the learning curve is not a plateau, I can agree there. > It's not terrible to work through, and I end up with an AST that I know > forwards and backwards without too much extra effort once the rules have > done their synthetic magic. > >> >> > >> >> Cheers, thank you! > >> >> > >> >>> On Thursday, November 1, 2018 at 6:14:54 PM UTC-7, Michael Powell > wrote: > >> >>>> > >> >>>> Hello, > >> >>>> > >> >>>> I'm a bit confused. I thought I was grasping it earlier, then I > >> >>>> thought I wasn't ... What is the starting point developing a protoc > >> >>>> plugin? > >> >>>> > >> >>>> What I want to accomplish is processing a .proto (v2) and > generating > >> >>>> some C# boilerplate code for it. I'm not generating a proto adapter > >> >>>> itself, per se, but C# DSL that would be used to support it. > >> >>>> > >> >>>> The starting point for me would seem to be receiving the compiler > >> >>>> request, but that itself is a .proto, which leaves me a bit > confused. > >> >>>> Where do you obtain that from? Or are you starting by compiling > those > >> >>>> .protos from the bits bundled with the protoc.exe compiler? > >> >>>> > >> >>>> What I want is to just have the descriptors drawn from the target > >> >>>> .proto(s) themselves. That's it. A full-on plugin seems like a > little > >> >>>> bit of overkill. > >> >>>> > >> >>>> Suggestions? > >> >>>> > >> >>>> Thanks so much! > >> >>>> > >> >>>> Best regards, > >> >>>> > >> >>>> Michael Powell > >> >> > >> >> -- > >> >> You received this message because you are subscribed to the Google > Groups "Protocol Buffers" group. > >> >> To unsubscribe from this group and stop receiving emails from it, > send an email to [email protected]. > >> >> To post to this group, send email to [email protected]. > >> >> Visit this group at https://groups.google.com/group/protobuf. > >> >> For more options, visit https://groups.google.com/d/optout. > >> > > >> > > >> > > >> > -- > >> > -Nadav > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups "Protocol Buffers" group. > >> To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > >> To post to this group, send email to [email protected]. > >> Visit this group at https://groups.google.com/group/protobuf. > >> For more options, visit https://groups.google.com/d/optout. > > > > > > > > -- > > -Nadav > > -- > You received this message because you are subscribed to the Google Groups > "Protocol Buffers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/protobuf. > For more options, visit https://groups.google.com/d/optout. > -- -Nadav -- You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/protobuf. For more options, visit https://groups.google.com/d/optout.
