]> git.ipfire.org Git - thirdparty/pdns.git/blame - CONTRIBUTING.md
Merge pull request #13143 from rgacogne/ddist-cache-metrics-tsan-warning
[thirdparty/pdns.git] / CONTRIBUTING.md
CommitLineData
11902fff
PL
1Contributing to PowerDNS
2------------------------
3Thank you for you interest to contribute to the PowerDNS project. This document
4will explain some of the things you need to keep in mind when contributing to
5ease the workflow of this.
6
7# Issue Tracker
8When you post an issue or feature request to the
9[issue tracker](https://github.com/PowerDNS/pdns/issues), make sure this hasn't
10been reported before. If there is an open issue, add extra information on this
11issue or show that you have the same issue/want this feature by adding a `:+1:`.
12
13If there is no similar issue, feature request or you're not sure, open a new
14issue.
15
16## Filing a Feature Request
c1fc5d10 17When filing a feature request, please use the Feature request template provided.
11902fff
PL
18
19Please be as elaborate as possible when describing the feature you need. Provide
20at least the following information (if they are relevant):
21
22* Use case (what is the 'masterplan' that requires this feature)
23* Description of what the feature should do
24
25## Filing an Issue or Bug
26**Note:** if you're planning to file a security bug, look at our
27[Security Policy](https://doc.powerdns.com/md/security/) first.
28
29When filing an issue or bug report, make the title of the issue a very short
30summary (e.g. "Recursor crash when some-setting is set to 'crash'"). In the
31content of the issue, be as detailed as possible. Supply at least the following
32information:
33
34* PowerDNS version
76d09a54 35* Where you got the software from (e.g. distribution, compiled yourself)
11902fff
PL
36* Operating System and version
37* Steps to reproduce: How can we reproduce the issue
38* Expected behavior: what did you expect what would happen?
4821dd69 39* Observed behavior: what actually happened when following the steps?
11902fff
PL
40* Relevant logs: Please use code blocks (\`\`\`) to format console output, logs, and code as it's very hard to read otherwise.
41
c1fc5d10
PD
42We provide convenient templates that make it easy to not forget any of these steps.
43
11902fff
PL
44If you have already looked deeper into the problem, provide what you found as
45well.
46
47# Filing a Pull Request
48Code contributions are sent as a pull request on [GitHub](https://github.com/PowerDNS/pdns/pulls).
c1fc5d10 49By submitting a Pull Request you agree to your code becoming GPLv2 licensed.
11902fff
PL
50
51## Pull Request Guidelines
52A pull request, at the least, should have:
53
76d09a54 54* A clear and concise title (not e.g. 'Issue #1234')
11902fff
PL
55* A description of the patch (what issue does it solve or what feature does it add)
56* Documentation for the feature or when current behaviour changes
57* Regression and/or unit tests
58
59And must:
60* Be filed against the master branch before any release branch
c1fc5d10 61* Pass all tests in our CI (currently Github Actions and CircleCI)
11902fff 62
f1fe0aa3
PL
63Information on the tests can be found in the repository at
64[/regression-tests/README.md](https://github.com/PowerDNS/pdns/blob/master/regression-tests/README.md)
c1fc5d10
PD
65,
66[/regression-tests.recursor/README.md](https://github.com/PowerDNS/pdns/blob/master/regression-tests.recursor/README.md),
67plus various other directories with `regression-tests.*` names.
f1fe0aa3 68
11902fff
PL
69## Commit Guidelines
70* Tell why the change does what it does, not how it does it.
e2bd355f 71* The first line should be short (preferably less than 50 characters)
11902fff
PL
72* The rest of the commit body should be wrapped at 72 characters (see [this](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) for more info)
73* If this commit fixes an issue, put "Closes #XXXX" in the message
74* Do not put whitespace fixes/cleanup and functionality changes in the same commit
75
8f7dc5e9 76# Formatting and Coding Guidelines
7df8188e
FM
77
78## `clang-format`
79
15501d19
FM
80We have `clang-format` in place, but not for all files yet. We are working towards a fully formatted codebase in an incremental fashion.
81
82If you're adding new code, adhering to the formatting configuration available in `.clang-format` is appreciated. If you are touching code that is not yet formatted, it would also be very appreciated to format it in a separate commit first.
83
84Any formatting breakage in already formatted files will be caught by the CI. To format all files that are supposed to be formatted, run `make format-code` in the root of the tree.
c1fc5d10 85
8f7dc5e9 86## Formatting guidelines
11902fff 87
15501d19
FM
88* Don't have end-of-line whitespace.
89* Use spaces instead of tabs.
c1f41129 90
8f7dc5e9 91## Coding guidelines
c1f41129 92
8f7dc5e9
RG
93The coding guidelines can be found in the repository at
94[CODING_GUIDELINES.md](https://github.com/PowerDNS/pdns/blob/master/CODING_GUIDELINES.md)
95
96## Code Checkers
c1f41129
FM
97
98### `clang-tidy`
99
100`clang-tidy` requires a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) to work.
101See the ["Compilation Database" section of the DEVELOPMENT document](DEVELOPMENT.md#compilation-database) on how to generate a compilation database.
102
103Once the compilation database has been generated, you can pick one of the two available `clang-tidy` configuration files to run checks on source files.
104Picking a configuration file is a matter of creating a symbolic link called `.clang-tidy` to said file in the topmost level of the sub-project you're working on (or the toplevel repository directory if you're working on PowerDNS auth).
105
106We provide two configuration files for `clang-tidy`:
107
1081. A minimal [.clang-tidy.bugs](.clang-tidy.bugs) which only enables a few checks for common bugs.
109 This configuration can be enabled using `ln -sf .clang-tidy.bugs .clang-tidy`.
110
1112. A more complete [.clang-tidy.full](.clang-tidy.full) which enables almost all available checks.
112 This configuration can be enabled using `ln -sf .clang-tidy.full .clang-tidy` and is recommended for all new code.
d4ad3054 113
1215b18c
FM
114### `clang-tidy` and CI
115
116We run `clang-tidy` using the `.clang-tidy.full` configuration as part of our CI. `clang-tidy` warnings will show up on a pull request if any are introduced.
117
118However, it may happen that existing code could produce warnings and can show up too due to being part of the pull request. In such a case there are two options:
119
1201. Fix the warnings in a separate commit.
1212. If fixing the warning would be too much trouble at this point in time, disabling the specific warning using the `// NOLINTNEXTLINE` or `// NOLINT` directives can be acceptable given the following is adhered to:
122
123Any added `// NOLINTNEXTLINE` or `// NOLINT` directive or others need to have a Github issue title, issue number and link next to them in the description along with the name or Github nickname of the person that wrote it. The Github issue must have an assignee and an accurate description of what needs to be done. As an example:
124
125`// NOLINTNEXTLINE(<warning-name>) <issue-number> <issue-link> <person-name>: <issue-title> + a short comment if needed.`
126
127If the warning cannot be avoided in any way, a good explanation is needed. As an example:
128
129`// NOLINTNEXTLINE(*-cast): Using the OpenSSL C APIs.`
130
8f7dc5e9
RG
131### Additional checkers
132
133Even though we don't automatically run any of the code checkers listed below as part of our CI, it might make sense to run them manually, not only on newly added code, but to also improve existing code.
134
135* `clang`'s static analyzer, sometimes also referred as `scan-build`
136* `cppcheck`
137
d4ad3054
FM
138# Development Environment
139
140Information about setting up a development environment using a language server like [`clangd`](https://clangd.llvm.org/) or [`ccls`](https://github.com/MaskRay/ccls) can be found in [DEVELOPMENT.md](DEVELOPMENT.md).
56f01422
FM
141
142# Debugging
143
144## Using GDB
145
146To get a good debugging experience with `gdb`, it is recommended to build PowerDNS using the following flags:
147
148* `CC` and `CXX` set to `gcc` and `g++`, respectively.
149* `CFLAGS` and `CXXFLAGS` set to `-ggdb -Og -fno-inline`.
150
151These variables need to be set during the `configure` step, as follows:
152
153```sh
154export CC=clang CXX=clang++
155export CFLAGS="-ggdb -Og -fno-inline" CXXFLAGS="-ggdb -Og -fno-inline"
156./configure --with-modules=gsqlite3 --disable-lua-records --enable-unit-tests
157make -j 8
158```
159
160[GDB Dashboard](https://github.com/cyrus-and/gdb-dashboard) can be used to vastly improve the GDB debugging experience.