[PATCH v8 5/5] dts: add API doc generation

Juraj Linkeš juraj.linkes at pantheon.tech
Thu Aug 1 15:03:07 CEST 2024



On 30. 7. 2024 15:51, Thomas Monjalon wrote:
> 12/07/2024 10:57, Juraj Linkeš:
>> The tool used to generate DTS API docs is Sphinx, which is already in
>> use in DPDK. The same configuration is used to preserve style with one
>> DTS-specific configuration (so that the DPDK docs are unchanged) that
>> modifies how the sidebar displays the content.
> 
> What is changed in the sidebar?
> 

These are the two changes:
html_theme_options = {
     'collapse_navigation': False,
     'navigation_depth': -1,
}

The first allows you to explore the structure without needing to enter 
any specific section - it puts the + at each section so everything is 
expandable.
The second just means that each section can be fully expanded (there's 
no limit).

> 
>> --- a/doc/api/doxy-api-index.md
>> +++ b/doc/api/doxy-api-index.md
>> @@ -244,3 +244,6 @@ The public API headers are grouped by topics:
>>     [experimental APIs](@ref rte_compat.h),
>>     [ABI versioning](@ref rte_function_versioning.h),
>>     [version](@ref rte_version.h)
>> +
>> +- **tests**:
>> +  [**DTS**](@dts_api_main_page)
> 
> OK looks good
> 
> 
>> --- a/doc/api/doxy-api.conf.in
>> +++ b/doc/api/doxy-api.conf.in
>> @@ -124,6 +124,8 @@ SEARCHENGINE            = YES
>>   SORT_MEMBER_DOCS        = NO
>>   SOURCE_BROWSER          = YES
>>   
>> +ALIASES                 = "dts_api_main_page=@DTS_API_MAIN_PAGE@"
> 
> Why is it needed?
> That's the only way to reference it in doxy-api-index.md?
> Would be nice to explain in the commit log.
> 

I can add something to the commit log. The questions are answered below, 
in your other related comment.

>> --- a/doc/api/meson.build
>> +++ b/doc/api/meson.build
>> +# A local reference must be relative to the main index.html page
>> +# The path below can't be taken from the DTS meson file as that would
>> +# require recursive subdir traversal (doc, dts, then doc again)
> 
> This comment is really obscure.
> 

I guess it is. I just wanted to explain that there's not way to do this 
without spelling out the path this way. At least I didn't find a way.
Should I remove the comment or reword it?

>> +cdata.set('DTS_API_MAIN_PAGE', join_paths('..', 'dts', 'html', 'index.html'))
> 
> Oh I think I get it:
> 	- DTS_API_MAIN_PAGE is the Meson variable
> 	- dts_api_main_page is the Doxygen variable
> 

Yes, this is a way to make it work. Maybe there's something else (I'm 
not that familiar with Doxygen), but from what I can tell, there wasn't 
a command line option that would set a variable (passing the path form 
Meson to Doxygen) and nothing else I found worked.

Is this solution ok? If we want to explore something else, is there 
someone with more experience with Doxygen who could help?

> 
>> +# Napoleon enables the Google format of Python doscstrings, used in DTS
>> +# Intersphinx allows linking to external projects, such as Python docs, also used in DTS
> 
> Close sentences with a dot, it is easier to read.
> 

Ack.

>> +extensions = ['sphinx.ext.napoleon', 'sphinx.ext.intersphinx']
>> +
>> +# DTS Python docstring options
>> +autodoc_default_options = {
>> +    'members': True,
>> +    'member-order': 'bysource',
>> +    'show-inheritance': True,
>> +}
>> +autodoc_class_signature = 'separated'
>> +autodoc_typehints = 'both'
>> +autodoc_typehints_format = 'short'
>> +autodoc_typehints_description_target = 'documented'
>> +napoleon_numpy_docstring = False
>> +napoleon_attr_annotations = True
>> +napoleon_preprocess_types = True
>> +add_module_names = False
>> +toc_object_entries = True
>> +toc_object_entries_show_parents = 'hide'
>> +intersphinx_mapping = {'python': ('https://docs.python.org/3', None)}
>> +
>> +dts_root = environ.get('DTS_ROOT')
> 
> Why does it need to be passed as an environment variable?
> Isn't it a fixed absolute path?
> 

The path to DTS needs to be passed in some way (and added to sys.path) 
so that Sphinx knows where the sources are in order to import them.

Do you want us to not pass the path, but just hardcode it here? I didn't 
really think about that, maybe that could work.

>> +if dts_root:
>> +    path.append(dts_root)
>> +    # DTS Sidebar config
>> +    html_theme_options = {
>> +        'collapse_navigation': False,
>> +        'navigation_depth': -1,
>> +    }
> 
> [...]
> 
>> +To build DTS API docs, install the dependencies with Poetry, then enter its shell:
> 
> I don't plan to use Poetry on my machine.
> Can we simply describe the dependencies even if the versions are not specified?
> 

The reason we don't list the dependencies anywhere is that doing it with 
Poetry is much easier (and a bit safer, as Poetry is going to install 
tested versions).

But I can add references to the two relevant sections of 
dts/pyproject.toml which contain the dependencies with a note that they 
can be installed with pip (and I guess that would be another 
dependency), but at that point it's that not much different than using 
Poetry.

>> +
>> +.. code-block:: console
>> +
>> +   poetry install --no-root --with docs
>> +   poetry shell
>> +
>> +The documentation is built using the standard DPDK build system.
>> +After executing the meson command and entering Poetry's shell, build the documentation with:
>> +
>> +.. code-block:: console
>> +
>> +   ninja -C build dts-doc
> 
> Don't we rely on the Meson option "enable_docs"?

I had a discussion about this with Bruce, but I can't find it anywhere, 
so here's what I remember:
1. We didn't want to tie the dts api doc build to dpdk doc build because 
of the dependencies.
2. There's a way to build docs without the enable_docs option (running 
ninja with the target), which is what we added for dts. This doesn't tie 
the dts api doc build to the dpdk doc build.
3. We had an "enable_dts_docs" Meson option in the past (to keep it 
separate from dpdk doc build), but decided to drop it. My memory is hazy 
on this, but I think it was, again, because of the additional steps 
needed to bring up the dependency (poetry shell) - at that point, 
supporting just the ninja build way is sufficient. Bruce may shed more 
light on this.

>> +
>> +The output is generated in ``build/doc/api/dts/html``.
>> +
>> +.. Note::
> 
> In general the RST expressions are lowercase.
> 

Ack.

>> +
>> +   Make sure to fix any Sphinx warnings when adding or updating docstrings,
>> +   and also run the ``devtools/dts-check-format.sh`` script and address any issues it finds.
> 
> It looks like something to write in the contributing guide.
> 

I could add it there, where is the right place? In patches.rst, section 
"Checking the Patches"?

> 
>> +++ b/dts/doc/meson.build
>> @@ -0,0 +1,27 @@
>> +# SPDX-License-Identifier: BSD-3-Clause
>> +# Copyright(c) 2023 PANTHEON.tech s.r.o.
>> +
>> +sphinx = find_program('sphinx-build', required: false)
>> +sphinx_apidoc = find_program('sphinx-apidoc', required: false)
>> +
>> +if not sphinx.found() or not sphinx_apidoc.found()
> 
> You should include the option "enable_docs" here.
> 
>> +    subdir_done()
>> +endif
> 
> 
> 


More information about the dev mailing list