From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Original-To: caml-list@sympa.inria.fr Delivered-To: caml-list@sympa.inria.fr Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 956CA7EEF6 for ; Sun, 14 Jun 2015 15:48:27 +0200 (CEST) Received-SPF: Neutral (mail2-smtp-roc.national.inria.fr: domain of simon.cruanes.2007@m4x.org does not assert whether or not 129.104.30.34 is permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=qade=GY=m4x.org=simon.cruanes.2007@bounces.m4x.org"; x-sender="simon.cruanes.2007@m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=qade=GY=m4x.org=simon.cruanes.2007@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=qade=GY=m4x.org=simon.cruanes.2007@bounces.m4x.org"; x-sender="SRS0=qade=GY=m4x.org=simon.cruanes.2007@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=qade=GY=m4x.org=simon.cruanes.2007@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: A0CwAgC0hX1VnCIeaIFcg2RfglhGq2+QWocYTAEBAQEBARIBAQEBAQgLCQkhLkEFg10BBQwXDwE7CxAJAhgNHQICRRIGAQ0FEogIAxIECZVcnRmQJQOFYQEBAQEBAQEai0SEHR6DOi+BFgWFVQqNegKEUIRWg08ULYYnjBqDW4QhbQGCRgEBAQ X-IPAS-Result: A0CwAgC0hX1VnCIeaIFcg2RfglhGq2+QWocYTAEBAQEBARIBAQEBAQgLCQkhLkEFg10BBQwXDwE7CxAJAhgNHQICRRIGAQ0FEogIAxIECZVcnRmQJQOFYQEBAQEBAQEai0SEHR6DOi+BFgWFVQqNegKEUIRWg08ULYYnjBqDW4QhbQGCRgEBAQ X-IronPort-AV: E=Sophos;i="5.13,613,1427752800"; d="scan'208,217";a="165156602" Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ADH-AES256-SHA; 14 Jun 2015 15:48:26 +0200 Received: from [10.150.84.167] (unknown [178.251.23.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 56C7E14091338; Sun, 14 Jun 2015 15:48:06 +0200 (CEST) User-Agent: K-9 Mail for Android In-Reply-To: References: <8AD46EC2-3269-4DD5-B1E7-C518B33EAC07@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----6D7PMGOYY11P327RG6ICX2O7F632K4" Content-Transfer-Encoding: 8bit From: Simon Cruanes Date: Sun, 14 Jun 2015 15:47:52 +0200 To: Tim Cuthbertson ,=?ISO-8859-1?Q?T=F6r=F6k_Edwin?= CC: caml-list@inria.fr Message-ID: <60FF9258-CA44-441F-87F0-2DECCAC3682F@m4x.org> X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Sun Jun 14 15:48:08 2015 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.058601, queueID=8934D14091328 X-Org-Mail: simon.cruanes.2007@polytechnique.org Subject: Re: [Caml-list] Determining what code is depending on `Unix` ------6D7PMGOYY11P327RG6ICX2O7F632K4 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 If you do not use the module Batteries itself (a pack of all modules in the library, including those that depend on Unix) but instead directly use BatList, BatString you might avoid the dependency. I'm not sure though, it can be not the case if the dependency is enforced through ocamlfind or if {BatIO, BatEnum} use Unix (almost all modules depend on them). The batteries team values retro compatibility more than being lightweight at link time, which is why it still depends on Unix. Le 13 juin 2015 16:36:33 UTC+02:00, Tim Cuthbertson a écrit : >On Sat, Jun 13, 2015 at 10:07 PM, Török Edwin > wrote: >> >> On 06/13/2015 10:22 AM, Tim Cuthbertson wrote: >> > Hi all, >> > >> > I'm attempting to convert an existing (reasonably small) HTTP >server written in OCaml to run on mirage's xen backend. I've gotten the >compiler reasonably happy by replacing uses of Unix / Lwt_unix with >appropriate mirage-compatible modules. But when it comes to link time, >it seems that my application is still indirectly depending on Unix: >> > >> > + ocamlbuild -quiet -cflag -warn-error -cflag +a-3 -build-dir >[...]/_build/mirage-xen -use-ocamlfind -lflags >-g,-linkpkg,-dontlink,unix main.native.o >> > + ocamlfind ocamlopt -g -linkpkg -dontlink unix -output-obj -syntax >camlp4o -package 'fat-filesystem, io-page, mirage-block-xen.front, >batteries, yojson, safepass, sha, lwt, lwt.syntax, mirage-console.xen, >mirage-types, mirage-types.lwt, mirage-net-xen, >mirage-types,cohttp,cohttp.lwt, mirage-http, lwt, mirage.runtime, >tcpip.stack-direct,tcpip.stack-socket,mirage-clock-xen,conduit.mirage' >src/passe.cmx src/passe_server.cmx src/unikernel.cmx main.cmx -o >main.native.o >> > File "_none_", line 1: >> > Error: No implementations provided for the following modules: >> > Unix referenced from >/home/tim/.opam/mirage_4_01_0/lib/lwt/lwt-unix.cmxa(Lwt_engine), >> > >/home/tim/.opam/mirage_4_01_0/lib/lwt/lwt-unix.cmxa(Lwt_unix), >> > >/home/tim/.opam/mirage_4_01_0/lib/ipaddr/ipaddr_unix.cmxa(Ipaddr_unix) >> > Command exited with code 2. >> > >> > I can't figure out why those modules are being linked in, though. I >have grepped all files in _build/mirage-xen/**/*.ml.depends (as well as >my own source code), and nothing in there matches "unix", nor mentions >any of the modules listed above. The only lwt_* matches are: >> > >> > Cohttp_lwt_body >> > Lwt_mutex >> > Lwt_stream >> > >> > Which all seem like they shouldn't depend on unix either directly >or indirectly. >> > >> > Is there some way to see a tree / list of "what module in my source >code is transitively depending on Unix, and via what modules is that >dependency inherited?" Or even if there's no way to see a tree, is >there a way to do it one step at a time (e.g "what is depending >directly on Lwt_unix", then repeat the process for those modules listed >until I see something that surprises me) >> > >> > Failing that, does anyone have tricks for weeding indirect `Unix` >usage out of a codebase which is not directly using it? >> >> 'ocamlfind query -r' can be useful, in your case: >> >> $ ocamlfind query -r -p-format fat-filesystem io-page >mirage-block-xen.front batteries yojson safepass sha lwt lwt.syntax >mirage-console.xen mirage-types mirage-types.lwt mirage-net-xen >mirage-types cohttp cohttp.lwt mirage-http lwt mirage.runtime >tcpip.stack-direct tcpip.stack-socket mirage-clock-xen conduit.mirage | >grep unix >> unix >> lwt.unix >> ipaddr.unix >> conduit.lwt-unix >> io-page.unix >> >> Drop cohttp.lwt, tcpip.stack-direct, tcpip.stack-socket (use >tcpip.xen? and you already have mirage-http and cohttp.lwt-core), and >then: >> >> $ ocamlfind query -r -p-format fat-filesystem io-page >mirage-block-xen.front batteries yojson safepass sha lwt lwt.syntax >mirage-console.xen mirage-types mirage-types.lwt mirage-net-xen >mirage-types cohttp mirage-http lwt mirage.runtime mirage-clock-xen >conduit.mirage | grep unix >> unix >> >> Best regards, >> --Edwin > > >Thanks for the advice, that has gotten me much further. >tcpip-stack-direct still seems necessary, but *-socket isn't. I notice >`unix` is still in the output after removing these modules (which >seems like a bad thing), and yet it successfully compiles >main.native.o now. Perhaps that is related to: > > > >On Sat, Jun 13, 2015 at 11:06 PM, Simon Cruanes > wrote: >> >> I don't have a general answer for finding such dependencies, but in >the list you have it seems there is at least batteries that depends on >Unix. >> >> > >I thought so too, but I was hoping that I can use toplevel modules >(specifically BatList and BatString), so that even though the >"batteries" package depends on Unix, those individual modules I'm >using don't. In which case the Unix dependency won't actually be >needed or referenced. But perhaps the dependencies aren't that >fine-grained? > >(I should probably drop the Batteries dependency since I'm using so >little, but it's used more heavily in non-server parts of the same >codebase) > >-- >Caml-list mailing list. Subscription management and archives: >https://sympa.inria.fr/sympa/arc/caml-list >Beginner's list: http://groups.yahoo.com/group/ocaml_beginners >Bug reports: http://caml.inria.fr/bin/caml-bugs -- Simon ------6D7PMGOYY11P327RG6ICX2O7F632K4 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: 8bit If you do not use the module Batteries itself (a pack of all modules in the library, including those that depend on Unix) but instead directly use BatList, BatString you might avoid the dependency. I'm not sure though, it can be not the case if the dependency is enforced through ocamlfind or if {BatIO, BatEnum} use Unix (almost all modules depend on them).

The batteries team values retro compatibility more than being lightweight at link time, which is why it still depends on Unix.

Le 13 juin 2015 16:36:33 UTC+02:00, Tim Cuthbertson <tim@gfxmonk.net> a écrit :
On Sat, Jun 13, 2015 at 10:07 PM, Török Edwin <edwin+ml-ocaml@etorok.net> wrote:

On 06/13/2015 10:22 AM, Tim Cuthbertson wrote:
Hi all,

I'm attempting to convert an existing (reasonably small) HTTP server written in OCaml to run on mirage's xen backend. I've gotten the compiler reasonably happy by replacing uses of Unix / Lwt_unix with appropriate mirage-compatible modules. But when it comes to link time, it seems that my application is still indirectly depending on Unix:

+ ocamlbuild -quiet -cflag -warn-error -cflag +a-3 -build-dir [...]/_build/mirage-xen -use-ocamlfind -lflags -g,-linkpkg,-dontlink,unix main.native.o
+ ocamlfind ocamlopt -g -linkpkg -dontlink unix -output-obj -syntax camlp4o -package 'fat-filesystem, io-page, mirage-block-xen.front, batteries, yojson, safepass, sha, lwt, lwt.syntax, mirage-console.xen, mirage-types, mirage-types.lwt, mirage-net-xen, mirage-types,cohttp,cohttp.lwt, mirage-http, lwt, mirage.runtime, tcpip.stack-direct,tcpip.stack-socket,mirage-clock-xen,conduit.mirage' src/passe.cmx src/passe_server.cmx src/unikernel.cmx main.cmx -o main.native.o
File "_none_", line 1:
Error: No implementations provided for the following modules:
Unix referenced from /home/tim/.opam/mirage_4_01_0/lib/lwt/lwt-unix.cmxa(Lwt_engine),
/home/tim/.opam/mirage_4_01_0/lib/lwt/lwt-unix.cmxa(Lwt_unix),
/home/tim/.opam/mirage_4_01_0/lib/ipaddr/ipaddr_unix.cmxa(Ipaddr_unix)
Command exited with code 2.

I can't figure out why those modules are being linked in, though. I have grepped all files in _build/mirage-xen/**/*.ml.depends (as well as my own source code), and nothing in there matches "unix", nor mentions any of the modules listed above. The only lwt_* matches are:

Cohttp_lwt_body
Lwt_mutex
Lwt_stream

Which all seem like they shouldn't depend on unix either directly or indirectly.

Is there some way to see a tree / list of "what module in my source code is transitively depending on Unix, and via what modules is that dependency inherited?" Or even if there's no way to see a tree, is there a way to do it one step at a time (e.g "what is depending directly on Lwt_unix", then repeat the process for those modules listed until I see something that surprises me)

Failing that, does anyone have tricks for weeding indirect `Unix` usage out of a codebase which is not directly using it?

'ocamlfind query -r' can be useful, in your case:

$ ocamlfind query -r -p-format fat-filesystem io-page mirage-block-xen.front batteries yojson safepass sha lwt lwt.syntax mirage-console.xen mirage-types mirage-types.lwt mirage-net-xen mirage-types cohttp cohttp.lwt mirage-http lwt mirage.runtime tcpip.stack-direct tcpip.stack-socket mirage-clock-xen conduit.mirage | grep unix
unix
lwt.unix
ipaddr.unix
conduit.lwt-unix
io-page.unix

Drop cohttp.lwt, tcpip.stack-direct, tcpip.stack-socket (use tcpip.xen? and you already have mirage-http and cohttp.lwt-core), and then:

$ ocamlfind query -r -p-format fat-filesystem io-page mirage-block-xen.front batteries yojson safepass sha lwt lwt.syntax mirage-console.xen mirage-types mirage-types.lwt mirage-net-xen mirage-types cohttp mirage-http lwt mirage.runtime mirage-clock-xen conduit.mirage | grep unix
unix

Best regards,
--Edwin


Thanks for the advice, that has gotten me much further.
tcpip-stack-direct still seems necessary, but *-socket isn't. I notice
`unix` is still in the output after removing these modules (which
seems like a bad thing), and yet it successfully compiles
main.native.o now. Perhaps that is related to:



On Sat, Jun 13, 2015 at 11:06 PM, Simon Cruanes
<simon.cruanes.2007@m4x.org> wrote:

I don't have a general answer for finding such dependencies, but in the list you have it seems there is at least batteries that depends on Unix.



I thought so too, but I was hoping that I can use toplevel modules
(specifically BatList and BatString), so that even though the
"batteries" package depends on Unix, those individual modules I'm
using don't. In which case the Unix dependency won't actually be
needed or referenced. But perhaps the dependencies aren't that
fine-grained?

(I should probably drop the Batteries dependency since I'm using so
little, but it's used more heavily in non-server parts of the same
codebase)

--
Simon ------6D7PMGOYY11P327RG6ICX2O7F632K4--