1       #######################################################
2       #  Developer information for contributing to libcoap  #
3       #######################################################
4
51. The basics
6~~~~~~~~~~~~~
7The libcoap project is a FOSS project that is dual licensed. The maintainer
8for the libcoap is Olaf Bergmann <bergmann@tzi.org>.
9Any contributions have to be made dual licensed under the terms of the
10license
11
12  * BSD 2-Clause (The BSD 2-Clause License)
13
14and
15
16  * GPL v2+ (The GNU General Public License 2.0 or later)
17
18The used VCS for libcoap is Git, the main repository is living on GitHub.
19You can clone (or fork directly on GitHub) on the repository site:
20
21  https://github.com/obgm/libcoap
22
23Please refer also to the libcoap website for additional information
24
25  https://libcoap.net/
26
27The build environment is grounded on the classical autotools, the GNU GCC and
28the LLVM C-compiler (CLang) are supported. The Windows systems are not
29currently supported (until someone is creating support for it).
30
31Doxygen is used for creating a HTML based online documentation of the
32libcoap library.
33
342. Communications
35~~~~~~~~~~~~~~~~~
36The main discussion and development platform for libcoap is the mailing list
37on Sourceforge.
38No matter if you just have a simple question, some specific problem or
39want to discuss some patches, please write it to the mailing list. Please
40avoid personal mailings to the maintainer (or some other contributor) if
41your questions will probably be in the interest of other users too.
42You can subscribe to the list here:
43
44  https://lists.sourceforge.net/lists/listinfo/libcoap-developers
45
46The archive of the list can be found on:
47
48  https://sourceforge.net/p/libcoap/mailman/libcoap-developers
49
503. Starting contributing
51~~~~~~~~~~~~~~~~~~~~~~~~
52As written above libcoap is maintained with the Git tools so you should be
53familiar with the various git commands.
54The libcoap project is using just two main branches, the 'master' branch is
55holding the point releases, all the development process is going on in the
56'develop' branch.
57To start any contributing you first have to clone the git tree from the main
58repository on GitHub:
59
60  git clone https://github.com/obgm/libcoap.git
61
624. Working on the source
63~~~~~~~~~~~~~~~~~~~~~~~~
64As one golden rule you should work on improvements within *your* own local
65development branch! To do so you have to first checkout the 'develop' branch
66as local branch and then start on top on this branch your own branch. So
67create (or better say checkout) the local 'develop' branch:
68
69  cd libcoap
70  git checkout develop origin/develop
71
72Now you can simply start your own local branch (for example 'my-develop')
73with the 'origin/develop' as parent so you can later create the patches
74against the the upstream development branch:
75
76  git checkout -b my-develop
77
78At this point you can now work as known with git, modify the source, commit
79the changes, amend if needed and test your work.
80At some point you will have to generate patches to post them on the mailing
81list (and/or push your changes into your public Git tree). It's a good idea to
82post your patch series on the mailing list so other contributors will see your
83work and give further suggestions or discuss your work.
84
85To be able to send a patch series you will now create the series itself as
86single patches, this will be going easy with the 'git format-patch' command
87against the 'develop' branch, remind this is the upstream main development
88branch.
89To not mix up your series with probably unrelated patches let git place the
90patches within a defined directory. Also, while create the patches, tell git to
91create a cover letter patch so you can append some introducing words that will
92hold probably explanations why you create the patches in the way you have done.
93
94  git format-patch --cover-letter -o ../patches4libcoap
95
96This command will create a patch series in ../patches4libcoap where you find a
97patch named '0000-cover-letter.patch'. Please modify this patch with some
98useful information's for the mailing list. After finish this you now can send
99your patches to libcoap-developers@lists.sourceforge.net
100
101  git send-email ../patches4libcoap/* --to=libcoap-developers@lists.sourceforge.net
102
1035. Coding rules
104~~~~~~~~~~~~~~~
105As every FOSS project the libcoap project needs also some rules for coding.
106There are loss but the main of them are important!
107
1085.1 License and Copyright
109-------------------------
110Every new file must contain a license and the copyright holder(s). Please
111take a look into existing files and adopt the needed changes to your new
112file(s).
113
1145.2 Source Code Indentation
115---------------------------
116* For better reading the indentation is set to 2 characters as spaces, this
117  is depended on the often used nested functions like 'if-else'. Don't use
118  TABs any there! Avoid trailing white spaces at the end of a line.
119  It's appropriate to set up a modline like this one at first line within
120  the source file:
121
122--8<----
123/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 * -*- */
124--->8--
125
126* Single lines within the source code should not be longer then 78
127  characters.
128
129* If there a functions with a lot of parameters that do not fit into the above
130  rule split the declaration (in the *.h) and the implementation (in the *.c)
131  into single lines per parameter. For example like this (from src/block.c):
132
133--8<----
134int
135coap_add_block(coap_pdu_t *pdu,
136               unsigned int len,
137               const unsigned char *data,
138               unsigned int block_num,
139               unsigned char block_szx);
140--->8--
141
1425.3 Source Code Documentation
143-----------------------------
144* A useful source code documentation is mandatory. Mostly to be done within the
145  source code files, but more complex description should be done in extra
146  README files.
147
148* Please set up/adjust the doxygen documentation if you create new functions or
149  change existing functions. The doxygen documentation has to be done in the
150  header files as they are the public part of the libcoap and only use the
151  @-syntax for doxygen commands (akin to javadoc).
152
1535.4 API Changes
154---------------
155* Never break the API!
156  Don't remove old functions and if there some changes are needed in some kind
157  always provide a wrapper for the old call to let the library be backward
158  compatible and mark the old function as @deprecated in the doxygen comment.
159  Please discuss needed changes on the mailing list.
160
1615.5 Patches and Commits
162-----------------------
163* Git commits must be atomic and contain a declarative subject line (max 50
164  characters if possible) and a body for a statement if needed.
165  Use the possibility to write a good explanation why your patch/commit is
166  handle the changes in the way you have done. Remind that other user can
167  read your code but not necessary understand why the code is written this
168  way. Don't use something to generic like "bugfix commit".
169
170* A patch/commit or a series of patches/commits have to ensure that the
171  whole project is able to build up every thing, in short: Do not break
172  any make target and test your work.
173
174* Every patch/commit should handle one single logical change. If more than
175  one patch/commit is needed for a change explain it, respect the point
176  above. If your subject line become much larger than 50 characters then
177  typically your patch is to big for one single commit.
178
179* Commit message should begin with a submodule or unit the commit is for. By
180  this your commit message helps to find thematic other changes. If you have
181  to search and find something with 'git log | grep [foo]' you will see why
182  this is useful. Examples:
183
184    rd.c: Fixed type-specifier warning
185    Makefile.am: Added missing src/address.c
186    address.[hc]: make coap_address_equals() not inline on POSIX
187
1886. Where to start contributing?
189~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
190There are various things you could starting on to contribute, the best
191is you simply pick up an issue you blindly see and just improve the
192situation. Please take also a look into the file TODO and choose a point
193from there or point the maintainer to add other things here too.
194
195* Documentation
196We are always lacking on a better documentation on the source code, so
197maybe you can improve the doxygen documentation.
198Also a good documentation on the usage of the libcoap and the example
199binaries is always improvable. So we appreciate any help on this.
200
201* Man Pages
202The source is providing some example binaries which originally just should show
203how the libcoap can be used. Right now these binaries are fully usable and
204quite more than simple examples on a system. There are man pages for these
205binaries available, if you found there is a improvement needed please do so and
206write to the mailing list explained in section 2.
207Maybe you can write up some good HowTo's on the usage for these binaries. A man
208page for the library itself would be also a improvement.
209
210* HowTo's
211The libcoap library has now a lot of functions you can use.
212Unfortunately there is no good user guide on how to use the libcoap in
213any external project. This means there is no HowTo or CheatSheet for a
214programming person available. You want to write up something?
215
216* missed Functionality
217There are some features that are still missing inside the libcoap. For
218example some DTLS implementations and proxy functionality.
219
220