Project

General

Profile

Guidelines for API documentation » History » Version 18

neels, 02/01/2019 02:27 AM

1 1 neels
h1. Guidelines for API documentation
2
3 12 neels
Find the current API doc in HTML form here: http://ftp.osmocom.org/api/latest/
4
5 13 neels
We use doxygen for API documentation, for an overview see http://www.doxygen.nl/manual/docblocks.html. Please follow these guidelines:
6 1 neels
7 14 neels
h2. Marker style
8
9 1 neels
Use the @/*!@ (Qt-style) doxygen markers.
10 14 neels
<pre>
11
/*! Item summary.
12
 * Details follow. */
13
struct item {
14
    int member; /*!< Member summary. */
15
};
16
</pre>
17 1 neels
18 14 neels
h2. Summary
19
20
Since we are using the AUTOBRIEF feature, omit '\brief', and always end the first sentence with a full-stop "." to mark the end of the short description.
21
22
To have a dot in a summary, use an escaped space like
23 1 neels
<pre>/*! Brief description (e.g.\ using only a few words). Details follow. */</pre>
24
25
Never rely on line breaks as semantic separation or to end a sentence, always use proper punctuation. The API doc may be rendered with different line breaks than in the source file.
26 4 neels
27
h2. Locations
28
29
Header files usually contain merely function declarations bare of any API docs. The API doc comment should be in a @.c@ file at the definition of a function.
30
31
Structs and enums defined in a header file, though, also have their API doc comments in that @.h@ file.
32 10 neels
33
Comments for single-line items like enum values or struct members can be placed on the same line using @/*!< Description */@.
34 4 neels
35
h2. Grammar
36
37
Always use the imperative form, i.e. omit wording like "This function does", and avoid writing documentation that merely mirrors a function's name. For example:
38
39
<pre>
40
/*! Return a (static) buffer containing a hexdump of the msg.
41
 * \param[in] msg message buffer
42 15 neels
 * \return a pointer to a static char array
43 4 neels
 */
44
const char *msgb_hexdump(const struct msgb *msg)
45
{
46
...
47
</pre>
48
49 1 neels
h2. Parameters
50 12 neels
51 4 neels
All parameters of a function should be documented. Input params are documented with @\param[in]@, where out-parameters (pointers to which returned data is written) are documented with @\param[out]@. Rarely, a param is both: @\param[in,out]@.
52
53
<pre>
54
/*! Apply nifty algorithm.
55
 * \param[in] x0  First factor.
56
 * \param[in] n   Amount of values to calculate.
57
 * \param[out] buf  Write calculated values to this buffer.
58
 *
59 1 neels
 * Optional longer function description. */
60 7 neels
</pre>
61 8 neels
62 4 neels
It is also possible to document parameters without a direction, using merely @\param param_name Description@, however, it is desirable to always indicate @[in]@, @[out]@ or @[inout]@.
63 1 neels
64 16 osmith
Parameters can *not* be referenced with @\ref@, nor with @\a@. See "this post":https://lists.osmocom.org/pipermail/openbsc/2019-January/012603.html for details.
65
66 1 neels
h2. File comments
67
68 17 neels
Choose distinct names in the '\file' directive: similar names will Doxygen, even if they are in separate subdirs and even separate libraries.
69
An example is osmocom/code/stats.h vs osmocom/vty/stats.h. If both of these are advertised as '\file stats.h', the duplicate handle will lead to both files missing from their respective groups.
70
Solutions:
71
72
* write '\file core/stats.h' and '\file vty/stats.h'
73
* do not use identical file names in the first place
74
75
Descriptions:
76
77 1 neels
If a file contains a descriptive comment, this comment should be right at the start of the file, as a doxygen @\file@ section.
78
The first sentence must be ended by a full stop "." to mark the end of the short description.
79
The copyright notice shall not be part of such API doc file comment.
80
81
<pre>
82
/*! \file foo.c
83
 * Short description. */
84
/*
85
 * (C) 2017 ... Copyright not in a doxygen comment
86
 * license information
87
 */
88
</pre>
89
90 17 neels
A more detailed description may follow later. Typically though, we place longer descriptions in groups, see below.
91 1 neels
92
<pre>
93
/*! \file foo.c
94
 * Short description.
95
 */
96
/*
97
 * (C) 2017 ...
98 17 neels
 */
99
100
/*! \file foo.c
101
 *
102
 * More information in multiple lines.
103 1 neels
 */
104
</pre>
105 11 neels
106 9 neels
If a file needs no description, it is ok to omit the @\file@ tag entirely. Since we are using EXTRACT_ALL = YES, files lacking a @\file@ tag are still listed in the API docs.
107 1 neels
108
h2. Groups
109
110 18 neels
Doxygen allows grouping elements: a group can include code elements and also entire files, and join them with a common description and cross references.
111 1 neels
112 18 neels
Use this pattern:
113 1 neels
114
<pre>
115 18 neels
/*! \file foo.h
116
 * API to provide Fooing.
117 1 neels
 */
118 18 neels
/* Copyright...
119
 */
120 1 neels
121 18 neels
#include <xyz>
122 1 neels
123 18 neels
/*! \defgroup fooing  Fooing Listed Name
124 1 neels
 * @{
125 18 neels
 * \file foo.h
126 1 neels
 */
127
128 18 neels
struct foo {
129 1 neels
...
130 18 neels
};
131 1 neels
132 18 neels
int foo(struct foo *f);
133
134 1 neels
/*! @} */
135
</pre>
136
137
<pre>
138
/*! \file foo.c
139 18 neels
 * Implementation of Fooing.
140 1 neels
 */
141 18 neels
/* Copyright...
142 1 neels
 */
143
144 18 neels
/*! \addtogroup fooing
145 1 neels
 *
146 18 neels
 * Fooing short description of one sentence.
147 1 neels
 *
148 18 neels
 * Fooing has a long description with many applications in modern Foo science.
149
 * Apply the Foo, not to be confused with the Fu, or Kung.
150 6 neels
 *
151 18 neels
 * @{
152
 * \file foo.c
153 1 neels
 */
154
155 18 neels
int foo(struct foo *f) {
156
    return 0xf00;
157
}
158 1 neels
159
...
160
161 18 neels
/*! @} */
162 1 neels
</pre>
163 18 neels
164
In detail:
165
166
* A \file with short description should be the first line of the file.
167
* Later on, name the same \file without the short description, after an opening @{ to add to a specific group.
168
* Do not add other #include directives within the group braces.
169
* A \defgroup initially defines a group, this shall exist only once, preferably in a .h file.
170
* More items can be added using an \addtogroup marker. Use this in the .c file and add a long description with references.
171
* Put the longer description in the .c file, not the .h file.
172
* Both have to be closed by "@}".
173
* Choose distinct group and file names, even across separate libraries, e.g. "\defgroup foo" and "\defgroup foo_VTY",
174
  or "\file foo.h" and "\file vty/foo.h".
175
* Be aware, any description following \file will be associated with that file and not the group.
176
* If a file's description matches a group's description, don't describe the file at all to avoid duplicated docs.
Add picture from clipboard (Maximum size: 48.8 MB)