caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gerd Stolpmann <gerd@gerd-stolpmann.de>
To: Dario Teixeira <darioteixeira@yahoo.com>
Cc: caml-list@yquem.inria.fr, Stefano Zacchiroli <zack@upsilon.cc>
Subject: Re: [Caml-list] Virtual packages in findlib
Date: Tue, 14 Jul 2009 00:55:43 +0200	[thread overview]
Message-ID: <1247525743.15577.21.camel@flake.lan.gerd-stolpmann.de> (raw)
In-Reply-To: <379032.5491.qm@web111513.mail.gq1.yahoo.com>


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"
etc.

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.

Gerd

> 
> Cheers,
> Dario Teixeira
> 
> 
> 
>       
> 
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 
-- 
------------------------------------------------------------
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany 
gerd@gerd-stolpmann.de          http://www.gerd-stolpmann.de
Phone: +49-6151-153855                  Fax: +49-6151-997714
------------------------------------------------------------



  reply	other threads:[~2009-07-13 22:52 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-08 10:35 Dario Teixeira
2009-07-13 22:55 ` Gerd Stolpmann [this message]
2009-07-14 20:47   ` Dario Teixeira
  -- strict thread matches above, loose matches on Subject: below --
2009-07-07 18:07 Dario Teixeira
2009-07-08  7:41 ` [Caml-list] " Stefano Zacchiroli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1247525743.15577.21.camel@flake.lan.gerd-stolpmann.de \
    --to=gerd@gerd-stolpmann.de \
    --cc=caml-list@yquem.inria.fr \
    --cc=darioteixeira@yahoo.com \
    --cc=zack@upsilon.cc \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).