#########################################################################
#                                                                       #
#                                 OCaml                                 #
#                                                                       #
#                 Xavier Clerc, SED, INRIA Rocquencourt                 #
#                                                                       #
#   Copyright 2010 Institut National de Recherche en Informatique et    #
#   en Automatique.  All rights reserved.  This file is distributed     #
#   under the terms of the Q Public License version 1.0.                #
#                                                                       #
#########################################################################

BASEDIR=../..

COMPFLAGS=-I $(OTOPDIR)/otherlibs/dynlink
LD_PATH=.:$(TOPDIR)/otherlibs/dynlink

.PHONY: default
default:
	@if ! $(SUPPORTS_SHARED_LIBRARIES); then \
	  echo 'skipped (shared libraries not available)'; \
	else \
	  $(SET_LD_PATH) $(MAKE) compile run; \
	fi

.PHONY: compile
compile:
	@$(OCAMLC) -c registry.ml
	@for file in stub*.c; do \
	  $(OCAMLC) -ccopt -I -ccopt $(CTOPDIR)/byterun/caml -c $$file; \
	  $(OCAMLMKLIB) -o `echo $$file | sed -e 's/stub/plug/' -e 's/\.c//'` \
	                `basename $$file c`$(O); \
	done
	@for file in plug*.ml; do \
	  $(OCAMLC) -c $$file; \
	  $(OCAMLMKLIB) -o `basename $$file .ml` `basename $$file ml`cmo; \
	done
	@$(OCAMLC) -c main.ml
	@rm -f main static custom custom.exe
	@$(OCAMLC) -o main dynlink.cma registry.cmo main.cmo
	@$(OCAMLC) -o static -linkall registry.cmo plug1.cma plug2.cma \
	           -use-runtime $(OTOPDIR)/boot/ocamlrun$(EXE)
	@$(OCAMLC) -o custom$(EXE) -custom -linkall registry.cmo plug2.cma \
	           plug1.cma -I .

.PHONY: run
run:
	@printf " ... testing 'main'"
	@$(OCAMLRUN) ./main plug1.cma plug2.cma >main.result
	@$(DIFF) main.reference main.result >/dev/null \
	&& echo " => passed" || echo " => failed"

	@printf " ... testing 'static'"
	@$(OCAMLRUN) ./static >static.result
	@$(DIFF) static.reference static.result >/dev/null \
	&& echo " => passed" || echo " => failed"

	@printf " ... testing 'custom'"
	@./custom$(EXE) >custom.result
	@$(DIFF) custom.reference custom.result >/dev/null \
	&& echo " => passed" || echo " => failed"

.PHONY: promote
promote: defaultpromote

.PHONY: clean
clean: defaultclean
	@rm -f main static custom custom.exe *.result marshal.data

include $(BASEDIR)/makefiles/Makefile.common