頭の悪いmakefile

あれー、おかしいなー。GNUツールとは別れられたはずなのに。

SOURCEDIR=.
BUILDDIR=build
DESTDIR=dest

EXENAME=sample.exe
EXE=$(DESTDIR)/$(EXENAME)

MLSOURCE = $(wildcard $(SOURCEDIR)/*.ml)
MLISOURCE = $(wildcard $(SOURCEDIR)/*.mli)
MAINSOURCE = $(SOURCEDIR)/sample.ml

INCLUDES =

CMO = $(addsuffix .cmo, $(basename $(patsubst %,$(BUILDDIR)/%, $(notdir $(MLSOURCE)))))
CMI = $(addsuffix .cmi, $(basename $(patsubst %,$(BUILDDIR)/%, $(notdir $(MLISOURCE)))))

MAINCMO = $(addsuffix .cmo, $(basename $(patsubst %,$(BUILDDIR)/%, $(notdir $(MAINSOURCE)))))
MAINCMI = $(addsuffix .cmi, $(basename $(MAINCMO)))
BUILDCMA=$(BUILDDIR)/$(addsuffix .cma, $(basename $(EXENAME)))
BUILDCMO=$(filter-out MAINCMO, $(CMO))
BUILDCMI=$(filter-out MAINCMI, $(CMI))

EXTRA_CMA = bigarray.cma gmp.cma

OCAMLFLAGS=-I $(BUILDDIR) $(INCLUDES)
OCAMLLIBFLAGS=-I $(BUILDDIR) $(INCLUDES)
OCAMLLINKFLAGS=-I $(BUILDDIR) $(INCLUDES)

OCAMLC=ocamlc
OCAMLOPT=ocamlopt
OCAMLDEP=ocamldep

all: $(EXE)

$(EXE): $(BUILDCMA) $(MAINCMO)
	$(OCAMLC) -o $(EXE) $(OCAMLLINKFLAGS) $(EXTRA_CMA) $(BUILDCMA) $(MAINCMO)

$(BUILDCMA) : $(BUILDCMI) $(BUILDCMO)
	$(OCAMLC) -o $(BUILDCMA) $(OCAMLLIBFLAGS) -a $(BUILDCMO)

$(CMO): $(BUILDDIR)/%.cmo: $(SOURCEDIR)/%.ml
	$(OCAMLC) -o $@ $(OCAMLFLAGS) -c $<

$(CMI): $(BUILDDIR)/%.cmi: $(SOURCEDIR)/%.mli
	$(OCAMLC) -o $@ $(OCAMLFLAGS) -c $<

clean:
	cmd "/c cd $(BUILDDIR) && del *.cm*"

clean-exe:
	cmd "/c cd $(DESTDIR) && del $(EXENAME)"

clean-all: clean-exe clean

depend:
	$(OCAMLDEP) $(INCLUDES) -I $(SOURCEDIR) $(SOURCEDIR)/*.mli $(SOURCEDIR)/*.ml \
		| sed "s/[a-z_0-9]*\.cm./$(BUILDDIR)\/&/g" > $(BUILDDIR)/.depend

include $(BUILDDIR)/.depend

sedまで使ってるし……。
リンク時にocamlcに渡す順序が重要ですので、一旦.cmaにまとめて順序を気にしなくてもよくしてるあたり頭が悪いです。
改めて、全てのコンパイラはdcc32を見習うべき。
だいぶ遅れてOCamlMakefileを見つけたのですが見なかったことにします。