More details can be found in the other files in this directory.
Please read and follow at least our contribution guidelines,
the style guide,
Logging.md
, and Test.md
.
For JavaScript code read ReportTemplateStyleGuide.md
,
and for Python code read PythonStyleGuide.md
.
There are two possibilities to retrieve the source code:
-
A read-only mirror at GitHub
For bug tracking, we use GitLab.
For building the code on the command line, c.f. ../INSTALL.md
.
-
Install a Java 17 compatible JDK (c.f.
../INSTALL.md
). -
Install Eclipse with at least version 4.22, with JDT. If you have more than one Java version installed, make sure to start Eclipse with Java 17 or newer.
-
Install the Eclipse plugin for google-java-format: Download the
google-java-format-eclipse-plugin-*.jar
from the most recent google-java-format release and put it into thedropins
directory of your Eclipse installation (where you extracted the Eclipse archive, not the workspace). Open theeclipse.ini
file in your Eclipse installation and append the following lines:
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
-
Create a copy of the file
.factorypath.template
and name it.factorypath
, and (if necessary) adjust the path to the CPAchecker directory within it. -
If Eclipse complains about a missing JDK (
Unbound classpath container: 'JRE System Library [JavaSE-17]'
), go to Window -> Preferences -> Java -> Installed JREs, click the "Search" button and select the path where your Java 17 installation can be found (on Ubuntu/usr/lib/jvm
will do). -
In order to run CPAchecker, use one of the supplied launch configurations or create your own. To select the configuration, specification, and program files use the text box "program arguments" in the launch configuration editor. The text box "VM arguments" should contain "-ea" to enable assertion checking.
-
Recommended: If you want the sources of the libraries (like Guava or CDT), run
ant install-contrib
once in the CPAchecker directory.
All files in the CPAchecker repository need to have a header with a declaration of copyright and license in the REUSE format.
After installing the reuse tool, use the following command to add our standard header:
reuse addheader --template=header.jinja2 --license Apache-2.0 --copyright 'Dirk Beyer <https://www.sosy-lab.org>' <FILES>
Of course, you can adjust license and copyright if necessary (e.g., when integrating third-party code). However, for all original contributions please consider transferring the copyright to us and use our standard license in order to make license handling easier for us and all users of CPAchecker. In accordance with the Apache license, all contributions to CPAchecker are by default under the Apache license as well unless explicitly marked otherwise.
We use javac, the Eclipse Java Compiler,
Google Error Prone,
SpotBugs,
Checkstyle, and
Policeman's Forbidden API Checker
for findings bugs in the source, and we keep CPAchecker
free of warnings from all these tools.
You can run them all at once (plus the unit tests) with ant all-checks
.
There is one additional check (Refaster) that is not included
because it needs additional setup, cf. below.
Our CI
will also execute these checks and send mails to the developer list
(cf. Mailing.md
, please apply for membership if you commit to CPAchecker).
If any of these tools or the unit tests find a problem, please fix them as soon as possible (ideally before committing).
Additionally, our BuildBot
executes integration tests with thousands of CPAchecker runs
in various configurations on every commit to the main branch and checks for regressions.
All major projects and configurations within CPAchecker should be part of this test suite.
Please refer to Test.md
for more information.
Refaster is a way to extend Google Error Prone with custom rules, and we have a collection of such rules. To apply them to CPAchecker, the following setup is required:
- Checkout rule repository with
git clone https://gitlab.com/sosy-lab/software/refaster.git
to some directory. - Add the following line to
build.properties
in the CPAchecker project directory (create the file if you do not have it already):refaster.rule.file=/PATH_TO_YOUR_REFASTER_RULES_CHECKOUT/rule.refaster
- Then from time to time update the rules checkout
(the desired revision can be seen with
grep REFASTER_REPO_REVISION .gitlab-ci.yml
in the CPAchecker directory) and compile the rules with the following command in the rules directory:(The desired Error Prone version can be seen withant build-refaster-rule -Drefaster.source.pattern=**/*.java -Derrorprone.version=ERROR_PRONE_VERSION
grep REFASTER_VERSION .gitlab-ci.yml
in the CPAchecker directory.)
Now you can execute the rules with ant refaster
and an error-prone.patch
file with the result will be created if there are recommendations.
For attaching a debugger to a CPAchecker process started on the command line (even remotely),
just run bin/cpachecker --jvm-debug ...
and point your debugger to TCP port 5005
of the respective machine.
The JS files can be found in the directory src/org/sosy_lab/cpachecker/core/counterexample
. We use Node.js as environment for our files.
All necessary third party libraries that we rely on can be installed via npm run install
.
Our JS code is postprocessed with webpack. Webpack bundles our JS and CSS code as well as the third party libraries and puts the resulting files in the build
directory. This can be done via the npm run build
command, which should be executed every time changes to the JS related files are made. Note that none of the raw files are actually used in the report generating, so any changes will not take effect unless the bundled files are updated.
During development, we also have a small development server that can be started via npm run start
. This server automatically opens an example report file in the browser and enables live updates for any changes to the JS code. Since a fully rendered HTML file is necessary for this server, the example file was created by CPAchecker and can be found under development_data/index.html
. Therefore, changes to the report.html
file will not be updated automatically. It is important to keep this file up to date by hand after any changes to the report.html
file.
Dependencies for CPAchecker are downloaded from an Ivy repository hosted at sosy-lab.org during build. Once all dependencies are cached locally, builds work offline.
It is also possible to override the path to the Ivy repository and to use a fully local copy of the Ivy repository. Instructions for doing so can be found in our cross-project wiki.
As a last resort for offline builds even if not all dependencies are available,
one can disable Ivy with ant -Divy.disable=true
.
But of course, as soon as a missing dependency is required,
this may not work.
-
Preparations: Update
NEWS.md
with notes for all important changes since the last CPAchecker release (i.e., new analyses and features, important changes to configuration etc.), and ensure thatAuthors.md
are up-to-date. -
Make sure to work in a fresh checkout with no uncommitted files and modifications.
-
Define a new version by setting
version.base
inbuild.xml
to the new value. The version number is constructed as outlined below in Sect. "Version Numbering". -
Update the heading in
NEWS.md
and update the version number in all places in the following files: -
Build binary archives with
ant clean dist
. -
Build
.deb
package withbuild/deb-package.sh <version> CPAchecker-<version>-unix.zip dist-<version>/
. -
Test binary archives and the
.deb
package. -
Commit the changes with commit message
Release <version>
. -
Add a tag in the repository with name
cpachecker-<version>
. -
Prepare for next development cycle by setting
version.base
inbuild.xml
to a new development version, which is the next possible version number with the suffix-svn
. For example, if3.0
was just released, the next possible feature release is3.1
and the new development version should be3.1-svn
. -
Publish the
.deb
package created indist-<version>/
in our APT repository using the instructions there. -
Publish new CPAchecker version on Zenodo under https://doi.org/10.5281/zenodo.3816620:
- Assign new DOI and upload
CPAchecker-<version>-unix.zip
archive. - Update title to
CPAchecker Release <version> (image)
. - Set publication date.
- Update description with entries for new version in
NEWS.md
. - Update list of contributors according to
Authors.md
. - Set version field to
<version> (unix)
.
- Assign new DOI and upload
-
Update homepage:
- Add release ZIP archives to
/html
in the repository. - Put changelog of newest version into
/html/NEWS-<version>.txt
. - Add links to
/html/download.php
. - Move the old download links to
/html/download-oldversions.php
. - Update section News on
/html/index.php
.
- Add release ZIP archives to
-
Publish the Docker image by either building and pushing the image manually as described in
build/Dockerfile.release
or triggering the scheduled GitLab CI job (https://gitlab.com/sosy-lab/software/cpachecker/pipeline_schedules). This needs to be done after updating the homepage. -
Send a mail with the release announcement to cpachecker-announce and cpachecker-users mailing lists.
We use the following schema to construct version numbers for CPAchecker releases (from version 3.0 onwards):
X.Y
is a release that should be done at least yearly, where an increase ofX
to versionX.0
indicates a major change and an increase ofY
indicates a minor change (e.g., added functionality).X.Y.Z
indicates a bug-fix release, whereZ
is increased (starting from0
).- Extensions with hyphen are possible,
for example,
-dev
indicates unstable development versions that are not released. Note thatX.Y-suffix
is ordered beforeX.Y
.
The tags in our repository are named cpachecker-VERSION
, e.g., cpachecker-3.0
.