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