X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=generator%2Fnanopb_generator.py;h=663745a151ea1e03c824a17705477a409c3c1e20;hb=5522e02133be7d9dfd2f350f2774dfc0abc15686;hp=45b2ac68144bf587357a0fc152cbb3287268e5dd;hpb=80a2d33fa9a835564b44fe97ba34e713901cf4fb;p=apps%2Fagl-service-can-low-level.git diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py index 45b2ac68..663745a1 100644 --- a/generator/nanopb_generator.py +++ b/generator/nanopb_generator.py @@ -1,5 +1,5 @@ '''Generate header file for nanopb from a ProtoBuf FileDescriptorSet.''' -nanopb_version = "0.2.0-dev" +nanopb_version = "nanopb-0.2.1-dev" try: import google.protobuf.descriptor_pb2 as descriptor @@ -300,6 +300,12 @@ class Message: def __str__(self): result = 'typedef struct _%s {\n' % self.name + + if not self.ordered_fields: + # Empty structs are not allowed in C standard. + # Therefore add a dummy field if an empty message occurs. + result += ' uint8_t dummy_field;' + result += '\n'.join([str(f) for f in self.ordered_fields]) result += '\n}' @@ -439,7 +445,7 @@ def make_identifier(headername): result += '_' return result -def generate_header(dependencies, headername, enums, messages): +def generate_header(dependencies, headername, enums, messages, options): '''Generate content for a header file. Generates strings, which should be concatenated and stored to file. ''' @@ -450,12 +456,14 @@ def generate_header(dependencies, headername, enums, messages): symbol = make_identifier(headername) yield '#ifndef _PB_%s_\n' % symbol yield '#define _PB_%s_\n' % symbol - yield '#include \n\n' + yield options.libformat % ('pb.h') + yield '\n' for dependency in dependencies: noext = os.path.splitext(dependency)[0] - yield '#include "%s.pb.h"\n' % noext - + yield options.genformat % (noext + '.' + options.extension + '.h') + yield '\n' + yield '#ifdef __cplusplus\n' yield 'extern "C" {\n' yield '#endif\n\n' @@ -490,7 +498,8 @@ def generate_source(headername, enums, messages): yield '/* Automatically generated nanopb constant definitions */\n' yield '/* Generated by %s at %s. */\n\n' % (nanopb_version, time.asctime()) - yield '#include "%s"\n\n' % headername + yield options.genformat % (headername) + yield '\n' for msg in messages: yield msg.default_decl(False) @@ -582,6 +591,14 @@ optparser = OptionParser( "Output will be written to file.pb.h and file.pb.c.") optparser.add_option("-x", dest="exclude", metavar="FILE", action="append", default=[], help="Exclude file from generated #include list.") +optparser.add_option("-e", "--extension", dest="extension", metavar="EXTENSION", default="pb", + help="Set extension to use instead of 'pb' for generated files. [default: %default]") +optparser.add_option("-Q", "--generated-include-format", dest="genformat", + metavar="FORMAT", default='#include "%s"\n', + help="Set format string to use for including other .pb.h files. [default: %default]") +optparser.add_option("-L", "--library-include-format", dest="libformat", + metavar="FORMAT", default='#include <%s>\n', + help="Set format string to use for including the nanopb pb.h header. [default: %default]") optparser.add_option("-q", "--quiet", dest="quiet", action="store_true", default=False, help="Don't print anything except errors.") optparser.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False, @@ -638,8 +655,8 @@ def process(filenames, options): enums, messages = parse_file(fdesc.file[0], file_options) noext = os.path.splitext(filename)[0] - headername = noext + '.pb.h' - sourcename = noext + '.pb.c' + headername = noext + '.' + options.extension + '.h' + sourcename = noext + '.' + options.extension + '.c' headerbasename = os.path.basename(headername) if not options.quiet: @@ -651,7 +668,7 @@ def process(filenames, options): dependencies = [d for d in fdesc.file[0].dependency if d not in excludes] header = open(headername, 'w') - for part in generate_header(dependencies, headerbasename, enums, messages): + for part in generate_header(dependencies, headerbasename, enums, messages, options): header.write(part) source = open(sourcename, 'w')