sinclude ../../Makeconf

FIXEDVERTARGET = fixedversion.h
FIXEDTARGET = fixed.oct 

FIXEDLINKTARGETS = $(patsubst %,%$(OCTLINK), \
	isfixed fabs fcos fcosh fsin fsinh \
	ftan ftanh fsqrt fexp flog flog10 fround \
	ffloor fceil fprod fsum fsumsq fcumsum \
	fcumprod display_fixed_operations reset_fixed_operations \
	freshape fdiag fatan2 freal fimag fconj \
	farg fangle \
	fixed_point_warn_overflow fixed_point_debug \
	fixed_point_count_operations fixed_point_version \
	fixed_point_library_version) 

SUBDIRS = examples doc

ifeq (,$(findstring cygwin,$(canonical_host_type)))
 ifeq (,$(findstring mingw,$(canonical_host_type)))
   OCT_INCLUDES_LIB = 1
  endif
endif
export OCT_INCLUDES_LIB

ifeq (1,$(OCT_INCLUDES_LIB))
  FIXEDSOURCES = fixedColVector.cc fixedRowVector.cc \
	fixedMatrix.cc fixedComplex.cc fixedCColVector.cc fixedCRowVector.cc \
	fixedCMatrix.cc Array-f.cc fixed-conv.cc ov-fixed.cc ov-fixed-mat.cc \
	fixedNDArray.cc fixedCNDArray.cc \
	ov-fixed-complex.cc ov-fixed-cx-mat.cc \
	op-fs-fs.cc   op-fs-fm.cc   op-fm-fs.cc   op-fm-fm.cc \
	op-fs-fcs.cc  op-fs-fcm.cc  op-fm-fcs.cc  op-fm-fcm.cc \
	op-fcs-fs.cc  op-fcs-fm.cc  op-fcm-fs.cc  op-fcm-fm.cc \
	op-fcs-fcs.cc op-fcs-fcm.cc op-fcm-fcs.cc op-fcm-fcm.cc \
	op-fil-fs.cc  op-fil-fm.cc  op-fil-fcs.cc op-fil-fcm.cc \
	fixed-var.cc fixed.cc
  FIXEDOBJECTS = fixed-int.o $(patsubst %.cc,%.o,$(FIXEDSOURCES))
  FIXEDDEPENDS = fixed-int.d $(patsubst %.cc,%.d,$(FIXEDSOURCES))

  TARGETS = $(FIXEDTARGET) $(FIXEDLINKTARGETS)
  OBJECTS = $(FIXEDOBJECTS)

  EXTRALIBS =
else
  FIXEDLIBTARGET = liboctave_fixed.dll
  FIXEDLIBSOURCES = fixedColVector.cc fixedRowVector.cc \
	fixedMatrix.cc fixedComplex.cc fixedCColVector.cc fixedCRowVector.cc \
	fixedCMatrix.cc Array-f.cc fixed-conv.cc ov-fixed.cc ov-fixed-mat.cc \
	fixedNDArray.cc fixedCNDArray.cc \
	ov-fixed-complex.cc ov-fixed-cx-mat.cc \
	op-fs-fs.cc   op-fs-fm.cc   op-fm-fs.cc   op-fm-fm.cc \
	op-fs-fcs.cc  op-fs-fcm.cc  op-fm-fcs.cc  op-fm-fcm.cc \
	op-fcs-fs.cc  op-fcs-fm.cc  op-fcm-fs.cc  op-fcm-fm.cc \
	op-fcs-fcs.cc op-fcs-fcm.cc op-fcm-fcs.cc op-fcm-fcm.cc \
	op-fil-fs.cc  op-fil-fm.cc  op-fil-fcs.cc op-fil-fcm.cc \
	fixed-var.cc 
  FIXEDLIBOBJECTS = fixed-int.o $(patsubst %.cc,%.o,$(FIXEDLIBSOURCES))
  FIXEDLIBDEPENDS = fixed-int.d $(patsubst %.cc,%.d,$(FIXEDLIBSOURCES))

  FIXEDSOURCES = fixed.cc
  FIXEDOBJECTS = $(patsubst %.cc,%.o,$(FIXEDSOURCES))
  FIXEDDEPENDS = $(FIXEDLIBDEPENDS) $(patsubst %.cc,%.d,$(FIXEDSOURCES))

  TARGETS = $(FIXEDLIBTARGET) $(FIXEDTARGET) $(FIXEDLINKTARGETS)
  OBJECTS = $(FIXEDLIBOBJECTS) $(FIXEDOBJECTS)

  EXTRALIBS = -L./ -loctave_fixed

  # The name of this flag changed in version 2.1.54. Use both versions
  # so that one of them will work.
  MY_SH_LDFLAGS = $(shell $(MKOCTFILE) -p SH_LDFLAGS) \
	-Wl,--out-implib=$(FIXEDLIBTARGET).a
  MY_DL_LDFLAGS = $(shell $(MKOCTFILE) -p DL_LDFLAGS) \
	-Wl,--out-implib=$(FIXEDLIBTARGET).a
endif

ifeq ($(MAKECMDGOALS),all)
  DEPENDS = $(FIXEDDEPENDS)
endif
ifeq ($(MAKECMDGOALS),)
  DEPENDS = $(FIXEDDEPENDS)
endif

DELETES = $(OBJECTS) $(FIXEDDEPENDS) $(TARGETS) $(FIXEDLIBTARGET).a \
	$(FIXEDVERTARGET) core octave-core *~ *.d-t int/fixed.o int/fixed.d \
	int/fixed.d-t

DEFINES = -DOCTAVE_FORGE $(HAVE_DO_FORTRAN_INDEXING) \
	$(HAVE_PROPAGATE_EMPTY_MATRICES) \
	$(HAVE_OK_TO_LOSE_IMAGINARY_PART) \
	$(HAVE_ND_ARRAYS) $(TYPEID_HAS_CLASS) \
	$(CLASS_HAS_LOAD_SAVE) $(MX_ND_RED_NUM) \
	$(HAVE_OCTAVE_CONCAT) $(HAVE_SWAP_BYTES) $(HAVE_OCTAVE_UPLUS)
MOFLAGS =

.PHONY: all clean count $(SUBDIRS)

.SUFFIXES:

.PRECIOUS: %.d %.o

all : $(TARGETS) $(SUBDIRS)

ifndef OCTAVE_FORGE
install :
	@echo "Where exactly do you want me to install to!!!"
else
ifeq (1,$(OCT_INCLUDES_LIB))
install : $(SUBDIRS)
	@$(INSTALL) -d $(DESTDIR)$(MPATH)/fixed
else
install : $(SUBDIRS)
	@$(INSTALL) -d $(DESTDIR)$(MPATH)/fixed; \
	if test ! -e $(bindir)/liboctave.dll ; then \
	  echo "****** WARNING: $(FIXEDLIBTARGET) not correctly installed."; \
	  echo "****** To ensure correct operation $(FIXEDLIBTARGET) should"; \
	  echo "****** be in the same directory as liboctave.dll"; \
	fi; \
	$(INSTALL) $(FIXEDLIBTARGET) $(bindir); \
	if test ! -e $(libdir)/liboctave.dll.a ; then \
	  echo "****** WARNING: $(FIXEDLIBTARGET).a not correctly installed"; \
	  echo "****** To ensure correct operation $(FIXEDLIBTARGET).a"; \
	  echo "****** should be in the same directory as liboctave.dll.a"; \
	fi; \
	$(INSTALL) $(FIXEDLIBTARGET).a $(libdir);

$(FIXEDLIBTARGET): $(FIXEDLIBDEPENDS) $(FIXEDLIBOBJECTS) 
	@echo "Linking $@"; \
	$(RM) -f $@; \
	DL_LDFLAGS="$(MY_DL_LDFLAGS)" SH_LDFLAGS="$(MY_SH_LDFLAGS)" $(MKOCTFILE) -v -o $@ $(FIXEDLIBOBJECTS)
endif
endif

$(FIXEDTARGET) : $(DEPENDS) $(FIXEDOBJECTS) 
	@echo "Linking $@"; \
	$(MKOCTFILE) $(MOFLAGS) $(FIXEDOBJECTS) $(EXTRALIBS) -o $@

$(FIXEDVERTARGET) :
	@echo "Creating $@"; $(RM) -f $@; \
	echo "#define OCTAVEFIXEDVERSION \"$(OCTAVEFIXEDVERSION)\"" > $@

$(FIXEDLINKTARGETS) :
	@echo "Symbolic linking $@ to $(FIXEDTARGET)"; \
	$(RM) -f $@ ; \
	$(MKOCTLINK) $(FIXEDTARGET) $@

ifneq (,$(DEPENDS))
  sinclude $(DEPENDS)
endif

$(SUBDIRS) :
	@if test -z "$(MAKECMDGOALS)" ; then \
	    cd $@ && $(MAKE) ; \
	elif grep -q "^$(MAKECMDGOALS) *[:]" $@/Makefile ; then \
	    cd $@ && $(MAKE) $(MAKECMDGOALS) ; \
	fi

fixed-int.d : int/fixed.cc
	@echo "Depending $<"; \
	$(MKOCTFILE) $(MOFLAGS) $(DEFINES) -M int/fixed.cc; \
	$(LN_S) $(patsubst %.cc,%.d,$<) $@

fixed-var.d : $(FIXEDVERTARGET)

fixed-int.o : int/fixed.cc fixed-int.d
	@echo "Compiling $@ from $<"; \
	$(MKOCTFILE) $(MOFLAGS) $(DEFINES) -c $<; \
	$(RM) -f $@ ; \
	$(LN_S) $(patsubst %.cc,%.o,$<) $@

%.d: %.cc
	@echo "Depending $<"; \
	$(MKOCTFILE) $(MOFLAGS) $(DEFINES) -M $<

%.o:%.cc
%.o:%.cc %.d
	@echo "Compiling $@"; \
	$(MKOCTFILE) $(MOFLAGS) $(DEFINES) -c $< 

clean: $(SUBDIRS)
	@echo "Cleaning..."; \
	$(RM) -f $(DELETES)

realclean: $(SUBDIRS)
	@echo "Cleaning..."; \
	$(RM) -f $(DELETES)

dist: $(SUBDIRS)

count: $(SUBDIRS)
	wc *{.cc,.h,.m} int/*.{cc,h}
