頭の悪い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を見つけたのですが見なかったことにします。