From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 EAFC37EE89 for ; Fri, 28 Oct 2016 08:15:00 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=jonathan.dilorenzo@gmail.com; spf=Pass smtp.mailfrom=jonathan.dilorenzo@gmail.com; spf=None smtp.helo=postmaster@mail-yw0-f172.google.com Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of jonathan.dilorenzo@gmail.com) identity=pra; client-ip=209.85.161.172; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jonathan.dilorenzo@gmail.com"; x-sender="jonathan.dilorenzo@gmail.com"; x-conformance=sidf_compatible Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of jonathan.dilorenzo@gmail.com designates 209.85.161.172 as permitted sender) identity=mailfrom; client-ip=209.85.161.172; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jonathan.dilorenzo@gmail.com"; x-sender="jonathan.dilorenzo@gmail.com"; x-conformance=sidf_compatible; x-record-type="v=spf1" Received-SPF: None (mail2-smtp-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@mail-yw0-f172.google.com) identity=helo; client-ip=209.85.161.172; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="jonathan.dilorenzo@gmail.com"; x-sender="postmaster@mail-yw0-f172.google.com"; x-conformance=sidf_compatible IronPort-PHdr: =?us-ascii?q?9a23=3ARts9Khdp1n09c2cckh1p5nPtlGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc67Yx7h7PlgxGXEQZ/co6odzbGH6ea/AydZuMzJ8ChbNscTB1ld0Y?= =?us-ascii?q?RetjdjKfDGIHWzFOTtYS0+EZYKf35e1Fb/D3JoHt3jbUbZuHy44G1aMBz+MQ1o?= =?us-ascii?q?Ora9QdaK3Iyfntq/8JzLYghOmCH1IfYrdE33/k3tsZw3n4JkYok21hzXqXtJZ/?= =?us-ascii?q?8ekWJ2KnqSkhvxoMCq88gw3T5XvqcD8MhJTaXzeewUTJhfFjkgIWd9sMHqsR7Z?= =?us-ascii?q?QA2d4VMXSSMdlQBODgzBqhz2Q8Gi4WPBquNh1XzCboXNRrcuVGHntv8zRQ=3D?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AVAQAc7BJYhqyhVdFdGwEBAQMBAQEJA?= =?us-ascii?q?QEBFgEBAQMBAQEJAQEBgn8BAQEBAXd9B40vln+CMiWRaIIIH4gBBz8UAQEBAQE?= =?us-ascii?q?BAQEBAQESAQEBCAsLCR0wgjMEARUBBIIQAQEBAwESEQQZATgBAwELAQUDAgsDC?= =?us-ascii?q?ioCAiISAQUBHAYTGweIGAMPCJQSj02BMj8yi0aESgWEBicNRAaDJQwBHAIGEIl?= =?us-ascii?q?9gQWHS4JbBY5MhW6FXoYtiXiBbk6EH4kpiHyEE4I/Ex6BER6CV4FKDxyBbyI0h?= =?us-ascii?q?lCBSgEBAQ?= X-IPAS-Result: =?us-ascii?q?A0AVAQAc7BJYhqyhVdFdGwEBAQMBAQEJAQEBFgEBAQMBAQE?= =?us-ascii?q?JAQEBgn8BAQEBAXd9B40vln+CMiWRaIIIH4gBBz8UAQEBAQEBAQEBAQESAQEBC?= =?us-ascii?q?AsLCR0wgjMEARUBBIIQAQEBAwESEQQZATgBAwELAQUDAgsDCioCAiISAQUBHAY?= =?us-ascii?q?TGweIGAMPCJQSj02BMj8yi0aESgWEBicNRAaDJQwBHAIGEIl9gQWHS4JbBY5Mh?= =?us-ascii?q?W6FXoYtiXiBbk6EH4kpiHyEE4I/Ex6BER6CV4FKDxyBbyI0hlCBSgEBAQ?= X-IronPort-AV: E=Sophos;i="5.31,556,1473112800"; d="scan'208,217";a="242686733" Received: from mail-yw0-f172.google.com ([209.85.161.172]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/AES128-GCM-SHA256; 28 Oct 2016 08:14:59 +0200 Received: by mail-yw0-f172.google.com with SMTP id w3so69198890ywg.1 for ; Thu, 27 Oct 2016 23:14:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:sender:in-reply-to:references:from:date:message-id :subject:to:cc; bh=3JKeP90/sYxGiNw6y9DGSrIcKSBwWt3BdJ/2AWkLoIM=; b=YYLscYUtOk1Ir+cK/TpkZNeiYGLxag+9vmKsNhJxFVvjqMmqX09QNDvJu+Smmpvn0o tVdl/gASsReMdJEoazuT4p/JcjxcbNIrnQo2qZCr4Wc8QkAviH9HaoVzCkLN1CiwL/D2 SxFAhJLgnCxwvoZKUDXDUofCZd5SZjoFx9GHwCDQsaN5P00VxzMUE7eUJOB6Nh8BGIMv 8r8YJF1PH2TnA0gB81O7A7hFhsE9EKqhGbKe2kYiDhAGaxzPFS0bugTOzIFHI5aXceOU 4acljLFhgNFKPi4pXivDBV8nWZ0wnJxL96MLvyGziA/jvHV1DhsLbfk/MX6Psgij9nys U1yQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:sender:in-reply-to:references:from :date:message-id:subject:to:cc; bh=3JKeP90/sYxGiNw6y9DGSrIcKSBwWt3BdJ/2AWkLoIM=; b=BPGFMSVIO0GQsqhSpVd4h/kmPJNKxj7d0HcCN4tW8kuVIFSMSLcMfOvgoqqHN1P6uu g9D7G8qZ5rvsIfzNfUSrSz7fM6ODWkFhJySmnAb+LZr4n44hywzyhruJcaUlm25LLtRq yBX9q/vZAHzMcSnos/lv+TrQsxcOHF6FD2LVOahoGbre6WVIKjta66ZiABK/ou0LX4oe nK+sH6eTwjszN+ca47NPMJNG9NjQ8fCEAYLwjvqhgMjuNgWWHjxxNRpD8cb4rfKxL5mN HgzaPhwzk8QK6QC/OG6HurMX0UUjU9UdDnORotWSXDZUQ1fMM3OGt6BDprognGTjt1dv e40Q== X-Gm-Message-State: ABUngveTlS1bFijafOCeY2xG9y3pFiSG2NGVCe874DGkIFghdwAw3tVGbVTe3YP1+D3DENqlAJ+kINhnOViKFA== X-Received: by 10.36.73.134 with SMTP id e6mr1336055itd.109.1477635298128; Thu, 27 Oct 2016 23:14:58 -0700 (PDT) MIME-Version: 1.0 Sender: jonathan.dilorenzo@gmail.com Received: by 10.36.15.68 with HTTP; Thu, 27 Oct 2016 23:14:37 -0700 (PDT) In-Reply-To: References: From: Jonathan DiLorenzo Date: Fri, 28 Oct 2016 02:14:37 -0400 X-Google-Sender-Auth: X6nQKu1Lj6SelK_lLPJSqhMXcdc Message-ID: To: Ivan Gotovchits Cc: Jonathan DiLorenzo , caml-list Content-Type: multipart/alternative; boundary=001a113a98c40d7897053fe6c7c9 X-Validation-by: dilorenzo@cs.cornell.edu Subject: Re: [Caml-list] Providing module implementations for Oasis --001a113a98c40d7897053fe6c7c9 Content-Type: text/plain; charset=UTF-8 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 >>>>>> >>>>>> >>>>> >>>> >>> >> > --001a113a98c40d7897053fe6c7c9 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hmm, sadly this seems to still produce the same error afte= r cleaning up all the oasis generated files and everything:

<= div>
File "_none_", line 1:
Error: No implementatio= ns provided for the following modules:
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0Forest_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 ocamlop= t, I instead get:

File "_none_", li= ne 1:
Error: Error while linking ppx/forest_ppx.cma(Skins):
=
Reference to undefined global `Forest_parser_helper'
Com= mand exited with code 2.

New _oasis file (no= t with best -> byte change):

Library fores= t_parser
=C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 parsing<= /div>
=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 BuildDepends: =C2=A0 forest, ppx_d= eriving.show, compiler-libs.common=C2=A0
=C2=A0 CompiledObject: b= est
=C2=A0 Modules: =C2=A0Forest_parser_helper, Forest_types
=C2=A0 InternalModules: Forest_lexer, Forest_parser

<= div>Library forest_ppx
=C2=A0 Path: =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 ppx
=C2=A0 BuildTools: =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.fore= st_parser, forest, ppx_tools.metaquot
=C2=A0 CompiledObject: best=
=C2=A0 Modules: =C2=A0 =C2=A0 =C2=A0 =C2=A0Ppx_forest
= =C2=A0 InternalModules: Ppx_forest_lib, Utility, Skins
=C2=A0 XME= TAEnable: =C2=A0 =C2=A0true
=C2=A0 XMETADescription: Syntax exten= sion library for OCaml Forest
=C2=A0 XMETARequires: =C2=A0 str re= core threads ppx_tools.metaquot
=C2=A0 XMETAExtraLines: =C2=A0pp= x =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.for= est_parser, forest.forest_ppx, pads.ppx, ppx_tools.metaquot
=C2= =A0 CompiledObject: best


On Thu, Oct 27, 2016 at 2:2= 4 PM, Ivan Gotovchits <ivg@ieee.org> wrote:
The problem is =C2=A0in a name clashing betw= een `$opam-switch/lib/ocaml/compiler-libs/parser` and the `parser` lib= rary that is compiled from your internal library named `parser.cmxa`.
T= he 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 a= rchive, that definitely doesn't have=C2=A0
`Forest_parser_hel= per` module.

The reason, why it is still able to s= ee that there is no `bad_func` in `Forest_parser_helper` is because the int= erfaces are not contained in the `cmxa` file, but are looked up directly in= =C2=A0
the `cmi`. Compiler is looking for a file named `forest_pa= rser_helper.cmi` and can see that there are not `bad_func` there.=C2=A0

The solution is to rename your library, e.g., use `Li= brary forest_parser` instead of `Library parser`

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

Ok, now the next step would be the follo= wing. Carefully check that all modules, that you're using in libraries = are included in `Modules` or `InternalModules`. It is the case
that som= etimes=C2=A0when you forgot to include a module, oasis (actually `ocamlbuil= d`), may produce a strange, and on a first glance, irrelevant error message= .=C2=A0

I checked and sa= dly the modules I'm trying to access are all in `Modules`. Perhaps inte= restingly, 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 g= ives me this error (which is what I would normally expect):

<= /div>
File "ppx/skins.ml", line 39, characters 8-37:
Error: Unbound val= ue Forest_parser_helper.bad_func
Command exited with code 2= .
=C2=A0
If it doesn't help then the `_bui= ld/_log` file might help us to debug the issue.=C2=A0

Attached. Thanks so much for helping with this a= gain. I'm at a total loss.
=C2=A0

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

Thanks for your re= sponse.

The first one is that you didn't run `oasis setup` after you = made the changes, so I would suggest cleaning current state
a= nd starting from scratch. (I usually just do `git clean -idx` just to be su= re 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 t= he generated files. Same error unfortunately
=C2=A0
Anoth= er idea=C2=A0is 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=C2=A0
either a compiler or oasis to d= ifferent versions.=C2=A0

I am using oasis 0.4.7 and ocaml-4.03.0, but I don't appear to be usin= g 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&#= 39;s some other way I should be checking for this please let me know. Hopef= ully, they're compatible sans flambda?

<= /div>

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 exam= ple, I want my 'ppx' library to be able to use functions from my &#= 39;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:




<= div>Thanks in advance,

= =C2=A0 BuildDepends: =C2=A0 pads, str, re, re.glob, core, threads, ppx_let<= /div>
=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 BuildTools: =C2=A0 =C2=A0 ocamlbuild, menhir, ocamllex
=C2= =A0 Findlibparent: =C2=A0forest
=C2=A0 Findlibname: =C2=A0 =C2=A0= parser
=C2=A0 BuildDepends: =C2=A0 forest, ppx_deriving.show, com= piler-libs.common=C2=A0
=C2=A0 CompiledObject: best
=C2= =A0 Modules: =C2= =A0Forest_parser_helper
=C2=A0 InternalModules: Forest_lexer, For= est_parser, Forest_types

Library 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=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
=C2=A0 InternalModules: Ppx_forest_lib, Utility, Sk= ins
=C2=A0 XMETAEnable: =C2=A0 =C2=A0true
=C2=A0 XMETAR= equires: =C2=A0 str re core threads ppx_tools.metaquot
=C2=A0 XME= TAExtraLines: =C2=A0ppx =3D "ppx_forest"

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

<= /div>






--001a113a98c40d7897053fe6c7c9--