###########################################################################
#
# This program is part of Zenoss Core, an open source monitoring platform.
# Copyright (C) 2007, Zenoss Inc.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published by
# the Free Software Foundation.
#
# For complete information please visit: http://www.zenoss.com/oss/
#
###########################################################################

SHELL=/bin/sh

ifeq ($(ZENHOME),)
ZENHOME=/usr/local/zenoss
endif
PATCHCMD=$(firstword \
		$(wildcard /usr/local/bin/gpatch) \
		$(wildcard /usr/bin/gpatch) \
		$(wildcard /usr/bin/patch) \
		patch)
ZOPEUSER=admin
ZOPEHOME=	$(ZENHOME)

DARWIN=0
ifeq ($(shell python -c 'import sys; print sys.platform'),darwin)
  DARWIN=1
endif

DESTDIR=	/
INSTDIR=	$(PWD)
RRDTOOL=	$(ZENHOME)
ZENBIN=		$(ZENHOME)/bin
ZENCONF=	$(ZENHOME)/conf
ZENEXPORT=	$(ZENHOME)/export
SVNCMD=		svn
SVNURL=		http://dev.zenoss.org/svn
ifeq ($(SVNTAG),)
SVNTAG=      trunk
endif
SETUID=		true

BUILDLOG=	 $(INSTDIR)/zenbuild.log
PYTHON=		/usr/bin/python
PYLIBDIR=	$(ZENHOME)/lib/python
PYTHONPATH=	$(DESTDIR)$(ZENHOME)/lib/python
LOG=		>>$(BUILDLOG) 2>&1
MSG=		@echo installing $(patsubst %-install,%,$@)
PYINSTALLCMD= 	PYTHONPATH=$(PYTHONPATH)			\
		$(PYTHON) setup.py install			\
		    --install-lib="$(PYLIBDIR)"			\
		    --install-scripts="$(ZENBIN)"		\
		    --root="$(DESTDIR)"				\
                $(LOG)
PYINSTALL=	 $(MSG) ; cd $(<D) ; $(PYINSTALLCMD)
CONFIGURE=	echo configuring $@ ; ./configure --prefix=$(ZENHOME)

INSTALLABLES=	$(patsubst externallibs/%,%,$(wildcard externallibs/*z externallibs/*bz2))
ROOTS=		$(patsubst %.tar.bz2,%,		\
		$(patsubst %.tgz,%, 		\
		$(patsubst %.tar.gz,%,		\
		$(INSTALLABLES))))

ROOT=$(firstword $(filter $(1)%, $(ROOTS) $(1)))

MYSQLPYTHON=	$(call ROOT, MySQL-python)
EPYDOC=		$(call ROOT, epydoc)
ZOPE=		$(call ROOT, Zope)
PYSNMP=		$(call ROOT, pysnmp)
PYCRYPTO=	$(call ROOT, pycrypto)
TWISTED=	$(call ROOT, Twisted-)
TWISTEDSNMP=	$(call ROOT, TwistedSNMP)
FREETYPE=	$(call ROOT, freetype)
LIBART=		$(call ROOT, libart_lgpl)
LIBPNG=		$(call ROOT, libpng)
RRDTOOL=	$(call ROOT, rrdtool)
LIBSMI=		$(call ROOT, libsmi)
YAPPS=		$(call ROOT, Yapps)
SNPP=		$(call ROOT, python-snpp)
NAGIOS=		$(call ROOT, nagios-plugins)
SIMPLEJSON=	$(call ROOT, simplejson)
PYNETSNMP=	$(call ROOT, pynetsnmp)
CTYPES=		$(call ROOT, ctypes)
PYIP=		$(call ROOT, pyip)
WMI=		$(call ROOT, wmi)

# optional packages
SENDPAGE=	$(call ROOT, sendpage)

ifeq ($(wildcard /usr/include/freetype2 /usr/local/include/freetype2),)
NEEDFREETYPE=	freetype-install
endif
ifeq ($(wildcard /usr/include/libpng12 /usr/local/include/libpng12),)
NEEDLIBPNG=	libpng-install
endif
ifeq ($(wildcard /usr/include/libart-2.0 /usr/local/include/libart-2.0),)
NEEDLIBART=	libart-install
endif

# normal configure ; make ; make install
NORMALS=$(LIBPNG) $(LIBART) $(FREETYPE) $(LIBSMI)


#
CONFIG_FILES= 	$(patsubst conf/%,%,$(wildcard conf/*.conf*) conf/hubpasswd)
INSTALLED_CONFIG= $(patsubst %,$(DESTDIR)$(ZENHOME)/etc/%.example, $(CONFIG_FILES))

# general patterns for unpacking sources
TARZPACKAGES = \
  $(patsubst externallibs/%.tar.gz,build/%/.unpacked,$(wildcard externallibs/*.tar.gz))

TGZPACKAGES = \
  $(patsubst externallibs/%.tgz,build/%/.unpacked,$(wildcard externallibs/*.tgz))

BZ2PACKAGES = \
  $(patsubst externallibs/%.tar.bz2,build/%/.unpacked,$(wildcard externallibs/*.tar.bz2))

ifeq ($(svnex),1)
SVNGET=		 svn export --force
else
SVNGET=		 svn checkout 
endif

default: .patchdeps datestamp products-install config-install


config-install : $(INSTALLED_CONFIG)

$(INSTALLED_CONFIG): $(DESTDIR)$(ZENHOME)/etc/%.example : conf/%
	@echo installing $<
	@mkdir -p $(DESTDIR)$(ZENHOME)/etc
	@sed -e 's/ZENUSERNAME/$(ZOPEUSER)/' \
	     -e 's/ZENPASSWORD/$(ZOPEPASSWORD)/' < $< > $@
	@if [ ! -f $(DESTDIR)$(ZENHOME)/etc/$* ] ; then \
	   cp $@ $(DESTDIR)$(ZENHOME)/etc/$* ; \
        fi


EVERYTHING = 					\
	    sitecustomize			\
            zope-install			\
            twistedsnmp-install			\
            zensocket-install			\
            pynetsnmp-install			\
            mysql-python-install		\
            rrdtool-install			\
            epydoc-install			\
            snpp-install			\
            yapps-install			\
            nagios-install			\
            libsmi-install			\
            wmi-install				\
            pyip-install			\
            simplejson-install

products-install: $(EVERYTHING)

rpath-install:	datestamp zenoss-install config-install zensocket-install

clean:
	rm -f zenbuild.log
	rm -rf build

datestamp: testZenHome
	@echo "build log is in zenbuild.log"
	@date $(LOG)

testZenHome:
	@if [ -z "$(ZOPEPASSWORD)" ] ; then	\
	  echo ;				\
	  echo ;				\
	  echo ZOPEPASSWORD is not set! ;	\
	  echo ;				\
	  echo ;				\
	  exit 1 ;				\
	fi
	@mkdir -p build
	@mkdir -p $(DESTDIR)$(ZENHOME) 2>/dev/null
	@echo installing into $(DESTDIR)$(ZENHOME)
	@if [ ! -w $(DESTDIR)$(ZENHOME) ] ; then	\
	 echo ;								\
	 echo ;								\
	 echo ZENHOME not writable!					\
	      Check permissions on $(DESTDIR)$(ZENHOME) ;		\
	 echo ;								\
	 echo ;								\
	 exit 1 ;							\
	fi 
	@rm -f $(DESTDIR)$(ZENHOME)/.writable
	@mkdir -p $(DESTDIR)$(ZENBIN)
	@mkdir -p $(DESTDIR)$(ZENEXPORT)

zensocket-install: zensocket
	@echo making $<
	@cd zensocket ; $(MAKE) install SETUID=$(SETUID)

mysql-python-install: build/$(MYSQLPYTHON)/.unpacked
	$(PYINSTALL)

epydoc-install: build/$(EPYDOC)/.unpacked
	$(PYINSTALL)

pynetsnmp-install: build/$(PYNETSNMP)/.unpacked ctypes-install
	$(PYINSTALL)

pyip-install: build/$(PYIP)/.unpacked
	$(PYINSTALL)

ctypes-install: build/$(CTYPES)/.unpacked
	$(PYINSTALL)


PYTHONVERSION=$(shell $(PYTHON) -c 'import sys; print "python%d.%d"%sys.version_info[:2]')
BB=$(INSTDIR)/build/$(ZOPE)/build-base/$(PYTHONVERSION)
zope-install: build/$(ZOPE)/.unpacked build/$(ZOPE)/makefile zenoss-install
	$(MSG) ; cd $(<D) ;					\
	${PYTHON} setup.py install				\
		--build-base="$(BB)"				\
	        --build-lib="$(BB)/build-lib"			\
                --build-scripts="$(BB)/build-scripts"		\
                --build-temp="$(BB)/build-temp"			\
		--home="$(ZENHOME)"				\
		--root="$(DESTDIR)" $(LOG);			\
	[ -f $(DESTDIR)$(ZENHOME)/bin/python ] || 			\
		ln -s ${PYTHON} ${DESTDIR}$(ZENHOME)/bin/python

build/$(ZOPE)/makefile: build/$(ZOPE)/.unpacked
	@cd $(<D) ; $(CONFIGURE) --with-python=$(PYTHON) --prefix=$(ZENHOME) $(LOG)
	@touch $@

twistedsnmp-install: build/$(TWISTEDSNMP)/.unpacked pysnmp-install twisted-install 
	$(PYINSTALL)

pysnmp-install: build/$(PYSNMP)/.unpacked
	$(PYINSTALL)

twisted-install: build/$(TWISTED)/.unpacked pycrypto-install
	$(PYINSTALL)

pycrypto-install: build/$(PYCRYPTO)/.unpacked
	$(PYINSTALL)

rrdtool-install : build/$(RRDTOOL)/Makefile
	$(MSG) ; cd $(<D) ; $(MAKE) install $(LOG)
	@cd build/$(RRDTOOL)/bindings/python ; LIBDIR=$(DESTDIR)/$(ZENHOME)/lib $(PYINSTALLCMD)
	rm -rf $(DESTDIR)$(ZENHOME)/share/rrdtool/examples
	rm -rf $(DESTDIR)$(ZENHOME)/lib/perl

wmi-install: build/$(WMI)/.unpacked
	@cd $(<D) ; $(MAKE) install $(LOG)

build/$(NAGIOS)/Makefile: build/$(NAGIOS)/.unpacked
	@cd $(<D) ; export LIBS=-ldl ; $(CONFIGURE) $(LOG)
	@touch $@

build/$(RRDTOOL)/Makefile: build/$(RRDTOOL)/.unpacked $(NEEDLIBART) $(NEEDFREETYPE) $(NEEDLIBPNG)
	@cd $(<D) ; \
	LDFLAGS="$(LDFLAGS) -L$(DESTDIR)/$(ZENHOME)/lib" \
	CPPFLAGS="$(CFLAGS) -I$(DESTDIR)/$(ZENHOME)/include/freetype2 \
		  -I$(DESTDIR)/$(ZENHOME)/include/libpng \
		  -I$(DESTDIR)/$(ZENHOME)/include/libart-2.0 \
		  -I$(DESTDIR)/$(ZENHOME)/include" ; \
	export LDFLAGS CPPFLAGS; \
	$(CONFIGURE) --disable-rrdcgi --disable-python --disable-tcl --disable-perl $(LOG)
	@touch $@

NORMAL_MAKE_INSTALL=$(MSG) ; cd $(<D) ; $(MAKE) install DESTDIR="$(DESTDIR)" $(LOG)
freetype-install: build/$(FREETYPE)/Makefile
	$(NORMAL_MAKE_INSTALL)

libpng-install: build/$(LIBPNG)/Makefile
	$(NORMAL_MAKE_INSTALL)

libart-install: build/$(LIBART)/Makefile
	$(NORMAL_MAKE_INSTALL)

nagios-install: build/$(NAGIOS)/Makefile
	$(NORMAL_MAKE_INSTALL)

libsmi-install: build/$(LIBSMI)/.unpacked build/$(LIBSMI)/Makefile
	$(NORMAL_MAKE_INSTALL)

$(patsubst %,build/%/Makefile,$(NORMALS)) : %/Makefile : %/.unpacked
	@cd $(<D) ; $(CONFIGURE) $(LOG)
	@touch $@

snpp-install: build/$(SNPP)/.unpacked
	$(PYINSTALL)

yapps-install: build/$(YAPPS)/.unpacked
	$(PYINSTALL)

simplejson-install: build/$(SIMPLEJSON)/.unpacked
	cp externallibs/setuptools*.egg $(<D)
	$(PYINSTALL)

sitecustomize: $(DESTDIR)$(PYLIBDIR)/sitecustomize.py

$(DESTDIR)$(PYLIBDIR)/sitecustomize.py:
	@mkdir -p $(DESTDIR)$(PYLIBDIR)
	@echo "import sys; sys.setdefaultencoding('latin-1')" > $@

# optional installs

sendpage-install: build/$(SENDPAGE)/.unpacked
	$(MSG) ; cd $(<D) ; perl Makefile.PL ; \
	$(MAKE) ; $(MAKE) DESTDIR="$(DESTDIR)" install

PATCH=	cd $(@D) ; \
	for i in $(wildcard $(INSTDIR)/externallibs/$*.patch* /dev/null ); do \
		$(PATCHCMD) -p0 < $$i ; \
	done 

$(TARZPACKAGES) : build/%/.unpacked : externallibs/%.tar.gz $(wildcard externallibs/%.patch*)
	@echo unpacking $* in build/
	@rm -rf $(@D) ; cd build ; gzip -dc ../$< | tar -xf -
	@$(PATCH)
	@touch $@

$(TGZPACKAGES) : build/%/.unpacked : externallibs/%.tgz $(wildcard externallibs/%.patch*)
	@echo unpacking $* in build/
	@rm -rf $(@D) ; cd build ; gzip -dc ../$< | tar -xf -
	@$(PATCH)
	@touch $@

$(BZ2PACKAGES) : build/%/.unpacked : externallibs/%.tar.bz2 $(wildcard externallibs/%.patch*)
	@echo unpacking $* in build/
	@rm -rf $(@D) ; cd build ; bzip2 -dc ../$< | tar -xf -
	@$(PATCH)
	@touch $@

ifeq ($(wildcard $(INSTDIR)/libzenoss),)
zenoss-install: svn-install zope-config
else
zenoss-install: libzenoss-install zope-config
endif

zope-config: $(DESTDIR)$(ZOPEHOME)/skel/etc/zenoss.conf.in

$(DESTDIR)$(ZOPEHOME)/skel/etc/zenoss.conf.in: conf/zope.conf.in
	mkdir -p $(DESTDIR)$(ZOPEHOME)/skel/etc
	cp $^ $@

svn-install: always
	@mkdir -p $(DESTDIR)$(ZENHOME) ;				 \
	cd $(DESTDIR)$(ZENHOME) ;					 \
	if [ -d Products/.svn ] ; then					 \
		echo updating Zenoss from svn ;				 \
		$(SVNCMD) update Products $(LOG) ;			 \
		$(SVNCMD) update bin $(LOG) ;				 \
		$(SVNCMD) update extras $(LOG) ;				 \
	else								 \
		echo checking out Zenoss from svn: branch $(SVNTAG) ;	 \
		$(SVNGET) $(SVNURL)/$(SVNTAG)/Products Products $(LOG) ; \
		find Products -name .cvsignore -exec rm -f '{}' \; ;	 \
		$(SVNGET) $(SVNURL)/$(SVNTAG)/bin bin $(LOG) ;		 \
		$(SVNGET) $(SVNURL)/$(SVNTAG)/inst/fs extras $(LOG) ;		 \
	fi

libzenoss-install: always
	@mkdir -p $(DESTDIR)$(ZENHOME) ;			\
	cd $(DESTDIR)$(ZENHOME) ;				\
	for i in Products bin extras ; do				\
		echo installing libzenos/$$i.tar.gz ;		\
		tar -xzf $(INSTDIR)/libzenoss/$$i.tar.gz ;	\
        done

.patchdeps: $(wildcard externallibs/*)
	$(PYTHON) genpatchdeps.py >$@

-include .patchdeps

always:

.PHONY: always

