.. _`Compiling the datamodel with the GPB compiler`: ############################################# Compiling the datamodel with the GPB compiler ############################################# Once you've defined your messages, you run the protocol buffer compiler for your application's language on your ``.proto`` file to generate data access classes. These provide simple accessors for each field so, for instance, if your chosen language is ISO-C++, running the compiler on the above example will generate a class called *Person*. You can then use this class in your application to populate, serialize, and retrieve *Person* protocol buffer messages. DDS-specific GPB-compiler plugin to generate code. ================================================== The GPB compiler can be extended to support new languages *via* so-called plugins. The compiler invokes the plugin while providing the GPB type definition to it in the form of a GPB message. For DDS support the OpenSplice GPB-compiler is delivered with Vortex OpenSplice. The Vortex OpenSplice IDL compiler is invoked by the OpenSplice GPB-compiler plugin to generate the DDS type including typed DataWriter and DataReader code. Additionally, code is generated to convert an instance of the DDS type to the GPB type and *vice versa*, which hides the DDS type from the application entirely. Java 5 example ============== |java| In this example we assume that a correct OpenSplice environment is set (``release.bat`` has been run). For creating the DDS-specific code by the GPB compiler the option ``--ddsjava_out`` must be given to the compiler. Also the path to the OpenSplice GPB-compiler must be supplied. Example:: protoc --java_out =outputPath --ddsjava_out =outputPath --proto_path =PathToProtoFile --proto_path =PathToProtoSelf --proto_path =PathToOpenSpliceProtoCompiler protoFileToCompile .. - ``--java_out`` gives the path where the GDP generated code will be stored. - ``--ddsjava_out`` gives the path where the DDS-specific generated code will be stored. - first ``--proto_path``: the protoc compiler needs the path where the ``.proto`` file is located. - second ``--proto_path``: the path where the GPB environment is installed on your local machine. - third ``--proto_path``: specifies the path to the OpenSplice proto descriptor. This is normally ``$OSPL_HOME/include/protobuf``. - ``protoFileToCompile`` the last option is the ``.proto`` file. Assuming that we need the generated code in the ``./generated`` directory and the previous ``address.proto`` example is in the current directory, the command will be:: protoc --java_out=./generated --ddsjava_out=./generated --proto_path=./ --proto_path=$PROTOBUF_HOME/src --proto_path=$OSPL_HOME/include/protobuf ./address.proto The generated code, in the ``./generated`` directory, can be compiled normally with the Java compiler together with your own written applications. The only pre-requisite is that ``$OSPL_HOME/jar/dcpssaj5.jar`` and ``$OSPL_HOME/jar/dcpsprotobuf.jar`` are in the classpath so that the Java compiler can find the included OpenSplice ``jar`` files. This example is delivered with OpenSplice, and is located in ``examples/protobuf/java5``. If the generated ``.idl`` file is needed by other applications, this file will also be generated in the ``--ddsjava_out`` path if the environment variable ``OSPL_PROTOBUF_INCLUDE_IDL`` is set to true. C++ example =========== |cpp| In this example we assume that a correct OpenSplice environment is set (so release.bat has been run) For creating the DDS specific code by the GPB compiler the option --ddscpp_out must be given to the compiler. Also the path to the OpenSplice GPB-compiler must be given. Example:: protoc --cpp_out =outputPath --ddscpp_out =outputPath --proto_path =PathToProtoFile --proto_path =PathToProtoSelf --proto_path =PathToOpenSpliceProtoCompiler protoFileToCompile .. - ``--cpp_out`` gives the path where the GDP generated code will be stored. - ``--ddscpp_out`` gives the path where the DDS-specific generated code will be stored. - first ``--proto_path``: the protoc compiler needs the path where the ``.proto`` file is located. - second ``--proto_path``: the path where the GPB environment is installed on your local machine. - third ``--proto_path``: specifies the path to the OpenSplice proto descriptor. This is normally ``$OSPL_HOME/include/protobuf``. - ``protoFileToCompile`` the last option is the ``.proto`` file. Assuming that we need the generated code in the ``./generated`` directory and the previous ``address.proto`` example is in the current directory, the command will be:: protoc --cpp_out=./generated --ddscpp_out=./generated --proto_path=./ --proto_path=$PROTOBUF_HOME/src --proto_path=$OSPL_HOME/include/protobuf ./address.proto The generated code, in the ``./generated`` directory, can be compiled normally with the C++ compiler together with your own written applications. This example is delivered with OpenSplice, and is located in ``examples/protobuf/isocpp2``. If the generated ``.idl`` file is needed by other applications, this file will also be generated in the ``--ddscpp_out`` path if the environment variable ``OSPL_PROTOBUF_INCLUDE_IDL`` is set to true. Tempory IDL file created by the GPB data-model ============================================== The IDL file created for the previous example will contain: .. code-block:: idl module org { module omg { module dds { module protobuf { typedef sequence gpb_payload_t; }; }; }; }; module address { module dds { struct Person { string name; long age; string worksFor_name; string worksFor_address; ::org::omg::dds::protobuf::gpb_payload_t ospl_protobuf_data; }; #pragma keylist Person name worksFor_name }; }; This idl file is deleted after the idl-pp compiler is finished. If the temporary idl file is needed in other DDS applications (it also usable for other DDS vendors), then the environment variable ``OSPL_PROTOBUF_INCLUDE_IDL`` must be set to true to prevent the idl file from being deleted. .. |caution| image:: ./images/icon-caution.* :height: 6mm .. |info| image:: ./images/icon-info.* :height: 6mm .. |windows| image:: ./images/icon-windows.* :height: 6mm .. |unix| image:: ./images/icon-unix.* :height: 6mm .. |linux| image:: ./images/icon-linux.* :height: 6mm .. |c| image:: ./images/icon-c.* :height: 6mm .. |cpp| image:: ./images/icon-cpp.* :height: 6mm .. |csharp| image:: ./images/icon-csharp.* :height: 6mm .. |java| image:: ./images/icon-java.* :height: 6mm