# 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:%=%.testrun)

# The target specific variable can be set to control testrun:
# To skip testrun:
#   %.testrun: DO_TESTRUN=no
# To give arguments to the command
#   %.testrun: TESTRUN_ARGS=arglist
%.testrun: %
	if test "$(DO_TESTRUN)" != no; then \
	  echo ----------- Running $< $(TESTRUN_ARGS) -----------; \
	  if test -f $(SRCDIR)/$<.out; then \
	    ./$< $(TESTRUN_ARGS) > $<.out.testrun 2>&1 || exit 1; \
	    diff -u $<.out.testrun $(SRCDIR)/$<.out || exit 1; \
	  else \
	    ./$< $(TESTRUN_ARGS) || exit 1; \
	  fi \
	else \
	  echo ----------- Skipping run of $< -----------; \
	fi

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

ifeq ($(TMPLINST),yes)

SCLIBS := $(shell $(LISTLIBS) $(INCLUDE) $(SRCDIR)/LIBS.h)
SCLIBSOTHER := $(SCLIBS:$(TARGET_TO_MAKE).$(LIBSUF)=)
SCLIBSEXIST := $(wildcard $(SCLIBSOTHER:%=$(TOPDIR)/lib/%))

$(TOPDIR)/lib/$(TARGET_TO_MAKE).a: $(LIBOBJ) $(SCLIBSEXIST)
	@echo "Doing template instantiations (expect errors)."
	-$(LD) $(LDFLAGS) -o a.out.tmplinst $^ $(SYSLIBS) 2> /dev/null
	/bin/rm -f a.out.tmplinst
	@echo "Finished template instantiations (errors were expected)."
	/bin/rm -f $@
	$(AR) $(ARFLAGS) $@ $(LIBOBJ)
	$(RANLIB) $@

else

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

endif

$(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 *.rpo
	-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) $(TESTPROGS:%=%.out.testrun)

testclean::
	/bin/rm -f $(TESTPROGS) $(TESTPROGS:%=%.out.testrun)

#
# 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

#
# rules for cca component code
#

$(GEN_SRCS): .babel-stamp
	@if test -f $@; then \
          touch $@; \
        else \
          rm -f .babel-stamp; \
          $(MAKE) .babel-stamp; \
        fi

$(EXTRA_CXX_SRCS): .babel-stamp

.babel-stamp: $(SIDL_FILES)
	@rm -f .babel-stamp .babel-temp; touch .babel-temp
	for i in $(IMPLHDRS) $(IMPLSRCS) $(EXTRA_CXX_SRCS) $(EXTRA_INCLUDES); \
          do \
            if test ! -e $${i}; then \
              ln -s $(SRCDIR)/$${i}; \
            fi; \
          done
	$(INSTALL) $(INSTALLDIROPT) $(REPO)
	/bin/rm -f $(REPO)/MPQC* 
	$(BABEL) -e'^sidl.*' -e'^gov.*' \
          -R$(CCA_CHEM_REPO) -R$(CCA_SPEC_BABEL_SHARE)/xml \
          -R$(CCAFE_SHARE)/xml --text=xml -o$(REPO) $(SIDL_FILES)
	$(BABEL) $(BABEL_ARGS) $(BABEL_PACKAGES) $(BABEL_ENUMS) \
          $(BABEL_CLASSES)
	@mv -f .babel-temp $@

clean-components: oclean targetclean dclean miscclean
	rm -f $(IORHDRS) $(IORSRCS) $(STUBHDRS) $(STUBSRCS) \
              $(SKELHDRS) $(SKELSRCS)
	rm -f babel.make .babel-stamp
	for i in $(IMPLHDRS) $(IMPLSRCS) $(EXTRA_CXX_SRCS) $(EXTRA_INCLUDES); \
          do \
            if test -L $${i}; then \
              /bin/rm $${i}; \
            fi; \
          done
