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 計算它們。