VERSION_MAJOR	= @libxmp_VERSION_MAJOR@
VERSION_MINOR	= @libxmp_VERSION_MINOR@
VERSION_RELEASE	= @libxmp_VERSION_PATCH@

VERSION		= @libxmp_VERSION@

# This dylib will support anything linked against COMPAT_VERSION through VERSION
COMPAT_VERSION	= $(VERSION_MAJOR)

CC		= @CC@
CPPFLAGS	= @CPPFLAGS@ @DEFS@
CFLAGS		= @CFLAGS@
#CFLAGS		+= -DDEBUG
CFLAGS_SHARED	= @CFLAGS_SHARED@
CFLAGS_STATIC	= -DLIBXMP_STATIC
LD		= @CC@
LDFLAGS		= @LDFLAGS@
LIBS		= @LIBS@
AR		= @AR@
RANLIB		= @RANLIB@
INSTALL		= @INSTALL@
DESTDIR		=
prefix		= @prefix@
exec_prefix	= @prefix@
datarootdir	= @datarootdir@
BINDIR		= @bindir@
LIBDIR		= @libdir@
MANDIR		= @mandir@/man3
INCLUDEDIR	= @includedir@
LD_VERSCRIPT	= @LD_VERSCRIPT@
SHELL		= /bin/sh

DIST		= libxmp-$(VERSION)
DFILES		= README INSTALL install-sh configure configure.ac config.sub config.guess Makefile.in  \
		  Makefile.vc Makefile.dos Makefile.os2 Makefile.w32 Makefile.lnx watcom.mif  \
		  CMakeLists.txt aclocal.m4 autogen.sh libxmp.map libxmp.pc.in libxmp-config.cmake \
		  libxmp-config.cmake.autotools libxmp-config-version.cmake.autotools.in
DDIRS		= docs include src loaders prowiz depackers lhasa lite test cmake m4
V		= 0
LIB		= libxmp.a
SOLIB		= libxmp.so
SHLIB		= $(SOLIB).$(VERSION)
SONAME		= $(SOLIB).$(VERSION_MAJOR)
DLL		= libxmp.dll
IMPLIB		= libxmp.dll.a
DYLIB		= libxmp.$(VERSION_MAJOR).dylib
GCLIB		= libxmp-gc.a

LIB_LITE	= libxmp-lite.a
SOLIB_LITE	= libxmp-lite.so
SHLIB_LITE	= $(SOLIB_LITE).$(VERSION)
SONAME_LITE	= $(SOLIB_LITE).$(VERSION_MAJOR)
DLL_LITE	= libxmp-lite.dll
IMPLIB_LITE	= libxmp-lite.dll.a
DYLIB_LITE	= libxmp-lite.$(VERSION_MAJOR).dylib
GCLIB_LITE	= libxmp-lite-gc.a

DYLIB_COMPAT	= -compatibility_version,$(COMPAT_VERSION),

DARWIN_VERSION	= @DARWIN_VERSION@

# https://github.com/cmatsuoka/libxmp/issues/1
ifneq ($(DARWIN_VERSION),)
  ifeq ($(shell test $(DARWIN_VERSION) -lt 9 && echo true), true)
    DYLIB_COMPAT=
  endif
endif

all: @STATIC@ @SHARED@

include include/Makefile
include cmake/Makefile
include m4/Makefile
include src/Makefile
include src/loaders/Makefile
include src/loaders/prowizard/Makefile
include src/depackers/Makefile
include src/depackers/lhasa/Makefile
include src/lite/Makefile
include test/Makefile
include docs/Makefile

ALL_OBJS=$(OBJS) @PROWIZARD_OBJS@ @DEPACKER_OBJS@

LOBJS = $(ALL_OBJS:.o=.lo)

GCOBJS = $(ALL_OBJS:.o=.gco)

LOBJS_LITE = $(LITE_OBJS:.o=.lo)

GCOBJS_LITE = $(LITE_OBJS:.o=.gco)

.SUFFIXES: .c .o .lo .a .so .dll .in .gco .gcda .gcno

.c.o:
	@CMD='$(CC) $(CPPFLAGS) $(CFLAGS_STATIC) $(CFLAGS) -o $*.o -c $<'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo CC $*.o ; fi; \
	eval $$CMD

.c.lo:
	@CMD='$(CC) $(CPPFLAGS) $(CFLAGS_SHARED) $(CFLAGS) -o $*.lo -c $<'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo CC $*.lo ; fi; \
	eval $$CMD

.c.gco:
	@CMD='$(CC) $(CPPFLAGS) $(CFLAGS_STATIC) $(CFLAGS) -O0 -fno-inline -fprofile-arcs -ftest-coverage -o $*.gco -c $<'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo CC $*.gco ; fi; \
	eval $$CMD

static: lib/$(LIB)

shared: lib/$(SHLIB)

coverage: lib/$(GCLIB)

dll: lib/$(DLL)

dylib: lib/$(DYLIB)

static-lite: lib/$(LIB_LITE)

shared-lite: lib/$(SHLIB_LITE)

coverage-lite: lib/$(GCLIB_LITE)

dll-lite: lib/$(DLL_LITE)

dylib-lite: lib/$(DYLIB_LITE)

lib/$(LIB): $(ALL_OBJS)
	@mkdir -p lib
	@CMD='$(AR) r $@ $(ALL_OBJS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo AR $@ ; fi; \
	eval $$CMD
	$(RANLIB) $@

lib/$(SHLIB): $(LOBJS)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -shared -Wl,-soname,$(SONAME) $(LD_VERSCRIPT) -o $@ $(LOBJS) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD
	ln -sf $(SHLIB) lib/$(SONAME)
	ln -sf $(SONAME) lib/$(SOLIB)

lib/$(DLL): $(LOBJS)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -shared -Wl,--output-def,lib/libxmp.def,--out-implib,lib/$(IMPLIB) -o $@ $(LOBJS) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD

lib/$(LIB_LITE): $(LITE_OBJS)
	@mkdir -p lib
	@CMD='$(AR) r $@ $(LITE_OBJS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo AR $@ ; fi; \
	eval $$CMD
	$(RANLIB) $@

lib/$(SHLIB_LITE): $(LOBJS_LITE)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -shared -Wl,-soname,$(SONAME_LITE) $(LD_VERSCRIPT) -o $@ $(LOBJS_LITE) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD
	ln -sf $(SHLIB_LITE) lib/$(SONAME_LITE)
	ln -sf $(SONAME_LITE) lib/$(SOLIB_LITE)

lib/$(DLL_LITE): $(LOBJS_LITE)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -shared -Wl,--output-def,lib/libxmp-lite.def,--out-implib,lib/$(IMPLIB_LITE) -o $@ $(LOBJS_LITE) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD

# From http://stackoverflow.com/questions/15905310:
# The version number checks that dyld performs are limited to ensuring that
# the compatibility version of the library being loaded is higher than the
# compatibility version of the library that was used at build time.
#
lib/$(DYLIB): $(LOBJS)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -dynamiclib -Wl,-headerpad_max_install_names,$(DYLIB_COMPAT)-current_version,$(VERSION),-install_name,$(prefix)/lib/$(DYLIB) -o $@ $(LOBJS) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD
	ln -sf $(DYLIB) lib/libxmp.dylib

lib/$(GCLIB): $(GCOBJS)
	@mkdir -p lib
	@CMD='$(AR) r $@ $(GCOBJS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo AR $@ ; fi; \
	eval $$CMD
	$(RANLIB) $@

lib/$(DYLIB_LITE): $(LOBJS_LITE)
	@mkdir -p lib
	@CMD='$(LD) $(LDFLAGS) -dynamiclib -Wl,-headerpad_max_install_names,$(DYLIB_COMPAT)-current_version,$(VERSION),-install_name,$(prefix)/lib/$(DYLIB_LITE) -o $@ $(LOBJS_LITE) $(LIBS)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo LD $@ ; fi; \
	eval $$CMD
	ln -sf $(DYLIB) lib/libxmp-lite.dylib

lib/$(GCLIB_LITE): $(GCOBJS_LITE)
	@mkdir -p lib
	@CMD='$(AR) r $@ $(GCOBJS_LITE)'; \
	if [ "$(V)" -gt 0 ]; then echo $$CMD; else echo AR $@ ; fi; \
	eval $$CMD
	$(RANLIB) $@

docs: all-docs

clean:
	@rm -f $(ALL_OBJS) $(LOBJS) $(T_OBJS)
	@rm -f $(GCOBJS) $(ALL_OBJS:.o=.gcno) $(ALL_OBJS:.o=.gcda)
	@rm -f $(LITE_OBJS) $(LOBJS_LITE) $(TLITE_OBJS)
	@rm -f $(GCOBJS_LITE) $(LITE_OBJS:.o=.gcno) $(LITE_OBJS:.o=.gcda)

distclean: clean
	@rm -f config.log config.cache config.status *.pc *-version.cmake.autotools depend Makefile lib/* test/libxmp-test* test/libxmp-lite-test*

install: all
	@mkdir -p $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCLUDEDIR)
	@if [ -f lib/$(LIB) ]; then \
		echo "Installing $(LIB)..."; \
		$(INSTALL) -m644 lib/$(LIB) $(DESTDIR)$(LIBDIR); \
	fi
	@if [ -f lib/$(DYLIB) ]; then \
		echo "Installing $(DYLIB)..."; \
		$(INSTALL) -m755 lib/$(DYLIB) $(DESTDIR)$(LIBDIR); \
		ln -sf $(DYLIB) $(DESTDIR)$(LIBDIR)/libxmp.dylib; \
	fi
	@if [ -f lib/$(DLL) ]; then \
		echo "Installing $(DLL)..."; \
		$(INSTALL) -m644 lib/$(DLL) $(DESTDIR)$(BINDIR); \
		$(INSTALL) -m644 lib/$(IMPLIB) $(DESTDIR)$(LIBDIR); \
	fi
	@if [ -f lib/$(SHLIB) ]; then \
		echo "Installing $(SHLIB)..."; \
		$(INSTALL) -m755 lib/$(SHLIB) $(DESTDIR)$(LIBDIR); \
		ln -sf $(SHLIB) $(DESTDIR)$(LIBDIR)/$(SONAME); \
		ln -sf $(SONAME) $(DESTDIR)$(LIBDIR)/$(SOLIB); \
	fi
	@if [ -f lib/$(LIB_LITE) ]; then \
		echo "Installing $(LIB_LITE)..."; \
		$(INSTALL) -m644 lib/$(LIB_LITE) $(DESTDIR)$(LIBDIR); \
	fi
	@if [ -f lib/$(DYLIB_LITE) ]; then \
		echo "Installing $(DYLIB_LITE)..."; \
		$(INSTALL) -m755 lib/$(DYLIB_LITE) $(DESTDIR)$(LIBDIR); \
		ln -sf $(DYLIB_LITE) $(DESTDIR)$(LIBDIR_LITE)/libxmp-lite.dylib; \
	fi
	@if [ -f lib/$(DLL_LITE) ]; then \
		echo "Installing $(DLL_LITE)..."; \
		$(INSTALL) -m644 lib/$(DLL_LITE) $(DESTDIR)$(BINDIR); \
		$(INSTALL) -m644 lib/$(IMPLIB_LITE) $(DESTDIR)$(LIBDIR); \
	fi
	@if [ -f lib/$(SHLIB_LITE) ]; then \
		echo "Installing $(SHLIB_LITE)..."; \
		$(INSTALL) -m755 lib/$(SHLIB_LITE) $(DESTDIR)$(LIBDIR); \
		ln -sf $(SHLIB_LITE) $(DESTDIR)$(LIBDIR)/$(SONAME_LITE); \
		ln -sf $(SONAME_LITE) $(DESTDIR)$(LIBDIR)/$(SOLIB_LITE); \
	fi
	@echo "Installing xmp.h..."
	@$(INSTALL) -m644 include/xmp.h $(DESTDIR)$(INCLUDEDIR)
	@echo "Installing libxmp.pc..."
	@mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig
	@$(INSTALL) -m644 libxmp.pc $(DESTDIR)$(LIBDIR)/pkgconfig/
	@echo "Installing libxmp-config.cmake..."
	@mkdir -p $(DESTDIR)$(LIBDIR)/cmake/libxmp
	@$(INSTALL) -m644 libxmp-config.cmake.autotools $(DESTDIR)$(LIBDIR)/cmake/libxmp/libxmp-config.cmake
	@$(INSTALL) -m644 libxmp-config-version.cmake.autotools $(DESTDIR)$(LIBDIR)/cmake/libxmp/libxmp-config-version.cmake
	@if [ -f libxmp-lite.pc ]; then \
		echo "Installing libxmp-lite/xmp.h..."; \
		mkdir -p $(DESTDIR)$(INCLUDEDIR)/libxmp-lite; \
		$(INSTALL) -m644 include/xmp.h $(DESTDIR)$(INCLUDEDIR)/libxmp-lite; \
		echo "Installing libxmp-lite.pc..."; \
		mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig; \
		$(INSTALL) -m644 libxmp-lite.pc $(DESTDIR)$(LIBDIR)/pkgconfig/; \
		echo "Installing libxmp-lite-config.cmake..."; \
		mkdir -p $(DESTDIR)$(LIBDIR)/cmake/libxmp-lite; \
		$(INSTALL) -m644 src/lite/libxmp-lite-config.cmake.autotools $(DESTDIR)$(LIBDIR)/cmake/libxmp-lite/libxmp-lite-config.cmake; \
		$(INSTALL) -m644 libxmp-lite-config-version.cmake.autotools $(DESTDIR)$(LIBDIR)/cmake/libxmp-lite/libxmp-lite-config-version.cmake; \
	fi

#FIXME: do better?
depend:
	@echo Building dependencies...
	@echo > $@
	@for i in $(ALL_OBJS) $(LITE_OBJS) $(T_OBJS) $(TLITE_OBJS); do \
	    c="$${i%.o}.c"; l="$${i%.o}.lo"; \
	    $(CC) $(CFLAGS) $(CPPFLAGS) -MM $$c | \
		sed "s!^.*\.o:!$$i $$l:!" >> $@ ; \
	done

dist: version-prepare all-docs dist-prepare dist-jni dist-subdirs

dist-jni:
	mkdir $(DIST)/jni
	cp jni/Android.mk jni/Application.mk $(DIST)/jni

dist-prepare: cmake-prepare vc-prepare watcom-prepare
	./config.status
	rm -Rf $(DIST) $(DIST).tar.gz
	mkdir -p $(DIST)
	cp -RPp $(DFILES) $(DIST)/

space := $(eval) $(eval)
cmake-prepare:
	@echo Generate cmake/libxmp-sources.cmake
	@sed -e 's!@SRCS@!\n$(subst $(space),    , $(OBJS:.o=.c\n))!' \
	     -e 's!@PSRCS@!\n$(subst $(space),    , $(PROWIZARD_OBJS:.o=.c\n))!' \
	     -e 's!@DSRCS@!\n$(subst $(space),    , $(DEPACKER_OBJS:.o=.c\n))!' \
	     -e 's!@LITE_SRCS@!\n$(subst $(space),    , $(LITE_OBJS:.o=.c\n))!' \
	     cmake/libxmp-sources.cmake.in > cmake/libxmp-sources.cmake

vc-prepare:
	@echo Generate Makefile.vc
	@sed -e 's!@OBJS@!\\\r\n $(subst /,\\,$(OBJS:.o=.obj \\\r\n))!' \
	     -e 's!@POBJS@!\\\r\n $(subst /,\\,$(PROWIZARD_OBJS:.o=.obj \\\r\n))!' \
	     -e 's!@DOBJS@!\\\r\n $(subst /,\\,$(DEPACKER_OBJS:.o=.obj \\\r\n))!' \
	     -e 's!@LITE_OBJS@!\\\r\n $(subst /,\\,$(LITE_OBJS:.o=.obj \\\r\n))!' \
	     Makefile.vc.in > Makefile.vc

watcom-prepare:
	@echo Generate watcom.mif
	@sed -e 's!@OBJS@! \&\n $(OBJS:.o=.obj \&\n)!' \
	     -e 's!@POBJS@! \&\n $(PROWIZARD_OBJS:.o=.obj \&\n)!' \
	     -e 's!@DOBJS@! \&\n $(DEPACKER_OBJS:.o=.obj \&\n)!' \
	     -e 's!@LITE_OBJS@! \&\n $(LITE_OBJS:.o=.obj \&\n)!' \
	     watcom.mif.in > watcom.mif

dist-subdirs: $(addprefix dist-,$(DDIRS))
	chmod -R u+w $(DIST)/*
	tar cvf - $(DIST) | gzip -9c > $(DIST).tar.gz
	rm -Rf $(DIST)
	ls -l $(DIST).tar.gz

distcheck:
	rm -Rf $(DIST)
	tar xf $(DIST).tar.gz
	(cd $(DIST); ./configure --enable-lite --enable-static --prefix=`pwd`/test-install; make; make check check-lite; make install; find test-install)

devcheck:
	$(MAKE) -C test-dev

covercheck: coverage
	$(MAKE) -C test-dev covercheck

coverclean:
	@rm -f $(ALL_OBJS:.o=.gco) $(ALL_OBJS:.o=.gcno) $(ALL_OBJS:.o=.gcda)
	$(MAKE) -C test-dev coverclean

$(ALL_OBJS): Makefile

$(LITE_OBJS): Makefile

$(LOBJS): Makefile

$(LOBJS_LITE): Makefile

version-prepare:
	vercode=`printf "0x%02x%02x%02x" $(VERSION_MAJOR) $(VERSION_MINOR) $(VERSION_RELEASE)`; \
	sed -i -e "s/\(^#define XMP_VERSION\).*/\1 \"$(VERSION)\"/;s/\(^#define XMP_VERCODE\).*/\1 $$vercode/;s/\(^#define XMP_VER_MAJOR\).*/\1 $(VERSION_MAJOR)/;s/\(^#define XMP_VER_MINOR\).*/\1 $(VERSION_MINOR)/;s/\(^#define XMP_VER_RELEASE\).*/\1 $(VERSION_RELEASE)/" include/xmp.h
	./config.status

sinclude depend
