From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by walapai.inria.fr (8.13.6/8.13.6) with ESMTP id p539q5DY013716 for ; Fri, 3 Jun 2011 11:52:05 +0200 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhcDAG+u6E2GnQCBkWdsb2JhbABTl2iOUBQBAQEBCQsLBxQDIohxwwmGIQSgLw X-IronPort-AV: E=Sophos;i="4.65,314,1304287200"; d="scan'208";a="84584297" Received: from shiva.jussieu.fr ([134.157.0.129]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-SHA; 03 Jun 2011 11:52:00 +0200 Received: from hydrogene.pps.jussieu.fr (hydrogene.pps.jussieu.fr [134.157.168.1]) by shiva.jussieu.fr (8.14.4/jtpda-5.4) with ESMTP id p539pXGZ094692 for ; Fri, 3 Jun 2011 11:51:46 +0200 (CEST) X-Ids: 168 Received: by hydrogene.pps.jussieu.fr (Postfix, from userid 2065) id A27A7C337F; Fri, 3 Jun 2011 11:51:32 +0200 (CEST) Date: Fri, 3 Jun 2011 11:51:32 +0200 From: Pietro Abate To: caml-list@inria.fr Message-ID: <20110603095132.GA19919@pps.jussieu.fr> References: <20110602093853.GA27434@pps.jussieu.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Operating-System: GNU/Linux User-Agent: Mutt/1.5.20 (2009-06-14) X-Miltered: at jchkmail.jussieu.fr with ID 4DE8AEA5.002 by Joe's j-chkmail (http : // j-chkmail dot ensmp dot fr)! X-j-chkmail-Enveloppe: 4DE8AEA5.002/134.157.168.1/hydrogene.pps.jussieu.fr/hydrogene.pps.jussieu.fr/ Subject: Re: [Caml-list] conditional compilation and ocamlbuild On Thu, Jun 02, 2011 at 11:49:35AM +0200, Gabriel Scherer wrote: > It's a hack, but have you considered symlinking common.ml to a different name > (common_without_distrue, no idea) to bypass the per-name tag attribution and > caching logic of Ocamlbuild? > You could also generate files on the fly (add ocamlbuild rules to generate > common_for_a.ml and common_for_b.ml, then have a and b depend on those > modules). > > The problem is that it changes the name of the Common module for a.ml and b.ml. even if this is a hack, I guess this is exactly what I'm going to do. I could add a more complicated ocamlbuild rule to mangle the source, but I think it's not worth it... thanks for the feedback. > > On Thu, Jun 2, 2011 at 11:38 AM, Pietro Abate > wrote: > > Hello list, > > I've three modules a.ml, b.ml and common.ml. A and B both > use Common, but Common is compiled with Camlp4MacroParser > to exclude/include part of the code. > > The problem I want to include some part of the code when > I compile A and exclude it when I compile B. > > so the canonical way to use Camlp4MacroParser is to add a rule like > > : pp(camlp4o Camlp4MacroParser.cmo -DISTRUE) > > and when I compile everything I get something like : > > $ocamlbuild -classic-display b.byte a.byte > /usr/bin/ocamldep -modules b.ml > b.ml.depends > /usr/bin/ocamldep -pp 'camlp4o Camlp4MacroParser.cmo -DISTRUE' -modules > common.ml > common.ml.depends > /usr/bin/ocamlc -c -pp 'camlp4o Camlp4MacroParser.cmo -DISTRUE' -o > common.cmo common.ml > /usr/bin/ocamlc -c -o b.cmo b.ml > /usr/bin/ocamlc common.cmo b.cmo -o b.byte > /usr/bin/ocamldep -modules a.ml > a.ml.depends > /usr/bin/ocamlc -c -o a.cmo a.ml > /usr/bin/ocamlc common.cmo a.cmo -o a.byte > > now, both A and B use common.ml compiled with -DISTRUE . > But this is not what I want. > > I'm pretty sure I can't use _tags in this situation. But I'm > not sure how to write a simple myocamlbuild rule to basically > creating two common.cmo. > > One for A as > /usr/bin/ocamlc -c -pp 'camlp4o Camlp4MacroParser.cmo -DISTRUE' -o > common.cmo common.ml > > and one for B as > /usr/bin/ocamlc -c -pp 'camlp4o Camlp4MacroParser.cmo' -o common.cmo > common.ml > > -----------a.ml ------- > let a = print_endline (Common.func ()) > > -----------b.ml ------- > let a = print_endline (Common.func ()) > > ----------common.ml ------- > let func () = > IFDEF ISTRUE THEN > "is true" > ELSE > "is not true" > END > > I guess the idea is to add a rule that says : > if you are compiling A then run the preprocessor with -DISTRUE otherwise > without it. But doing this I want also to force ocamlbuild not to reuse an > existing common.cmo that maybe was compiled from a "different" source... > > Of course my real problem is a bit more complicated as in the conditional > compilation process I exclude/include calls an external C library and > I want to avoid linking this external C library to binaries that do not use > it at all ... > > pietro > -- > ---- > http://en.wikipedia.org/wiki/Posting_style > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa-roc.inria.fr/wws/info/caml-list > Beginner's list: http://groups.yahoo.com/group/ocaml_beginners > Bug reports: http://caml.inria.fr/bin/caml-bugs > > > -- ---- http://en.wikipedia.org/wiki/Posting_style