Skip to content
Commits on Source (2)
---
layout: page
title: Tools
permalink: /tools/
order: 3
---
<div class="row">
<div class="four columns">&nbsp;</div>
<div class="eight columns text">
<p>
Several tools are available to make your life easier when working on
<em>reproducible builds</em>.
<a href="http://reproducible.alioth.debian.org/releases/">Signed tarballs are available</a>.
</p>
</div>
</div>
<div class="row">
<div class="four columns title">
<h2>diffoscope</h2>
</div>
<div class="eight columns text">
<p>
<a href="https://diffoscope.org/">diffoscope</a> will try to <strong>get
to the bottom of what makes files or directories different</strong>. It
will recursively unpack archives of many kinds and transform various
binary formats into more human-readable forms for comparison. It can
compare two tarballs, ISO images, or PDFs just as easily.
</p>
<p>
See an <a href="https://diffoscope.org/examples/igerman98_20131206-5.txt">example text output</a>.
</p>
<p>
diffoscope is also <a href="https://pypi.python.org/pypi/diffoscope">available on PyPI</a>.
</p>
</div>
</div>
<div class="row">
<div class="four columns title">
<h2>trydiffoscope</h2>
</div>
<div class="eight columns text">
<p>
If you wish to just experiment with
<a href="https://diffoscope.org/">diffoscope</a> without installing a large
number of run-time dependencies, you can use the
<a href="https://try.diffoscope.org/">try.diffoscope.org</a> service directly
from your web browser. A lightweight command-line client is also
<a href="https://packages.debian.org/sid/diffoscope">available in Debian</a> and
<a href="https://pypi.python.org/pypi/trydiffoscope">on PyPI</a>.
</p>
</div>
</div>
<div class="row">
<div class="four columns title">
<h2>disorderfs</h2>
</div>
<div class="eight columns text">
<p>
Problems with <a href="/docs/stable-inputs/">unstable order of inputs</a>
or other variations introduced by filesystems can sometimes be hard to track down.
<a href="https://packages.debian.org/sid/disorderfs">disorderfs</a> is
<strong>an overlay FUSE filesystem that deliberately introduces
non-determinism into filesystem metadata</strong>. For example, it can
randomize the order in which directory entries are read.
</p>
</div>
</div>
<div class="row">
<div class="four columns title">
<h2>strip-nondeterminism</h2>
</div>
<div class="eight columns text">
<p>
Some tools used in build systems might introduce non-determinism in ways
difficult to fix at the source, which <strong>requires
post-processing</strong>. <a
href="https://packages.debian.org/sid/strip-nondeterminism">strip-nondeterminism</a>
knows how to <strong>normalize various file formats</strong> such as gzipped files, ZIP
archives, and Jar files. It is written in Perl with extensibility in
mind.
</p>
</div>
</div>
<div class="row">
<div class="four columns title">
<h2>reprotest</h2>
</div>
<div class="eight columns text">
<p>
<a href="https://packages.debian.org/sid/reprotest">reprotest</a> builds
the same source code in different environments and then checks the
binaries produced by the builds to see if changing the environment,
without changing the source code, changed the generated binaries.
</p>
</div>
<div class="row">
<div class="four columns title">
<h2>more tools</h2>
</div>
<div class="eight columns text">
<ul>
<li><a href="https://zlika.github.io/reproducible-build-maven-plugin">reproducible-build-maven-plugin</a> for the <a href="https://maven.apache.org">Apache Maven</a> build tool, popular with Java projects.</li>
<li><a href="https://github.com/raboof/sbt-reproducible-builds#readme">sbt-reproducible-builds</a> plugin for the <a href="https://www.scala-sbt.org/">sbt</a> build tool, popular with <a href="https://www.scala-lang.org/">Scala</a> projects.</li>
</ul>
</div>
</div>
---
layout: new/default
title: Tools
permalink: /tools/
order: 3
---
# Tools
<p class="lead">Several tools are available to make your life easier when working on reproducible builds.</p>
[Signed tarballs are available](http://reproducible.alioth.debian.org/releases/).
## diffoscope
[diffoscope](https://diffoscope.org/) will try to get to the bottom of what
makes files or directories different. It will recursively unpack archives of
many kinds and transform various binary formats into more human-readable forms
for comparison. It can compare two tarballs, ISO images, or PDFs just as
easily. See an example
[HTML](https://diffoscope.org/examples/https-everywhere-5.0.6_vs_5.0.7.html)
and [text](https://diffoscope.org/examples/igerman98_20131206-5.txt) output.
<a href="https://diffoscope.org/" class="btn btn-outline-primary btn-sm">Homepage</a>
<a href="https://salsa.debian.org/reproducible-builds/diffoscope" class="btn btn-outline-primary btn-sm">Git</a>
<a href="https://salsa.debian.org/reproducible-builds/diffoscope/issues" class="btn btn-outline-primary btn-sm">Issues</a>
<a href="https://salsa.debian.org/reproducible-builds/diffoscope/merge_requests" class="btn btn-outline-primary btn-sm">Merge requests</a>
<a href="https://packages.debian.org/sid/diffoscope" class="btn btn-outline-primary btn-sm">Debian package</a>
<a href="https://pypi.python.org/pypi/diffoscope" class="btn btn-outline-primary btn-sm">PyPI</a>
### trydiffoscope
If you wish to just experiment with [diffoscope](https://diffoscope.org/)
without installing a large number of run-time dependencies, you can use the
[try.diffoscope.org](https://try.diffoscope.org/) service directly from your
web browser. A lightweight lient is also available as the `trydiffoscope`
command-line utility.
<a href="https://try.diffoscope.org/" class="btn btn-outline-primary btn-sm">Homepage</a>
<a href="https://salsa.debian.org/reproducible-builds/trydiffoscope" class="btn btn-outline-primary btn-sm">Git</a>
<a href="https://salsa.debian.org/reproducible-builds/trydiffoscope/issues" class="btn btn-outline-primary btn-sm">Issues</a>
<a href="https://salsa.debian.org/reproducible-builds/trydiffoscope/merge_requests" class="btn btn-outline-primary btn-sm">Merge requests</a>
<a href="https://packages.debian.org/sid/trydiffoscope" class="btn btn-outline-primary btn-sm">Debian package</a>
<a href="https://pypi.python.org/pypi/trydiffoscope" class="btn btn-outline-primary btn-sm">PyPI</a>
## disorderfs
Problems with [unstable order of inputs](/docs/stable-inputs/) or other
variations introduced by filesystems can sometimes be hard to track down.
disorderfs is an overlay FUSE filesystem that deliberately introduces
non-determinism into filesystem metadata. For example, it can randomize the
order in which directory entries are read.
<a href="https://salsa.debian.org/reproducible-builds/diffoscope" class="btn btn-outline-primary btn-sm">Git</a>
<a href="https://salsa.debian.org/reproducible-builds/diffoscope/issues" class="btn btn-outline-primary btn-sm">Issues</a>
<a href="https://salsa.debian.org/reproducible-builds/diffoscope/merge_requests" class="btn btn-outline-primary btn-sm">Merge requests</a>
<a href="https://packages.debian.org/sid/disorderfs" class="btn btn-outline-primary btn-sm">Debian package</a>
## strip-nondeterminism
Some tools used in build systems might introduce non-determinism in ways
difficult to fix at the source, which requires post-processing.
`strip-nondeterminism` knows how to normalise various file formats such as
gzipped files, ZIP archives, and Jar files. It is written in Perl with
extensibility in mind.
<a href="https://salsa.debian.org/reproducible-builds/strip-nondeterminism" class="btn btn-outline-primary btn-sm">Git</a>
<a href="https://salsa.debian.org/reproducible-builds/strip-nondeterminism/issues" class="btn btn-outline-primary btn-sm">Issues</a>
<a href="https://salsa.debian.org/reproducible-builds/strip-nondeterminism/merge_requests" class="btn btn-outline-primary btn-sm">Merge requests</a>
<a href="https://packages.debian.org/sid/strip-nondeterminism" class="btn btn-outline-primary btn-sm">Debian package</a>
## reprotest
reprotest builds the same source code in different environments and then checks
the binaries produced by the builds to see if changing the environment, without
changing the source code, changed the generated binaries.
<a href="https://salsa.debian.org/reproducible-builds/reprotest" class="btn btn-outline-primary btn-sm">Git</a>
<a href="https://salsa.debian.org/reproducible-builds/reprotest/issues" class="btn btn-outline-primary btn-sm">Issues</a>
<a href="https://salsa.debian.org/reproducible-builds/reprotest/merge_requests" class="btn btn-outline-primary btn-sm">Merge requests</a>
<a href="https://packages.debian.org/sid/reprotest" class="btn btn-outline-primary btn-sm">Debian package</a>
## Other tools
* [reproducible-build-maven-plugin](https://zlika.github.io/reproducible-build-maven-plugin) for the [Apache Maven](https://maven.apache.org) build tool, popular with Java projects.
* [sbt-reproducible-builds](https://github.com/raboof/sbt-reproducible-builds#readme) plugin for the [sbt](https://www.scala-sbt.org/) build tool, popular with [Scala](https://www.scala-lang.org/) projects.