From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail4-relais-sop.national.inria.fr (mail4-relais-sop.national.inria.fr [192.134.164.105]) by yquem.inria.fr (Postfix) with ESMTP id A5D17BC37 for ; Mon, 11 Jan 2010 12:53:39 +0100 (CET) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArQBAPefSkvU4xEKkWdsb2JhbACBRJocAQEBAQkLCgcTA7kzAoQtBA X-IronPort-AV: E=Sophos;i="4.49,255,1262559600"; d="scan'208";a="53641228" Received: from moutng.kundenserver.de ([212.227.17.10]) by mail4-smtp-sop.national.inria.fr with ESMTP; 11 Jan 2010 12:53:39 +0100 Received: from office1.lan.sumadev.de (dslb-188-097-009-166.pools.arcor-ip.net [188.97.9.166]) by mrelayeu.kundenserver.de (node=mrbap1) with ESMTP (Nemesis) id 0LlXpX-1O3v2U3Nod-00amqg; Mon, 11 Jan 2010 12:53:38 +0100 Received: from [192.168.0.32] (dslb-084-058-051-010.pools.arcor-ip.net [84.58.51.10]) by office1.lan.sumadev.de (Postfix) with ESMTPSA id 65066C0E8E; Mon, 11 Jan 2010 12:53:37 +0100 (CET) Subject: Re: [Caml-list] Controlling module loading order. From: Gerd Stolpmann To: guillaume.yziquel@citycable.ch Cc: OCaml List In-Reply-To: <4B479BA3.6060300@citycable.ch> References: <4B479BA3.6060300@citycable.ch> Content-Type: text/plain Date: Mon, 11 Jan 2010 12:59:31 +0100 Message-Id: <1263211171.17350.7.camel@flake.lan.gerd-stolpmann.de> Mime-Version: 1.0 X-Mailer: Evolution 2.12.1 Content-Transfer-Encoding: 7bit X-Provags-ID: V01U2FsdGVkX18TEoQW/a+UZ0r9qcra9EN4eUeO/LpyGdpPHrY QwtE681qVCBMqLezHFsXQkOOL/yD3P1M05MCu6YDg/EBj0GuHp 6FyW1/ev5CZdAgB65lfDg== X-Spam: no; 0.00; gerd:01 stolpmann:01 gerd:01 guillaume:01 findlib:01 cmo:01 cmx:01 cmxa:01 cmo:01 cmx:01 initialized:01 guillaume:01 toplevel:01 segfaults:01 bindings:01 Hi Guillaume, if you want to control from findlib that a certain function is invoked, the usual way to do it is to put a .cmo/.cmx file into the "archive" variables. The problem is that the linker drops all unused modules from .cma/.cmxa archives, and as a consequence the initialization code of these modules is not executed. So you could make R.interpreter a .cmo/.cmx - in this case the module is always initialized. The other workaround is to provide an init function in R.interpreter like let init() = () By calling this function the user references the interpreter, and all the initialization code is executed. Gerd Am Freitag, den 08.01.2010, 21:54 +0100 schrieb Guillaume Yziquel: > Hi. > > I've been reimpleminting the OCaml-R binding, and implemented a simple > wrapper around the Quantmod package in R: > > http://yziquel.homelinux.org/gitweb/?p=ocaml-r.git;a=tree > http://yziquel.homelinux.org/gitweb/?p=ocamlr-quantmod.git;a=tree > > Testing these modules from the toplevel is quite fine. However, when > compiling stuff using these pieces of code, I have issues with the way > the modules are loaded, since the order in which they are loaded has > side-effects: Initialisation of the R interpreter in the good case, > segfaults in the bad case... > > For instance, the META file of OCaml-R: > > > 1 name = "R" > > 2 version = "0.2" > > 3 description = "R bindings for OCaml" > > 4 requires = "unix" > > 5 archive(byte) = "r.cma" > > 6 archive(native) = "r.cmxa" > > 7 > > 8 package "interpreter" ( > > 9 version = "0.2" > > 10 description = "Embedded R interpreter" > > 11 requires = "R" > > 12 archive(byte) = "oCamlR.cma" > > 13 archive(native) = "oCamlR.cmxa" > > 14 ) > > The stub functions are in package "R", and package "R.interpreter" > contains a module with and empty signature, whose side-effects are to > initialise the R interpreter through an application of the functor > > > 19 module Interpreter (Env : Environment) : Interpreter = struct > > 20 > > 21 let () = init ~name: Env.name > > 22 ~argv: Env.options > > 23 ~env: Env.env > > 24 ~sigs: Env.signal_handlers > > 25 () > > 26 > > 27 end > > My issue concerns the Quantmod wrapper: How can I make sure that when > the Quantmod module is loaded, the OCamlR module of the "R.interpreter" > findlib package gets loaded before? > > Currently the ocamlbuild _tags file for ocamlr-quantmod is > > > 1 : pkg_R.interpreter, pkg_CRAN-zoo > > But that doesn't seem to do the trick... > > My question is: do I have to put a line like "module X = OCamlR" in > quantmod.ml, or is there a way to load OCamlR beforehand just by > tweaking the build process, order of modules when linking, etc... > > All the best, > -- ------------------------------------------------------------ Gerd Stolpmann, Bad Nauheimer Str.3, 64289 Darmstadt,Germany gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de Phone: +49-6151-153855 Fax: +49-6151-997714 ------------------------------------------------------------