
SRCDIR = ..
INC = -I$(SRCDIR)

CC = gcc
LD = gcc
AR = ar

MPD_WARN = -Wall -W -Wno-unknown-pragmas
MPD_CONFIG = -DUNIVERSAL
MPD_CCOV = -O0 -g -fno-inline -fprofile-arcs -ftest-coverage -fpic

CONFIGURE_CFLAGS = -Wall -W -Wno-unknown-pragmas -DUNIVERSAL -O2 -fpic -s
CFLAGS ?= $(CONFIGURE_CFLAGS)

GMPDEPS = 
GMPPATH = 
ifneq ($(strip $(GMPPATH)),)
  INC += -I$(GMPPATH)/include -L$(GMPPATH)/lib
  ifeq ($(CC), suncc)
    INC += -R$(GMPPATH)/lib
  endif
endif


default:  runtest cov fntcov test_transpose ppro_mulmod
extended: default karatsuba_fnt karatsuba_fnt2 $(GMPDEPS)
build_libcoverage: CFLAGS = $(MPD_WARN) $(MPD_CONFIG) $(MPD_CCOV)
build_libcoverage: default


# dectest
runtest:\
runtest.c $(SRCDIR)/io.h  $(SRCDIR)/mpdecimal.h $(SRCDIR)/memory.h \
          $(SRCDIR)/mptest.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a \
          malloc_fail.c malloc_fail.h
	$(CC) $(INC) $(CFLAGS) -o runtest runtest.c malloc_fail.c $(SRCDIR)/libmpdec.a -lm

cov:\
cov.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a \
      malloc_fail.c malloc_fail.h
	$(CC) $(INC) $(CFLAGS) -o cov cov.c malloc_fail.c $(SRCDIR)/libmpdec.a -lm

fntcov:\
fntcov.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a \
         malloc_fail.c malloc_fail.h
	$(CC) $(INC) $(CFLAGS) -o fntcov fntcov.c malloc_fail.c $(SRCDIR)/libmpdec.a -lm

# extended tests
karatsuba_fnt:\
karatsuba_fnt.c $(SRCDIR)/mpdecimal.h  $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o karatsuba_fnt karatsuba_fnt.c $(SRCDIR)/libmpdec.a -lm

karatsuba_fnt2:\
karatsuba_fnt2.c $(SRCDIR)/mpdecimal.h  $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o karatsuba_fnt2 karatsuba_fnt2.c $(SRCDIR)/libmpdec.a -lm

ppro_mulmod:\
ppro_mulmod.c $(SRCDIR)/mpdecimal.h    $(SRCDIR)/constants.h \
              $(SRCDIR)/numbertheory.h $(SRCDIR)/mptypes.h \
              $(SRCDIR)/mptest.h       $(SRCDIR)/umodarith.h \
              $(SRCDIR)/typearith.h    $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o ppro_mulmod ppro_mulmod.c $(SRCDIR)/libmpdec.a -lm

test_transpose:\
test_transpose.c $(SRCDIR)/bits.h      $(SRCDIR)/mpdecimal.h \
                 $(SRCDIR)/constants.h $(SRCDIR)/mptypes.h \
                 $(SRCDIR)/mptest.h    $(SRCDIR)/typearith.h \
                 $(SRCDIR)/transpose.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o test_transpose test_transpose.c $(SRCDIR)/libmpdec.a -lm

# tests against gmp
mpd_mpz_add:\
mpd_mpz_add.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o mpd_mpz_add mpd_mpz_add.c $(SRCDIR)/libmpdec.a -lm -lgmp

mpd_mpz_divmod:\
mpd_mpz_divmod.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o mpd_mpz_divmod mpd_mpz_divmod.c $(SRCDIR)/libmpdec.a -lm -lgmp

mpd_mpz_mul:\
mpd_mpz_mul.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o mpd_mpz_mul mpd_mpz_mul.c $(SRCDIR)/libmpdec.a -lm -lgmp

mpd_mpz_sub:\
mpd_mpz_sub.c $(SRCDIR)/mpdecimal.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) $(CFLAGS) -o mpd_mpz_sub mpd_mpz_sub.c $(SRCDIR)/libmpdec.a -lm -lgmp

# tests against decNumber
deccheck:\
deccheck.c $(SRCDIR)/io.h  $(SRCDIR)/mpdecimal.h $(SRCDIR)/memory.h \
           $(SRCDIR)/mptest.h $(SRCDIR)/mptypes.h $(SRCDIR)/libmpdec.a
	$(CC) $(INC) -IdecNumber $(CFLAGS) -o deccheck deccheck.c \
	decNumber/decNumber.c decNumber/decContext.c $(SRCDIR)/libmpdec.a -lm


FORCE:

clean: FORCE
	rm -f *.o *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock \
	      runtest cov fntcov karatsuba_fnt karatsuba_fnt2 ppro_mulmod \
              test_transpose mpd_mpz_add mpd_mpz_divmod mpd_mpz_mul mpd_mpz_sub

distclean: FORCE
	$(MAKE) clean
	rm -rf Makefile deccheck dectest.zip testdata decNumber*


