The ocamldep 命令扫描一组 OCaml 源文件 (.ml 和 .mli 文件) 以查找对外部编译单元的引用,并以适合 make 实用程序的格式输出依赖关系行。这确保了 make 将以正确的顺序编译源文件,并在修改源文件时重新编译需要重新编译的文件。
典型的用法是
ocamldep options *.mli *.ml > .depend
其中 *.mli *.ml 展开到当前目录中的所有源文件,而 .depend 是应包含依赖关系的文件。(有关典型的 Makefile,请参见下文。)
为使用字节码编译器 ocamlc 和使用原生代码编译器 ocamlopt 进行编译生成依赖关系。
ocamldep 识别以下命令行选项。
filename: Module1 Module2 ... ModuleN其中 Module1、…、ModuleN 是文件 filename 中引用的编译单元的名称,但这些名称不会解析为源文件名。此类原始依赖关系无法被 make 使用,但可以由其他工具(如 Omake)进行后处理。
这是一个 OCaml 程序的模板 Makefile。
OCAMLC=ocamlc OCAMLOPT=ocamlopt OCAMLDEP=ocamldep INCLUDES= # all relevant -I options here OCAMLFLAGS=$(INCLUDES) # add other options for ocamlc here OCAMLOPTFLAGS=$(INCLUDES) # add other options for ocamlopt here # prog1 should be compiled to bytecode, and is composed of three # units: mod1, mod2 and mod3. # The list of object files for prog1 PROG1_OBJS=mod1.cmo mod2.cmo mod3.cmo prog1: $(PROG1_OBJS) $(OCAMLC) -o prog1 $(OCAMLFLAGS) $(PROG1_OBJS) # prog2 should be compiled to native-code, and is composed of two # units: mod4 and mod5. # The list of object files for prog2 PROG2_OBJS=mod4.cmx mod5.cmx prog2: $(PROG2_OBJS) $(OCAMLOPT) -o prog2 $(OCAMLFLAGS) $(PROG2_OBJS) # Common rules %.cmo: %.ml $(OCAMLC) $(OCAMLFLAGS) -c $< %.cmi: %.mli $(OCAMLC) $(OCAMLFLAGS) -c $< %.cmx: %.ml $(OCAMLOPT) $(OCAMLOPTFLAGS) -c $< # Clean up clean: rm -f prog1 prog2 rm -f *.cm[iox] # Dependencies depend: $(OCAMLDEP) $(INCLUDES) *.mli *.ml > .depend include .depend
如果您使用模块别名来为模块提供更短的名称,则需要更改上述定义。假设您的映射文件称为 mylib.mli,以下是最低限度的修改。
OCAMLFLAGS=$(INCLUDES) -open Mylib mylib.cmi: mylib.mli $(OCAMLC) $(INCLUDES) -no-alias-deps -w -49 -c $< depend: $(OCAMLDEP) $(INCLUDES) -map mylib.mli $(PROG1_OBJS:.cmo=.ml) > .depend
请注意,在这种情况下,您不应与其他文件一起计算 mylib.mli 的依赖关系,因此需要显式传递要处理的文件列表。如果 mylib.mli 本身具有依赖关系,则应使用 -as-map 计算这些依赖关系。