| .. This work is licensed under a Creative Commons Attribution 4.0 International License. |
| .. SPDX-License-Identifier: CC-BY-4.0 |
| .. CAUTION: this document is generated from source in doc/src/rtd. |
| .. To make changes edit the source and recompile the document. |
| .. Do NOT make changes directly to .rst or .md files. |
| |
| ============================================================================================ |
| Developer's Guide |
| ============================================================================================ |
| |
| |
| OVERVIEW |
| ======== |
| |
| The RIC Message Router (RMR) is a library for peer-to-peer |
| communication. Applications use the library to send and |
| receive messages where the message routing and endpoint |
| selection is based on the message type rather than DNS host |
| name-IP port combinations. |
| |
| This document contains information that developers need to |
| know to contribute to the RMR project. |
| |
| |
| Language |
| -------- |
| |
| RMR is written in C, and thus a contributing developer to the |
| core library should have an excellent working knowledge of C. |
| There currently is one set of cross-languages bindings |
| supporting Python, and a developer wishing to contribute to |
| the bindings source should be familiar with Python (version |
| 3.7+) and with the Python *ctypes* library. |
| |
| |
| Code Structure |
| -------------- |
| |
| RMR is designed to provide an insulation layer between user |
| applications and the actual transport mechanism. Initially |
| RMR was built on top of the third-party library Nanosmg, |
| shortly after was ported to the third-party library NNG |
| (Nanomsg Next Generation), and then was ported to an |
| internally developed socket library called SI95. RMR presents |
| the same API to the user application regardless of the |
| underlying transport library, but the resulting output when |
| compiling RMR is always a transport-specific library. As an |
| example, ``librmr_nng.a`` is the library generated for use |
| with the NNG transport. |
| |
| As such the library source is organised into multiple |
| components: |
| |
| .. list-table:: |
| :widths: auto |
| :header-rows: 0 |
| :class: borderless |
| |
| * - **common** |
| - |
| Source in the common directory is agnostic to the underlying |
| transport mechanism (Nanomsg, NNG, SI95, ..), and thus can be |
| used when generating either library. |
| |
| * - **nano** |
| - |
| Source which is tightly coupled with the underlying Nanomsg |
| library. (Nanomsg has been deprecated, but the RMR source |
| remains as an example.) |
| |
| * - **nng** |
| - |
| Source which is tightly coupled with the underlying NNG |
| library. (NNG has been deprecated, but the RMR source remains |
| as an example.) |
| |
| * - **si** |
| - |
| Source which is tightly coupled with the underlying SI95 |
| library. |
| |
| |
| |
| |
| |
| Internal Function Exposure |
| -------------------------- |
| |
| The decision to limit as much as practical the exposure of |
| truly internal RMR functions was made, and as a result most |
| of the RMR functions carry a ``static`` label. In order to |
| modularise the code as much as possible, this means that the |
| primary module (e.g. rmr_nng.c) directly includes other RMR |
| modules, rather than depending on referencing the internal |
| functions during linking. While this is an infrequently used |
| approach, it does mean that there are very few functions |
| visible for the user application to reference, all of them |
| having the prefix ``rmr\$1_``. This allows internal functions |
| to have shorter names while still being meaningful. |
| |
| |
| Coding Style |
| ------------ |
| |
| There is a list of coding style guidelines in the top level |
| directory, and as such they are not expanded upon here. The |
| general practice is to follow the style when editing an |
| existing module, respect the author's choice where style |
| alternatives are not frowned upon. When creating new modules, |
| select a style that fits the guidelines and is easy for you |
| to work with. There are a few things that the RMR maintainers |
| insist on, but for the most part style is up to the creator |
| of a module. |
| |
| |
| Building |
| -------- |
| |
| RMR is constructed using CMake. While CMake's project |
| description can be more cumbersome than most typical |
| Makefiles, the tool provides convenience especially when it |
| comes to creating DEB/RPM packages. |