From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@yquem.inria.fr Delivered-To: caml-list@yquem.inria.fr Received: from concorde.inria.fr (concorde.inria.fr [192.93.2.39]) by yquem.inria.fr (Postfix) with ESMTP id A51AED45F for ; Wed, 2 Nov 2005 15:36:21 +0100 (CET) Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.173]) by concorde.inria.fr (8.13.0/8.13.0) with ESMTP id jA2EaL3D024098 for ; Wed, 2 Nov 2005 15:36:21 +0100 Received: from [212.227.126.160] (helo=mrelayng.kundenserver.de) by moutng.kundenserver.de with esmtp (Exim 3.35 #1) id 1EXJir-0007Wi-00; Wed, 02 Nov 2005 15:36:17 +0100 Received: from [84.58.130.212] (helo=gate.lan.gerd-stolpmann.de) by mrelayng.kundenserver.de with asmtp (Exim 3.35 #1) id 1EXJir-0007dA-00; Wed, 02 Nov 2005 15:36:17 +0100 Received: from flakew.lan.gerd-stolpmann.de (flakew.lan.gerd-stolpmann.de [192.168.0.32]) by gate.lan.gerd-stolpmann.de (Postfix) with ESMTP id 6C3ABC05F; Wed, 2 Nov 2005 15:36:17 +0100 (CET) Subject: Re: [Caml-list] Nesting Modules From: Gerd Stolpmann To: Tom Hawkins Cc: caml-list@yquem.inria.fr In-Reply-To: <4368C6F4.6050301@confluent.org> References: <43679EEF.70102@confluent.org> <20051102094613.GA8506@furbychan.cocan.org> <4368AA08.8030409@confluent.org> <20051102.141108.60891081.Christophe.Troestler@umh.ac.be> <4368C6F4.6050301@confluent.org> Content-Type: text/plain Date: Wed, 02 Nov 2005 15:36:16 +0100 Message-Id: <1130942176.4327.50.camel@localhost.localdomain> Mime-Version: 1.0 X-Mailer: Evolution 2.2.1.1 Content-Transfer-Encoding: 7bit X-Provags-ID: kundenserver.de abuse@kundenserver.de auth:a6865a839c0178d9aa0ce41878507ea2 X-Miltered: at concorde with ID 4368CEE5.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Spam: no; 0.00; caml-list:01 nesting:01 gerd:01 stolpmann:01 -pack:01 o'caml:01 ocamlc:01 cmo:01 -pack:01 cmo:01 ocamlc:01 cmi:01 cmi:01 o'caml:01 ocamlopt:01 X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on yquem.inria.fr X-Spam-Level: X-Spam-Status: No, score=0.1 required=5.0 tests=FORGED_RCVD_HELO autolearn=disabled version=3.0.3 Sorry, but this is not a good solution. The leaves are only hidden from the user, but can still cause nameclashes. (E.g. if one adds another Leaf1 module later.) The proper solution is to use -pack (and -for-pack in O'Caml 3.09): ocamlc -o branch2.cmo -pack leaf2.cmo leaf3.cmo ocamlc -o branch1.cmo -pack leaf1.cmo brachch2.cmo Then throw away leaf*.{cmi,cmo} and branch2.{cmi,cmo}. Everything is now in branch1.{cmi,cmo}. For O'Caml 3.09 and ocamlopt, you need to add the right -for-pack options, e.g. ocamlopt -for-pack Branch1.Branch2 -c leaf2.ml ocamlopt -for-pack Branch1.Branch2 -c leaf3.ml ocamlopt -for-pack Branch1 -c leaf1.ml ocamlopt -o branch2.cmx -pack -for-pack Branch1 leaf2.cmx leaf3.cmx ocamlopt -o branch1.cmx -pack leaf1.cmx branch2.cmx For O'Caml 3.08 and ocamlopt, you need GNU objcopy, but no extra -for-pack options. Gerd Am Mittwoch, den 02.11.2005, 08:02 -0600 schrieb Tom Hawkins: > I found a convenient way to compose a set modules into a hierarchical > library. First define the set of modules (ml/mli file pairs) -- these > become the leaves in the module tree. Next, define the branch modules > in the hierarchy using "module Leaf = Leaf" (ml only, no mli). Then > compile and link. The only restriction is that all functional code must > reside in leaf modules. Here's an example... > > # Define the leaf modules. > echo 'let name = "leaf1"' > leaf1.ml > echo 'val name : string' > leaf1.mli > echo 'let name = "leaf2"' > leaf2.ml > echo 'val name : string' > leaf2.mli > echo 'let name = "leaf3"' > leaf3.ml > echo 'val name : string' > leaf3.mli > > # Define the branch modules. > echo 'module Leaf2 = Leaf2;; module Leaf3 = Leaf3' > branch2.ml > echo 'module Leaf1 = Leaf1;; module Branch2 = Branch2' > branch1.ml > > # Compile all leaf modules. > ocamlc -c leaf1.mli > ocamlc -c leaf1.ml > ocamlc -c leaf2.mli > ocamlc -c leaf2.ml > ocamlc -c leaf3.mli > ocamlc -c leaf3.ml > > # Compile all branch modules. > ocamlc -c branch2.ml > ocamlc -c branch1.ml > > # Link the library. > ocamlc -a -o branch1.cma leaf1.cmo leaf2.cmo leaf3.cmo branch2.cmo > branch1.cmo > > # Delete all *.cmi files except top. > rm leaf*.cmi > rm branch2.cmi > > # Run. > ocaml branch1.cma > > Objective Caml version 3.09.0 > > # Branch1.Branch2.Leaf3.name;; > - : string = "leaf3" > > > > > Thanks for everyone's help! > > -Tom > > _______________________________________________ > 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 Telefon: 06151/153855 Telefax: 06151/997714 ------------------------------------------------------------