
# ==============================================================================
#                          Unix Makefile for libmpdec++
# ==============================================================================

ENABLE_STATIC = @ENABLE_STATIC@
ENABLE_SHARED = @ENABLE_SHARED@
ENABLE_MINGW = @ENABLE_MINGW@

FPIC = @FPIC@
LIBSTATIC = @LIBSTATIC@
LIBNAME = @LIBNAME@
LIBSONAME = @LIBSONAME@
LIBSHARED = @LIBSHARED@
LIBIMPORT = @LIBIMPORT@

LIBSTATIC_CXX = @LIBSTATIC_CXX@
LIBNAME_CXX = @LIBNAME_CXX@
LIBSONAME_CXX = @LIBSONAME_CXX@
LIBSHARED_CXX = @LIBSHARED_CXX@
LIBIMPORT_CXX = @LIBIMPORT_CXX@
LIBSHARED_USE_AR = @LIBSHARED_USE_AR@
LINK_STATIC = @LINK_STATIC@
LINK_DYNAMIC = @LINK_DYNAMIC@

OBJECT_SUFFIX = @OBJECT_SUFFIX@
COPY = @cp -f $1 $2

CXX = @CXX@
LDXX = @LDXX@
AR = @AR@
RANLIB = @RANLIB@
MPD_PTHREAD = @MPD_PTHREAD@
MPD_PGEN = @MPD_PGEN@
MPD_PUSE = @MPD_PUSE@
MPD_PREC = @MPD_PREC@

MPD_CXX = $(strip $(CXX) $(MPD_PTHREAD))
MPD_LDXX = $(strip $(LDXX) $(MPD_PTHREAD))

FILTER_FOR_STATIC = @FILTER_FOR_STATIC@

CONFIGURE_CXXFLAGS = @CONFIGURE_CXXFLAGS@
MPD_CXXFLAGS_COMMON = $(strip $(filter-out $(CXXFLAGS),$(CONFIGURE_CXXFLAGS)) $(CXXFLAGS))
MPD_CXXFLAGS_SHARED = $(strip $(filter-out $(FPIC),$(MPD_CXXFLAGS_COMMON)) $(FPIC))
MPD_CXXFLAGS = $(strip $(filter-out $(FILTER_FOR_STATIC),$(MPD_CXXFLAGS_COMMON)))

CONFIGURE_LDXXFLAGS = @CONFIGURE_LDXXFLAGS@
MPD_LDXXFLAGS = $(strip $(filter-out $(LDXXFLAGS),$(CONFIGURE_LDXXFLAGS)) $(LDXXFLAGS))

LINK_LIBSTATIC = $(strip $(LINK_STATIC) $(LIBSTATIC_CXX) ../libmpdec/$(LIBSTATIC) $(LINK_DYNAMIC))

ifeq ($(MAKECMDGOALS), profile_gen)
  MPD_CXXFLAGS_COMMON += $(MPD_PGEN)
  MPD_LDXXFLAGS += $(MPD_PGEN)
endif
ifeq ($(MAKECMDGOALS), profile_use)
  MPD_CXXFLAGS_COMMON += $(MPD_PUSE)
  MPD_LDXXFLAGS += $(MPD_PUSE)
endif


MPD_TARGETS =
ifeq ($(ENABLE_STATIC), yes)
    MPD_TARGETS += $(LIBSTATIC_CXX)
endif
ifeq ($(ENABLE_SHARED), yes)
    MPD_TARGETS += $(LIBSHARED_CXX)
endif


default: $(MPD_TARGETS)


OBJS := decimal.o
SHARED_OBJS := .objs/decimal.o


ifeq ($(LIBSHARED_USE_AR), yes)
AR_STATIC_OBJS := $(OBJS:.o=$(OBJECT_SUFFIX))
AR_SHARED_OBJS := $(LIBSHARED:.o=$(OBJECT_SUFFIX))
%$(OBJECT_SUFFIX): %.o
	$(call COPY,$<,$@)

# Disabled: C++ symbol extraction is not reliable.
$(LIBSHARED_CXX):

$(LIBSTATIC_CXX): Makefile $(AR_STATIC_OBJS)
	$(AR) rc $(LIBSTATIC_CXX) $(AR_STATIC_OBJS)
	$(RANLIB) $(LIBSTATIC_CXX)
else
$(LIBSTATIC_CXX): Makefile $(OBJS)
	$(AR) rc $(LIBSTATIC_CXX) $(OBJS)
	$(RANLIB) $(LIBSTATIC_CXX)

$(LIBSHARED_CXX): Makefile $(SHARED_OBJS)
ifeq ($(ENABLE_MINGW), yes)
	$(LDXX) $(MPD_LDXXFLAGS) -o $(LIBSHARED_CXX) $(SHARED_OBJS) ../libmpdec/$(LIBIMPORT) -lm
else
	$(MPD_LDXX) -L../libmpdec $(MPD_LDXXFLAGS) -o $(LIBSHARED_CXX) $(SHARED_OBJS) -lmpdec -lm
	ln -sf $(LIBSHARED_CXX) $(LIBNAME_CXX)
	ln -sf $(LIBSHARED_CXX) $(LIBSONAME_CXX)
endif
endif


decimal.o:\
Makefile decimal.cc ../libmpdec/mpdecimal.h decimal.hh
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS) -c decimal.cc

.objs/decimal.o:\
Makefile decimal.cc ../libmpdec/mpdecimal.h decimal.hh
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS_SHARED) -c decimal.cc -o .objs/decimal.o


bench: Makefile bench.cc ../libmpdec/mpdecimal.h decimal.hh $(LIBSTATIC_CXX)
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS) -o bench bench.cc $(LINK_LIBSTATIC) -lm

bench_full: Makefile bench_full.cc ../libmpdec/mpdecimal.h decimal.hh $(LIBSTATIC_CXX)
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS) -o bench_full bench_full.cc $(LINK_LIBSTATIC) -lm

bench_shared: Makefile bench.cc ../libmpdec/mpdecimal.h decimal.hh $(LIBSHARED_CXX)
	$(MPD_CXX) -I. -I../libmpdec -L. -L../libmpdec $(MPD_CXXFLAGS_COMMON) -o bench_shared bench.cc -lm -lmpdec++ -lmpdec

bench_full_shared: Makefile bench_full.cc ../libmpdec/mpdecimal.h decimal.hh $(LIBSHARED_CXX)
	$(MPD_CXX) -I. -I../libmpdec -L. -L../libmpdec $(MPD_CXXFLAGS_COMMON) -o bench_full_shared bench_full.cc -lm -lmpdec++ -lmpdec


factorial: Makefile examples/factorial.cc $(LIBSTATIC_CXX)
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS) -o factorial examples/factorial.cc $(LINK_LIBSTATIC) -lm

pi: Makefile examples/pi.cc $(LIBSTATIC_CXX)
	$(MPD_CXX) -I. -I../libmpdec $(MPD_CXXFLAGS) -o pi examples/pi.cc $(LINK_LIBSTATIC) -lm

examples: factorial pi


GEN_TARGETS =
ifeq ($(ENABLE_STATIC), yes)
GEN_TARGETS += bench_full
endif
ifeq ($(ENABLE_SHARED), yes)
GEN_TARGETS += bench_shared
endif

profile_gen: $(GEN_TARGETS)
	./.profile/train.sh $(MPD_PREC)

profile_clean:
	rm -f *.o *.so *.gch
	rm -f bench bench_shared bench_full bench_full_shared factorial pi
	rm -f $(LIBSTATIC_CXX) $(LIBNAME_CXX) $(LIBSONAME_CXX) $(LIBSHARED_CXX) $(LIBIMPORT_CXX)
	cd .objs && rm -f *.o *.so *.gch

profile_use: default

profile:
	$(MAKE) clean
	$(MAKE) profile_gen
	$(MAKE) profile_clean
	$(MAKE) profile_use


check: default
	cd ../tests++ && $(MAKE) && ./runshort.sh

check_local: default
	cd ../tests++ && $(MAKE) && ./runshort.sh --local

check_alloc: default
	cd ../tests++ && $(MAKE) && ./runshort_alloc.sh


clean:
	rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock
	rm -f bench bench_shared bench_full bench_full_shared factorial pi
	rm -f $(LIBSTATIC_CXX) $(LIBNAME_CXX) $(LIBSONAME_CXX) $(LIBSHARED_CXX) $(LIBIMPORT_CXX)
	cd .objs && rm -f *.o *.so *.gch *.gcda *.gcno *.gcov *.dyn *.dpi *.lock

distclean: clean
	rm -f Makefile .pc/libmpdec++.pc
