Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
Re: [Caml-list] Virtual packages in findlib
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2009-07-13 (22:52)
From: Gerd Stolpmann <gerd@g...>
Subject: Re: [Caml-list] Virtual packages in findlib

Am Mittwoch, den 08.07.2009, 03:35 -0700 schrieb Dario Teixeira:
> Hi,
> > Can you explain that? I don't see why virtual packages can resolve
> > ordering problems.
> Because without virtual packages, one cannot list the true dependencies
> of a package, thus causing ordering problems.
> Consider the minimal example of there being two packages: A and B, with
> B depending on A, and therefore having to be linked after.  However, A is
> not a real package, but instead a virtual one instantiated by either
> A1, A2, A3, etc.
> But alas, there is no virtual package support in findlib (I assume).
> Because of this, the META file for B does not list A as a dependency.
> (Yes, the META is "wrong", but how could it be made right?)
> Now, we tell ocamlbuild that the project depends on A1 (for instance) and B.
> Because there is no *declared* dependency between A1 and B (though in fact
> there should be), ocamlbuild probably assumes that it is indifferent to
> link "A1; B" or "B; A1".  However, the latter case will cause an error.
> Therefore, there are two solutions to this problem:
> a) Make ocamlbuild preserve the order of the given packages *when there
>    is no explicit dependency among them*.  (Obviously if there are dependencies
>    then Ocamlbuild should re-order the packages as fit).
> b) Find some virtual package mechanism in findlib (thus rendering the
>    hack a) moot).

Well, you can make dependencies conditional using the predicate feature.
In B you can write:

requires(P_A1) = "A1"
requires(P_A2) = "A2"

and when linking you have to select which dependency to take by giving
the right -predicates switch: e.g. -predicates P_A1.

Also, there are subpackages (useful when you want to put A1 and A2 into
the same directory). So you can create a fancy package A with
subpackages A1 and A2 like:

requires(P_A1) = "A.A1"
requires(P_A2) = "A.A2"
requires = "A.A1"    (* default *)

package "A1" (
  (* definitions for A1	*)
  requires = ...
  archive(byte) = ...
  archive(native) = ...

package "A2" (
  (* definitions for A2	*)
  requires = ...
  archive(byte) = ...
  archive(native) = ...

And B simply lists A as dep, and A is dependent on either A.A1 or A.A2,
as given by predicates.

This is not really a virtual package as you describe it. It was
developed to support several versions of the same package, e.g. one
version with enabled debugging, and the other without. The predicates
work more or less orthogonal to the dependency graph.


> Cheers,
> Dario Teixeira
> _______________________________________________
> Caml-list mailing list. Subscription management:
> Archives:
> Beginner's list:
> Bug reports:
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany
Phone: +49-6151-153855                  Fax: +49-6151-997714