2015-10-09 38 views
1

我在使用大量输入文件运行ocamldep时出现臭名昭着的Argument list too long错误。ocamldep:参数列表太长

只有在使用本机Windows OCaml编译器+ Cygwin时才会出现此问题:在此配置中,ARG_MAX返回32000,这是一个非常低的值,我认为这是Windows本身强加的限制,而不是Cygwin。

对于这种类型的错误通常的解决方法是使用xargs,如果我们可以分割的参数,例如使用lsrm时一样,但我不知道它如何与ocamldep工作。既然它期望在命令行中同时给出所有文件(为了正确计算依赖关系),并且似乎没有选择给文件中的文件列表(如在-f filelist.txt中),是否有办法避免这个问题?

回答

0

您可以使用xargs,因为您不需要一次性列出ocamldep的所有文件。

例如,在OCaml的编译器的源代码,就知道GraphicsX11的图形上的依赖关系,你不需要列出graphcs.ml

$ cd otherlibs/graphics 
$ ocamldep graphicsX11.ml 
graphicsX11.cmo : graphics.cmi graphicsX11.cmi 
graphicsX11.cmx : graphics.cmx graphicsX11.cmi 

但是,你必须做出dependees访问ocamldep,否则他们是忽略。其实GraphicsX11取决于Hashtbl过了,发现与-I dir选项:(。我个人从来没有见过的OCaml的项目超过32000毫升/ MLI文件WOW)

# Seek dependencies over stdlib modules too: 
$ ocamldep -I ../../stdlib/ graphicsX11.ml 
graphicsX11.cmo : ../../stdlib/hashtbl.cmi graphics.cmi graphicsX11.cmi 
graphicsX11.cmx : ../../stdlib/hashtbl.cmx graphics.cmx graphicsX11.cmi 

+0

这不是数量参数,但扩展命令行的总大小不得超过'ARG_MAX'。至少看起来是这样的,因为我将扩展的命令行复制到一个文件中,它略大于32 KiB(在我的Linux上'ARG_MAX'实际上是2MiB,具有128 KiB缓冲区)。其中80%是一遍又一遍重复过长的目录名称,顺便说一句。不理想,但我们仍然远离32k文件... – anol