aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CODING.md139
1 files changed, 139 insertions, 0 deletions
diff --git a/CODING.md b/CODING.md
new file mode 100644
index 000000000..fbd1b2de2
--- /dev/null
+++ b/CODING.md
@@ -0,0 +1,139 @@
+# UHD Coding Standards
+
+Note: This file applies to all code within the UHD repository, not just for
+code that is actually part of the UHD library.
+
+## Preamble
+
+To quote R. W. Emerson: "A foolish consistency is the hobgoblin of little minds,
+adored by little statesmen and philosophers and divines". Ignoring the little
+statesmen for a minute, these coding standards are here to make our life
+*easier*, not simply add additional rules. They are meant as additional guidance
+for developers, and are not meant to be interpreted as law.
+
+So, ultimately, it is up to the developer to decide how much these guidelines
+should be heeded when writing code, and up to reviewers how much they are
+relevant to new submissions.
+That said, a consistent codebase is easier to maintain, read, understand, and
+extend. Choosing personal preferences over these coding guidelines is not a
+helpful move for the team and future maintainability of the UHD codebase.
+
+## General Coding Guidelines
+
+* Never submit code with trailing whitespace.
+* Code layout: We use 4 spaces for indentation levels, and never tabs.
+* Code is read more often than it's written. Code readability is thus something
+ worth optimizing for.
+* Try and keep line lengths to 79 characters, unless readability suffers. We
+ often have to do fun things like SSH into machines and edit code in a
+ terminal, and do side-by-side views of code on small-ish screens, so this is
+ actually pretty helpful.
+* Go crazy with log messages. Trace-level log messages in particular can be
+ used copiously and freely (unless in rare cases where the can interfere with
+ performance). Note that in C++, we have the option of fully compiling out
+ trace-level messages (and even higher levels).
+
+## C++-specific Guidelines
+
+* Use Doxygen doc-blocks copiously.
+* All things equal, prefer standard C++ constructs over Boost constructs (see
+ also Boost guidelines).
+* Given the option, prefer C++ lambdas over std::bind, and just don't use
+ boost::bind if you can.
+* `size_t` is the correct container for all indexing of C++ structures (such
+ as vectors). But keep in mind that the size of `size_t` is
+ *platform-dependent*!
+* Use size-specific types whenever interacting with hardware (`int32_t`, etc.).
+ It's very easy to get bitten by incorrect sizes.
+* Include include files in the following order: Local headers, other
+ UHD headers, 3rd-party library headers, Boost headers, standard headers.
+ The rationale is to include from most to least specific. This is the best way
+ to catch missing includes (if you were to include the standard header first,
+ it would be available to all include files that come later. If they need that
+ standard header too, they should be including it themselves).
+ Example:
+
+```cpp
+#include "x300_specific.hpp"
+#include <uhd/utils/log.hpp>
+#include <libusb/foo.hpp>
+#include <boost/shared_ptr.hpp>
+#include <mutex>
+```
+
+* Feel free to use modern C/C++ features even if they were not used before.
+ Make sure they work with the compilers and dependencies which are set for the
+ version of UHD the commit will be made upon. The Ettus CI system will be able
+ to confirm this.
+ For interesting new features, use 'anchor commits', which describe clearly
+ which new feature was used. They can be used as a reference for other
+ developers. Example:
+
+```
+commit 9fe731cc371efee7f0051186697e611571c5b41b
+Author: Andrej Rode <andrej.rode@ettus.com>
+Date: Tue Nov 22 16:19:38 2016 -0800
+
+ utils: uhd_find_devices display one device for each unique serial found
+
+ Note: This also is the first precedent for the usage of the 'auto' keyword
+ in UHD. Commits past this one will also be able to use 'auto'.
+
+ Reviewed-By: Martin Braun <martin.braun@ettus.com>
+```
+
+
+## Boost-specific Guidelines
+
+* Avoid Boost where possible.
+* Don't use Boost's sleep functions. Prefer `std::chrono` functions.
+* When using `boost::assign::list_of` or `boost::assign::map_list_of`, make
+ sure to explicitly cast to the appropriate container (even better: Avoid
+ `boost::assign`, maybe use std initializer lists where possible):
+
+```cpp
+std::vector<std::string> foo =
+ boost::assign::list_of<std::string> // Explicitly list the type (in this
+ ("string1") // case, std::string). Then list all
+ ("string2") // the items (string1, string2, etc).
+ ("etc")
+ .to_container(foo); // Finally, call conversion routine explicitly.
+// Same for maps:
+std::map<std::string, std::string> bar =
+ boost::assign::map_list_of<std::string, std::string>
+ ("a", "b")
+ ("c", "d")
+ ("etc", "etc")
+ .to_container(bar);
+```
+
+
+## Python-specific Guidelines
+
+* Keep Python code compatible with Py2k and Py3k. There are plenty of tools to
+ aid with this, such as `futurize`.
+* Follow the suggestions in PEP8 (https://www.python.org/dev/peps/pep-0008/)
+ and PEP257 (https://www.python.org/dev/peps/pep-0257/). The former is about
+ code layout in general, the latter about docstrings.
+* Pylint is good tool for helping with following code guidelines. It's very
+ fussy though, so don't get too worked up about following its suggestions.
+
+
+## Revision Control Hygiene
+
+* In this repository, we almost always use fast-forward merges, and no merge
+ commits.
+* Prefix all commit messages with the section of code they apply to (Example:
+ "x300: Fixed overflow at full moon"
+* Keep the subject line of a git commit short and concise (so that
+ `git log --oneline` is actually useful), and follow up in greater detail in
+ the body of the commmit message. The body is separated from the subject line
+ with one blank line.
+* Avoid long lines in commit messages (standard is 50 characters for subject,
+ and 72 characters for body).
+* Avoid refactoring, whitespace cleanup, or fixing code to match coding
+ guidelines in the same commit as modifying behaviour. Prefer dedicated
+ cleanup commits.
+* Remember that we ship git repositories, not just code. This means every
+ commit is part of our product and should be treated as such.
+