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 43F927EE89 for ; Fri, 28 Oct 2016 18:19:29 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=jnfoster@cs.cornell.edu; spf=None smtp.mailfrom=jnfoster@cs.cornell.edu; spf=None smtp.helo=postmaster@exch-hub1.cs.cornell.edu Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of jnfoster@cs.cornell.edu) identity=pra; client-ip=128.253.49.13; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jnfoster@cs.cornell.edu"; x-sender="jnfoster@cs.cornell.edu"; x-conformance=sidf_compatible Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of jnfoster@cs.cornell.edu) identity=mailfrom; client-ip=128.253.49.13; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jnfoster@cs.cornell.edu"; x-sender="jnfoster@cs.cornell.edu"; x-conformance=sidf_compatible Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@exch-hub1.cs.cornell.edu) identity=helo; client-ip=128.253.49.13; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jnfoster@cs.cornell.edu"; x-sender="postmaster@exch-hub1.cs.cornell.edu"; x-conformance=sidf_compatible IronPort-PHdr: =?us-ascii?q?9a23=3At8LUCBYe8cDNJRwhcsoyLwf/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZpc65bnLW6fgltlLVR4KTs6sC0LuM9f+7Ej1eqdbZ6TZZL8wKD0dEwe?= =?us-ascii?q?wt3CUeQ+e9QXXhK/DrayFoVO9jb3RCu0+BDE5OBczlbEfTqHDhpRQbGxH4KBYn?= =?us-ascii?q?br+tQt2ap42N2uuz45zeZRlTzHr4OOsqbUb+kQKElM4QiJdiI6B55hrtpWFFff?= =?us-ascii?q?ZRjTdkJFaUhRv69MCY94Ul+CNKvf8l84hNXbisLIoiSrkNKj06Pigb49b3uAOL?= =?us-ascii?q?GQmJ6HwHTmgMuhFTRQPC9hf3WpO3vyfn4LkukBKGNNH7GOhnEQ+p6L1mHVqx0H?= =?us-ascii?q?8K?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AjAABjeRNYmA0x/YBdDgwBAQEBAgEBA?= =?us-ascii?q?QEIAQEBARUBAQEBAgEBAQEIAQEBAYJ/AQEBAQF3bRAHhHaIOZZ+gleRaIIHASe?= =?us-ascii?q?FewKBd0YUAQEBAQEBAQEBAQESAQEBAQEICwsHHTCCMwQBFQEEghABAQEDARIRB?= =?us-ascii?q?FIFCwkCCw0gCgICIhIBBQEcBg4FGweIKggOk0SPTYEyPzKLRolDBoMaAQEBAQE?= =?us-ascii?q?BBAEBAQEBAQEBAQEdig2BBYUFgkaCWwEEjkx4hHaFXoYtgwiGcoFuToQfiSmND?= =?us-ascii?q?4I/Ex6BER6BBwYIgmA7EQuBGFtShimBSgEBAQ?= X-IPAS-Result: =?us-ascii?q?A0AjAABjeRNYmA0x/YBdDgwBAQEBAgEBAQEIAQEBARUBAQE?= =?us-ascii?q?BAgEBAQEIAQEBAYJ/AQEBAQF3bRAHhHaIOZZ+gleRaIIHASeFewKBd0YUAQEBA?= =?us-ascii?q?QEBAQEBAQESAQEBAQEICwsHHTCCMwQBFQEEghABAQEDARIRBFIFCwkCCw0gCgI?= =?us-ascii?q?CIhIBBQEcBg4FGweIKggOk0SPTYEyPzKLRolDBoMaAQEBAQEBBAEBAQEBAQEBA?= =?us-ascii?q?QEdig2BBYUFgkaCWwEEjkx4hHaFXoYtgwiGcoFuToQfiSmND4I/Ex6BER6BBwY?= =?us-ascii?q?IgmA7EQuBGFtShimBSgEBAQ?= X-IronPort-AV: E=Sophos;i="5.31,410,1473112800"; d="scan'208,217";a="242789066" Received: from outgoing-mail-1.cs.cornell.edu (HELO exch-hub1.cs.cornell.edu) ([128.253.49.13]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DES-CBC3-SHA; 28 Oct 2016 18:19:27 +0200 Received: from mail-qt0-f182.google.com (209.85.216.182) by mail.cs.cornell.edu (128.253.49.15) with Microsoft SMTP Server (TLS) id 8.3.465.0; Fri, 28 Oct 2016 12:18:11 -0400 Received: by mail-qt0-f182.google.com with SMTP id g32so46822992qta.2 for ; Fri, 28 Oct 2016 09:19:25 -0700 (PDT) X-Gm-Message-State: ABUngvezdoxjLMuFcU4/k/oW/GgCMPXw7Iyw+f7aASFJLHlFkRSAjtNqm87doui7TxVQ9fq5x/SUGiVkudrfkA== X-Received: by 10.237.57.98 with SMTP id l89mr11246974qte.146.1477671565290; Fri, 28 Oct 2016 09:19:25 -0700 (PDT) MIME-Version: 1.0 Received: by 10.140.42.110 with HTTP; Fri, 28 Oct 2016 09:19:24 -0700 (PDT) In-Reply-To: References: From: Nate Foster Date: Fri, 28 Oct 2016 09:19:24 -0700 X-Gmail-Original-Message-ID: Message-ID: To: Jonathan DiLorenzo CC: Ivan Gotovchits , caml-list Content-Type: multipart/alternative; boundary="001a113e37dabe7fe5053fef3811" Subject: Re: [Caml-list] Providing module implementations for Oasis --001a113e37dabe7fe5053fef3811 Content-Type: text/plain; charset="UTF-8" +1 On Fri, Oct 28, 2016 at 7:28 AM, Jonathan DiLorenzo < dilorenzo@cs.cornell.edu> wrote: > Thank you so much. That makes a lot of sense in hindsight, but I can't > quite imagine the situation that leads to me figuring it out. > > On Oct 28, 2016 09:06, "Ivan Gotovchits" wrote: > >> The problem is that executable `ppx_forest` and library `forest_ppx` both >> refer to the same compilation >> unit `ppx_forest`. So the solution is easy, just remove the `Ppx_forest` >> module from the library (indeed, it is not part of the library, it is the >> executable implementation). >> Here is the PR with the fix: https://github.com/padsproj/oforest/pull/9. >> >> # Details >> >> Just in case if you're interested why the resulting error was so >> confusing :) >> >> The error message came from the following compilation command: >> >> ocamlfind ocamlopt -linkpkg -g -linkpkg -thread -package threads >> -package str -package re.str -package re.glob -package re -package >> ppx_tools.metaquot -package ppx_let -package ppx_deriving.show -package >> pads.ppx -package pads -package core -package compiler-libs.common >> ppx/forest_ppx.cmxa parsing/forest_parser.cmxa lib/forest.cmxa >> ppx/ppx_forest.cmx -o ppx/ppx_forest.native >> >> >> It is obvious that the command is incorrect (pun intended). Let's, >> actually, remove all the packages so that we can see the libraries: >> >> ocamlfind ocamlopt -linkpkg ppx/forest_ppx.cmxa >> parsing/forest_parser.cmxa lib/forest.cmxa ppx/ppx_forest.cmx -o >> ppx/ppx_forest.native >> >> In fact, the problem is in library ordering. Modules and libraries must >> be sorted in topological order, so the first should be `lib/forest.cmxa`, >> then `parsing/forest_parser.cmxa` and finally `forest_ppx.cmxa`. >> And, yes, this is how this command looks after the fix: >> >> ocamlfind ocamlopt -linkpkg lib/forest.cmxa >> parsing/forest_parser.cmxa ppx/forest_ppx.cmxa ppx/ppx_forest.cmx -o >> ppx/ppx_forest.native >> >> So how the toposort can be broken? My assumption, that this was because >> you introduced a loop into a dependency graph, when you added ppx_forest to >> both: the library and the executable. >> If my assumption is true, then probably we should add to ocamlbuild >> toposort routine an easy check that will detect loops and output a proper >> diagnostic message if a dependency graph contains cycles. >> >> Regards, >> Ivan Gotovchits >> >> >> On Fri, Oct 28, 2016 at 2:14 AM, Jonathan DiLorenzo < >> dilorenzo@cs.cornell.edu> wrote: >> >>> Hmm, sadly this seems to still produce the same error after cleaning up >>> all the oasis generated files and everything: >>> >>> File "_none_", line 1: >>> Error: No implementations provided for the following modules: >>> Forest_parser_helper referenced from ppx/forest_ppx.cmxa(Skins) >>> Command exited with code 2. >>> >>> Maybe notable (or maybe obvious) that if I switch oasis to use ocamlc >>> instead of ocamlopt, I instead get: >>> >>> File "_none_", line 1: >>> Error: Error while linking ppx/forest_ppx.cma(Skins): >>> Reference to undefined global `Forest_parser_helper' >>> Command exited with code 2. >>> >>> New _oasis file (not with best -> byte change): >>> >>> Library forest_parser >>> Path: parsing >>> BuildTools: ocamlbuild, menhir, ocamllex >>> Findlibparent: forest >>> Findlibname: forest_parser >>> BuildDepends: forest, ppx_deriving.show, compiler-libs.common >>> CompiledObject: best >>> Modules: Forest_parser_helper, Forest_types >>> InternalModules: Forest_lexer, Forest_parser >>> >>> Library forest_ppx >>> Path: ppx >>> BuildTools: ocamlbuild >>> Findlibparent: forest >>> Findlibname: forest_ppx >>> BuildDepends: re, re.str, forest.forest_parser, forest, >>> ppx_tools.metaquot >>> CompiledObject: best >>> Modules: Ppx_forest >>> InternalModules: Ppx_forest_lib, Utility, Skins >>> XMETAEnable: true >>> XMETADescription: Syntax extension library for OCaml Forest >>> XMETARequires: str re core threads ppx_tools.metaquot >>> XMETAExtraLines: ppx = "ppx_forest" >>> >>> Executable ppx_forest >>> Path: ppx >>> MainIs: ppx_forest.ml >>> BuildDepends: forest, forest.forest_parser, forest.forest_ppx, >>> pads.ppx, ppx_tools.metaquot >>> CompiledObject: best >>> >>> >>> On Thu, Oct 27, 2016 at 2:24 PM, Ivan Gotovchits wrote: >>> >>>> The problem is in a name clashing between >>>> `$opam-switch/lib/ocaml/compiler-libs/parser` and the `parser` library >>>> that is compiled from your internal library named `parser.cmxa`. >>>> The compiler-lib is added to the search path by the `ppx_tools` >>>> library, and when you're trying to link your final executable, it takes the >>>> wrong archive, that definitely doesn't have >>>> `Forest_parser_helper` module. >>>> >>>> The reason, why it is still able to see that there is no `bad_func` in >>>> `Forest_parser_helper` is because the interfaces are not contained in the >>>> `cmxa` file, but are looked up directly in >>>> the `cmi`. Compiler is looking for a file named >>>> `forest_parser_helper.cmi` and can see that there are not `bad_func` there. >>>> >>>> The solution is to rename your library, e.g., use `Library >>>> forest_parser` instead of `Library parser` >>>> >>>> On Thu, Oct 27, 2016 at 1:44 PM, Jonathan DiLorenzo < >>>> dilorenzo@cs.cornell.edu> wrote: >>>> >>>>> Hey, >>>>> >>>>> Ok, now the next step would be the following. Carefully check that all >>>>>> modules, that you're using in libraries are included in `Modules` or >>>>>> `InternalModules`. It is the case >>>>>> that sometimes when you forgot to include a module, oasis (actually >>>>>> `ocamlbuild`), may produce a strange, and on a first glance, irrelevant >>>>>> error message. >>>>>> >>>>> >>>>> I checked and sadly the modules I'm trying to access are all in >>>>> `Modules`. Perhaps interestingly, it can still clearly detect statically if >>>>> the function exists or not because if I try to use a function that doesn't >>>>> exist it instead gives me this error (which is what I would normally >>>>> expect): >>>>> >>>>> File "ppx/skins.ml", line 39, characters 8-37: >>>>> Error: Unbound value Forest_parser_helper.bad_func >>>>> Command exited with code 2. >>>>> >>>>> >>>>>> If it doesn't help then the `_build/_log` file might help us to debug >>>>>> the issue. >>>>>> >>>>> >>>>> Attached. Thanks so much for helping with this again. I'm at a total >>>>> loss. >>>>> >>>>> >>>>>> >>>>>> On Thu, Oct 27, 2016 at 10:59 AM, Jonathan DiLorenzo < >>>>>> dilorenzo@cs.cornell.edu> wrote: >>>>>> >>>>>>> Hey Ivan, >>>>>>> >>>>>>> Thanks for your response. >>>>>>> >>>>>>> The first one is that you didn't run `oasis setup` after you made >>>>>>>> the changes, so I would suggest cleaning current state >>>>>>>> and starting from scratch. (I usually just do `git clean -idx` just >>>>>>>> to be sure that I got rid of any generated files, like setup.data, et alas, >>>>>>>> but be careful, >>>>>>>> don't delete something that you need). >>>>>>>> >>>>>>> >>>>>>> I tried cleaning up all the generated files. Same error unfortunately >>>>>>> >>>>>>> >>>>>>>> Another idea is that you're using oasis 0.4.7 with >>>>>>>> ocaml-4.03.0+flambda, they are currently incompatible, and can produce >>>>>>>> weird bugs. If that so, then consider switching >>>>>>>> either a compiler or oasis to different versions. >>>>>>>> >>>>>>> >>>>>>> I am using oasis 0.4.7 and ocaml-4.03.0, but I don't appear to be >>>>>>> using flambda. I tried passing in -config and it said that flambda was >>>>>>> false at least, but I admit, I'm not especially familiar with it, so if >>>>>>> there's some other way I should be checking for this please let me know. >>>>>>> Hopefully, they're compatible sans flambda? >>>>>>> >>>>>>> >>>>>>> On Thu, Oct 27, 2016 at 1:01 AM, Jonathan DiLorenzo < >>>>>>>> dilorenzo@cs.cornell.edu> wrote: >>>>>>>> >>>>>>>>> Hey all, >>>>>>>>> >>>>>>>>> I'm trying to build my system using Oasis and OCamlbuild. I have 3 >>>>>>>>> different libraries and for some reason I seem to only be able to refer >>>>>>>>> from one to the other in seemingly random files. For example, I want my >>>>>>>>> 'ppx' library to be able to use functions from my 'parser' library. One >>>>>>>>> file (ppx_forest.ml) can use functions from it, while another in >>>>>>>>> the same library (skins.ml) cannot, giving me this error: >>>>>>>>> >>>>>>>>> File "_none_", line 1: >>>>>>>>> Error: No implementations provided for the following modules: >>>>>>>>> Forest_parser_helper referenced from ppx/ppx.cmxa(Skins) >>>>>>>>> Command exited with code 2. >>>>>>>>> >>>>>>>>> They can all refer to types I've defined therein though. >>>>>>>>> >>>>>>>>> I'm not fantastic at Oasis so maybe I'm just missing something >>>>>>>>> basic? Any ideas? Any more information I can gather to give more context >>>>>>>>> otherwise? >>>>>>>>> >>>>>>>>> Thanks in advance, >>>>>>>>> Jonathan >>>>>>>>> >>>>>>>>> Excerpt of my Oasis file that may possibly be relevant: >>>>>>>>> >>>>>>>>> Library forest >>>>>>>>> Path: lib >>>>>>>>> BuildTools: ocamlbuild >>>>>>>>> BuildDepends: pads, str, re, re.glob, core, threads, ppx_let >>>>>>>>> CompiledObject: best >>>>>>>>> Modules: Forest, PadsInterface >>>>>>>>> >>>>>>>>> Library parser >>>>>>>>> Path: parsing >>>>>>>>> BuildTools: ocamlbuild, menhir, ocamllex >>>>>>>>> Findlibparent: forest >>>>>>>>> Findlibname: parser >>>>>>>>> BuildDepends: forest, ppx_deriving.show, compiler-libs.common >>>>>>>>> CompiledObject: best >>>>>>>>> Modules: Forest_parser_helper >>>>>>>>> InternalModules: Forest_lexer, Forest_parser, Forest_types >>>>>>>>> >>>>>>>>> Library ppx >>>>>>>>> Path: ppx >>>>>>>>> BuildTools: ocamlbuild >>>>>>>>> Findlibparent: forest >>>>>>>>> Findlibname: ppx >>>>>>>>> BuildDepends: re, re.str, forest.parser, forest, >>>>>>>>> ppx_tools.metaquot >>>>>>>>> CompiledObject: best >>>>>>>>> Modules: Ppx_forest >>>>>>>>> InternalModules: Ppx_forest_lib, Utility, Skins >>>>>>>>> XMETAEnable: true >>>>>>>>> XMETARequires: str re core threads ppx_tools.metaquot >>>>>>>>> XMETAExtraLines: ppx = "ppx_forest" >>>>>>>>> >>>>>>>>> Executable ppx_forest >>>>>>>>> Path: ppx >>>>>>>>> MainIs: ppx_forest.ml >>>>>>>>> BuildDepends: forest, forest.parser, forest.ppx, pads.ppx, >>>>>>>>> ppx_tools.metaquot >>>>>>>>> CompiledObject: best >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> --001a113e37dabe7fe5053fef3811 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
+1

On Fri, Oct 28, 2016 at 7:28 AM, Jonathan DiLorenzo <dilore= nzo@cs.cornell.edu> wrote:
=

Thank you so much. That makes a lot of sense in hindsight, b= ut I can't quite imagine the situation that leads to me figuring it out= .


On Oct 28, 2016 0= 9:06, "Ivan Gotovchits" <ivg@ieee.org> wrote:
The problem is that executable `ppx_f= orest` and library `forest_ppx` both refer to the same compilation
unit= `ppx_forest`.=C2=A0 So the solution is easy, just remove the `Ppx_forest` = module from the library (indeed, it is not part of the library, it is the e= xecutable implementation).
Here is the PR with the fix: https://g= ithub.com/padsproj/oforest/pull/9.

# Deta= ils

Just in case if you're interested why the = resulting error was so confusing :)

The error mess= age came from the following compilation command:

= =C2=A0 =C2=A0 ocamlfind ocamlopt -linkpkg -g -linkpkg -thread -package thre= ads -package str -package re.str -package re.glob -package re -package ppx_= tools.metaquot -package ppx_let -package ppx_deriving.show -package pads.pp= x -package pads -package core -package compiler-libs.common ppx/forest_ppx.= cmxa parsing/forest_parser.cmxa lib/forest.cmxa ppx/ppx_forest.cmx -o ppx/p= px_forest.native


It is obvious = that the command is incorrect (pun intended). Let's, actually, remove a= ll the packages so that we can see the libraries:

=
=C2=A0 =C2=A0 ocamlfind ocamlopt -linkpkg ppx/forest_ppx.cmxa parsing/= forest_parser.cmxa lib/forest.cmxa ppx/ppx_forest.cmx -o ppx/ppx_forest.nat= ive

In fact, the problem is in library = ordering. Modules and libraries must be sorted in topological order, so the= first should be `lib/forest.cmxa`, then `parsing/forest_parser.cmxa` and f= inally `forest_ppx.cmxa`.=C2=A0
And, yes, this is how this = command looks after the fix:

=C2=A0 =C2=A0 ocamlfi= nd ocamlopt -linkpkg lib/forest.cmxa parsing/forest_parser.cmxa ppx/forest_= ppx.cmxa ppx/ppx_forest.cmx -o ppx/ppx_forest.native

So how the toposort=C2=A0can be broken? My assumption, that this was= because you introduced a loop into a dependency graph, when you added ppx_= forest to both: the library and the executable.=C2=A0
If my assum= ption is true, then probably we should add to ocamlbuild toposort routine a= n easy check that will detect loops and output =C2=A0a proper diagnostic me= ssage if a dependency graph contains cycles.

Regar= ds,
Ivan Gotovchits


On Fri, Oct 28, 2016 at 2:14 AM, Jon= athan DiLorenzo <dilorenzo@cs.cornell.edu> wrote:
=
Hmm, sadly this seems to st= ill produce the same error after cleaning up all the oasis generated files = and everything:

File "_none_", line= 1:
Error: No implementations provided for the following modules:=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Forest_parser_helper re= ferenced from ppx/forest_ppx.cmxa(Skins)
Command exited wit= h code 2.

Maybe notable (or maybe obvious) = that if I switch oasis to use ocamlc instead of ocamlopt, I instead get:

File "_none_", line 1:
Error: Error while linking ppx/forest_ppx.cma(Skins):
Re= ference to undefined global `Forest_parser_helper'
Comm= and exited with code 2.

New _oasis fi= le (not with best -> byte change):

Library= forest_parser
=C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 parsing
=C2=A0 BuildTools: =C2=A0 =C2=A0 ocamlbuild, menhir, = ocamllex
=C2=A0 Findlibparent: =C2=A0forest
=C2= =A0 Findlibname: =C2=A0 =C2=A0forest_parser
=C2=A0 BuildDep= ends: =C2=A0 forest, ppx_deriving.show, compiler-libs.common=C2=A0
=C2=A0 CompiledObject: best
=C2=A0 Modules: =C2=A0Forest_parse= r_helper, Forest_types
=C2=A0 InternalModules: Forest_lexer, Fore= st_parser

Library forest_ppx
=C2= =A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ppx
=C2=A0 BuildTool= s: =C2=A0 =C2=A0 ocamlbuild
=C2=A0 Findlibparent: =C2=A0forest
=C2=A0 Findlibname: =C2=A0 =C2=A0forest_ppx
=C2=A0= BuildDepends: =C2=A0 re, re.str, forest.forest_parser, forest, ppx_tools.m= etaquot
=C2=A0 CompiledObject: best
=C2=A0 Module= s: =C2=A0 =C2=A0 =C2=A0 =C2=A0Ppx_forest
=C2=A0 InternalModules: = Ppx_forest_lib, Utility, Skins
=C2=A0 XMETAEnable: =C2=A0 =C2=A0t= rue
=C2=A0 XMETADescription: Syntax extension library for = OCaml Forest
=C2=A0 XMETARequires: =C2=A0 str re core threa= ds ppx_tools.metaquot
=C2=A0 XMETAExtraLines: =C2=A0ppx =3D "= ;ppx_forest"

Executable ppx_forest
= =C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ppx
=C2=A0 MainIs= : =C2=A0 =C2=A0 =C2=A0 =C2=A0 ppx_forest.ml
=C2=A0 BuildDepends: =C2=A0 forest= , forest.forest_parser, forest.forest_ppx, pads.ppx, ppx_tools.metaquot
=C2=A0 CompiledObject: best


On Thu, Oct 27, 2016 at 2:24 PM, Ivan Go= tovchits <ivg@ieee.org> wrote:
=
The problem is =C2=A0in a name clashing between `$opam-swi= tch/lib/ocaml/compiler-libs/parser` and the `parser` library that is c= ompiled from your internal library named `parser.cmxa`.
The compiler-li= b is added to the search path by the `ppx_tools` library, and when you'= re trying to link your final executable, it takes the wrong archive, that d= efinitely doesn't have=C2=A0
`Forest_parser_helper` module.

The reason, why it is still able to see that there = is no `bad_func` in `Forest_parser_helper` is because the interfaces are no= t contained in the `cmxa` file, but are looked up directly in=C2=A0
the `cmi`. Compiler is looking for a file named `forest_parser_helper.cm= i` and can see that there are not `bad_func` there.=C2=A0

The solution is to rename your library, e.g., use `Library forest_p= arser` instead of `Library parser`

On Thu, Oct 27, 2016 at = 1:44 PM, Jonathan DiLorenzo <dilorenzo@cs.cornell.edu> wrote:
Hey,

Ok, now the next step would be the following. Carefully check that all m= odules, that you're using in libraries are included in `Modules` or `In= ternalModules`. It is the case
that sometimes=C2=A0when you forgot to i= nclude a module, oasis (actually `ocamlbuild`), may produce a strange, and = on a first glance, irrelevant error message.=C2=A0
=

I checked and sadly the modules I'm trying t= o access are all in `Modules`. Perhaps interestingly, it can still clearly = detect statically if the function exists or not because if I try to use a f= unction that doesn't exist it instead gives me this error (which is wha= t I would normally expect):

File "ppx/skins.ml", line 39, ch= aracters 8-37:
Error: Unbound value Forest_parser_helper.bad_func=
Command exited with code 2.
=C2=A0<= br>
If it doesn't help then the `_build/_log` file might help us to d= ebug the issue.=C2=A0

Attac= hed. Thanks so much for helping with this again. I'm at a total loss.
=C2=A0

On Thu, Oct 27, 2016 at 10:59 AM, Jonathan DiLorenzo <dilorenzo@cs.cornell.edu> wrote:
Hey Ivan,

= Thanks for your response.

The first one is that you didn't run `oasis= setup` after you made the changes, so I would suggest cleaning current sta= te
and starting from scratch. (I usually just do `git clean -= idx` just to be sure that I got rid of any generated files, like setup.data= , et alas, but be careful,=C2=A0
don't delete something that = you need).=C2=A0

I tried= cleaning up all the generated files. Same error unfortunately
<= div>=C2=A0
Another idea=C2=A0is that you're using oasis 0.4.7 with o= caml-4.03.0+flambda, they are currently incompatible, and can produce weird= bugs. If that so, then consider switching=C2=A0
either a com= piler or oasis to different versions.=C2=A0
I am using oasis 0.4.7 and ocaml-4.03.0, but I don'= t appear to be using flambda. I tried passing in -config and it said that f= lambda was false at least, but I admit, I'm not especially familiar wit= h it, so if there's some other way I should be checking for this please= let me know. Hopefully, they're compatible sans flambda?
=


On Thu, Oct 27, 2016 at 1:01 AM, Jonath= an DiLorenzo <dilorenzo@cs.cornell.edu> wrote:
Hey all,
I'm trying to build my system using Oasis and OCamlbui= ld. I have 3 different libraries and for some reason I seem to only be able= to refer from one to the other in seemingly random files. For example, I w= ant my 'ppx' library to be able to use functions from my 'parse= r' library. One file (ppx_forest.ml) can use functions from it, while another in the same l= ibrary (skins.ml) cannot,= giving me this error:

File "_none_"= ;, line 1:
Error: No implementations provided for the following m= odules:
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Forest_parser_helper re= ferenced from ppx/ppx.cmxa(Skins)
Command exited with code 2.

They can all refer to types I've defined th= erein though.

I'm not fantastic at Oasis so ma= ybe I'm just missing something basic? Any ideas? Any more information I= can gather to give more context otherwise?

Thanks= in advance,
Jonathan

Excerpt of my Oasi= s file that may possibly be relevant:

Library= forest=C2=A0
=C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0lib<= /div>
=C2=A0 BuildTools: =C2=A0 =C2=A0ocamlbuild
=C2=A0 Build= Depends: =C2=A0 pads, str, re, re.glob, core, threads, ppx_let
= =C2=A0 CompiledObject: best
=C2=A0 Modules: =C2=A0 =C2=A0 =C2=A0 = Forest, PadsInterface

Library parser
=C2= =A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 parsing
=C2=A0 Build= Tools: =C2=A0 =C2=A0 ocamlbuild, menhir, ocamllex
=C2=A0 Findlibp= arent: =C2=A0forest
=C2=A0 Findlibname: =C2=A0 =C2=A0parser
=
=C2=A0 BuildDepends: =C2=A0 forest, ppx_deriving.show, compiler-libs.c= ommon=C2=A0
=C2=A0 CompiledObject: best
=C2=A0 Modules:= =C2=A0Forest_parser_helpe= r
=C2=A0 InternalModules: Forest_lexer, Forest_parser, Forest_typ= es

Library ppx
=C2=A0 Path: =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 ppx
=C2=A0 BuildTools: =C2=A0 =C2=A0 oca= mlbuild
=C2=A0 Findlibparent: =C2=A0forest
=C2=A0 Findl= ibname: =C2=A0 =C2=A0ppx
=C2=A0 BuildDepends: =C2=A0 re, re.str, = forest.parser, forest, ppx_tools.metaquot
=C2=A0 CompiledObject: = best
=C2=A0 Modules: =C2=A0 =C2=A0 =C2=A0 =C2=A0Ppx_forest
<= div>=C2=A0 InternalModules: Ppx_forest_lib, Utility, Skins
=C2=A0= XMETAEnable: =C2=A0 =C2=A0true
=C2=A0 XMETARequires: =C2=A0 str = re core threads ppx_tools.metaquot
=C2=A0 XMETAExtraLines: =C2=A0= ppx =3D "ppx_forest"

Executable ppx_fore= st
=C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ppx
= =C2=A0 MainIs: =C2=A0 =C2=A0 =C2=A0 =C2=A0 ppx_forest.ml
=C2=A0 BuildDepends: =C2=A0 = forest, forest.parser, forest.ppx, pads.ppx, ppx_tools.metaquot
= =C2=A0 CompiledObject: best









--001a113e37dabe7fe5053fef3811--