ocamldep:参数列表太长
当运行带有大量输入文件的ocamldep:参数列表太长,ocaml,Ocaml,当运行带有大量输入文件的ocamldep时,我遇到了臭名昭著的参数列表过长的错误 此问题仅在使用本机Windows OCaml编译器+Cygwin时发生:在此配置中,ARG_MAX返回32000,这是一个非常低的值,我认为这是Windows本身施加的限制,而不是Cygwin 对于这种错误,通常的解决方案是使用xargs,如果我们可以拆分参数,例如使用ls或rm时,但我不知道如何使用ocamldep。由于它希望所有文件同时在命令行中给出(以正确计算依赖关系),并且似乎没有选项给出文件中的文件列表(
ocamldep
时,我遇到了臭名昭著的参数列表过长的错误
此问题仅在使用本机Windows OCaml编译器+Cygwin时发生:在此配置中,ARG_MAX
返回32000,这是一个非常低的值,我认为这是Windows本身施加的限制,而不是Cygwin
对于这种错误,通常的解决方案是使用xargs
,如果我们可以拆分参数,例如使用ls
或rm
时,但我不知道如何使用ocamldep
。由于它希望所有文件同时在命令行中给出(以正确计算依赖关系),并且似乎没有选项给出文件中的文件列表(如-f filelist.txt
),有没有办法避免此问题?您可以使用xargs
,因为您不需要一次列出ocamldep
的所有文件
例如,在OCaml编译器的源代码中,要了解GraphicsX11对图形的依赖关系,不需要列出graphcs.ml
$ cd otherlibs/graphics
$ ocamldep graphicsX11.ml
graphicsX11.cmo : graphics.cmi graphicsX11.cmi
graphicsX11.cmx : graphics.cmx graphicsX11.cmi
但是,必须使依赖项可访问ocamldep
,否则将忽略它们。实际上,GraphicsX11也依赖于Hashtbl,它可以通过-I dir
选项找到:
# 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
(我个人从未见过OCaml项目超过32000 ml/mli文件。哇。)您可以使用xargs
,因为您不需要一次列出ocamldep
的所有文件
例如,在OCaml编译器的源代码中,要了解GraphicsX11对图形的依赖关系,不需要列出graphcs.ml
$ cd otherlibs/graphics
$ ocamldep graphicsX11.ml
graphicsX11.cmo : graphics.cmi graphicsX11.cmi
graphicsX11.cmx : graphics.cmx graphicsX11.cmi
但是,必须使依赖项可访问ocamldep
,否则将忽略它们。实际上,GraphicsX11也依赖于Hashtbl,它可以通过-I dir
选项找到:
# 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
(就我个人而言,我从未见过OCaml项目超过32000 ml/mli files.Wow。)不是参数的数量,而是扩展命令行的总大小不能超过ARG_MAX
。至少看起来是这样,因为我将扩展的命令行复制到一个文件中,它略大于32kib(在我的Linux上,ARG_MAX实际上是2Mb,有128kib的缓冲区)。其中80%是反复重复的过长目录名,顺便说一句。这并不理想,但我们离32k文件还很远……不是参数的数量,而是扩展命令行的总大小不能超过ARG\u MAX
。至少看起来是这样,因为我将扩展的命令行复制到一个文件中,它略大于32kib(在我的Linux上,ARG_MAX实际上是2Mb,有128kib的缓冲区)。80%的目录名重复了很多次,顺便说一句。这并不理想,但我们离32k文件还很远。。。