# Emacs should use -*- Makefile -*- mode.

#################################################
#
# the user can specify the following targets
#
#  install_inc::
#    installs the include files
#
#  default::
#
# the user must define the following:
#
#
# TARGET_TO_MAKE
#
# BIN_OR_LIB = BIN or LIB
#
# TRUESRC
#
# DEPENDINCLUDE
#
# TRUEINCLUDES
#
# OTHERFILES
#
# LIBOBJ
# BINOBJ
#
# LIBS
#
# SABER_FILES
#
#################################################

.PHONY: default install install_devel install_inc install_target clean

default::

install::

install_devel::

.PHONY: testbuild testrun

testbuild: $(TESTPROGS)

testrun: $(TESTPROGS)
ifneq ($(TESTPROGS),)
	for prog in $(TESTPROGS); \
	  do \
	    ./$${prog} || exit 1; \
	  done
endif

ifeq ($(BIN_OR_LIB),LIB)

ifeq ($(TMPLINLIB),yes)

$(TOPDIR)/lib/$(TARGET_TO_MAKE).a: $(LIBOBJ)
	/bin/rm -f $@
	$(AR) $(ARFLAGS) $@ $^ $(wildcard $(TMPLREPO)/*.o)
	$(RANLIB) $@

$(TOPDIR)/lib/$(TARGET_TO_MAKE).la: $(LIBOBJ)
	$(LTLINK) $(CXX) -o $@ $^ $(wildcard $(TMPLREPO)/*.o) $(LTLINKLIBOPTS)

else

$(TOPDIR)/lib/$(TARGET_TO_MAKE).a: $(LIBOBJ)
	/bin/rm -f $@
	$(AR) $(ARFLAGS) $@ $^
	$(RANLIB) $@

$(TOPDIR)/lib/$(TARGET_TO_MAKE).la: $(LIBOBJ)
	$(LTLINK) $(CXX) -o $@ $^ $(LTLINKLIBOPTS)

endif

default:: $(TOPDIR)/lib/$(TARGET_TO_MAKE).$(LIBSUF)

ifneq ($(ENABLESHARED),yes)

install_devel:: install_inc install_target

install::

endif

ifeq ($(ENABLESHARED),yes)

install_devel:: install_inc

install:: install_target

endif

install_inc::
	$(INSTALL) $(INSTALLDIROPT) $(installroot)$(includedir)/$(SRCDIR:$(SRCTOPDIR)/src/lib/%=%)
	-$(INSTALL) $(INSTALLLIBOPT) $(SRCDIR)/*.h $(installroot)$(includedir)/$(SRCDIR:$(SRCTOPDIR)/src/lib/%=%)
	-$(INSTALL) $(INSTALLLIBOPT) *.h $(installroot)$(includedir)/$(SRCDIR:$(SRCTOPDIR)/src/lib/%=%)

install_target:: $(TOPDIR)/lib/$(TARGET_TO_MAKE).$(LIBSUF)
	$(INSTALL) $(INSTALLDIROPT) $(installroot)$(libdir)
	$(LTINST) $(INSTALL) $(INSTALLLIBOPT) $< $(installroot)$(libdir)
endif

ifeq ($(BIN_OR_LIB),BIN)

$(TARGET_TO_MAKE): $(BINOBJ) $(LIBS)
	$(LD) $(LDFLAGS) $^ -o $(@F) $(SYSLIBS)

install_devel::

install:: install_target

install_target:: $(TARGET_TO_MAKE)
	$(INSTALL) $(INSTALLDIROPT) $(installroot)$(bindir)
	$(LTINST) $(INSTALL) $(INSTALLBINOPT) $(TARGET_TO_MAKE) $(installroot)$(bindir)

endif

%.$(OBJSUF): %.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< $(OUTPUT_OPTION)

%.lo: %.c
	$(LTCOMP) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< $(OUTPUT_OPTION)

ifneq ($(OBJSUF),lo)

%.$(OBJSUF): %.f
	$(FC) $(FFLAGS) -c $< $(OUTPUT_OPTION)

%.$(OBJSUF): %.C
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $(OUTPUT_OPTION)

%.$(OBJSUF): %.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $(OUTPUT_OPTION)

endif

%.lo: %.C
	$(LTCOMP) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $(OUTPUT_OPTION)

%.lo: %.cc
	$(LTCOMP) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< $(OUTPUT_OPTION)

%.lo: %.f
	$(LTCOMP) $(FC) $(FFLAGS) -c $< $(OUTPUT_OPTION)

#
# cleans
#
clean:: oclean targetclean dclean miscclean

distclean:: oclean targetclean dclean genclean miscclean

miscclean::
	-rm -f *~

oclean::
	-rm -rf *.o $(TMPLREPO) cxx_tmpl_repo ti_files *.lo
	-rm -rf .libs

dclean::
	-rm -f *.d

genclean::
ifdef GENINC
	-rm -f $(GENINC)
endif
ifdef GENSRC
	-rm -f $(GENSRC)
endif

targetclean::
ifdef TARGET_TO_MAKE
  ifeq ($(BIN_OR_LIB),BIN)
	-rm -f $(TARGET_TO_MAKE)
  endif
  ifeq ($(BIN_OR_LIB),LIB)
	-rm -f $(TARGET_TO_MAKE).a
  endif
endif

targetclean::
	-rm -f $(TESTPROGS)

#
# dependencies
#

ifneq ($(CCDEPENDSUF),none)
%.d: %.c
	$(CCDEPEND) $(CCDEPENDFLAGS) -c $(CPPFLAGS) $(CFLAGS) $< > /dev/null
	sed 's/^$*.o/$*.$(OBJSUF) $*.d/g' < $(*F).$(CCDEPENDSUF) > $(@F)
	/bin/rm -f $(*F).$(CCDEPENDSUF)
else
%.d: %.c
	$(CCDEPEND) $(CCDEPENDFLAGS) -c $(CPPFLAGS) $(CFLAGS) $< | sed 's/^$*.o/$*.$(OBJSUF) $*.d/g' > $(@F)
endif

ifneq ($(CXXDEPENDSUF),none)
%.d: %.cc
	$(CXXDEPEND) $(CXXDEPENDFLAGS) -c $(CPPFLAGS) $(CXXFLAGS) $< > /dev/null
	sed 's/^$*.o/$*.$(OBJSUF) $*.d/g' < $(*F).$(CXXDEPENDSUF) > $(@F)
	/bin/rm -f $(*F).$(CXXDEPENDSUF)
else
%.d: %.cc
	$(CXXDEPEND) $(CXXDEPENDFLAGS) -c $(CPPFLAGS) $(CXXFLAGS) $< | sed 's/^$*.o/$*.$(OBJSUF) $*.d/g' > $(@F)
endif

#
# sometimes it's nice to get assembler source
#
%.s: %.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -S $<

%.s: %.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -S $<

#
# sometimes it's nice to get preprocessed source
#
%.i: %.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -E $< -o $@

%.ii: %.cc
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -E $< -o $@

values::
	@echo TOPDIR=$(TOPDIR)
	@echo SRCDIR=$(SRCDIR)
	@echo VPATH=$(VPATH)
	@echo BIN_OR_LIB=$(BIN_OR_LIB)
	@echo TARGET_TO_MAKE=$(TARGET_TO_MAKE)
ifdef LIBS
	@echo LIBS=$(LIBS)
endif
ifeq ($(BIN_OR_LIB),LIB)
	@echo LIBOBJ=$(LIBOBJ)
endif
ifeq ($(BIN_OR_LIB),BIN)
	@echo BINOBJ=$(BINOBJ)
endif
