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 tarball. Too big to send via list otherwise. 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