| =========================== |
| Including uAPI header files |
| =========================== |
| |
| Sometimes, it is useful to include header files and C example codes in |
| order to describe the userspace API and to generate cross-references |
| between the code and the documentation. Adding cross-references for |
| userspace API files has an additional advantage: Sphinx will generate warnings |
| if a symbol is not found at the documentation. That helps to keep the |
| uAPI documentation in sync with the Kernel changes. |
| The :ref:`parse_headers.py <parse_headers>` provides a way to generate such |
| cross-references. It has to be called via Makefile, while building the |
| documentation. Please see ``Documentation/userspace-api/media/Makefile`` for an example |
| about how to use it inside the Kernel tree. |
| |
| .. _parse_headers: |
| |
| tools/docs/parse_headers.py |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| NAME |
| **** |
| |
| parse_headers.py - parse a C file, in order to identify functions, structs, |
| enums and defines and create cross-references to a Sphinx book. |
| |
| USAGE |
| ***** |
| |
| parse-headers.py [-h] [-d] [-t] ``FILE_IN`` ``FILE_OUT`` ``FILE_RULES`` |
| |
| SYNOPSIS |
| ******** |
| |
| Converts a C header or source file ``FILE_IN`` into a ReStructured Text |
| included via ..parsed-literal block with cross-references for the |
| documentation files that describe the API. It accepts an optional |
| ``FILE_RULES`` file to describe what elements will be either ignored or |
| be pointed to a non-default reference type/name. |
| |
| The output is written at ``FILE_OUT``. |
| |
| It is capable of identifying ``define``, ``struct``, ``typedef``, ``enum`` |
| and enum ``symbol``, creating cross-references for all of them. |
| |
| It is also capable of distinguishing ``#define`` used for specifying |
| Linux-specific macros used to define ``ioctl``. |
| |
| The optional ``FILE_RULES`` contains a set of rules like:: |
| |
| ignore ioctl VIDIOC_ENUM_FMT |
| replace ioctl VIDIOC_DQBUF vidioc_qbuf |
| replace define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ :c:type:`v4l2_event_motion_det` |
| |
| POSITIONAL ARGUMENTS |
| ******************** |
| |
| ``FILE_IN`` |
| Input C file |
| |
| ``FILE_OUT`` |
| Output RST file |
| |
| ``FILE_RULES`` |
| Exceptions file (optional) |
| |
| OPTIONS |
| ******* |
| |
| ``-h``, ``--help`` |
| show a help message and exit |
| ``-d``, ``--debug`` |
| Increase debug level. Can be used multiple times |
| ``-t``, ``--toc`` |
| instead of a literal block, outputs a TOC table at the RST file |
| |
| |
| DESCRIPTION |
| *********** |
| |
| Creates an enriched version of a Kernel header file with cross-links |
| to each C data structure type, from ``FILE_IN``, formatting it with |
| reStructuredText notation, either as-is or as a table of contents. |
| |
| It accepts an optional ``FILE_RULES`` which describes what elements will be |
| either ignored or be pointed to a non-default reference, and optionally |
| defines the C namespace to be used. |
| |
| It is meant to allow having more comprehensive documentation, where |
| uAPI headers will create cross-reference links to the code. |
| |
| The output is written at the ``FILE_OUT``. |
| |
| The ``FILE_RULES`` may contain contain three types of statements: |
| **ignore**, **replace** and **namespace**. |
| |
| By default, it create rules for all symbols and defines, but it also |
| allows parsing an exception file. Such file contains a set of rules |
| using the syntax below: |
| |
| 1. Ignore rules: |
| |
| ignore *type* *symbol* |
| |
| Removes the symbol from reference generation. |
| |
| 2. Replace rules: |
| |
| replace *type* *old_symbol* *new_reference* |
| |
| Replaces *old_symbol* with a *new_reference*. |
| The *new_reference* can be: |
| |
| - A simple symbol name; |
| - A full Sphinx reference. |
| |
| 3. Namespace rules |
| |
| namespace *namespace* |
| |
| Sets C *namespace* to be used during cross-reference generation. Can |
| be overridden by replace rules. |
| |
| On ignore and replace rules, *type* can be: |
| |
| - ioctl: |
| for defines of the form ``_IO*``, e.g., ioctl definitions |
| |
| - define: |
| for other defines |
| |
| - symbol: |
| for symbols defined within enums; |
| |
| - typedef: |
| for typedefs; |
| |
| - enum: |
| for the name of a non-anonymous enum; |
| |
| - struct: |
| for structs. |
| |
| |
| EXAMPLES |
| ******** |
| |
| - Ignore a define ``_VIDEODEV2_H`` at ``FILE_IN``:: |
| |
| ignore define _VIDEODEV2_H |
| |
| - On an data structure like this enum:: |
| |
| enum foo { BAR1, BAR2, PRIVATE }; |
| |
| It won't generate cross-references for ``PRIVATE``:: |
| |
| ignore symbol PRIVATE |
| |
| At the same struct, instead of creating one cross reference per symbol, |
| make them all point to the ``enum foo`` C type:: |
| |
| replace symbol BAR1 :c:type:\`foo\` |
| replace symbol BAR2 :c:type:\`foo\` |
| |
| |
| - Use C namespace ``MC`` for all symbols at ``FILE_IN``:: |
| |
| namespace MC |
| |
| BUGS |
| **** |
| |
| |
| Report bugs to Mauro Carvalho Chehab <mchehab@kernel.org> |
| |
| |
| COPYRIGHT |
| ********* |
| |
| |
| Copyright (c) 2016, 2025 by Mauro Carvalho Chehab <mchehab+huawei@kernel.org>. |
| |
| License GPLv2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>. |
| |
| This is free software: you are free to change and redistribute it. |
| There is NO WARRANTY, to the extent permitted by law. |