################################################################################
# vls (VideoLAN Server) main Makefile
#-------------------------------------------------------------------------------
# (c)1999-2001 VideoLAN
# $Id: Makefile,v 1.82 2001/12/06 15:02:39 sam Exp $
################################################################################


ifeq ($(shell [ ! -r Makefile.opts ] && echo 1),)
    include Makefile.opts
endif


################################################################################
# Common options
################################################################################

LCFLAGS += $(VLS_LCFLAGS)


################################################################################
# Files description
################################################################################

#
# Source files
#
CORESRC=	src/core/application.cpp \
		src/core/exception.cpp \
		src/core/file.cpp \
		src/core/log.cpp \
		src/core/parsers.cpp \
		src/core/reflect.cpp \
		src/core/regexp.cpp \
		src/core/serialization.cpp \
		src/core/settings.cpp \
		src/core/socket.cpp \
		src/core/string.cpp \
		src/core/system.cpp \
		src/core/thread.cpp \
		src/core/module.cpp \

MPEGSRC=	src/mpeg/ts.cpp \
		src/mpeg/streamdescr.cpp \
		src/mpeg/reader.cpp \
		src/mpeg/converter.cpp \

SHAREDSRC=	src/server/buffer.cpp \
		src/server/directory.cpp \
		src/server/input.cpp \
		src/server/output.cpp \
                src/server/channel.cpp \
		src/server/request.cpp \

SERVERSRC=	src/server/admin.cpp \
		src/server/broadcast.cpp \
		src/server/manager.cpp \
		src/server/program.cpp \
		src/server/telnet.cpp \
		src/server/nativeadmin.cpp \
		src/server/tsstreamer.cpp \
		src/server/vls.cpp \


#
# Module libraries
#
MODULE_LIST:=	dvdreader \
		filechannel \
		filereader \
		localinput \
		videoinput \
		netchannel \
		ps2ts \
		ts2ts \


BUILTINSTARGETS:=$(BUILTINS:%:bin/%.a)
PLUGINSTARGETS:=$(PLUGINS:%:bin/%.so)


#
# Object files
# 
COREOBJ:=$(CORESRC:src/%.cpp=obj/%.o)
MPEGOBJ:=$(MPEGSRC:src/%.cpp=obj/%.o)
SHAREDOBJ:=$(SHAREDSRC:src/%.cpp=obj/%.o)
SERVEROBJ:=$(SERVERSRC:src/%.cpp=obj/%.o)

OBJ:=$(COREOBJ) $(MPEGOBJ) $(SHAREDOBJ) $(SERVEROBJ)


#
# Dependencies
#
COREDEP:=$(CORESRC:src/%.cpp=dep/%.d)
MPEGDEP:=$(MPEGSRC:src/%.cpp=dep/%.d)
SHAREDDEP:=$(SHAREDSRC:src/%.cpp=dep/%.d)
SERVERDEP:=$(SERVERSRC:src/%.cpp=dep/%.d)

DEP:=$(COREDEP) $(MPEGDEP) $(SHAREDDEP) $(SERVERDEP)


#
# Misc variables
#
VLS_QUICKVERSION := $(shell grep '^ *VLS_VERSION=' configure.in | cut -f2 -d=)

# export symbols for recursive Makefiles
export


################################################################################
# Targets definition
################################################################################

#
# Build rules
#
all:		Makefile.opts vls $(PLUGINS)

Makefile.opts:
		@echo "**** No configuration found, please run ./configure..."
		@exit 1

clean:
		rm -Rf obj
		for module in $(MODULE_LIST) ; do \
			( cd src/modules/$$module && $(MAKE) clean ) ; done

distclean:	clean
		rm -f bin/vls
		rm -f config*status config*cache config*log
		rm -f Makefile.opts src/core/defs.h src/server/config.h
		rm -f src/server/vls_builtins.cpp
		rm -Rf dep
		rm -Rf *.log *.dbg
		for module in $(MODULE_LIST) ; do \
			( cd src/modules/$$module && $(MAKE) distclean ) ; done

install:
	mkdir -p $(DESTDIR)$(bindir)
	$(INSTALL) bin/vls $(DESTDIR)$(bindir)
	mkdir -p $(DESTDIR)$(libdir)/videolan/vls
ifneq (,$(PLUGINS))
	$(INSTALL) -m 644 $(PLUGINS:%=bin/%.so) $(DESTDIR)$(libdir)/videolan/vls
endif
	mkdir -p $(DESTDIR)$(sysconfdir)/videolan/vls
	test -r $(DESTDIR)$(sysconfdir)/videolan/vls/vls.cfg || $(INSTALL) -m 644 vls.cfg $(DESTDIR)$(sysconfdir)/videolan/vls
	@echo "Installation succeeded."

uninstall:
	rm -f $(DESTDIR)$(bindir)/vls
	rm -f $(DESTDIR)$(libdir)/videolan/vls/*.so

dep:		Makefile.opts $(DEP)

vls:		Makefile.opts $(OBJ) $(BUILTINS)
		@echo "Linking $@..."
		@test -d bin || mkdir -p bin
		$(CXX) $(LCFLAGS) -o bin/$@ $(OBJ) $(BUILTINS:%=obj/%.a) $(VLS_LIB)
		chmod 755 bin/$@

dep/server/vls.d:	src/server/vls_builtins.cpp

src/server/vls_builtins.cpp:	Makefile.opts
		rm -f $@
ifneq (,$(BUILTINS))
		for builtin in $(BUILTINS) ; do \
		echo "extern C_Module* NewBuiltin_"$$builtin"(handle hLog);" >> $@ ; \
		done
endif
		echo "" >> $@
		echo "void C_Vls::LoadBuiltins()" >> $@
		echo "{" >> $@
ifneq (,$(BUILTINS))
		for builtin in $(BUILTINS) ; do \
		echo "  C_Module* pModule_"$$builtin" = NewBuiltin_"$$builtin"(m_hLog);" >> $@ ; \
		echo "  m_pModuleManager->RegisterModule(pModule_"$$builtin");" >> $@ ; \
		done
endif
		echo "}" >> $@
		echo "" >> $@

$(PLUGINS):	%: Makefile.opts
$(PLUGINS):	%: src/modules/%/Makefile
		cd src/modules/$* && $(MAKE) ../../../bin/$*.so

$(BUILTINS):	%: Makefile.opts
$(BUILTINS):	%: src/modules/%/Makefile
		cd src/modules/$* && $(MAKE) ../../../obj/$*.a

$(OBJ):		obj/%.o: Makefile.opts
$(OBJ):		obj/%.o: dep/%.d
$(OBJ):		obj/%.o: src/%.cpp
		@test -d obj/$(dir $*) || mkdir -p obj/$(dir $*)
		@echo "Compiling $<..."
		$(CXX) $(CCFLAGS) $(INCLUDE) -o $@ -c $< 

$(DEP):		Makefile.opts Makefile FORCE
$(DEP):		dep/%.d: src/%.cpp
		@$(MAKE) -s --no-print-directory -f Makefile.dep $@

FORCE:

#
# Package generation rules
#
snapshot:
	# Check that tmp isn't in the way
	@if test -e tmp; then \
		echo "Error: please remove ./tmp, it is in the way"; false; \
	else \
		echo "Starting snapshot's build."; mkdir tmp; \
	fi
	# Copy directory structure in tmp
	find -type d | grep -v '\(snapshot\|CVS\)' | while read i ; \
		do mkdir -p tmp/vls/$$i ; \
	done
	rm -Rf tmp/vls/tmp
	find debian -mindepth 1 -maxdepth 1 -type d | \
		while read i ; do rm -Rf tmp/vls/$$i ; done
	# Copy .c .h .in .cpp and files
	find src -type f -name '*.[chi]*' | while read i ; \
		do cp $$i tmp/vls/$$i ; done
	# Copy module Makefiles
	find src/modules -type f -name Makefile | while read i ; \
		do cp $$i tmp/vls/$$i ; done
	# Copy input Makefiles
	find src/inputs -type f -name Makefile | while read i ; \
		do cp $$i tmp/vls/$$i ; done
	# Copy misc files
	cp AUTHORS COPYING TODO todo.pl ChangeLog* README* INSTALL* HOWTO \
		vls.cfg input.cfg Makefile Makefile.dep Makefile.module \
		Makefile.module.dep Makefile.opts.in\
		configure configure.in install-sh config.sub config.guess \
		tmp/vls/
	# Copy Debian control files
	for file in debian/*dirs debian/*docs debian/*menu debian/*desktop \
		debian/*copyright debian/*conffiles ; \
			do cp $$file tmp/vls/debian ; done
	for file in control changelog rules vls.1 ; do \
		cp debian/$$file tmp/vls/debian/ ; done
	# Build archives
	F=vls-${VLS_QUICKVERSION}; \
		mv tmp/vls tmp/$$F; (cd tmp ; tar cf $$F.tar $$F); \
		bzip2 -f -9 < tmp/$$F.tar > $$F.tar.bz2; \
		gzip -f -9 tmp/$$F.tar ; mv tmp/$$F.tar.gz .
	# Clean up
	rm -Rf tmp

