#########################################################################
# Uptime Client v5.0b8
# $Id: Makefile,v 1.58 2003/05/26 22:29:23 carstenklapp Exp $
#
# Logs system uptime and statistics with Uptimes Project servers
#
# Copyright (C) 1999-2002 Martijn Broenland, Alex C. de Haas, Carsten Klapp
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Carsten Klapp <carstenklapp@users.sourceforge.net>
# Alex C. de Haas <alex@uptimes.net>
# Martijn Broenland <tgm@uptimes.net>
#
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Makefile
#
# Disclaimer: This Makefile needs a lot of work. Help!!
# 
# Please report problems and suggestions(!) about this new Makefile to
# Carsten at the above address.
#
  PROGRAMNAME = UpClient
# UPCLIENT_VERSION = "5.0b8"
  UPCLIENT_VERSION = `sed -n 's/"//g;/\#define UPCLIENT_VERSION /s///p' version.h`
#########################################################################


binname = upclient

# Uptimes Server
uptimes_server = uptimes.wonko.com

OPTIMIZATION_CFLAGS=-O3

# System directories
prefix = /usr/local
#prefix = /sw
#prefix = /opt/${binname}
#prefix = /tmp/upclient

mandir = ${prefix}/share/man
#mandir = ${prefix}/man

exec_prefix = ${prefix}
sbindir = ${exec_prefix}/sbin
datadir = ${prefix}/share
sysconfdir = ${prefix}/etc
#sysconfdir = /etc
localstatedir = ${prefix}/var
#localstatedir = /var
destdir=


# Further Reading
# Filesystem Hierarchy Standard 2.2 May 24, 2001
# http://www.pathname.com/fhs/
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# Uncomment the lines for your system if you want to use Gettext
# localization. Included languages: Deutsch, Franais

LANGUAGES=de es fr it nl

## generic
#localedir = ${datadir}/locale
#LOCALEFLAGS = -DLOCALEPATH=\"$(localedir)\"
#LOCALELIBS = -lintl

## [x86] Linux 2.4 (Debian 2.2)
## [x86] Linux 2.4 (Redhat 7.3)
## [Alpha] Linux 2.4 (Debian 3.0)
## [PPC - RS/6000]  Linux 2.2 (Debian 3.0)
## [CerfCube SA1110] Linux 2.4 (Debian 3.0)
## [PPC - 601] MkLinux (DR3)
#localedir = ${datadir}/locale
#LOCALEFLAGS = -DLOCALEPATH=\"$(localedir)\"
#LOCALELIBS =

## [x86] FreeBSD (4.7-RC)
## assumes gettext installed in /usr/local
#localedir = ${datadir}/locale
#LOCALEFLAGS = -DLOCALEPATH=\"$(localedir)\" -I/usr/local/include
#LOCALELIBS = -L/usr/local/lib -lintl

## [Sparc - R220] Sun Solaris (5.8)
## not sure whether this locale dir is correct
#localedir = ${prefix}/lib/locale
#LOCALEFLAGS = -DLOCALEPATH=\"$(localedir)\"
#LOCALELIBS = -lintl

## [PPC] Darwin-fink
#localedir = /sw/share/locale
#LOCALEFLAGS = -DLOCALEPATH=\"$(localedir)\"
#LOCALELIBS = -lintl

#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# -DPARANOID prevents any data from being transmitted!
# -DDBUG gives extra messages.
#DEBUGFLAGS=-g3 -DDEBUG
#DEBUGFLAGS=-g3 -DDEBUG -DPARANOID

WARNINGFLAGS=-Wpointer-arith -Wbad-function-cast -Wcast-qual		\
 -Wcast-align -Wconversion -Wstrict-prototypes -Wmissing-prototypes	\
 -Wmissing-declarations -Wnested-externs -Wformat-security -Wformat	\
 -Wcomment -Wchar-subscripts -Wunused -Wbad-function-cast -Wconversion
#########################################################################
# No user serviceable parts below

MAKEFLAGS=$(MFLAGS)

# compiler files
SOURCES = stats-bsd.c stats-uxw.c stats-ult.c stats-sol.c stats-lnx.c	\
 stats-mach.c stats-aix.c stats-beos.c stats-w2k.c network.c base64.c	\
 options.c uplog.c transmit.c upclient.c
OBJECTS = stats-bsd.o stats-uxw.o stats-ult.o stats-sol.o stats-lnx.o	\
 stats-mach.o stats-aix.o stats-beos.o stats-w2k.o network.o base64.o	\
 options.o uplog.o transmit.o upclient.o

OBJECTSDIR=objects
PRODUCTSDIR=products

# our files
MANFILE = $(binname).8
DOCS = AUTHORS INSTALL README TODO COPYING HISTORY HISTORY-BETA FAQ	\
 "Uptimes Protocol 5" TODO-splint TODO-flawfinder
DOCDIR = ${datadir}/doc/$(binname)

# more of our files
CONFIGFILE = $(binname).conf
CONFIGPATH = ${sysconfdir}/$(CONFIGFILE)
#DEBUGCONFIGPATH=./upclient.conf
PIDFILE = ${binname}.pid
PIDPATH = ${localstatedir}/run/$(PIDFILE)
PATHFLAGS = -DCONFIGFILE=\"$(CONFIGPATH)\" -DPIDFILE=\"$(PIDPATH)\"

# install commands (not used for install-solaris)
INSTALL_PROGRAM = install -m 750
INSTALL_DATA = install -m 644
INSTALL_CONFIG = install -m 600

#########################################################################
# targets

nothing-specified:
	       #########################################################################
	@echo ""
	@echo "BUILD:"
	@echo "To compile with gettext you must first edit the Makefile."
	@echo "Please specify the system which you want to compile for:"
	@echo "make bsd         OpenBSD, FreeBSD, NetBSD"
	@echo "make darwin      Darwin, Mac OS X"
	@echo "make solaris     Solaris, SunOS"
	@echo "make linux       Linux"
	@echo "make irix        Irix"
	@echo "make ultrix      Ultrix"
	@echo "make unixware    UnixWare"
	@echo "make aix         AIX"
	@echo "make beos        BeOS"
	@echo "make winnt       Windows NT4/2000"
	@echo ""
	@echo "INSTALL:"
	@echo "make install            use generic 'install' program (GNU)"
	@echo "make install-solaris"
	@echo "or make install-irix    if using Solaris/SunOS 'install' program"
	@echo ""
	@echo "LOCALIZED INSTALL:"
	@echo "make install-locales            generic 'install' with gettext"
	@echo "make install-locales-solaris"
	@echo "make install-locales-irix       Solaris/SunOS with gettext"
	@echo ""
	@echo "PREVIEW:"
	@echo "make pathcheck    preview paths used for compile & install,"
	@echo "                  (nothing compiled)"
	@echo ""
	@echo "make uninstall    uninstalls all but config file"
	@echo ""
	       #########################################################################

pathcheck:
	@echo "prefix        = ${prefix}"
	@echo "exec_prefix   = ${exec_prefix}"
	@echo "datadir       = ${datadir}"
	@echo "mandir        = ${mandir}"
	@echo "docdir        = ${docdir}"
	@echo "sysconfdir    = ${sysconfdir}"
	@echo "localstatedir = ${localstatedir}"
	@echo "localedir     = ${localedir}"
	@echo "destdir       = ${destdir}"

bsd:
	$(MAKE) $(MAKEFLAGS) CC=gcc		\
		LDFLAGS='$(LDFLAGS) -lkvm'	\
		PLATFORMFLAG='-DPLATFORM_BSD'	\
		all

darwin:
	$(MAKE) $(MAKEFLAGS) CC=cc			\
		LDFLAGS='$(LDFLAGS) -lkvm -prebind'	\
		CFLAGS='$(CFLAGS) -prebind'		\
		PLATFORMFLAG='-DPLATFORM_BSD'		\
		all

darwin-fink:
	$(MAKE) $(MAKEFLAGS) CC=cc			\
		prefix=/sw mandir=/sw/share/man		\
		LDFLAGS='$(LDFLAGS) -prebind -lkvm'	\
		CFLAGS='$(CFLAGS) -prebind'		\
		PLATFORMFLAG='-DPLATFORM_BSD'		\
		all
#		CFLAGS='-O3 -prebind -I/sw/include -mcpu=7400 -mmultiple -faltivec'	\

unixware:
	$(MAKE) $(MAKEFLAGS) CC=gcc			\
		PLATFORMFLAG='-DPLATFORM_UNIXWARE'	\
		all

ultrix:
	$(MAKE) $(MAKEFLAGS) CC=mwcc			\
		PLATFORMFLAG='-DPLATFORM_ULTRIX'	\
		all

# Uncomment this if default Irix won't work. (This might not work either)
#irix:
#	$(MAKE) $(MAKEFLAGS) CC=cc			\
#		LDFLAGS='$(LDFLAGS) -lnet'		\
#		OBJECTS='$(OBJECTS) stats-ult.o'	\
#		SOURCES='$(SOURCES) stats-ult.c'	\
#		CFLAGS=$(CFLAGS) -fullwarn		\
#		PLATFORMFLAG='-DPLATFORM_ULTRIX'	\
#		all-solaris

irix:
	$(MAKE) $(MAKEFLAGS) CC=gcc			\
		PLATFORMFLAG='-DPLATFORM_SOLARIS'	\
		all-irix

solaris:
	$(MAKE) $(MAKEFLAGS) CC=gcc			\
		LDFLAGS='$(LDFLAGS) -lsocket -lnsl'	\
		PLATFORMFLAG='-DPLATFORM_SOLARIS'	\
		all-solaris

linux:
	$(MAKE) $(MAKEFLAGS) CC=gcc		\
		PLATFORMFLAG='-DPLATFORM_LINUX'	\
		all

aix:
	$(MAKE) $(MAKEFLAGS) CC=cc		\
		PLATFORMFLAG='-DPLATFORM_AIX'	\
		all

beos:
	$(MAKE) $(MAKEFLAGS) CC=gcc		\
		PLATFORMFLAG='-DPLATFORM_BEOS'	\
		all

winnt:
	$(MAKE) $(MAKEFLAGS) CC=bcc32					    \
		CONFIGPATH="\"C:\\Program Files\\Upclient\\$(CONFIGFILE)\"" \
		OBJECTS='$(OBJECTS) compat/wsyslog.o'			    \
		SOURCES='$(SOURCES) compat/wsyslog.c'			    \
		PLATFORMFLAG='-DPLATFORM_WINNT'				    \
		all-win

#########################################################################
version:
	@echo "Making ${PROGRAMNAME} $(UPCLIENT_VERSION)..."

all: upclient upclient.man upclient.conf
all-solaris: upclient upclient.man upclient.conf.solaris
all-irix: all-solaris
all-win: upclient upclient.conf

$(OBJECTS): $(OBJECTSDIR)

.c.o:
	if [ ! -f $(OBJECTSDIR)/$@ ]; then			\
	    $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(LOCALEFLAGS)	\
	    $(PLATFORMFLAG) $(PATHFLAGS) $(DEBUGFLAGS)		\
	    $(WARNINGFLAGS) -c $< -o $(OBJECTSDIR)/$@;		\
	 fi

$(PRODUCTSDIR) $(OBJECTSDIR):
	mkdir -p $@

upclient: version $(OBJECTS) $(PRODUCTSDIR)
	if [ ! -f $(PRODUCTSDIR)/$@ ]; then				\
	    cd $(OBJECTSDIR) ; $(CC) $(OPTIMIZATION_CFLAGS) $(CFLAGS)	\
	    $(EXTRA_CFLAGS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LOCALELIBS)	\
	    $(LOCALEFLAGS) $(PLATFORMFLAG) $(PATHFLAGS) $(DEBUGFLAGS)	\
	    $(WARNINGFLAGS) $(OBJECTS) -o ../${PRODUCTSDIR}/${binname};	\
	    echo "Done". ;						\
	else								\
	   echo "$@ is up to date." ;					\
	fi

upclient.man: $(PRODUCTSDIR)
	@if [ -f $(PRODUCTSDIR)/$(MANFILE) ]; then			\
	   echo $(MANFILE) is up to date. ;				\
	 else								\
	   echo Inserting paths into man file ;				\
	   sed -e s@__NAME__@$(PROGRAMNAME)@g				\
	       -e s@__UPCLIENT_VERSION__@$(UPCLIENT_VERSION)@g		\
	       -e s@__BINNAME__@${binname}@g				\
	       -e s@__SBINDIR__@${sbindir}@g				\
	       -e s@__PIDFILE__@$(PIDPATH)@g				\
	       -e s@__CONFIGFILE__@$(CONFIGPATH)@g			\
	       -e s@__UPTIMES_SERVER__@${uptimes_server}@g		\
	       -e s@__DATADIR__@${datadir}@g				\
	       ./man/$(binname).man > $(PRODUCTSDIR)/$(MANFILE) ;	\
	 fi

upclient.conf: $(PRODUCTSDIR)
	@if [ -f $(PRODUCTSDIR)/$@ ]; then			\
	   echo $@ is up to date. ;				\
	 else							\
	   echo Making config file ;				\
	   sed -e 's|@PIDFILE@|${PIDPATH}|g'			\
	       -e 's|@UPTIMES_SERVER@|${uptimes_server}|g'	\
	       ./conf/$(CONFIGFILE) > $(PRODUCTSDIR)/$@ ;	\
	 fi

upclient.conf.solaris: $(PRODUCTSDIR)
	@if [ -f $(PRODUCTSDIR)/$(CONFIGFILE) ]; then			\
	   echo $(CONFIGFILE) is up to date. ;				\
	 else								\
	   echo Making into config file ;				\
	   sed -e 's|@PIDFILE@|${PIDPATH}|g'				\
	       -e 's|@UPTIMES_SERVER@|${uptimes_server}|g'		\
	       -e 's|SendIdle      = 1|SendIdle      = 0|g'		\
	       -e 's|SendUsage     = 1|SendUsage     = 0|g'		\
	       ./conf/$(CONFIGFILE) > $(PRODUCTSDIR)/$(CONFIGFILE) ;	\
	 fi

#########################################################################
# Goals

.phony: all all-solaris all-win install install-solaris solaris-install uninstall remove clean osxclean distclean cvsclean tarball cvsclean dist install-irix irix-install $(PRODUCTSDIR) $(OBJECTSDIR) $(LANGUAGES)

install:
	@echo Installing files
	mkdir -p ${destdir}${sbindir}
	mkdir -p ${destdir}${mandir}/man8
	mkdir -p ${destdir}$(DOCDIR)
	mkdir -p ${destdir}${sysconfdir}
	mkdir -p ${destdir}${localstatedir}/run
	if [ -f ${destdir}$(CONFIGPATH) ]; then \
	   mv ${destdir}$(CONFIGPATH) ${destdir}$(CONFIGPATH).old; \
	fi
	$(INSTALL_PROGRAM) $(PRODUCTSDIR)/${binname} ${destdir}${sbindir}
	$(INSTALL_DATA) $(PRODUCTSDIR)/$(MANFILE) ${destdir}${mandir}/man8
	$(INSTALL_CONFIG) $(PRODUCTSDIR)/$(CONFIGFILE) ${destdir}$(CONFIGPATH)
	cd .. && ln -f doc/Uptimes\ Protocol\ 5
	cd .. && $(INSTALL_DATA) $(DOCS) ${destdir}$(DOCDIR)

$(LANGUAGES):
	    mkdir -p ${destdir}$(localedir)/$@/LC_MESSAGES
	    $(INSTALL_DATA) ./locale/$@.mo ${destdir}$(localedir)/$@/LC_MESSAGES/${binname}.mo
	    chmod 644 ${destdir}$(localedir)/$@/LC_MESSAGES/${binname}.mo

install-locales: $(LANGUAGES)

install-locales-solaris:
	$(MAKE) $(LANGUAGES) INSTALL_DATA=cp

install-locales-irix: install-locales-solaris
install-solaris-locales: install-locales-solaris
install-irix-locales: install-locales-solaris

install-solaris:
#	solaris install is reversed, or is it vice-versa?
	mkdir -p ${destdir}${sbindir}
	mkdir -p ${destdir}${mandir}/man8
	mkdir -p ${destdir}$(DOCDIR)
	mkdir -p ${destdir}${sysconfdir}
	mkdir -p ${destdir}${localstatedir}/run
	if [ -f ${destdir}$(CONFIGPATH) ]; then \
	   mv ${destdir}$(CONFIGPATH) ${destdir}$(CONFIGPATH).old; \
	fi
	cd $(PRODUCTSDIR) && install -f ${destdir}${sbindir} -m 750 ${binname}
	cd $(PRODUCTSDIR) && install -f ${destdir}${mandir}/man8 -m 644 $(MANFILE)
#	note: use sysconfdir instead of CONFIGPATH
	cd $(PRODUCTSDIR) && install -f ${destdir}${sysconfdir} -m 600 $(CONFIGFILE)
#	no $(foreach) available in Solaris unless using gnumake
	install -f ${destdir}$(DOCDIR) -m 644 ../AUTHORS
	install -f ${destdir}$(DOCDIR) -m 644 ../INSTALL
	install -f ${destdir}$(DOCDIR) -m 644 ../README
	install -f ${destdir}$(DOCDIR) -m 644 ../TODO
	install -f ${destdir}$(DOCDIR) -m 644 ../COPYING
	install -f ${destdir}$(DOCDIR) -m 644 ../HISTORY
	install -f ${destdir}$(DOCDIR) -m 644 ../HISTORY-BETA
	install -f ${destdir}$(DOCDIR) -m 644  ../FAQ
#	Solaris installer's built-in cp routines can't handle spaces in
#	filenames
	cp ../doc/Uptimes\ Protocol\ 5 ${destdir}$(DOCDIR)
	chmod 644 ${destdir}$(DOCDIR)/Uptimes\ Protocol\ 5

solaris-install: install-solaris
irix-install: install-solaris
install-irix: install-solaris

uninstall:
	rm -f ${destdir}${sbindir}/${binname} ${destdir}${mandir}/man8/$(MANFILE)
	-@rmdir ${destdir}${mandir}/man8
	-cd ${destdir}$(DOCDIR) && rm -f $(DOCS)
	-@rmdir -p ${destdir}$(DOCDIR)

remove: uninstall

cleano:
	rm -f core
	-cd $(OBJECTSDIR) && rm -f $(OBJECTS) && rm -f core
	-@rmdir -p $(OBJECTSDIR)

clean: cleano
	rm -f $(PRODUCTSDIR)/${binname} $(PRODUCTSDIR)/$(MANFILE) $(PRODUCTSDIR)/$(CONFIGFILE)
	-@rmdir -p $(PRODUCTSDIR)

mostlyclean: cleano
	rm -f core $(OBJECTSDIR)/core $(PRODUCTSDIR)/core $(PRODUCTSDIR)/${binname}

osxclean:
	@rm -fR "Mac OS X Project Builder/build"
	@find ../ -name .DS_Store -print -exec rm {} \;

distclean: clean / osxclean

#########################################################################
# You probably don't want anything below this line, it might destroy your
# package and you will have to download it again
cvsclean:
	-find ../ -name CVS -print -exec rm -R {} \;
	-find ../ -name ".#*" -print -exec rm -R {} \;
	-find ../ -name .cvsignore -print -exec rm {} \;

dist: distclean / cvsclean
	-rm -f "Mac OS X Project Builder/upclient.pbproj/*.pbxuser"
	tar -cf ../../upclient-$(UPCLIENT_VERSION).tar ../../upclient-$(UPCLIENT_VERSION)
	gzip -9 ../../upclient-$(UPCLIENT_VERSION).tar

indentsplint:
	$(MAKE) -j1 indent indentclean TODO-flawfinder TODO-splint

indent:
	@if [ -f .indent.pro ]; then						\
	   echo "Reindenting source code" ;					\
	   indent *.c *.h ;							\
	 else									\
	   echo "Sorry, this project's '.indent.pro' file is missing." ;	\
	 fi

indentclean:
	rm -f *.c~
	rm -f *.h~

TODO-flawfinder:
	@echo "\$$Id\$$" > ../$@
	@echo "" >> ../$@
	@echo "make flawfinder" >> ../$@
	@echo "     using options: -c --inputs" >> ../$@
	@echo "" >> ../$@
	flawfinder -c --inputs $(SOURCES) >> ../$@


TODO-splint:
	@echo "\$$Id\$$" > ../$@
	@echo "" >> ../$@
	@echo "make splint" >> ../$@
	@echo "     using options: +charint +ignoresigns +charindex +posixlib -skipposixheaders -exportlocal +boolint +charintliteral -exitarg -formatconst" >> ../$@
	@echo "" >> ../$@
	-splint +charint +ignoresigns +charindex +posixlib -skipposixheaders -exportlocal +boolint +charintliteral -exitarg -formatconst $(SOURCES) >> ../$@

flawfinder: TODO-flawfinder
splint: TODO-splint

diff:
	cd ..;cvs diff > ../../diff
