1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Implements the Protocol Compiler front-end such that it may be reused by
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// custom compilers written to support other languages.
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifndef GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <map>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <set>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <utility>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass FileDescriptor;        // descriptor.h
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DescriptorPool;        // descriptor.h
53d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass FileDescriptorProto;   // descriptor.pb.h
54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilletemplate<typename T> class RepeatedPtrField;  // repeated_field.h
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass CodeGenerator;        // code_generator.h
59d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleclass OutputDirectory;      // code_generator.h
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass DiskSourceTree;       // importer.h
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// This class implements the command-line interface to the protocol compiler.
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// It is designed to make it very easy to create a custom protocol compiler
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// supporting the languages of your choice.  For example, if you wanted to
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// create a custom protocol compiler binary which includes both the regular
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// C++ support plus support for your own custom output "Foo", you would
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// write a class "FooGenerator" which implements the CodeGenerator interface,
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// then write a main() procedure like this:
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   int main(int argc, char* argv[]) {
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     google::protobuf::compiler::CommandLineInterface cli;
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     // Support generation of C++ source and headers.
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     google::protobuf::compiler::cpp::CppGenerator cpp_generator;
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     cli.RegisterGenerator("--cpp_out", &cpp_generator,
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       "Generate C++ source and header.");
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     // Support generation of Foo code.
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     FooGenerator foo_generator;
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     cli.RegisterGenerator("--foo_out", &foo_generator,
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//       "Generate Foo file.");
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     return cli.Run(argc, argv);
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   }
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// The compiler is invoked with syntax like:
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//   protoc --cpp_out=outdir --foo_out=outdir --proto_path=src src/foo.proto
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// For a full description of the command-line syntax, invoke it with --help.
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass LIBPROTOC_EXPORT CommandLineInterface {
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CommandLineInterface();
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ~CommandLineInterface();
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Register a code generator for a language.
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parameters:
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * flag_name: The command-line flag used to specify an output file of
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   this type.  The name must start with a '-'.  If the name is longer
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   than one letter, it must start with two '-'s.
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * generator: The CodeGenerator which will be called to generate files
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   of this type.
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // * help_text: Text describing this flag in the --help output.
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Some generators accept extra parameters.  You can specify this parameter
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // on the command-line by placing it before the output directory, separated
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // by a colon:
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   protoc --foo_out=enable_bar:outdir
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The text before the colon is passed to CodeGenerator::Generate() as the
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // "parameter".
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void RegisterGenerator(const string& flag_name,
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         CodeGenerator* generator,
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         const string& help_text);
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Enables "plugins".  In this mode, if a command-line flag ends with "_out"
116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // but does not match any registered generator, the compiler will attempt to
117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // find a "plugin" to implement the generator.  Plugins are just executables.
118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // They should live somewhere in the PATH.
119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //
120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // The compiler determines the executable name to search for by concatenating
121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // exe_name_prefix with the unrecognized flag name, removing "_out".  So, for
122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // example, if exe_name_prefix is "protoc-" and you pass the flag --foo_out,
123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // the compiler will try to run the program "protoc-foo".
124d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //
125d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // The plugin program should implement the following usage:
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //   plugin [--out=OUTDIR] [--parameter=PARAMETER] PROTO_FILES < DESCRIPTORS
127d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // --out indicates the output directory (as passed to the --foo_out
128d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // parameter); if omitted, the current directory should be used.  --parameter
129d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // gives the generator parameter, if any was provided.  The PROTO_FILES list
130d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // the .proto files which were given on the compiler command-line; these are
131d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // the files for which the plugin is expected to generate output code.
132d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Finally, DESCRIPTORS is an encoded FileDescriptorSet (as defined in
133d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // descriptor.proto).  This is piped to the plugin's stdin.  The set will
134d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // include descriptors for all the files listed in PROTO_FILES as well as
135d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // all files that they import.  The plugin MUST NOT attempt to read the
136d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // PROTO_FILES directly -- it must use the FileDescriptorSet.
137d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  //
138d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // The plugin should generate whatever files are necessary, as code generators
139d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // normally do.  It should write the names of all files it generates to
140d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // stdout.  The names should be relative to the output directory, NOT absolute
141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // names or relative to the current directory.  If any errors occur, error
142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // messages should be written to stderr.  If an error is fatal, the plugin
143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // should exit with a non-zero exit code.
144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  void AllowPlugins(const string& exe_name_prefix);
145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Run the Protocol Compiler with the given command-line parameters.
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Returns the error code which should be returned by main().
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // It may not be safe to call Run() in a multi-threaded environment because
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // it calls strerror().  I'm not sure why you'd want to do this anyway.
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int Run(int argc, const char* const argv[]);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Call SetInputsAreCwdRelative(true) if the input files given on the command
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // line should be interpreted relative to the proto import path specified
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // using --proto_path or -I flags.  Otherwise, input file names will be
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // interpreted relative to the current working directory (or as absolute
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // paths if they start with '/'), though they must still reside inside
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // a directory given by --proto_path or the compiler will fail.  The latter
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // mode is generally more intuitive and easier to use, especially e.g. when
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // defining implicit rules in Makefiles.
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetInputsAreProtoPathRelative(bool enable) {
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    inputs_are_proto_path_relative_ = enable;
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Provides some text which will be printed when the --version flag is
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // used.  The version of libprotoc will also be printed on the next line
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // after this text.
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetVersionInfo(const string& text) {
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    version_info_ = text;
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private:
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // -----------------------------------------------------------------
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  class ErrorPrinter;
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  class MemoryOutputDirectory;
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  class MemoryOutputStream;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Clear state from previous Run().
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void Clear();
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Remaps each file in input_files_ so that it is relative to one of the
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // directories in proto_path_.  Returns false if an error occurred.  This
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // is only used if inputs_are_proto_path_relative_ is false.
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool MakeInputsBeProtoPathRelative(
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    DiskSourceTree* source_tree);
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parse all command-line arguments.
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseArguments(int argc, const char* const argv[]);
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Parses a command-line argument into a name/value pair.  Returns
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // true if the next argument in the argv should be used as the value,
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // false otherwise.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Exmaples:
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   "-Isrc/protos" ->
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //     name = "-I", value = "src/protos"
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   "--cpp_out=src/foo.pb2.cc" ->
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //     name = "--cpp_out", value = "src/foo.pb2.cc"
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //   "foo.proto" ->
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  //     name = "", value = "foo.proto"
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool ParseArgument(const char* arg, string* name, string* value);
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Interprets arguments parsed with ParseArgument.
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool InterpretArgument(const string& name, const string& value);
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Print the --help text to stderr.
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void PrintHelpText();
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Generate the given output file from the given input.
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  struct OutputDirective;  // see below
213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  bool GenerateOutput(const vector<const FileDescriptor*>& parsed_files,
214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                      const OutputDirective& output_directive,
215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                      OutputDirectory* output_directory);
216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  bool GeneratePluginOutput(const vector<const FileDescriptor*>& parsed_files,
217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            const string& plugin_name,
218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            const string& parameter,
219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            OutputDirectory* output_directory,
220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            string* error);
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Implements --encode and --decode.
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool EncodeOrDecode(const DescriptorPool* pool);
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Implements the --descriptor_set_out option.
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool WriteDescriptorSet(const vector<const FileDescriptor*> parsed_files);
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Get all transitive dependencies of the given file (including the file
229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // itself), adding them to the given list of FileDescriptorProtos.  The
230d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // protos will be ordered such that every file is listed before any file that
231d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // depends on it, so that you can call DescriptorPool::BuildFile() on them
232d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // in order.  Any files in *already_seen will not be added, and each file
233d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // added will be inserted into *already_seen.
234d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  static void GetTransitiveDependencies(
235d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      const FileDescriptor* file,
236d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      set<const FileDescriptor*>* already_seen,
237d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      RepeatedPtrField<FileDescriptorProto>* output);
238d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // -----------------------------------------------------------------
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // The name of the executable as invoked (i.e. argv[0]).
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string executable_name_;
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Version info set with SetVersionInfo().
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string version_info_;
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Map from flag names to registered generators.
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  struct GeneratorInfo {
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    CodeGenerator* generator;
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string help_text;
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  typedef map<string, GeneratorInfo> GeneratorMap;
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GeneratorMap generators_;
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
255d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // See AllowPlugins().  If this is empty, plugins aren't allowed.
256d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  string plugin_prefix_;
257d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
258d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // Maps specific plugin names to files.  When executing a plugin, this map
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // is searched first to find the plugin executable.  If not found here, the
260d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  // PATH (or other OS-specific search strategy) is searched.
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  map<string, string> plugins_;
262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Stuff parsed from command line.
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum Mode {
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MODE_COMPILE,  // Normal mode:  parse .proto files and compile them.
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MODE_ENCODE,   // --encode:  read text from stdin, write binary to stdout.
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    MODE_DECODE    // --decode:  read binary from stdin, write text to stdout.
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Mode mode_;
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  enum ErrorFormat {
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ERROR_FORMAT_GCC,   // GCC error output format (default).
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ERROR_FORMAT_MSVS   // Visual Studio output (--error_format=msvs).
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ErrorFormat error_format_;
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  vector<pair<string, string> > proto_path_;  // Search path for proto files.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  vector<string> input_files_;                // Names of the input proto files.
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // output_directives_ lists all the files we are supposed to output and what
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // generator to use for each.
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  struct OutputDirective {
285d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    string name;                // E.g. "--foo_out"
286d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    CodeGenerator* generator;   // NULL for plugins
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string parameter;
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string output_location;
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  };
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  vector<OutputDirective> output_directives_;
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // When using --encode or --decode, this names the type we are encoding or
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // decoding.  (Empty string indicates --decode_raw.)
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string codec_type_;
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // If --descriptor_set_out was given, this is the filename to which the
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // FileDescriptorSet should be written.  Otherwise, empty.
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string descriptor_set_name_;
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // True if --include_imports was given, meaning that we should
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // write all transitive dependencies to the DescriptorSet.  Otherwise, only
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // the .proto files listed on the command-line are added.
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool imports_in_descriptor_set_;
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Was the --disallow_services flag used?
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool disallow_services_;
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // See SetInputsAreProtoPathRelative().
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  bool inputs_are_proto_path_relative_;
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface);
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__
319