caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* ocamlbuild & deps
@ 2009-02-20 14:01 Daniel Bünzli
  2009-02-20 15:39 ` [Caml-list] " Romain Bardou
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Bünzli @ 2009-02-20 14:01 UTC (permalink / raw)
  To: OCaml List

Am I right in thinking that in rule specifications we could get rid of  
the ~dep(s) parameter of rules and have all deps be specified/ 
discovered dynamically via the 'build' argument ? Otherwise stated is  
~dep(s) just an optimization ?

Out of curiosity any idea in the cost of suppressing these arguments  
(i.e. was that road actually followed at some point) ?

If the answer to the first question is yes. Then I think the  
documentation could be made clearer by stating that what is asked to  
be built by the 'build' argument is considered as dependencies.  
However if you know some deps statically you can specify them as  
dep(s) argument this will just implicitely add  them to the list given  
to the 'build' argument.

Best,

Daniel




^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-20 14:01 ocamlbuild & deps Daniel Bünzli
@ 2009-02-20 15:39 ` Romain Bardou
  2009-02-20 16:31   ` Daniel Bünzli
  0 siblings, 1 reply; 8+ messages in thread
From: Romain Bardou @ 2009-02-20 15:39 UTC (permalink / raw)
  To: Daniel Bünzli; +Cc: OCaml List

> Am I right in thinking that in rule specifications we could get rid of 
> the ~dep(s) parameter of rules and have all deps be specified/discovered 
> dynamically via the 'build' argument ? Otherwise stated is ~dep(s) just 
> an optimization ?
> 
> Out of curiosity any idea in the cost of suppressing these arguments 
> (i.e. was that road actually followed at some point) ?
> 
> If the answer to the first question is yes. Then I think the 
> documentation could be made clearer by stating that what is asked to be 
> built by the 'build' argument is considered as dependencies. However if 
> you know some deps statically you can specify them as dep(s) argument 
> this will just implicitely add  them to the list given to the 'build' 
> argument.

I think there is a difference. It is indeed an optimization issue but 
not at the level of Ocamlbuild itself : it is as the level of your 
compilation process. If A *dynamically* depends on B, and your whole 
project (say, 10 hours of compilation) depends on A, but you have no way 
to build B, then Ocamlbuild will start to compile your project until it 
finds out that A cannot be built (maybe several hours later). If B had 
been put as a ~dep, then Ocamlbuild would not even had started building 
the project in the first place, saving you a lot of time.

Well, at least that's how I understand it ;)

-- 
Romain Bardou


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-20 15:39 ` [Caml-list] " Romain Bardou
@ 2009-02-20 16:31   ` Daniel Bünzli
  2009-02-21 18:53     ` Romain Bardou
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Bünzli @ 2009-02-20 16:31 UTC (permalink / raw)
  To: OCaml List


Le 20 févr. 09 à 16:39, Romain Bardou a écrit :

> I think there is a difference. It is indeed an optimization issue  
> but not at the level of Ocamlbuild itself : it is as the level of  
> your compilation process. If A *dynamically* depends on B, and your  
> whole project (say, 10 hours of compilation) depends on A, but you  
> have no way to build B, then Ocamlbuild will start to compile your  
> project until it finds out that A cannot be built (maybe several  
> hours later). If B had been put as a ~dep, then Ocamlbuild would not  
> even had started building the project in the first place, saving you  
> a lot of time.

Heu no. If B cannot be built then the compilation of A stops and the  
compilation of your project stops.

It is however true that if A has a dependency on a heavy C in parallel  
to B you'll have to wait for the end of C. But even in this case, it's  
just a matter of calling 'build' with B and C in a sensible order (and  
not in parallel).

Best,

Daniel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-20 16:31   ` Daniel Bünzli
@ 2009-02-21 18:53     ` Romain Bardou
  2009-02-21 20:19       ` Daniel Bünzli
  0 siblings, 1 reply; 8+ messages in thread
From: Romain Bardou @ 2009-02-21 18:53 UTC (permalink / raw)
  To: Daniel Bünzli; +Cc: OCaml List

Daniel Bünzli wrote:
> 
> Le 20 févr. 09 à 16:39, Romain Bardou a écrit :
> 
>> I think there is a difference. It is indeed an optimization issue but 
>> not at the level of Ocamlbuild itself : it is as the level of your 
>> compilation process. If A *dynamically* depends on B, and your whole 
>> project (say, 10 hours of compilation) depends on A, but you have no 
>> way to build B, then Ocamlbuild will start to compile your project 
>> until it finds out that A cannot be built (maybe several hours later). 
>> If B had been put as a ~dep, then Ocamlbuild would not even had 
>> started building the project in the first place, saving you a lot of 
>> time.
> 
> Heu no. If B cannot be built then the compilation of A stops and the 
> compilation of your project stops.
> 
> It is however true that if A has a dependency on a heavy C in parallel 
> to B you'll have to wait for the end of C. But even in this case, it's 
> just a matter of calling 'build' with B and C in a sensible order (and 
> not in parallel).

Ok I think I did not explain correctly. Let's say that :
- A dynamically depends on B
- A depends on C
- B cannot be built
Now if I try to build A, C will be built, then the rule to build A will 
be applied and the dependency on B will be discovered. But B cannot be 
built so the compilation fails.

Now if the compilation of C takes 10 hours, you will have to wait 10 
hours no matter what. "Damn, I waited 10 hours just to discover that it 
cannot compile!" If the dependency on B was not dynamic, C would not 
have been built at all.

So, there is indeed a difference between dynamic and static 
dependencies, with or without parallelism. In fact, dynamic dependencies 
also tend to break parallelism as dynamic dependencies cannot be built 
at the same time as static dependencies. In my example, C and B cannot 
be built in parallel. This is another difference.

You cannot, in general, run the rule to discover dynamic dependencies 
before building static dependencies. Indeed, what if the rule needs to 
read one of the static dependencies to discover other dependencies?

-- 
Romain Bardou


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-21 18:53     ` Romain Bardou
@ 2009-02-21 20:19       ` Daniel Bünzli
  2009-02-21 20:23         ` Daniel Bünzli
  2009-02-26 13:04         ` Daniel Bünzli
  0 siblings, 2 replies; 8+ messages in thread
From: Daniel Bünzli @ 2009-02-21 20:19 UTC (permalink / raw)
  To: OCaml List


Le 21 févr. 09 à 19:53, Romain Bardou a écrit :

> Ok I think I did not explain correctly. Let's say that :
[...]

I think you are not getting my point. What I meant in the first place  
is that I see strictly no difference between :

> rule ~deps ~prod r

and

> rule ~prod begin fun env build ->
>   let static_deps = build (List.map (fun d -> env d) deps) in
>   List.iter Outcome.ignore_good static_deps;
>   r env build
> end

Strictly speaking this means that all dependencies can be resolved by  
the 'build' argument. However it is sometimes useful to introduce a  
partial order among them. Now your distinction dynamic/static is just  
a limited way of specifiying a partial order among dependencies. The  
generalized way of introducing that order is just to have calls to the  
'build' argument in the order you want inside your rule.

If the above is true then I think it would be usefull to mention this  
in the documentation about the 'build' argument.

Best,

Daniel



^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-21 20:19       ` Daniel Bünzli
@ 2009-02-21 20:23         ` Daniel Bünzli
  2009-02-26 13:04         ` Daniel Bünzli
  1 sibling, 0 replies; 8+ messages in thread
From: Daniel Bünzli @ 2009-02-21 20:23 UTC (permalink / raw)
  To: OCaml List


Sorry, in my preceding message the line

>  let static_deps = build (List.map (fun d -> env d) deps) in


Should read

>  let static_deps = build (List.map (fun d -> [env d]) deps) in

Daniel


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-21 20:19       ` Daniel Bünzli
  2009-02-21 20:23         ` Daniel Bünzli
@ 2009-02-26 13:04         ` Daniel Bünzli
  2009-03-02 13:43           ` Daniel Bünzli
  1 sibling, 1 reply; 8+ messages in thread
From: Daniel Bünzli @ 2009-02-26 13:04 UTC (permalink / raw)
  To: OCaml List


Le 21 févr. 09 à 21:19, Daniel Bünzli a écrit :

> If the above is true then I think it would be usefull to mention  
> this in the documentation about the 'build' argument.

It seems to be false. Suppose we have the following dependencies ("->"  
is "depends")

A -> {B, C}
B -> {B1, B2}
C -> {C1, C2}

The idea is that ocamlbuild will take the static ~deps of the rules  
and construct a first tree of dependencies. Given this tree,  
ocamlbuild will start to build the dependencies from the leaves; I  
wasn't able to get precise information about how the nodes of this  
tree are followed but what seems to be sure is that it will try to  
build all the leaves first, thus some order exists. This means that  
for the example above if all dependencies are known via ~deps  
arguments the build order is going to be something like this (at least  
that would be the most sensible way of doing it, breadth-first order  
reversed).

(B1 || B2 || C1 || C2); (C || B); A

where "||" is parallel, and ";" is sequencing.

Now if you try to simulate the static dependencies ~deps as I  
suggested in my last email. The build order you will get is :

(((B1 || B2); B) || ((C1 || C2); C)); A

and this order will give you different results when B can be built but  
C cannot (or vice-versa) as in that case you will build B (or C)  
whereas it won't be with static dependencies. Hence the conclusion is  
that you cannot simulate the ~deps argument as I suggested in my last  
email.

Best,

Daniel

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Caml-list] ocamlbuild & deps
  2009-02-26 13:04         ` Daniel Bünzli
@ 2009-03-02 13:43           ` Daniel Bünzli
  0 siblings, 0 replies; 8+ messages in thread
From: Daniel Bünzli @ 2009-03-02 13:43 UTC (permalink / raw)
  To: OCaml List

[-- Attachment #1: Type: text/plain, Size: 575 bytes --]


Nicolas told me that the actual order for static dependencies in that  
example would also be that one :

> (((B1 || B2); B) || ((C1 || C2); C)); A

However he points out that there's still a difference between static  
and dynamic dependencies : static dependencies can control the way  
rules are selected. If two rules can build a target but the first rule  
has a static dependency that cannot be built then the second rule will  
be tried. Dynamic dependencies cannot do that since once a rule is  
invoked it is considered to be definitively selected.

Best,

Daniel


[-- Attachment #2: Type: text/html, Size: 898 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-03-02 13:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-20 14:01 ocamlbuild & deps Daniel Bünzli
2009-02-20 15:39 ` [Caml-list] " Romain Bardou
2009-02-20 16:31   ` Daniel Bünzli
2009-02-21 18:53     ` Romain Bardou
2009-02-21 20:19       ` Daniel Bünzli
2009-02-21 20:23         ` Daniel Bünzli
2009-02-26 13:04         ` Daniel Bünzli
2009-03-02 13:43           ` Daniel Bünzli

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).