我想优化makefile
的编译时间。在我修改一个文件后,一个问题是,make
返回,例如,
File "frontend/parser_e.ml", line 1:
Error: The files expression/rc.cmi and frontend/gen/lexer_ref.cmi
make inconsistent assumptions over interface Utility
make: *** [frontend/parser_e.cmx] Error 2
rm frontend/parser_name.ml
请注意,遇到问题的文件可能会发生变化,但这种情况经常发生。我要做的是make clean
然后make
,因此它不是增量构建,需要时间。
所以有人知道我应该在makefile
检查什么来减少出现这种错误的可能性吗?
修改1:
实际上,我的所有与ml相关的文件都是1
,但frontend/gen/*
除外,它们都是深度2.在@camlspotter的答案之后,我修改了一点{{1}我的ocamldep
的一部分。现在看起来如下:
makefile
因此,DIRS= -I frontend -I frontend/gen -I lib ...
depend: $(AUTOGEN)
# ocamldep -native $(DIRS) */*.ml */*.mli > depend # this is what was written before, I don't hink it is correct
ocamldep -native $(DIRS) *.ml *.mli > depend
跟随另一个make
会立即出现不一致错误。
一句话是我没有make
,这是正常的吗?
另一个评论是AUTOGEN
生成一个{0}字符的make depend
,这是正常的吗?
编辑2:
我按照OCaml源代码的depend
修改了depend:
:
Makefile
我实际上有大约20个文件夹,每个文件夹有1-5毫升文件。这一次,beforedepend:: */*.ml
depend: beforedepend
(for d in \
frontend frontend/gen lib ... ; \
do ocamldep $(DIRS) $$d/*.mli $$d/*.ml; \
done) > depend
响起make
,并且不想停止。但是如果删除3-4个文件夹,几秒钟后就可以成功创建一个for d in ...
。
答案 0 :(得分:0)
您的Makefile未涵盖模块之间的所有必要依赖项。
的含义
File "frontend/parser_e.ml", line 1:
Error: The files expression/rc.cmi and frontend/gen/lexer_ref.cmi
make inconsistent assumptions over interface Utility
是:
frontend/parser_e.ml
取决于expression/rc.ml
和frontend/gen/lexer_ref.ml
expression/rc.ml
和frontend/gen/lexer_ref.ml
都使用名为Utility
expression/rc.ml
和frontend/gen/lexer_ref.ml
必须同意Utility
的类型(界面),但没有。我认为有两种可能导致这种状态:
utility.ml
,例如dir_a/utility.ml
和dir_b/utility.ml
。 OCaml不允许链接具有相同名称的模块。您可以使用压缩模块解决此问题(请参阅-pack
编译器选项)。你的情况不是这个。utility.ml
,但您的Makefile可能无法完全了解依赖关系。这是你的情况。第二种情况的可能情况是:
utility.ml
或utility.mli
,其界面(.cmi
文件)已更改。expression/rc.ml
和frontend/gen/lexer_ref.ml
中的一个是针对此Utility
的新接口重新编译的,但另一个不是,因为依赖项未知。frontend/parser_e.ml
中一起使用时发现两个模块之间存在不一致。对于修复,您必须运行ocamldep
以捕获所有必需的模块依赖项并将其通知给make
。请注意:
-I
选项。.ml
运行之前确实生成了自动生成的.mli
和ocamldep
文件。由于您似乎有.mly
和.mll
个文件而且您遇到了问题,我怀疑您错过了这里的一些内容。 OCaml编译器源代码本身可以找到OCaml模块依赖性分析的一个很好的例子。最好使用beforedepend
,depend
和include .depend
检查其各行。
一般提示:
include .depend
.depend
添加到Makefile并将所有模块依赖项捕获到此ocamldep
文件中
.ml
和.mli
文件都必须由ocamldep
进行扫描。不要忘记正确添加-I
选项,否则会遗漏某些依赖项。ocamldep
之前,请确保生成自动生成的.ml
和.mli
文件,例如.mly
和.mll
的输出。或者它错过了一些依赖。典型的Makefile看起来像:
beforedepend:: x.ml
x.ml: x.mly
ocamlyacc x.mly
beforedepend:: y.ml
y.ml: y.mll
ocamllex y.mll
depend: beforedepend
ocamldep -I <dir1> -I <dir2> <all the ml and mli paths> > .depend
include .depend