From: "Nicolas Pouillard" <nicolas.pouillard@gmail.com>
To: christian.sternagel <christian.sternagel@uibk.ac.at>
Cc: caml-list <caml-list@yquem.inria.fr>
Subject: Re: [Caml-list] ocamlbuild `Circular dependencies'
Date: Mon, 28 Jan 2008 15:24:47 +0100 [thread overview]
Message-ID: <1201526011-sup-1368@ausone.inria.fr> (raw)
In-Reply-To: <20080128104309.GA3836@pc6197-c703.uibk.ac.at>
Excerpts from christian.sternagel's message of Mon Jan 28 11:43:09 +0100 2008:
> On Mon, Jan 28, 2008 at 11:23:29AM +0100, Romain Bardou wrote:
> > I tried to reproduce a similar set of directories as yours. I couldn't
> > get the "circular dependency" error, but I had to compile everything in
> > one command line, otherwise the file a.cma (which is in the _build/A
> Today I found out, that we indeed had a circular dependency:
>
> An interface file B.mli used a type A.t, whereas the implementation
> file A.ml uses functions from B. When using ocamldep + a Makefile, no
> error occurred. But ocamlbuild refused to compile... I guess that is
> the right thing to do =)
Yes ocamlbuild treats your module (interface + implementation) as a whole.
Then dependencies are computed for modules, so you are in a case that could
be compiled but ocamlbuild will refuse it. I'm a bit reluctant to change
this, since I think that the right thing to do is to avoid this kind of
semi-cycles.
> > directory) was deleted before compiling b.cma. The command which I used
> > and which worked is:
> >
> > ocamlbuild -Is A,B a.cma b.cma
> >
> > I don't really understand how the -lib option works though. Where and
> > when does it look for the library x.cma with the "-lib x" option? How
> > and what's the semantic of the "+" you can add at the beginning of a
> > library name?...
> As far as I know, a `+' means that the following name should be searched
> relative to the standard library.
All ocamlbuild include directories must be implicit and relative to the
current dir. So dirs like ../foo, /foo, +foo, ./foo are forbidden. You can
make symbolic link to avoid the two first cases. If you really need to give
+foo dir, please use non-interpreted compilation flags like -cflags for the
command line and tags like ["ocaml"; "compile"] for a tag based approach.
> Still my question remains, how one should configure a project
> that consists of several libraries and one binary, together
> with ocamlbuild. E.g.,
>
> +- prof.dir/
> +-+- A/
> | +- a.mllib
> | +- a1.ml
> | +- ...
> | +- aN.ml
> |
> +-+- B/
> | +- b.mllib
> | +- b1.ml
> | +- ...
> | +- bN.ml
> |
> +-+- Main/
> +- main.ml (depending on a.cma and b.cma)
The simplest thing to do is what you've tried (ocamlbuild -Is A,B Main/main.byte).
But here your mllib's are not used.
If you want to use them as libraries you need a small myocamlbuild.ml like:
$ cat myocamlbuild.ml
open Ocamlbuild_plugin;;
dispatch begin function
| After_rules ->
ocaml_lib "A/a";
ocaml_lib "B/b"
| _ -> ()
end
And to tag your files:
$ cat _tags
# tells that main use a and b libs
<Main/main.{byte,native}>: use_a, use_b
# this will avoid the need of command line options to ocamlbuild
"A" or "B": include
$ ocamlbuild Main/main.byte
Cheers,
PS: I've just updated the wiki [1]
[1]: http://brion.inria.fr/gallium/index.php/Using_internal_libraries
--
Nicolas Pouillard aka Ertai
prev parent reply other threads:[~2008-01-28 14:25 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-24 14:23 Christian Sternagel
2008-01-28 10:23 ` [Caml-list] " Romain Bardou
2008-01-28 10:43 ` Christian Sternagel
2008-01-28 11:08 ` Romain Bardou
2008-01-28 14:24 ` Nicolas Pouillard [this message]
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=1201526011-sup-1368@ausone.inria.fr \
--to=nicolas.pouillard@gmail.com \
--cc=caml-list@yquem.inria.fr \
--cc=christian.sternagel@uibk.ac.at \
/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