As explained in Section 1.2, native OCaml compilers are not available everywhere. For architectures missing native compiler, a bytecode version of the program should be provided.
The package's debian/rules should build the native code executable if supported on the architecture it is built on, and fall back to building the bytecode version if no working native code compiler is available. Exceptions to this are the executables who are small or not time critical, which may be built only as bytecode. It is the decision of the individual maintainers to choose this, maybe guided by the practice of the upstream author.
The availability of the native compiler can be tested in the debian/rules file by testing the possibility of executing /usr/bin/ocamlopt, and build the bytecode version or the native version of the program according to the result of the test. This is a sample snippet of debian/rules doing so:
build-stamp: dh_testdir if [ -x /usr/bin/ocamlopt ]; then \ $(MAKE) opt; \ else \ $(MAKE) all; \ fi
The bytecode versions are portable. In order to spare the buildds and the Debian archive, bytecode versions should be compiled once for all for big packages (which either take a lot of place on disks or take a lot of time to build). For example, the spamoracle package provides the spamoracle-byte package which is Architecture: all
and contains the bytecode version of spamoracle, and the spamoracle package which contains the native version of spamoracle and is available only where a native OCaml compiler is available (Architecture: amd64 i386 kfreebsd-i386 powerpc sparc
).
Bytecode versions of the programs should depend on ocaml-base-nox-3.10.2 (or ocaml-base-3.10.2 the program either uses the Graphics or the LablTk module). In order for the package to be able to be rebuilt or even binNMUed without a change in the packaging, this version should not be hardcoded in the debian/control file. Instead, the package should depend on ocaml-base-nox-${F:OCamlABI}
and use OCAMLABI := $(shell ocamlc -version) and dh_gencontrol -- -VF:OCamlABI="$(OCAMLABI)" in the debian/rules file.
The following is a snippet of a sample debian/control:
Package: spamoracle-byte Architecture: all Depends: ocaml-base-nox-${F:OCamlABI} Provides: spamoracle Conflicts: spamoracle Replaces: spamoracle
The following its pairing debian/rules snippet:
OCAMLABI := $(shell ocamlc -version) ... binary-indep: build install dh_gencontrol -i -- -VF:OCamlABI="$(OCAMLABI)"
In the case where there is only one package, which provides either a native version where available or a bytecode version otherwise, the dependency on ocaml-base-nox-3.10.2
should be added only when the package is built in native mode. For example, the debian/control of approx contains:
Package: approx Architecture: any Depends: ${shlibs:Depends}, ${F:OCamlRun}, adduser, bzip2, curland the corresponding debian/rules contains:
OCAMLABI = $(shell ocamlc -version) BYTECODE = $(shell [ -x /usr/bin/ocamlopt ] || echo yes) OCAMLRUN = $(if $(BYTECODE),ocaml-base-nox-$(OCAMLABI)) ... binary-arch: ... dh_gencontrol -- -VF:OCamlRun="$(OCAMLRUN)"