在子文件夹中正确编译模块(ocamlbuild)

10
我最近决定整理我的项目目录中的文件。我将用于几种不同文件类型的解析器移动到它们自己的目录中,并决定使用ocamlbuild(因为项目越来越复杂,简单的shell脚本不再足够)。我通过修改myocamlbuild添加了一些基本规则(调用ocaml_lib,我之后会使用ocamlfind),成功地包含了外部项目,但是我不知道如何适当地将文件夹作为模块包含到项目中。我创建了一个名为parser.mlpack的文件,并填充了正确的要包含的模块(例如,“parser / Date”等),在根目录中编写了一个parser.mli,用于它们的实现,并修改了_tags文件(见下文)。
在编译过程中,解析器目录被正确遍历,并且在_build目录中创建了parser.cmiparser.mli.depends以及parsers子目录中所有的*.cm[xio]文件。
我感觉我可能会做一些多余的事情,但无论如何,在编译时,项目仍然找不到Parser模块!
谢谢! _tags
debug : true
<*.ml> : annot
"parser" : include
<parser/*.cmx>: for-pack(Parser)
<curlIO.*> : use_curl
<mySQL.*> : use_mysql
<**/*.native> or <**/*.byte> : use_str,use_unix,use_curl,use_mysql

编译错误

/usr/local/bin/ocamlopt.opt unix.cmxa str.cmxa -g -I /usr/local/lib/ocaml/site-lib/mysql mysql.cmxa -I /usr/local/lib/ocaml/curl curl.cmxa curlIO.cmx utilities.cmx date.cmx fraction.cmx logger.cmx mySQL.cmx data.cmx project.cmx -o project.native  
File "\_none\_", line 1, characters 0-1:  
Error: **No implementations provided for the following modules:**
         Parser referenced from project.cmx  
Command exited with code 2.  

你会注意到在上面的链接阶段中没有包括 -I parser,事实上没有任何与解析器相关的文件被包含!

编辑:从下面的评论和回答中添加了新细节。

2个回答

4

您需要将解析器目录“包含”在搜索路径中。 您可以在_tags 文件中完成此操作:

"parser": include

然后,ocamlbuild 可以搜索解析器目录中的有趣文件。

我修改了我的问题。这有所帮助,但实际上我已经在使用 -I parser 命令行等价物了。现在,我只需使用 ocamlbuild project.<target> 进行构建。 - nlucaroni
那我们试试其他方法吧 :). 之前的已经做好了,这是另一种方法。 - Michael Ekstrand
<parser> 或者 "parser" 都可以,但是因为我不打算进行任何模式匹配,所以 "parser" 是正确的。 - nlucaroni

3
我想知道 parser.mli 是否会干扰处理 mlpack 文件的依赖关系。当处理和编译 parser.mlpack 时,将从打包操作中生成 parser.cmi。尝试删除 parser.mli 文件进行构建。如果可以正常工作,则可以将其重新处理为真正的答案。
此外,如果 parser.mlpackparser 目录中并且设置了 include 标签,则不需要在模块中添加 parser/ 前缀。但对于这个问题来说,这不应该有影响。
更新:这解决了问题,但并不是根本原因。根本原因是在 .mlpack 中提到的一个文件已被移动。

是的,这个方法起作用了,但是没有达到预期的效果。一个代表目录内容的模块并没有被创建出来;它们被子模块直接引用。在编译过程中,-pack参数被添加到适当的模块中。但是在最终产品中没有被使用。我的理解关于-pack是不正确的吗? - nlucaroni
-pack 应该创建一个包含其他模块作为子模块的模块。然后,您的其他代码必须将它们作为子模块引用(例如 Parser.ConfParser);如果它直接引用它们(只是 ConfParser 而没有首先打开 Parser),那么事情就会变得混乱。当您没有 parser.mli 时,您能否发布 -verbose 输出? - Michael Ekstrand
1
我已经重新添加了parser.mli文件。我认为由于某种原因,在编译包时出现错误,但没有在应该中断的地方中断。我的mlpack文件中有一个额外的模块,我已经移动了它。 - nlucaroni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接