Add descriptor.proto into the #include exclusion list
[apps/agl-service-can-low-level.git] / generator / nanopb_generator.py
index 2ceafc7..d41efb8 100644 (file)
@@ -1,7 +1,27 @@
 '''Generate header file for nanopb from a ProtoBuf FileDescriptorSet.'''
 
-import google.protobuf.descriptor_pb2 as descriptor
-import nanopb_pb2
+try:
+    import google.protobuf.descriptor_pb2 as descriptor
+except:
+    print
+    print "*************************************************************"
+    print "*** Could not import the Google protobuf Python libraries ***"
+    print "*** Try installing package 'python-protobuf' or similar.  ***"
+    print "*************************************************************"
+    print
+    raise
+
+try:
+    import nanopb_pb2
+except:
+    print
+    print "***************************************************************"
+    print "*** Could not import the precompiled nanopb_pb2.py.         ***"
+    print "*** Run 'make' in the 'generator' folder to update the file.***"
+    print "***************************************************************"
+    print
+    raise
+
 import os.path
 
 # Values are tuple (c type, pb ltype)
@@ -347,7 +367,7 @@ def sort_dependencies(messages):
         if msgname in message_by_name:
             yield message_by_name[msgname]
 
-def generate_header(headername, enums, messages):
+def generate_header(dependencies, headername, enums, messages):
     '''Generate content for a header file.
     Generates strings, which should be concatenated and stored to file.
     '''
@@ -359,6 +379,11 @@ def generate_header(headername, enums, messages):
     yield '#define _PB_%s_\n' % symbol
     yield '#include <pb.h>\n\n'
     
+    for dependency in dependencies:
+        noext = os.path.splitext(dependency)[0]
+        yield '#include "%s.pb.h"\n' % noext
+    yield '\n'
+    
     yield '/* Enum definitions */\n'
     for enum in enums:
         yield str(enum) + '\n\n'
@@ -404,7 +429,7 @@ if __name__ == '__main__':
         print "Output fill be written to file.pb.h and file.pb.c"
         sys.exit(1)
     
-    data = open(sys.argv[1]).read()
+    data = open(sys.argv[1], 'rb').read()
     fdesc = descriptor.FileDescriptorSet.FromString(data)
     enums, messages = parse_file(fdesc.file[0])
     
@@ -415,8 +440,13 @@ if __name__ == '__main__':
     
     print "Writing to " + headername + " and " + sourcename
     
+    # List of .proto files that should not be included in the C header file
+    # even if they are mentioned in the source .proto.
+    excludes = ['nanopb.proto', 'google/protobuf/descriptor.proto']
+    dependencies = [d for d in fdesc.file[0].dependency if d not in excludes]
+    
     header = open(headername, 'w')
-    for part in generate_header(headerbasename, enums, messages):
+    for part in generate_header(dependencies, headerbasename, enums, messages):
         header.write(part)
 
     source = open(sourcename, 'w')