Skip to content
Snippets Groups Projects

IMPORTANT

All the below is outdated and has to be rewritten. For more up-to-date instructions go to https://salsa.debian.org/debian-bootstrap-team/botch/-/wikis/home and read the articles linked from there.

First steps

Because there was no dose3 upstream release since January 2013, botch needs some features of dose3 which are only available via git. Dose3 itself can only release a new version once a new upstream version of libcudf is released. So dose3 depends on the git version of libcudf as well.

To check out the dose submodule you need git. To check out the libcudf submodule you need ca-certificates.

$ apt-get install git ca-certificates $ git submodule update --init $ (cd dose; git submodule update --init;)

You now can install all dependencies to build libcudf, dose3 and botch:

$ apt-get install ocaml-nox camlp4 libbz2-ocaml-dev ocaml-findlib libextlib-ocaml-dev libre-ocaml-dev libocamlgraph-ocaml-dev $ make doselib $ apt-get install libatdgen-ocaml-dev libxmlm-ocaml-dev $ make $ apt-get install dctrl-tools wget python python-apt python-networkx $ ./tools/native.sh

The result is...

You can also use graphviz:

$ apt-get install python-pygraphviz $ ./tools/graphml2dot

Install dependencies

$ apt-get install --no-install-recommends libdose3-ocaml-dev camlp4 make \
> wget python-apt bzip2 patch libatdgen-ocaml-dev
$ apt-get install {any www-browser of your choice}
  • libdose3-ocaml-dev, camlp4, make and python-apt are essential
  • wget is only needed for make setup execution
  • bzip2 and patch are only needed for make setup-sid
  • www-browser is needed to display the statistics output

If you want to use upstream master dose version

$ git submodule update --init
$ make doselib

Compile project

$ make

Retrieve sample Debian Sid Sources.bz2 and Packages.bz2

$ make setup-arm64

How to use in the cross case (new)

Select all binary packages that you want to have as part of the minimal distribution. This should at least be the Priority:essential packages and build-essential. Adding debhelper is recommended.

$ bzcat examples/real/Quantal-amd64-arm64-bootstrap.bz2 | \
grep-dctrl -X \( \
	-FPackage build-essential --or \
	-FPackage debhelper --or \
	-FEssential yes \
\) --and \( \
	-FArchitecture arm64 --or \
	-FArchitecture all \
\) > minimal

To get a quick overview of selected package names, just append

--no-field-names --show-field=Package

to above command. You can also add Priority:required packages.

Now get a coinstallation set for the selected binary packages. This step makes sure that your selected binary packages can be installed together and also outputs all additional binary packages that have to be installed.

$ ./dose/_build/applications/deb-coinstall.native \
--bg examples/real/Quantal-amd64-arm64-bootstrap.bz2 \
--fg minimal --deb-native-arch arm64 -v > minimal-arm64

Get the source packages associated to all binary packages that are not Architecture:all.

$ ./bin2src.native --deb-native-arch arm64 minimal-arm64 \
examples/real/Quantal-Sources-bootstrap.bz2 > minimal-src

Should the above fail because of a Sources.MismatchSrc exception, try adding

--srcverfallback

to above command.

You can then check which of those source packages already have their cross build dependencies satisfied, assuming all packages of the host architecture are available.

$ ./dose/_build/applications/deb-buildcheck.native \
--deb-native-arch amd64 --deb-host-arch arm64 \
examples/real/Quantal-amd64-arm64-bootstrap.bz2 minimal-src \
--successes

You can also investigate which source packages have unsatisfiable cross build dependencies by replacing the --successes option with

--failures --explain

This is helpful for locating conflicts created by missing multiarch annotations.

Now calculate all arm64 binary packages that must be available to crosscompile all source packages in minimal-src:

$ ./build_closure.native -vv \
--deb-native-arch=amd64 --deb-host-arch=arm64 \
--bg examples/real/Quantal-Sources-bootstrap.bz2 \
examples/real/Quantal-amd64-arm64-bootstrap.bz2 \
minimal-src > minimal-closure

This list can again be turned into a list of source packages using bin2src:

$ ./bin2src.native --deb-native-arch amd64 minimal-closure \
examples/real/Quantal-Sources-bootstrap.bz2 > minimal-closure-src

[...]

How to use in the native case (new)

Again, select all binary packages for your minimal distribution. This time you do not have to take care of the architecture.

    $ bzcat examples/real/Quantal-arm64-bootstrap.bz2 | \
    grep-dctrl -X \( \
            -FPackage build-essential --or \
            -FPackage debhelper --or \
            -FEssential yes \
    \) > minimal

Get a coinstallation set:

$ ./dose/_build/applications/deb-coinstall.native \
    --bg examples/real/Quantal-arm64-bootstrap.bz2 \
    --fg minimal --deb-native-arch arm64 -v > minimal-arm64

Turn it into a list of source packages:

$ ./bin2src.native --deb-native-arch arm64 minimal-arm64 \
examples/real/Quantal-Sources-bootstrap.bz2 > minimal-src

Create a reduced distribution using build_closure:

$ ./build_closure.native -vv --deb-native-arch=arm64 \
--bg examples/real/Quantal-Sources-bootstrap.bz2 \
examples/real/Quantal-arm64-bootstrap.bz2 \
-m minimal-arm64 minimal-src > minimal-closure

Create the list of corresponding source packages:

$ ./bin2src.native --deb-native-arch arm64 minimal-closure \
examples/real/Quantal-Sources-bootstrap.bz2 > minimal-closure-src

And check if the selection was done correctly by running deb-buildcheck:

$ ./dose/_build/applications/deb-buildcheck.native \
--deb-native-arch=arm64 -vv minimal-closure minimal-closure-src

General options

-v Info messages are printed -vv Info and Debug messages are printed --progress If available, progressbars are shown --help Display a usage message --timers If available, timing information is printed before exit --quiet Do not output anything

Debian options

--ignore-src-version Ignores mismatches between versions of binary and source packages --deb-native-arch Native architecture --deb-host-arch Cross compile target architecture --deb-foreign-archs Foreign architectures --deb-ignore-essential Ignore Essential packages

How to test

Only the first time: populate test directory with Packages and Sources files from snapshot.debian.org

$ make setup-test

Run tests

$ make test

Why the name

botch stands for Bootstrap/Build Order Tool CHain.