Document the .options file usage.

Also add note about the 'packed' message option being incompatible
with CPUs that do not support unaligned access.

Update issue 12
Status: FixedInGit

Update issue 77
Status: FixedInGit
This commit is contained in:
Petteri Aimonen
2013-07-06 13:49:47 +03:00
parent 68dd0171bc
commit 6e9e532927
3 changed files with 192 additions and 47 deletions

View File

@@ -10,47 +10,40 @@ The things outlined here are the underlying concepts of the nanopb design.
Proto files
===========
All Protocol Buffers implementations use .proto files to describe the message format.
The point of these files is to be a portable interface description language.
All Protocol Buffers implementations use .proto files to describe the message
format. The point of these files is to be a portable interface description
language.
Compiling .proto files for nanopb
---------------------------------
Nanopb uses the Google's protoc compiler to parse the .proto file, and then a python script to generate the C header and source code from it::
Nanopb uses the Google's protoc compiler to parse the .proto file, and then a
python script to generate the C header and source code from it::
user@host:~$ protoc -omessage.pb message.proto
user@host:~$ python ../generator/nanopb_generator.py message.pb
Writing to message.h and message.c
user@host:~$
Compiling .proto files with nanopb options
------------------------------------------
Nanopb defines two extensions for message fields described in .proto files: *max_size* and *max_count*.
These are the maximum size of a string and maximum count of items in an array::
Modifying generator behaviour
-----------------------------
Using generator options, you can set maximum sizes for fields in order to
allocate them statically. The preferred way to do this is to create an .options
file with the same name as your .proto file::
required string name = 1 [(nanopb).max_size = 40];
repeated PhoneNumber phone = 4 [(nanopb).max_count = 5];
# Foo.proto
message Foo {
required string name = 1;
}
To use these extensions, you need to place an import statement in the beginning of the file::
::
import "nanopb.proto";
# Foo.options
Foo.name max_size:16
This file, in turn, requires the file *google/protobuf/descriptor.proto*. This is usually installed under */usr/include*. Therefore, to compile a .proto file which uses options, use a protoc command similar to::
protoc -I/usr/include -Inanopb/generator -I. -omessage.pb message.proto
The options can be defined in file, message and field scopes::
option (nanopb_fileopt).max_size = 20; // File scope
message Message
{
option (nanopb_msgopt).max_size = 30; // Message scope
required string fieldsize = 1 [(nanopb).max_size = 40]; // Field scope
}
It is also possible to give the options on command line, but then they will affect the whole file. For example::
user@host:~$ python ../generator/nanopb_generator.py -s 'max_size: 20' message.pb
For more information on this, see the `Proto file options`_ section in the
reference manual.
.. _`Proto file options`: reference.html#proto-file-options
Streams
=======