include config.mak

LIBTOOL_OPTS = --tag=CXX

PRG = mms

CONFIGDIR = /etc/mms
VAR_DATA_DIR = $(DESTDIR)/var/lib/mms

EXTRA_DISTCLEAN =

ifeq ($(shell uname -m), x86_64)
	EXTRA_FLAGS = -march=$(OPTIMIZE)
else
ifeq ($(shell uname -m), i686)
	EXTRA_FLAGS = -march=$(OPTIMIZE)
else
	EXTRA_FLAGS =
endif
endif

EXTRA_FLAGS += -ffast-math -funroll-loops -fomit-frame-pointer

ifeq ($(GCC_VER_MAJOR),3)
ifeq ($(GCC_VER_MINOR),4)
EXTRA_FLAGS += -ftracer -funit-at-a-time
endif
ifeq ($(GCC_VER_MINOR),3)
EXTRA_FLAGS += -ftracer
endif
endif

ifeq ($(DEBUG),yes)
# use -Wno-long-long to make taglib happy
EXTRA_FLAGS = -g -Wall -W -Wno-sign-compare -Wold-style-cast -Wundef -Wshadow -Wno-long-long
OPTIMIZATION = -O0
else
OPTIMIZATION = -O3
endif

ifeq ($(COMMONCPP2_LOCAL),yes)
# -D_GNU_SOURCE is for compiling libcommoncpp2 with gcc 2.95.4
EXTRA_FLAGS += -D_GNU_SOURCE
endif

# Do not strip the binaries at installation
ifeq ($(DEBUG),yes)
INSTALLSTRIP = 
else
INSTALLSTRIP = -s
endif

STDFLAGS = -I/usr/local/include -I/usr/include/ -I. -I$(COMMONCPP2_CFLAGS) -pthread -pipe $(OPTIMIZATION) $(EXTRA_FLAGS)

CXXFLAGS = $(STDFLAGS) -fno-exceptions

CXX=g++

C=gcc

SRCS = simplefile.cpp common.cpp config.cpp input.cpp keyboard.cpp mms.cpp renderer.cpp \
	display.cpp socket.cpp startmenu.cpp module.cpp options.cpp option.cpp updater.cpp \
	themes.cpp theme.cpp rand.cpp image.cpp pic_object.cpp text_object.cpp rectangle_object.cpp \
	graphic_object.cpp render_device.cpp global_options.cpp print.cpp extra_menu.cpp \
	libfspp.cpp general.cc file_t.cc file_monitor.cc replay.cpp replay_device.cpp busy_indicator.cpp shutdown.cpp

OBJS = simplefile.o common.o config.o input.o keyboard.o mms.o renderer.o \
	display.o socket.o startmenu.o module.o options.o option.o updater.o \
	themes.o theme.o rand.o image.o pic_object.o text_object.o rectangle_object.o \
	graphic_object.o render_device.o global_options.o print.o extra_menu.o \
	libfspp.o general.o file_t.o file_monitor.o replay.o replay_device.o  busy_indicator.o shutdown.o

.SUFFIXES: .cpp .c .o
.cpp.o: ; $(CXX) $(CXXFLAGS) -c $<
.c.o: ; $(C) $(STDFLAGS) -c $<

ifeq ($(MEDIA),yes)
SRCS += cd.cpp
OBJS += cd.o
endif

ifeq ($(BENCH),yes)
SRCS += bench.cpp
OBJS += bench.o
endif

ifeq ($(LIRC),yes)
SRCS += lirc.cpp
OBJS += lirc.o
LIRC_LIBS += -llirc_client
endif

ifeq ($(EVDEV),yes)
SRCS += evdev.cpp
OBJS += evdev.o
endif

ifeq ($(FMOVIE),yes)
SRCS += wget_wrapper.cpp
OBJS += wget_wrapper.o
else
ifeq ($(MUSIC),yes)
SRCS += wget_wrapper.cpp
OBJS += wget_wrapper.o
endif
endif


ifeq ($(MUSIC),yes)
SRCS += audio_s.cpp audio.cpp shuffle_list.cpp dbaudiofile.cpp audio_opts.cpp player.cpp shoutcast.cpp
OBJS += audio_s.o audio.o shuffle_list.o dbaudiofile.o audio_opts.o player.o shoutcast.o

ifeq ($(BTTV_RADIO),yes)
SRCS += bttv.cpp
OBJS += bttv.o
endif

ifeq ($(PLAYER_ALSA),yes)
MUSIC_PLAYER_LIBS += -lalsaplayer
SRCS += alsaplayer.cpp
OBJS += alsaplayer.o
endif

ifeq ($(PLAYER_XINE),yes)
SRCS += xine.cpp
OBJS += xine.o
MUSIC_PLAYER_LIBS += `xine-config --libs`
CXXFLAGS += `xine-config --cflags`
endif

ifeq ($(PLAYER_GST),yes)
SRCS += gstreamer.cpp
OBJS += gstreamer.o
MUSIC_PLAYER_LIBS += `pkg-config --libs gstreamer-0.10`
CXXFLAGS += `pkg-config --cflags gstreamer-0.10`
endif

ifeq ($(TV),yes)
SRCS+= tv.cpp
OBJS+= tv.o
endif

ifeq ($(IMMS),yes)
SUBDIRS += library-builder
SRCS += library-builder/imms.cc library-builder/immsdb.cc \
	library-builder/basicdb.cc library-builder/correlate.cc \
	library-builder/playlist.cc library-builder/sqldb.cc \
	library-builder/fetcher.cc library-builder/picker.cc \
	library-builder/spectrum.cc library-builder/songinfo.cc \
	library-builder/comm.cc library-builder/server.cc \
	library-builder/regexx.cc library-builder/utils.cc \
	library-builder/strmanip.cc library-builder/levenshtein.c \
	library-builder/md5.c library-builder/player.cc
OBJS += library-builder/imms.o library-builder/immsdb.o \
	library-builder/basicdb.o library-builder/correlate.o \
	library-builder/playlist.o library-builder/sqldb.o \
	library-builder/fetcher.o library-builder/picker.o \
	library-builder/spectrum.o library-builder/songinfo.o \
	library-builder/comm.o library-builder/server.o \
	library-builder/regexx.o library-builder/utils.o \
	library-builder/strmanip.o library-builder/levenshtein.o \
	library-builder/md5.o library-builder/player.o
CXXFLAGS += -I/usr/include/taglib
COMMON_LIBS += -L/usr/X11R6/lib -lXss -lXext -lpcre -lsqlite -lz -ltag

ifeq ($(XIDLE),yes)
SRCS += library-builder/xidle.cc
OBJS += library-builder/xidle.o 
endif

endif
endif

ifeq ($(MOVIE),yes)
SRCS += movie.cpp
OBJS += movie.o 

ifeq ($(FMOVIE),yes)
SRCS += imdb.cpp imdb_movie.cpp
OBJS += imdb.o imdb_movie.o
endif
endif

ifeq ($(PICTURE),yes)
SRCS += pictures.cpp
OBJS += pictures.o 
endif

ifeq ($(GAME),yes)
SRCS += game.cpp
OBJS += game.o 
endif

ifeq ($(EPG),yes)
SRCS += epg.cpp
OBJS += epg.o
endif

ifeq ($(EPG),yes)
	COMMON_LIBS += libs/tinyxml/tinyxml.o libs/tinyxml/tinyxmlparser.o libs/tinyxml/tinyxmlerror.o libs/tinyxml/tinystr.o
	SUBDIRS += libs/tinyxml
	CXXFLAGS += -Ilibs/tinyxml/
else
ifeq ($(MUSIC),yes)
	COMMON_LIBS += libs/tinyxml/tinyxml.o libs/tinyxml/tinyxmlparser.o libs/tinyxml/tinyxmlerror.o libs/tinyxml/tinystr.o
	SUBDIRS += libs/tinyxml
	CXXFLAGS += -Ilibs/tinyxml/
endif
endif



ifeq ($(MPEG),yes)
SRCS += mpeg.cpp
OBJS += mpeg.o

ifeq ($(FFMPEG_EXTERNAL), yes)
MPEG_LIBS += `pkg-config --libs libavcodec libavutil`
CXXFLAGS += `pkg-config --cflags libavcodec libavutil`
else
MPEG_LIBS += libs/libavcodec/libavcodec.a -lz
SUBDIRS += libs/libavcodec
CXXFLAGS += -Ilibs/libavcodec/
EXTRA_DISTCLEAN = rm -f libavcodec-config.log && rm -f libs/libavcodec/*.pc && rm libs/libavcodec/config.*
endif

endif

ifeq ($(VO_DXR3),yes)
SRCS += dxr3out.cpp
OBJS += dxr3out.o
endif

ifeq ($(VO_DVB),yes)
SRCS += dvbout.cpp
OBJS += dvbout.o
endif

ifeq ($(VO_MPEG),yes)
SRCS += mpeg_out.cpp
OBJS += mpeg_out.o
endif

ifeq ($(VO_SDL),yes)
SRCS += sdlout.cpp
OBJS += sdlout.o
SDL_LIBS += `sdl-config --libs`
CXXFLAGS += `sdl-config --cflags`
endif

ifeq ($(VO_FBDEV),yes)
SRCS += fbdevout.cpp
OBJS += fbdevout.o
endif

ifeq ($(VO_VGA),yes)
SRCS += vgaglout.cpp
OBJS += vgaglout.o
COMMON_LIBS += -lvga -lvgagl
endif

SUBDIRS += termio po
ifeq ($(COMMONCPP2_LOCAL),yes)
SUBDIRS += libs/commoncpp2/src
endif

ifeq ($(COMMONCPP2_LOCAL),yes)
COMMON_DEPS += libs/commoncpp2/src/.libs/libccgnu2.a
endif

# Used for clock support
COMMON_LIBS += -lrt 

COMMON_LIBS += -lncurses $(COMMONCPP2_LIBS)
DO_MAKE = @ for i in $(SUBDIRS); do $(MAKE) -C $$i; done
DO_MAKECLEAN = @ for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done

all: version.h $(PRG)

libfs: $(OBJS)
	$(DO_MAKE)

fbdevout.o:
	$(CXX) $(CXXFLAGS) -O2 -c fbdevout.cpp

library-builder/levenshtein.o:
	$(C) $(STDFLAGS) -c library-builder/levenshtein.c -o library-builder/levenshtein.o

library-builder/md5.o:
	$(C) $(STDFLAGS) -c library-builder/md5.c -o library-builder/md5.o

# doesn't like -03 and uses exceptions
library-builder/regexx.o:
	$(CXX) $(CXXFLAGS) -fexceptions -O2 -c library-builder/regexx.cc -o library-builder/regexx.o

libs/commoncpp2/src/.libs/libccgnu2.a:
	$(MAKE) -C libs/commoncpp2/src/

termio/getch2.o:
	$(MAKE) -C termio

MMS_DEP = $(OBJS) $(COMMON_DEPS)

$(PRG): $(MMS_DEP)
	$(DO_MAKE)
	/bin/sh /usr/bin/libtool --mode=link $(LIBTOOL_OPTS) $(CXX) $(CXXFLAGS) -o $(PRG) $(OBJS) termio/getch2.o $(COMMON_LIBS) `imlib2-config --libs` $(MUSIC_PLAYER_LIBS) $(MPEG_LIBS) $(SDL_LIBS) $(LIRC_LIBS) $(IMMS_LIBS)
	@rm -r .libs

library-builders:
	make -C library-builder clean
	make -C library-builder mms-audio-library
	make -C pic-library clean
	make -C pic-library mms-pic-library

library-builders-install:
        # install cache programs
	make -C library-builder install
	make -C pic-library install

# ./configure must be run if it changed
config.h: configure
	@echo "############################################################"
	@echo "####### Please run ./configure again - it's changed! #######"
	@echo "############################################################"
	@exit 1

# rebuild at every config.h/config.mak change:
version.h:
	./version.sh
	$(MAKE) allclean
	$(MAKE) depend

# rebuild at every CVS update or config/makefile change:
version.h: config.h config.mak Makefile

# Every mms dependency depends on version.h, to force building version.h
# first (in serial mode) before any other of the dependencies for a parallel make
# run.  This is necessary, because the make rule for version.h removes objects
# in a recursive "make distclean" and we must wait for this "make distclean" to
# finish before we can start building new object files.
# Taken from mplayer's Makefile
$(MMS_DEP): version.h

OLD_PWD = ${PWD}

LOCAL_PATCH = "echo"

ifeq ($(LIRC),yes)
	LOCAL_PATCH = make patch-lirc-local
else
ifeq ($(EVDEV),yes)
	LOCAL_PATCH = make patch-evdev-local
endif
endif

ETC_PATCH = "echo"

ifeq ($(LIRC),yes)
	ETC_PATCH = make patch-lirc
else
ifeq ($(EVDEV),yes)
	ETC_PATCH = make patch-evdev
endif
endif

patch-lirc:
	@cd $(DESTDIR)$(CONFIGDIR)/ && patch -p1 < $(OLD_PWD)/cfg/patch-lirc

patch-evdev:
	@cd $(DESTDIR)$(CONFIGDIR)/ && patch -p1 < $(OLD_PWD)/cfg/patch-evdev

patch-lirc-local:
	@cd $(HOME)/.mms && patch -p1 < $(OLD_PWD)/cfg/patch-lirc

patch-evdev-local:
	@cd $(HOME)/.mms && patch -p1 < $(OLD_PWD)/cfg/patch-evdev

install: $(PRG)
	$(MAKE) install -C po;
	$(MAKE) install -C man;
	if test ! -d $(DESTDIR)$(BINDIR) ; then mkdir -p $(DESTDIR)$(BINDIR) ; fi
	$(INSTALL) -m 755 $(INSTALLSTRIP) $(PRG) $(DESTDIR)$(BINDIR)/$(PRG)
	@if test ! -d $(DESTDIR)$(DATADIR) ; then mkdir -p $(DESTDIR)$(DATADIR) ; fi
	@cp -r themes $(DESTDIR)$(DATADIR)/ ; 
	@if test ! -d $(DESTDIR)$(DATADIR)/fonts ; then cp -r fonts $(DESTDIR)$(DATADIR)/ ; fi
	@if test ! -d $(DESTDIR)$(CONFIGDIR) ; then mkdir -p $(DESTDIR)$(CONFIGDIR) ; fi
ifeq ($(VO_SDL),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/config ; then $(INSTALL) -c -m 644 cfg/config-sdl $(DESTDIR)$(CONFIGDIR)/config && $(ETC_PATCH); fi
endif
ifeq ($(VO_DXR3),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/config ; then $(INSTALL) -c -m 644 cfg/config-dxr3 $(DESTDIR)$(CONFIGDIR)/config && $(ETC_PATCH); fi
endif
ifeq ($(VO_DVB),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/config ; then $(INSTALL) -c -m 644 cfg/config-dvb $(DESTDIR)$(CONFIGDIR)/config && $(ETC_PATCH); fi
endif
ifeq ($(VO_VGA),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/config ; then $(INSTALL) -c -m 644 cfg/config-vga $(DESTDIR)$(CONFIGDIR)/config && $(ETC_PATCH); fi
endif
ifeq ($(VO_FBDEV),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/config ; then $(INSTALL) -c -m 644 cfg/config-fb $(DESTDIR)$(CONFIGDIR)/config && $(ETC_PATCH); fi
endif
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/lirc.conf ; then $(INSTALL) -c -m 644 cfg/lirc.conf $(DESTDIR)$(CONFIGDIR)/lirc.conf ; fi
ifeq ($(LIRC),yes)
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/input-lirc ; then $(INSTALL) -c -m 644 cfg/input-lirc $(DESTDIR)$(CONFIGDIR)/input-lirc ; fi
endif
	@if test ! -f $(DESTDIR)$(CONFIGDIR)/input-keyboard; then $(INSTALL) -c -m 644 cfg/input-keyboard $(DESTDIR)$(CONFIGDIR)/input-keyboard ; fi

        # create cache dir
	if test ! -d $(DESTDIR)/var/cache/mms ; then mkdir -m 777 -p $(DESTDIR)/var/cache/mms ; fi

        # playlists
	if test ! -d $(VAR_DATA_DIR) ; then mkdir -m 777 -p $(VAR_DATA_DIR) ; fi
	@if test ! -d $(VAR_DATA_DIR)/playlists ; then mkdir -m 777 -p $(VAR_DATA_DIR)/playlists ; fi
	@if test ! -f $(VAR_DATA_DIR)/options ; then touch $(VAR_DATA_DIR)/options ; chmod 666 $(VAR_DATA_DIR)/options ; fi


	@echo " Installation complete!"
	@echo ""
	@echo " have fun :)"

install-user:
	@if test ! -d $(HOME)/.mms ; then mkdir -p $(HOME)/.mms ; fi
	@cp -r themes $(HOME)/.mms/ ; 
	@if test ! -d $(HOME)/.mms/fonts ; then cp -r fonts $(HOME)/.mms/ ; fi
	@if test ! -d $(HOME)/.mms ; then mkdir -p $(HOME)/.mms ; fi
	@if test ! -d $(HOME)/.mms/themes ; then mkdir -p $(HOME)/.mms/themes ; fi
	@if test ! -f $(HOME)/.mms/options ; then touch $(HOME)/.mms/options ; fi
ifeq ($(VO_SDL),yes)
	@if test ! -f $(HOME)/.mms/config ; then $(INSTALL) -c -m 644 cfg/config-sdl $(HOME)/.mms/config && $(LOCAL_PATCH); fi
endif
ifeq ($(VO_DXR3),yes)
	@if test ! -f $(HOME)/.mms/config ; then $(INSTALL) -c -m 644 cfg/config-dxr3 $(HOME)/.mms/config && $(LOCAL_PATCH); fi
endif
ifeq ($(VO_DVB),yes)
	@if test ! -f $(HOME)/.mms/config ; then $(INSTALL) -c -m 644 cfg/config-dvb $(HOME)/.mms/config && $(LOCAL_PATCH); fi
endif
ifeq ($(VO_VGA),yes)
	@if test ! -f $(HOME)/.mms/config ; then $(INSTALL) -c -m 644 cfg/config-vga $(HOME)/.mms/config && $(LOCAL_PATCH); fi
endif
ifeq ($(VO_FBDEV),yes)
	@if test ! -f $(HOME)/.mms/config ; then $(INSTALL) -c -m 644 cfg/config-fb $(HOME)/.mms/config && $(LOCAL_PATCH); fi
endif
	@if test ! -f $(HOME)/.mms/lirc.conf ; then $(INSTALL) -c -m 644 cfg/lirc.conf $(HOME)/.mms/lirc.conf ; fi
ifeq ($(LIRC),yes)
	@if test ! -f $(HOME)/.mms/input-lirc ; then $(INSTALL) -c -m 644 cfg/input-lirc $(HOME)/.mms/input-lirc ; fi
endif
	@if test ! -f $(HOME)/.mms/input-keyboard ; then $(INSTALL) -c -m 644 cfg/input-keyboard $(HOME)/.mms/input-keyboard ; fi
        # playlists
	@if test ! -d $(HOME)/.mms/playlists ; then mkdir -p $(HOME)/.mms/playlists ; fi

uninstall:
	@if test ! -f $(BINDIR)/$(PRG) ; then rm -f $(BINDIR)/$(PRG) ; fi
	@echo " Uninstall completed"

clean: 
	@if test -f simplefile.o ; then rm *.o ; fi
	@if test -f mms ; then rm mms ; fi
	$(MAKE) -C library-builder clean
	$(MAKE) -C pic-library clean

allclean: 
	$(MAKE) clean
	$(DO_MAKECLEAN)

distclean: 
	$(MAKE) allclean
	$(MAKE) -C po distclean
	$(EXTRA_DISTCLEAN)
	@rm -f .depend
	@rm config.h
	@rm config.mak
	@if test -f version.h ; then rm version.h ; fi

dep: depend

depend: 
	./version.sh
	$(CXX) -MM $(CXXFLAGS) $(SRCS) 1> .depend

# dependencies
ifneq ($(wildcard .depend),)
include .depend
endif
