#-----------------------------------------------------------------------
# Submakefile :: cmex
#-----------------------------------------------------------------------

CMEX_SRCDIR   = $(top_srcdir)/cmex
CMEX_OBJDIR   = $(top_builddir)/cmex

MATDIR        = $(top_builddir)/matlab

ifeq ($(blas),yes)
  CMEXLIBS    = libsnopt7 libcmex
  STCMEXLIBS  = libsnopt7
else
  CMEXLIBS    = libsnopt7 libcmex libsnblas
  STCMEXLIBS  = libsnopt7 libsnblas
endif
CMEXLIBS_LA   = $(CMEXLIBS:%=$(LIBDIR)/%.la)
CMEXLIBS_INS  = $(CMEXLIBS:%=$(libdir)/%.la)
STCMEXLIBS_A  = $(STCMEXLIBS:%=$(LIBDIR)/%.a)

ifeq ($(f2c_enabled),no)
  CMEXFILES   = snoptcmex mexUtility snoptprobdef snoptprint sncmexlog s_copy
  CMEX_LIBS   = $(CMEXLIBS_LA)
  STCMEX_LIBS = $(STCMEXLIBS_A)
else
  CMEXFILES   = snoptcmex mexUtility snoptprobdef snoptprint sncmexlog
  CMEX_LIBS   = $(CMEXLIBS_LA) $(F2CLIBRARY)
  STCMEX_LIBS = $(STCMEXLIBS_A) $(LIBDIR)/libf2c.a
endif
CMEX_LO       = $(CMEXFILES:%=$(CMEX_OBJDIR)/%.lo)
CMEX_O        = $(CMEXFILES:%=$(CMEX_OBJDIR)/%.o)

MEXINCLUDE    = -I${MATLAB}/extern/include

#-----------------------------------------------------------------------

all: all_cmex
install: install_cmex
uninstall: uninstall_cmex
clean: clean_cmex
veryclean: veryclean_cmex
distclean: veryclean_cmex

#-----------------------------------------------------------------------

all_cmex: $(CMEX_OBJDIR) $(MATDIR) $(MATDIR)/snoptcmex

$(CMEX_OBJDIR): $(top_builddir)
	if [ ! -d $(CMEX_OBJDIR) ]; then mkdir $@; fi

$(MATDIR): $(top_builddir)
	if [ ! -d $(MATDIR) ]; then mkdir $@; fi

install_cmex: all_cmex
	$(INSTALL_LIB) $(LIBDIR)/libcmex.la $(libdir)
	$(FINISH) $(libdir)

uninstall_cmex:
	$(UNINSTALL) rm -f $(libdir)/libcmex.la

#-----------------------------------------------------------------------

ifeq ($(shared),yes)
$(MATDIR)/snoptcmex: $(CMEX_LIBS)
	$(LINK_MEX) -v -no-install $(MEXFLAGS) $(CMEX_SRCDIR)/dummy.c \
	CC='$(CC)' CLIBS='$$CLIBS $(CLIBS) $(FCLIBS)' LD='$(CC)' \
	-o $@ -output snoptcmex -outdir $(MATDIR) $^
	@echo "SNOPT cmex files installed in ${MATDIR}"
else
$(MATDIR)/snoptcmex:
	@echo "  To create mexfiles with static libraries,     "
	@echo "  do a                         'make veryclean' "
	@echo "  and then a                      'make static' "
	@echo "  To clean up static make,  'make static_clean' "
endif

$(LIBDIR)/libcmex.la: $(CMEX_LO)
	$(LINK_C) $(CFLAGS) -o $@ $^ -rpath $(libdir)

$(CMEX_OBJDIR)/%.lo : $(CMEX_SRCDIR)/%.c
	$(COMPILE_C) $(CFLAGS) $(MEXINCLUDE) -c $< -o $@

ifeq ($(f2c_enabled),yes)
$(CMEX_SRCDIR)/sncmexlog.c: $(CMEX_SRCDIR)/sncmexlog.f
	$(F2C) $(F2COPTS) $^
	@mv sncmexlog.c $@
else
$(CMEX_SRCDIR)/sncmexlog.c:
	@echo " Oops, we've lost sncmexlog.c!"
	@echo " To get it back, we need f2c, but it's been disabled."
	@echo " Please reconfigure SNOPT with f2c support."
endif

$(CMEX_OBJDIR)/snoptcmex.lo: $(CMEX_SRCDIR)/mexUtility.h $(CMEX_SRCDIR)/snopt.h \
	$(CMEX_SRCDIR)/sncmexlog.c \
	$(CMEX_SRCDIR)/snoptprobdef.h $(CMEX_SRCDIR)/snoptprint.h

#-----------------------------------------------------------------------

clean_cmex:
	$(CLEAN) rm -f $(CMEX_OBJDIR)/*.lo

veryclean_cmex: clean_cmex
	$(CLEAN) rm -f $(CMEX_OBJDIR)/snoptcmex
	$(CLEAN) rm -f $(MATDIR)/snoptcmex
	$(CLEAN) rm -f $(LIBDIR)/libcmex.la

#------------------------------------------------------------------------------#

static_cmex: $(CMEX_OBJDIR) $(MATDIR) $(CMEX_O)
	$(MEX) -v $(CMEX_SRCDIR)/dummy.c \
	CC='$(CC)' LD='$(CC)' CLIBS='$$CLIBS $(CLIBS) $(FCLIBS)' \
	-output $(MATDIR)/snoptcmex $(CMEX_O) $(STCMEX_LIBS)
	@echo "SNOPT cmex files installed in ${MATDIR}"

$(CMEX_OBJDIR)/%.o : $(CMEX_SRCDIR)/%.c
	$(MEX) -v $(MEXFLAGS) $(MEXINCLUDE) \
	CC='$(CC)' LD='$(CC)' CLIBS='$$CLIBS $(CLIBS) $(FCLIBS)' \
	-c $< $@ -outdir $(CMEX_OBJDIR)

$(CMEX_OBJDIR)/snoptcmex.o: $(CMEX_SRCDIR)/mexUtility.h $(CMEX_SRCDIR)/snopt.h \
	$(CMEX_SRCDIR)/sncmexlog.c \
	$(CMEX_SRCDIR)/snoptprobdef.h $(CMEX_SRCDIR)/snoptprint.h

static_cmex_clean:
	rm -rf $(CMEX_OBJDIR)/*.o

#-----------------------------------------------------------------------

.PRECIOUS: $(CMEX_OBJDIR)/%.c

.PHONY: all_cmex install_cmex uninstall_cmex clean_cmex veryclean_cmex \
        static_cmex static_cmex_clean

