Nunavut ships with built-in support for some programming languages,
and it can be used to generate code for other languages if custom templates (and some glue logic) are provided.
Currently, the following languages are supported out of the box:
Installation
Nunavut depends on PyDSDL.
Install from PIP:
pip install -U nunavut
Examples
The examples do not replace the documentation, please do endeavor to read it.
Generate C headers using the command-line tool
This example assumes that the public regulated namespace directories uavcan reside under
public_regulated_data_types/.
Nunavut is invoked to generate code for the former.
nnvg --target-language c --enable-serialization-asserts public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan
Generate HTML documentation pages using the command-line tool
See above assumptions. The below commands generate documentation
for the reg namespace.
as well, because there are types in reg that will link to uavcan
documentation sections.
nnvg --experimental-languages --target-language html public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan
Note that using the --lookup-dir option will only generate types under uavcan that are referenced by types in reg.
To generate all types in both directories simply target each namespace.
nnvg --experimental-languages --target-language html public_regulated_data_types/reg public_regulated_data_types/uavcan
Generate Python packages using the command-line tool
This example assumes that the public regulated namespace directories reg and uavcan reside under
public_regulated_data_types/.
Nunavut is invoked to generate code for the former.
nnvg --target-language py public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan
Use custom templates
Partial example: generating a C struct
/*
* Cyphal data structure definition
*
* Auto-generated, do not edit.
*
* Source file: {{T.source_file_path.as_posix()}}
*/
#ifndef {{T.full_name | ln.c.macrofy}}
#define {{T.full_name | ln.c.macrofy}}
{%- for constant in T.constants %}
#define {{ T | ln.c.macrofy }}_{{ constant.name | ln.c.macrofy }} {{ constant | constant_value }}
{%- endfor %}
typedef struct
{
/*
Note that we're not handling union types properly in this simplified example.
Unions take a bit more logic to generate correctly.
*/
{%- for field in T.fields_except_padding %}
{{ field.data_type | declaration }} {{ field | id }}
{%- if field.data_type is ArrayType -%}
[{{ field.data_type.capacity }}]
{%- endif -%};
{%- if field is VariableLengthArrayType %}
{{ typename_unsigned_length }} {{ field | id }}_length;
{%- endif -%}
{%- endfor %}
...
} {{ T | full_reference_name }};
#endif // {{T.full_name | ln.c.macrofy}}
More examples
Where to find more examples to get started:
See built-in templates under nunavut.lang.LANGUAGE.templates.
API usage examples can be found in the Pycyphal library.
Bundled third-party software
Nunavut embeds the following third-party software libraries into its source
(i.e. these are not dependencies and do not need to be installed):
Jinja2 3.1.6 by Pallets, BSD 3-clause license (with Nunavut’s auto-indent extension).
markupsafe 3.0.4 by Pallets, BSD 3-clause license (needed for Jinja).
Documentation
The documentation for Nunavut is hosted on readthedocs.io:
Nunavut is part of the OpenCyphal project: