1--- 2title: Contributing 3category: Contributing 4layout: default 5SPDX-License-Identifier: LGPL-2.1-or-later 6--- 7 8# Contributing 9 10We welcome contributions from everyone. However, please follow the following guidelines when posting a GitHub Pull Request or filing a GitHub Issue on the systemd project: 11 12## Filing Issues 13 14* We use [GitHub Issues](https://github.com/systemd/systemd/issues) **exclusively** for tracking **bugs** and **feature** **requests** (RFEs) of systemd. If you are looking for help, please contact [systemd-devel mailing list](https://lists.freedesktop.org/mailman/listinfo/systemd-devel) instead. 15* We only track bugs in the **two** **most** **recently** **released** (non-rc) **versions** of systemd in the GitHub Issue tracker. If you are using an older version of systemd, please contact your distribution's bug tracker instead (see below). See [GitHub Release Page](https://github.com/systemd/systemd/releases) for the list of most recent releases. 16* When filing a feature request issue (RFE), please always check first if the newest upstream version of systemd already implements the feature, and whether there's already an issue filed for your feature by someone else. 17* When filing an issue, specify the **systemd** **version** you are experiencing the issue with. Also, indicate which **distribution** you are using. 18* Please include an explanation how to reproduce the issue you are pointing out. 19 20Following these guidelines makes it easier for us to process your issue, and ensures we won't close your issue right-away for being misfiled. 21 22### Older downstream versions 23For older versions that are still supported by your distribution please use respective downstream tracker: 24* **Fedora** - [bugzilla](https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&component=systemd) 25* **RHEL/CentOS** - [bugzilla](https://bugzilla.redhat.com/) or [systemd-rhel github](https://github.com/systemd-rhel/) 26* **Debian** - [bugs.debian.org](https://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=systemd) 27 28## Security vulnerability reports 29 30See [reporting of security vulnerabilities](SECURITY.md). 31 32## Posting Pull Requests 33 34* Make sure to post PRs only relative to a very recent git tip. 35* Follow our [Coding Style](CODING_STYLE.md) when contributing code. This is a requirement for all code we merge. 36* Please make sure to test your change before submitting the PR. See the [Hacking guide](HACKING.md) for details on how to do this. 37* Make sure to run the test suite locally, before posting your PR. We use a CI system, meaning we don't even look at your PR, if the build and tests don't pass. 38* If you need to update the code in an existing PR, force-push into the same branch, overriding old commits with new versions. 39* After you have pushed a new version, add a comment about the new version (no notification is sent just for the commits, so it's easy to miss the update without an explicit comment). If you are a member of the systemd project on GitHub, remove the `reviewed/needs-rework` label. 40* If you are copying existing code from another source (eg: a compat header), please make sure the license is compatible with LGPL-2.1-or-later. If the license is not LGPL-2.1-or-later, please add a note to LICENSES/README.md. 41 42## Final Words 43 44We'd like to apologize in advance if we are not able to process and reply to your issue or PR right-away. We have a lot of work to do, but we are trying our best! 45 46Thank you very much for your contributions! 47 48# Backward Compatibility And External Dependencies 49 50We strive to keep backward compatibility where possible and reasonable. The following are general guidelines, not hard 51rules, and case-by-case exceptions might be applied at the discretion of the maintainers. The current set of build time 52and runtime dependencies are documented in the [README](../README). 53 54## New features 55 56It is fine for new features/functionality/tools/daemons to require bleeding edge external dependencies, provided there 57are runtime and build time graceful fallbacks (e.g.: daemon will not be built, runtime functionality will be skipped with 58clear log message). 59In case a new feature is added to both `systemd` and one of its dependencies, we expect the corresponding feature code to 60be merged upstream in the dependency before accepting our side of the implementation. 61Making use of new kernel syscalls can be achieved through compat wrappers in our tree (see: `src/basic/missing_syscall_def.h`), 62and does not need to wait for glibc support. 63 64## External Build/Runtime Dependencies 65 66It is often tempting to bump external dependencies minimum versions to cut cruft, and in general it's an essential part 67of the maintenance process. But as a generic rule, existing dependencies should not be bumped without very strong 68reasons. When possible, we try to keep compatibility with the most recent LTS releases of each mainstream distribution 69for optional components, and with all currently maintained (i.e.: not EOL) LTS releases for core components. When in 70doubt, ask before committing time to work on contributions if it's not clear that cutting support would be obviously 71acceptable. 72 73## Kernel Requirements 74 75Same principles as with other dependencies should be applied. It is fine to require newer kernel versions for additional 76functionality or optional features, but very strong reasons should be required for breaking compatibility for existing 77functionality, especially for core components. It is not uncommon, for example, for embedded systems to be stuck on older 78kernel versions due to hardware requirements, so do not assume everybody is running with latest and greatest at all times. 79In general, [currently maintained LTS branches](https://www.kernel.org/category/releases.html) should keep being supported 80for existing functionality, especially for core components. 81 82## `libsystemd.so` 83 84`libsystemd.so` is a shared public library, so breaking ABI/API compatibility creates a lot of work for its users, and should 85always be avoided apart from the most extreme circumstances. For example, always add a new interface instead of modifying 86the signature of an existing function. It is fine to mark an interface as deprecated to gently nudge users toward a newer one, 87but in general support for the old one should be maintained whenever possible. 88Symbol versioning and the compiler's deprecated attribute should be used when managing the lifetime of a public interface. 89 90## `libudev.so` 91 92`libudev.so` is a shared public library, and is still maintained, but should not gain new symbols at this point. 93