Basic Concepts
opam-bin is a simple framework to use opam with binary packages.
The framework is composed of:
A set of repositories containing binary packages. These repositories will only work for people using the same distribution on the same architecture. You will need to select carefully the right one if you want to use them. These repositories are provided by external contributors. Check this list
A
gitrepository containing patches to makeopampackages relocatable. Relocatable packages are needed because binary packages will be installed in different directories by different users. The repository is available here: https://github.com/ocamlpro/relocation-patchesA tool called
opam-binto create and use binary packages, available here: https://github.com/ocamlpro/opam-bin
If you only want to use a repository of binary packages and not create
them, you will only need to access one of the binary repositories in
the first item, without the need for opam-bin.
If you want to develop with a cache of binary packages, or to create
repositories of binary packages, then you need to install opam-bin.
Binary packages
Binary packages created by opam-bin follow the following convention:
The binary package created from package
$NAME.$VERSIONis called$NAME.$VERSION+bin+$HASH, where $HASH is a unique hash. This hash is used because dependencies between binary packages are strict and cannot be changed.An alias package called
$NAME+bin.$VERSIONis also generated, pointing to$NAME.$VERSION+bin+$HASH. You can use it to install the corresponding binary package. For example:$ opam install ocamlfind+bin
When opam-bin is installed and you ask to install a package
NAME.VERSION, OPAM may decide to install the source package instead
of the binary package. OPAM will always select the source package if
you have a "NAME" { = VERSION } dependencies asking for the package.
HOWEVER, opam-bin will detect if there is a corresponding binary
package, and if it is the case, it will install the binary package
instead of compiling the package (opam will still show you the build
steps, but these build steps will actually not be executed).
Relocatable packages
Binary packages have to be relocatable to be installed in many
different locations. Most OCaml packages are relocatable, but some of
them are not. For example, ocaml-base-compiler,
ocaml-variants, ocamlfind, ocamlbuild, etc.
If you want to create binary packages, you should only use relocatable
packages.
We provide a specific git repository containing patches to
make packages relocatable. This repository is available in the
project:
https://github.com/OCamlPro/relocation-patches
It can be used automatically by opam-bin with any opam
repository.
If you want to use or contribute to this repository, you may want to
use a local version. You will then have to set the patches_url
option, for example using the opam-bin config command:
opam bin config --patches-url file:///home/user/GIT/relocation-patches
Currently, it contains patches for the following packages:
apron
menhir
mlgmpidl
ocaml-base-compiler
ocaml-variants
ocamlbuild
ocaml-config
ocamlfind
ocamlfind
ocaml-variants
opam-bin will try to find the best patch for a given source
package. For that, it will use the patch with the highest version less
or equal to the current package version. If opam-bin cannot
find such a patch, it will disable itself automatically and let
opam build the package without using/creating binary packages.
File Structure
opam-bin creates the following file structure in the
$HOME/.opam/ directory (or OPAMROOT):
~/.opam/plugins/opam-bin/opam-bin.exeThis file is the executable ofopam-binused inopamwrappers.opam-bin.logThis file is an internal log ofopam-binused for debugging its behavior.cache/This directory contains a cache of the archives of the binary packages created locally. It is necessary as the URLs in theopamfiles are not correct before the archives have been uploaded to their final location.store/This directory contains the files that have to be published to share binary packages between users/computers.archives/This directory contains all the archives of the binary packages that have been created locally.repo/This directory contains anopamrepository that exposes the binary packages locally created. It is used locally byopam, and can be shared with other users/computers.
SWITCH/etc/opam-bin/packages/This directory contains, for every binary package that has been installed or built in the switch, its binary version..opam-switch/opam-binThis directory contains information on the packages viewed byopam-bin. In particular, it contains theopamfile used to generate the binary package, the package patch if one was applied.
Patches Repository Structure
The git repository of patches follows the following structure:
patches/directory:NAME/whereNAMEis the name of a packageVERSION.patchwhereVERSIONis the minimal version to which this patch can be applied.NAME.aliaswhereNAMEis another package name, whose patches should be used for this package.VERSION=.patchwhereVERSIONis a version that should exactly match the version of the package on which it should be applied