Previous Contents Next
Chapter 13 Dependency generator (ocamldep)

ocamldep コマンドは Objective Caml のソース群をスキャンして他のコンパイルユニットへの参照 (依存関係) を探します。 依存関係の出力は make コマンドの形式で、これを利用すると make が正しい順番でソースファイルをコンパイルでき、ソースファイルを一部変更したとき必要なところだけ再コンパイルできるようになります。

普通の使い方は以下のようになります。
        ocamldep options *.mli *.ml > .depend
*.mli *.ml はカレントディレクトリの中のソースファイルすべてを表し、依存関係は .depend ファイルに保存されます (Makefile と関連したことは下の方を見てください) 。

生成された依存関係はバイトコードコンパイラ ocamlc でもネイティブコードコンパイラ ocamlopt でも使えます。

13.1 Options

ocamldep のオプションは以下の通りです。
-I directory
指定されたディレクトリをソースファイルの検索パスに追加します。ソースファイル foo.ml の中に外部コンパイルユニット Bar への参照があると、カレントディレクトリか -I で指定されたディレクトリに bar のソースがあれば、そのユニットのインターフェイス bar.cmi への依存関係が生成されますが、ない場合は Bar は標準ライブラリのモジュールであると判断して依存関係は生成されません。複数のディレクトリにまたがるプログラムに対しては、コンパイラに渡す -I オプションを ocamldep にも渡すことを推奨します。

-native
純粋なネイティブコードプログラム (バイトコードでない) 用の依存関係を生成します。実装ファイル (.ml) がインターフェイスファイル (.mli) を持たない場合、ocamldep はインターフェイスの変更を反映するためコンパイル済みバイトコードファイル (.cmo) への依存関係を生成します。しかしこのせいで、ネイティブコードだけをコンパイルすればいいのに不必要にバイトコードも再コンパイルしてしまうことがあります。この -native フラグを使えば、.cmo の代わりにコンパイル済みネイティブコード .cmx への依存関係を生成することができます (すべてのソースファイルがインターフェイスファイル .mli を持っていればこのフラグは何もしません) 。
13.2 A typical Makefile

Objective Caml プログラム用の 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
.SUFFIXES: .ml .mli .cmo .cmi .cmx

.ml.cmo:
        $(OCAMLC) $(OCAMLFLAGS) -c $<

.mli.cmi:
        $(OCAMLC) $(OCAMLFLAGS) -c $<

.ml.cmx:
        $(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<

# Clean up
clean:
        rm -f prog1 prog2
        rm -f *.cm[iox]

# Dependencies
depend:
        $(OCAMLDEP) $(INCLUDES) *.mli *.ml > .depend

include .depend

Previous Contents Next