###########################################################################
#
# This program is part of Zenoss Core, an open source monitoring platform.
# Copyright (C) 2008-2010, 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, or (at your
# option) any later version, as published by the Free Software Foundation.
#
# For complete information please visit: http://www.zenoss.com/oss/
#
###########################################################################
build:   pywmi-build 
install: pywmi-installed 
all:     build install
.PHONY:  clean debug tarball

WMI_BUILD_TARGETS = proto bin/wmic bin/winexe libraries
SAMBA_SRCDIR      = Samba/source
ZENOSS_BINDIR     = $(ZENHOME)/bin
ZENPYTHON         = $(ZENOSS_BINDIR)/python
PYTHON           ?= $(ZENPYTHON)
PYTHON_EXISTS    := $(wildcard $(PYTHON))

# Assuming python was found, tease out path to headers we should 
# compile against:  e.g., $ZENHOME/include/python#.#
# Extract WMI version for subversion tagging as desired.
#
ifeq ($(PYTHON_EXISTS),$(PYTHON))
PY_INCDIR     = $(shell $(PYTHON) pyinclude.py)
GET_VERSION   = "import version as v; print v.VERSION"
WMI_VERSION  := $(shell cd pysamba ; $(PYTHON) -c $(GET_VERSION))
WMI_CPPFLAGS := -I$(PY_INCDIR)
endif

# Install dir for libasync_wmi_lib.so.* and pysamba wrapper code.
# e.g., Samba/source/bin/shared/libasync_wmi_lib.so.0.0.1 --> $(PY_LIBDIR)
#
PY_LIBDIR     = $(ZENHOME)/lib/python

#-------------------------------------------------------------------------#
# A key deliverable of this build process is the libasync_wmi shared      #
# library.  Derive the complete filename for this target from config data #
# and the build platform so we know precisely what should get built and   #
# installed.                                                              #
#                                                                         #
# e.g., libasync_wmi_lib.dylib versus libasync_wmi_lib.so.0.0.2           #
#-------------------------------------------------------------------------#
LIBASYNC_WMI_LIB_BASENAME    = libasync_wmi_lib
WMI_CONFIG_MK                = $(SAMBA_SRCDIR)/wmi/config.mk
LIBASYNC_WMI_LIB_VERSION_nnn = $(shell fgrep -A1 "[LIBRARY::async_wmi_lib]" $(WMI_CONFIG_MK) | sed -e "s/^VERSION=\(.*\)/\1/g"    | tail -1)
LIBASYNC_WMI_LIB_VERSION_n   = $(shell fgrep -A2 "[LIBRARY::async_wmi_lib]" $(WMI_CONFIG_MK) | sed -e "s/^SO_VERSION=\(.*\)/\1/g" | tail -1)
ifeq ($(shell uname), Darwin)
LIBASYNC_WMI_LIB             = $(LIBASYNC_WMI_LIB_BASENAME).dylib.$(LIBASYNC_WMI_LIB_VERSION_nnn)
else
# e.g., libasync_wmi_lib.so.0.0.2 and libasync_wmi_lib.so.0 respectively
LIBASYNC_WMI_LIB            := $(LIBASYNC_WMI_LIB_BASENAME).so.$(LIBASYNC_WMI_LIB_VERSION_nnn)
LIBASYNC_WMI_LIB_SO_N       := $(LIBASYNC_WMI_LIB_BASENAME).so.$(LIBASYNC_WMI_LIB_VERSION_n)
endif
PATHED_LIBASYNC_WMI_LIB     := $(SAMBA_SRCDIR)/bin/shared/$(LIBASYNC_WMI_LIB)

#-------------------------------------------------------------------------#
# Google Breakpad Integration                                             #
#-------------------------------------------------------------------------#
# libasync_wmi_lib.so can be built with google-breakpad crash reporting.  #
# http://code.google.com/p/google-breakpad                                #
#                                                                         #
#    Minidumps are typically written to /tmp.                             #
#    See: Samba/source/librpc/rpc/dcerpc.c                                #
#-------------------------------------------------------------------------#
# Comment out the next line to disable google-breakpad dependency.
ifneq ($(shell uname), Darwin)
USE_BREAKPAD = 1
endif

ifneq ($(USE_BREAKPAD),)
breakpad_CPPFLAGS    = -DBREAKPAD
WMI_CPPFLAGS        += $(breakpad_CPPFLAGS)
breakpad_LIB         = libbreakpad_client.a
breakpad_LIBDIR     ?= $(ZENHOME)/lib
_fqp_breakpad_LIB   := $(DESTDIR)$(breakpad_LIBDIR)/$(breakpad_LIB)
fqp_breakpad_LIB     = $(patsubst //%,/%,$(_fqp_breakpad_LIB))
breakpad_LIB_SYMLINK = $(SAMBA_SRCDIR)/bin/static/$(breakpad_LIB)
endif
#-------------------------------------------------------------------------#

# Check existence of a directory or file.  Bail out of the build if it is missing.
#
define check
	@if [ "$1" = "directory" ]; then \
		if [ ! -d "$2" ];then \
			echo $3 | awk '{printf("Missing: %-20s\n",$$1)}';\
			exit 1 ;\
		else \
			echo "$3 $2" | awk '{printf("Found:   %-20s %20s\n",$$1,$$2)}' 1>/dev/null;\
		fi ;\
	fi
	@if [ "$1" = "file" ]; then \
		if [ ! -f "$2" ];then \
			echo "$3 $2" | awk '{printf("Missing: %-20s %s\n",$$1,$$2)}';\
			exit 1 ;\
		else \
			echo "$3 $2" | awk '{printf("Found:   %-20s %20s\n",$$1,$$2)}' 1>/dev/null;\
		fi ;\
	fi
endef

build-prereqs:
	@echo
	@echo "Checking prequisites for building WMI"
	$(call check,directory,$(ZENHOME),"ZENHOME")
	$(call check,file,$(PYTHON),"PYTHON")
	$(call check,directory,$(PY_INCDIR),"PY_INCDIR")
ifneq ($(USE_BREAKPAD),)
	@if [ ! -f "$(fqp_breakpad_LIB)" ];then \
		echo "Unable to find the google breakpad client library we require at:" ;\
		echo "   $(fqp_breakpad_LIB)" ;\
		echo ;\
		echo "Either comment out USE_BREAKPAD in this makefile or build the" ;\
		echo "breakpad library." ;\
		echo ;\
		exit 1 ;\
	fi
endif
	@touch $@

install-prereqs:
	@echo
	@echo "Checking prequisites for installing WMI"
	$(call check,directory,$(ZENHOME),"ZENHOME")
	$(call check,directory,$(DESTDIR)$(ZENOSS_BINDIR),"ZENOSS_BINDIR")
	$(call check,directory,$(DESTDIR)$(PY_LIBDIR),"PY_LIBDIR")
	@touch $@

LIBRPC_CONFIG_MK = $(SAMBA_SRCDIR)/librpc/config.mk
ifeq ($(USE_BREAKPAD),)
LIBRPC_CONFIG_MK_NOBP = $(SAMBA_SRCDIR)/librpc/config.mk.nobreakpad
$(LIBRPC_CONFIG_MK): $(LIBRPC_CONFIG_MK_NOBP)
	cp $< $@
else
# Tell the build how to link against the breakpad library.
# e.g., Muck with Samba/source/librpc/config.mk to provide that visibility.
#
LIBRPC_CONFIG_MK_BP = $(SAMBA_SRCDIR)/librpc/config.mk.breakpad
LIBRPC_CONFIG_TAG  := $(fqp_breakpad_LIB)
$(LIBRPC_CONFIG_MK): $(LIBRPC_CONFIG_MK_BP)
	sed -e "s|_sed_tag_libbreakpad_client_path_|$(LIBRPC_CONFIG_TAG)|" $< >$@ || rm $@

# Create symlink to actual google breakpad library.
# e.g., Samba/source/bin/static/libbreakpad_client.a -> /actual/path/to/libbreakpad_client.a
$(breakpad_LIB_SYMLINK): $(fqp_breakpad_LIB)
	@if [ ! -d "$(@D)" ];then \
		 mkdir -p $(@D) ;\
	fi
	ln -sf $(fqp_breakpad_LIB) $@
endif

$(SAMBA_SRCDIR)/Makefile: $(SAMBA_SRCDIR)/autogen.sh
	cd $(SAMBA_SRCDIR) ;\
	./autogen.sh ;\
	CPPFLAGS="$(WMI_CPPFLAGS)" ./configure --without-readline --enable-debug

ifeq ($(USE_BREAKPAD),)
pywmi-build: build-prereqs $(LIBRPC_CONFIG_MK) $(SAMBA_SRCDIR)/Makefile
else
pywmi-build: build-prereqs $(LIBRPC_CONFIG_MK) $(SAMBA_SRCDIR)/Makefile $(breakpad_LIB_SYMLINK)
endif
	cd $(SAMBA_SRCDIR);\
	$(MAKE) $(WMI_BUILD_TARGETS) ;\
	touch $@

pywmi-installed: install-prereqs $(DESTDIR)$(PY_LIBDIR) $(DESTDIR)$(ZENOSS_BINDIR) $(SAMBA_SRCDIR)/bin/wmic $(SAMBA_SRCDIR)/bin/winexe $(PATHED_LIBASYNC_WMI_LIB)
	cp $(SAMBA_SRCDIR)/bin/wmic   $(DESTDIR)$(ZENOSS_BINDIR)
	cp $(SAMBA_SRCDIR)/bin/winexe $(DESTDIR)$(ZENOSS_BINDIR)
ifeq ($(shell uname), Darwin)
	-(cd $(DESTDIR)$(PY_LIBDIR) && rm -f $(LIBASYNC_WMI_LIB_BASENAME)*)
	cp $(PATHED_LIBASYNC_WMI_LIB) $(DESTDIR)$(PY_LIBDIR)/$(LIBASYNC_WMI_LIB_BASENAME).$(LIBASYNC_WMI_LIB_VERSION_nnn).dylib
	(cd $(DESTDIR)$(PY_LIBDIR) && ln -sf $(LIBASYNC_WMI_LIB_BASENAME).$(LIBASYNC_WMI_LIB_VERSION_nnn).dylib $(LIBASYNC_WMI_LIB_BASENAME).dylib)
else
	-(cd $(DESTDIR)$(PY_LIBDIR) && rm -f $(LIBASYNC_WMI_LIB_BASENAME)*)
	cp $(PATHED_LIBASYNC_WMI_LIB) $(DESTDIR)$(PY_LIBDIR)
	(cd $(DESTDIR)$(PY_LIBDIR) && ln -sf $(LIBASYNC_WMI_LIB) $(LIBASYNC_WMI_LIB_SO_N))
endif
	rm -rf $(DESTDIR)$(PY_LIBDIR)/pysamba
	cp -r pysamba $(DESTDIR)$(PY_LIBDIR) 

$(DESTDIR)$(ZENOSS_BINDIR) $(DESTDIR)$(PY_LIBDIR):
	mkdir -p $@

clean: $(LIBRPC_CONFIG_MK)
	-if [ -f "$(SAMBA_SRCDIR)/Makefile" ] ; then\
		cd $(SAMBA_SRCDIR) ;\
		make distclean ;\
	fi
	rm -f $(SAMBA_SRCDIR)/bin/shared/* 
	rm -f $(SAMBA_SRCDIR)/bin/static/* 
	rm -f $(SAMBA_SRCDIR)/heimdal/lib/des/hcrypto
	rm -f build-prereqs
	rm -f install-prereqs
	rm -f $(LIBRPC_CONFIG_MK)
	@-[ -L $(breakpad_LIB_SYMLINK) ] && rm -f $(breakpad_LIB_SYMLINK)

tarball:
	-svn rm -m 'cleanup' http://dev.zenoss.org/svn/tags/wmi-$(WMI_VERSION)
	svn cp -m "tagging wmi-$(WMI_VERSION)" http://dev.zenoss.org/svn/trunk/wmi http://dev.zenoss.org/svn/tags/wmi-$(WMI_VERSION)
	svn export http://dev.zenoss.org/svn/tags/wmi-$(WMI_VERSION)
	tar -cjf ../wmi-$(WMI_VERSION).tar.bz2 wmi-$(WMI_VERSION)
	rm -rf wmi-$(WMI_VERSION)

debug: 
	@echo "WMI_VERSION       = $(WMI_VERSION)"
	@echo "SAMBA_SRCDIR      = $(SAMBA_SRCDIR)"
	@echo "PY_INCDIR         = $(PY_INCDIR)"
	@echo "PY_LIBDIR         = $(PY_LIBDIR)"
	@echo "ZENOSS_BINDIR     = $(ZENOSS_BINDIR)"
	@echo "PYTHON            = $(PYTHON_EXISTS)"
	@echo "WMI_CONFIGURE       CPPFLAGS="$(WMI_CPPFLAGS)" ./configure --without-readline --enable-debug"
	@echo "WMI_MAKE            $(MAKE) $(WMI_BUILD_TARGETS)"
ifeq ($(USE_BREAKPAD),)
	@echo "USE_BREAKPAD        [ disabled ]"
else
	@echo "LIBRPC_CONFIG_TAG = $(LIBRPC_CONFIG_TAG)"
	@echo "USE_BREAKPAD        [ enabled ]"
	@echo "breakpad_CPPFLAGS = $(breakpad_CPPFLAGS)"
	@echo "breakpad_LIB      = $(breakpad_LIB)"
	@echo "breakpad_LIBDIR   = $(breakpad_LIBDIR)"
	@echo "fqp_breakpad_LIB  = $(fqp_breakpad_LIB)"
endif
