# $Id: Makefile,v 1.37 2004/11/22 16:09:39 hbo Exp $

VMAJ=2
VMIN=1
VTEENY=2
VRPM=1
VERSION=${VMAJ}.${VMIN}.${VTEENY}

DIST=sudoscript-${VERSION}

# Tarballs
DISTTARBALL=$(DIST).tar.gz
RPMDISTTARBALL=$(DIST).tar.bz2



# Names of the executable scripts we will install
SS=sudoscript
SDS= sudoshell
SDSI=$(SDS)-in
SDSD= $(SS)d
SDSDI=$(SDSD)-in
SDSLr= Sudoscript
SDSL= $(SDSLr).pm
sds=ss
SRC= $(SDSI) $(SDSDI) $(SDSL)

# Locations
# The first of several gnumakeisms
SRCDIR := $(shell pwd)

DISTDIR=$(DIST)

# Startup scripts
BSDINITSCR=$(SDSD).bsd.rc
NETBSDINITSCR=$(SDSD).netbsd.rc
LINUXINITSCR=$(SDSD).linux.init
IRIXINITSCR=$(SDSD).irix.init
SOLARISINITSCR=$(SDSD).solaris.init
INITSCRIPTS= $(BSDINITSCR) $(NETBSDINITSCR) $(LINUXINITSCR) $(SOLARISINITSCR) 

# Gnumakeism
# Get the user's effective user id
UID := $(shell perl -e 'print $$>')

# Gnumakeism
# If the user is root, don't use sudo
ifeq "$(UID)" "0"
else
  SUDO=sudo
endif

INSTALL=$(SUDO) install
# Default install locations (overridden below if needed)
INSTINI=$(INSTETC)/init.d
INSTININAME=$(SDSD)

# We'll set this to 0 if we don't recognize the OS
SUPPORTED=1

PERLPATH=/usr/bin/perl

# Gnumakeism
# Get Perl's idea of the OS.
OS := $(shell perl -e 'print $$^O')

# Set install locations and file names based on OS

ifeq "$(OS)" "linux"
DISTRO := $(shell perl -e 'chomp($$_=`head -1 /etc/issue`);if (/^Debian/){print "debian"} elsif (/^Red Hat/){print "redhat"} else {print "unknown"}')

ifeq "$(DISTRO)" "redhat"

RPMPKGDIR=packages/redhat
SPECFILE=sudoscript.spec
SPECFILESOURCE=$(RPMPKGDIR)/$(SPECFILE).src
RPM=$(DIST)-$(VRPM).noarch.rpm
SRPM=$(DIST)-$(VRPM).src.rpm
RPMS=$(RPM) $(SRPM)
endif
GROUP=root
PREFIX=/usr
MANPREFIX=$(PREFIX)/share/man
ADMINSECT=8
DOCPREFIX=$(PREFIX)/share/doc
INIPREFIX=/etc/init.d
INITSCR=$(LINUXINITSCR)

else
ifeq "$(OS)" "irix"

GROUP=root
PREFIX=/usr/local
MANPREFIX=$(PREFIX)/man
ADMINSECT=1m
DOCPREFIX=$(PREFIX)/doc
INIPREFIX=/etc/init.d
INITSCR=$(IRIXINITSCR)

else
ifeq "$(OS)" "hpux"

GROUP=wheel
PREFIX=/usr/local
MANPREFIX=$(PREFIX)/man
ADMINSECT=1m
DOCPREFIX=$(PREFIX)/doc
INIPREFIX=/sbin/init.d
INITSCR=$(SOLARISINITSCR)
INSTALL=$(SUDO)  ./install-sh -c

else
ifeq "$(OS)" "solaris"

GROUP=root
PREFIX=/usr/local
MANPREFIX=/usr/local/man
ADMINSECT=1m
DOCPREFIX=$(PREFIX)/doc
INIPREFIX=/etc/init.d
INITSCR=$(SOLARISINITSCR)
INSTALL=$(SUDO) ./install-sh -c
# Solaris package related
SOLPKGDIR=packages/solaris
PKGI=pkginfo
PKGII=${SOLPKGDIR}/${PKGI}-in
PTYP=prototype
PTYPI=${SOLPKGDIR}/${PTYP}-in
PKGMK=pkgmk
PKGTRANS=pkgtrans

else
ifeq "$(OS)" "freebsd"

GROUP=wheel
PREFIX=/usr/local
MANPREFIX=$(PREFIX)/man
ADMINSECT=8
DOCPREFIX=$(PREFIX)/share/doc
INIPREFIX=$(PREFIX)/etc/rc.d
INSTININAME=$(SDSD).sh
INITSCR=$(BSDINITSCR)
PORTDIR=packages/freebsd
PLIST=$(PORTDIR)/pkg-plist
PORTMK=$(PORTDIR)/Makefile
DISTFILEDIR=/usr/ports/distfiles
PKGOUT=$(PORTDIR)/$(DIST).tbz
PKGSHIP=pkgout/$(DIST)-freebsd-pkg.tbz

else
ifeq "$(OS)" "openbsd"

GROUP=wheel
PREFIX=/usr/local
MANPREFIX=$(PREFIX)/man
ADMINSECT=8
DOCPREFIX=$(PREFIX)/share/doc
INIPREFIX=$(PREFIX)/etc/rc.d
INSTININAME=$(SDSD).sh
INITSCR=$(BSDINITSCR)

PORTDIR=packages/openbsd
PLIST=$(PORTDIR)/pkg/PLIST
PORTMK=$(PORTDIR)/Makefile
DISTFILEDIR=/usr/ports/distfiles
PKGOUT=/usr/ports/packages/i386/All/$(DIST).tgz
PKGSHIP=pkgout/$(DIST)-openbsd-pkg.tgz

else
ifeq "$(OS)" "netbsd"

GROUP=wheel
PREFIX=/usr/pkg
PERLPATH=$(PREFIX)/bin/perl
MANPREFIX=$(PREFIX)/man
ADMINSECT=8
DOCPREFIX=$(PREFIX)/share/doc
INIPREFIX=$(PREFIX)/etc/rc.d
INSTININAME=$(SDSD)
INITSCR=$(NETBSDINITSCR)

PORTSRCDIR=packages/netbsd
PORTDIR=/usr/pkgsrc/security/sudoscript
PLIST=$(PORTDIR)/PLIST
PORTMK=$(PORTDIR)/Makefile
DISTFILEDIR=/usr/pkgsrc/distfiles
PKGOUT=/usr/pkgsrc/packages/All/$(DIST).tgz
PKGSHIP=pkgout/$(DIST)-netbsd-pkg.tgz


else
SUPPORTED=0
endif
endif
endif
endif
endif
endif
endif

ifeq "$(SSRPM)x" "x"
    DAEMONINSTARGS=-o root -g $(DGROUP)
    INSTARGS=-o root -g $(GROUP)
else
    DAEMONINSTARGS=
    INSTARGS=
    SUDO=
endif

INSTBIN=$(DESTDIR)$(PREFIX)/bin
INSTSBIN=$(DESTDIR)$(PREFIX)/sbin
INSTLIB=$(DESTDIR)$(PREFIX)/lib/sudoscript
INSTLIBFINAL=$(PREFIX)/lib/sudoscript
INSTMAN1=$(DESTDIR)$(MANPREFIX)/man1
INSTMAN3=$(DESTDIR)$(MANPREFIX)/man3
INSTMAN8=$(DESTDIR)$(MANPREFIX)/man$(ADMINSECT)
INSTDOC=$(DESTDIR)$(DOCPREFIX)/$(DIST)
INSTINI=$(DESTDIR)$(INIPREFIX)

SSPOD=$(SS).pod
SDSM8=$(SS).8
sdsM=$(sds).1
SDSM=$(SDS).1
SDSDM=$(SDSD).$(ADMINSECT)
SDSLM=$(SDSLr).3pm

MANS=$(SDSM) $(SDSM8) $(SDSDM) $(SDSLM)

# HTMLified mans
SDSHM=$(SDSM).html
SDSHM8=$(SDSM8).html
SDSDHM=$(SDSDM).html
SDSLHM=$(SDSLM).html
MANSHTML=$(SDSHM) $(SDSHM8) $(SDSDHM) $(SDSLHM)


# Perltidy'd sources
SDSH=$(SDS)-src.html
SDSDH=$(SDSD)-src.html
SDSLH=$(SDSL)-src.html
SRCHTML=$(SDSH) $(SDSDH) $(SDSLH)

# ;login paper
PAPER=PORCMOLSULB
PAPERSRC=${PAPER}.xml
PAPERHTM=${PAPER}.html
PAPERPDF=${PAPER}.pdf
PAPERFOP=${PAPER}.fo

# paper sources
PAPERS= $(PAPERSRC) \
	$(PAPERHTM) \
	$(PAPERPDF)
# paper targets
PAPERT= $(PAPERHTM) \
	$(PAPERPDF)

# Tools for xsl processing the paper and homepage
DTD=dtd/egbokdoc.dtd
XSLHTM=xsl/egbokdoc.xsl
XSLFOP=xsl/egbokdoc2fop.xsl
XMLSTUFF= 	$(DTD) \
		$(XSLHTM) \
		$(XSLFOP)
FOP=${HOME}/fop-0.20.3/fop.sh

# 2.0 architecture document
ARCH20GIF=2.0arch.gif
ARCH20SRC=2.0arch.xml
ARCH20HTM=2.0arch.html


DISTDOC=	README \
		INSTALL \
		PORTING \
		PROBLEMS \
		SUDOCONFIG \
		CHANGELOG \
		SECURITY \
		RELEASENOTES \
		$(MANSHTML) \
		$(SRCHTML) \
		$(PAPERS) \
		$(ARCH20GIF) \
		$(ARCH20SRC) \
		$(ARCH20HTM)


# Documents that we must build
DOCTARGETS=     $(MANS) \
		$(MANSHTML) \
		$(SRCHTML) \
		$(PAPERT) \
		$(ARCH20HTM)



# Sources required to build the RPMs
RPMDISTSRC= $(SRC) \
	$(LINUXINITSCR) \
	Makefile \
	sub_src.pl \
	sub_vers.pl \
	$(SSPOD) \
	$(DISTDOC) \
	$(PAPERS) \
	$(XMLSTUFF) \
	$(PERLTIDY)

# Files to include in the tarball distribution
DISTSRC= $(SRC)					\
	sub_src.pl				\
	sub_vers.pl				\
	$(SSPOD)				\
	$(SRCHTML)				\
	$(MANS)					\
	$(MANSHTML)				\
	$(IRIXINITSCR)				\
	$(LINUXINITSCR)				\
	$(SOLARISINITSCR)			\
	$(BSDINITSCR)				\
	$(NETBSDINITSCR)				\
	$(PKGII)				\
	$(PTYPI)				\
	Makefile				\
	install-sh				\
	$(ARCH20HTM)				\
	$(DISTDOC)				\
	$(PERLTIDY)



# Other tools we need

LN = $(SUDO) ln
TAR = $(SUDO) tar
RM =  $(SUDO) rm

# These come in a full Perl 5 installation
# (Oh, thank you, Sun. Can I have another?)
POD2MAN=pod2man
POD2HTML=pod2html

# perltidy is available at http://prdownloads.sourceforge.net/perltidy/
# but this older version doesn't require a module installation
PERLTIDY=./perltidy

# Default target checks OS and builds mans and some html pages
oscheck: $(SRCHTML) $(MANS) $(MANSHTML)
	@if [ "$(SUPPORTED)" != "1" ]; then \
	echo "Your OS isn't supported yet!";1; fi
# Dummy 'all' target for FreeBSD ports
all:
$(SDS): $(SDSI) 
	perl sub_src.pl $< $(PERLPATH) $(INSTLIBFINAL) > sdstmp
	perl sub_vers.pl $(VERSION) sdstmp $@
	rm -f sdstmp
$(SDSD): $(SDSDI) 
	perl sub_src.pl $< $(PERLPATH) $(INSTLIBFINAL) > sddtmp
	perl sub_vers.pl $(VERSION) sddtmp $@
	rm -f sddtmp

# Target to build all the documentation, including the ;login paper
doc: $(DOCTARGETS)

# HTML versions of source code via perltidy

$(SDSH): $(SDS)
	$(PERLTIDY) -html -st $< >$@

$(SDSDH): $(SDSD)
	$(PERLTIDY) -html -st $< >$@

$(SDSLH): $(SDSL)
	$(PERLTIDY) -html -st $< >$@

# Man pages

$(SDSM): $(SDS)
	$(POD2MAN) --section=1 $< > $@


$(SDSM8): $(SSPOD)
	$(POD2MAN) --section=8 $< > $@

$(SDSLM): $(SDSL)
	$(POD2MAN) --section=3pm $< > $@

$(SDSDM): $(SDSD)
	$(POD2MAN) --section=$(ADMINSECT) $< > $@


# HTML man pages

$(SDSHM): $(SDS)
	$(POD2HTML) $< > $@


$(SDSHM8): $(SSPOD)
	$(POD2HTML) $< > $@


$(SDSLHM): $(SDSL)
	$(POD2HTML) $< > $@

$(SDSDHM): $(SDSD)
	$(POD2HTML) $< > $@



# 2.0 architecture document
$(ARCH20HTM):	$(ARCH20SRC) $(DTD) $(XSLHTM)
	xalan $(ARCH20SRC) $(XSLHTM) $(ARCH20HTM)


# ;login paper
$(PAPERHTM):	$(PAPERSRC) $(DTD) $(XSLHTM)
	xalan $(PAPERSRC) $(XSLHTM) $(PAPERHTM)

$(PAPERPDF):	$(PAPERSRC) $(DTD) $(XSLFOP)
	xalan $(PAPERSRC) $(XSLFOP) $(PAPERFOP)
	$(FOP) $(PAPERFOP) $(PAPERPDF)


# Install section

# Create our installation directories if they don't exist
dircheck:
	if [ ! -d $(INSTBIN) ]; then $(SUDO) mkdir -p $(INSTBIN); fi
	if [ ! -d $(INSTSBIN) ]; then $(SUDO) mkdir -p $(INSTSBIN); fi
	if [ ! -d $(INSTLIB) ]; then $(SUDO) mkdir -p $(INSTLIB); fi
	if [ ! -d $(INSTMAN1) ]; then $(SUDO) mkdir -p $(INSTMAN1); fi
	if [ ! -d $(INSTMAN3) ]; then $(SUDO) mkdir -p $(INSTMAN3); fi
	if [ ! -d $(INSTMAN8) ]; then $(SUDO) mkdir -p $(INSTMAN8); fi
	if [ ! -d $(INSTDOC) ]; then $(SUDO) mkdir -p $(INSTDOC); fi
	if [ ! -d $(INSTDOC)/xsl ]; then $(SUDO) mkdir -p $(INSTDOC)/xsl; fi
	if [ ! -d $(INSTDOC)/dtd ]; then $(SUDO) mkdir -p $(INSTDOC)/dtd; fi
	if [ ! -d $(INSTINI) ]; then $(SUDO) mkdir -p $(INSTINI); fi


install: oscheck dircheck install-daemon install-program install-module install-mans install-init install-doc

install-daemon: $(SDSD)
	$(INSTALL) $(INSTDAEMONARGS) -m 700 $(SDSD) $(INSTSBIN)/$(SDSD);

install-program: $(SDS)
	$(INSTALL) $(INSTARGS) -m 755 $(SDS) $(INSTBIN)/$(SDS);
	$(RM) -f $(INSTBIN)/$(sds);
	$(LN) -sf $(SDS) $(INSTBIN)/$(sds);

install-module: $(SDSL)
	$(INSTALL)  $(INSTARGS) -m 755 $(SDSL) $(INSTLIB)/$(SDSL);

install-mans: 
	$(INSTALL) $(INSTARGS) -m 644 $(SDSM) $(INSTMAN1)/$(SDSM);
	$(RM) -f $(INSTMAN1)/$(sdsM);
	$(LN) -sf $(SDSM) $(INSTMAN1)/$(sdsM);
	$(INSTALL) $(INSTARGS) -m 644 $(SDSLM) $(INSTMAN3)/$(SDSLM);
	$(INSTALL) $(INSTARGS) -m 644 $(SDSDM) $(INSTMAN8)/$(SDSDM);
	$(INSTALL) $(INSTARGS) -m 644 $(SDSM8) $(INSTMAN8)/$(SDSM8);

install-init: $(INITSCR)
	$(INSTALL) $(INSTARGS) -m 755 $(INITSCR) $(INSTINI)/$(INSTININAME);

install-doc: $(DISTDOC) $(XMLSTUFF)
	for d in $(DISTDOC) $(SSPOD);  do \
	  $(INSTALL) $$d $(INSTDOC); \
	done
	$(INSTALL) $(DTD) $(INSTDOC)/dtd;
	$(INSTALL) $(XSLHTM) $(INSTDOC)/xsl;
	$(INSTALL) $(XSLFOP) $(INSTDOC)/xsl;


# (Free|Open)BSD port section

port:
	cp $(DISTTARBALL) $(DISTFILEDIR)
	perl  sub_vers.pl ${VERSION} $(PLIST)-in $(PLIST);
	perl  sub_vers.pl ${VERSION} $(PORTMK)-in $(PORTMK);
	(	cd $(PORTDIR); \
		make clean; \
		make makesum; \
		make package; \
		make clean \
	)
	mv $(PKGOUT) $(PKGSHIP)

# NetBSD port section

nbsdport:
	rm -fr $(PORTDIR)
	mkdir $(PORTDIR)
	(cd $(PORTSRCDIR);tar cf - .|(cd $(PORTDIR);tar xf -))
	cp $(DISTTARBALL) $(DISTFILEDIR)
	perl  sub_vers.pl ${VERSION} $(PLIST)-in $(PLIST);
	perl  sub_vers.pl ${VERSION} $(PORTMK)-in $(PORTMK);
	(	cd $(PORTDIR); \
		make clean; \
		make makesum; \
		make package; \
		make clean \
	)
	mv $(PKGOUT) $(PKGSHIP)

# Solaris package section

${PKGI}:		${PKGII} 
	perl sub_vers.pl ${VERSION} $< $@

${PTYP}:		${PTYPI} 
	perl sub_vers.pl ${VERSION} $< $@

solpkg:	${PKGI} ${PTYP} install
	${PKGMK} -o -f ${PTYP} EGsdosc
	${PKGTRANS} -o -s /var/spool/pkg ./EGsdosc-${VERSION} EGsdosc
	cp /var/spool/pkg/EGsdosc-${VERSION} pkgout
	gzip -f pkgout/EGsdosc-${VERSION}

# RPM section

# Substitute the dist names and revisions in the spec file
$(SPECFILE):	$(SPECFILESOURCE)
	perl sub_rpm.pl ${VMAJ} ${VMIN} ${VTEENY} ${VRPM} $< $@

# Grab the built RPMs
getrpms: 
	cp rpm/RPMS/noarch/* pkgout
	cp rpm/SRPMS/* pkgout

# Make the source tarball RPM wants
rpmdist:  $(RPMDISTSRC)
	mkdir $(DISTDIR)
	(tar cf - $(RPMDISTSRC)|(cd $(DISTDIR);tar xf -))
	tar cjf $(RPMDISTTARBALL) $(DISTDIR)
	rm -fr $(DISTDIR)

# Put the tarball where RPM expects it
prep-rpmtree: rpmdist
	rm -fr rpm
	mkdir -p rpm/SOURCES rpm/SPECS rpm//BUILD rpm/RPMS/noarch rpm/SRPMS 
	cp $(RPMDISTTARBALL) rpm/SOURCES
	cp $(SPECFILE) rpm/SPECS

# Build the RPMs
rpm: $(SRC)  $(SPECFILE) prep-rpmtree
	rpmbuild -ba --sign --define "_topdir `pwd`/rpm/" \
		--target noarch rpm/SPECS/$(SPECFILE)


# Tarball distribution section
# Make the tarball
dist: $(DISTSRC)
	mkdir $(DISTDIR)
	cp $(DISTSRC) $(DISTDIR)
	mkdir $(DISTDIR)/dtd
	cp $(DTD) $(DISTDIR)/dtd
	mkdir $(DISTDIR)/xsl
	cp $(XSLHTM) $(DISTDIR)/xsl
	cp $(XSLFOP) $(DISTDIR)/xsl
	cp -r packages $(DISTDIR)
	cp sub_dist.pl $(DISTDIR)
	cp sub_rpm.pl $(DISTDIR)
	perl sub_dist.pl $(DIST) $(DISTTARBALL) $(RPM) ${DISTDIR} $(CHANGEDOC)
	find ${DISTDIR} -type d -name CVS -print | xargs rm -fr
	mkdir $(DISTDIR)/pkgout
	tar czf $(DISTTARBALL) $(DISTDIR)
	rm -fr $(DISTDIR)


# Publish the distribution. (If this works for you,
# please let me know! 8)
ship:  
	scp  $(DISTTARBALL) \
		$(MANS) \
		$(MANSHTML) \
		$(SRCHTML) \
		$(INITSCRIPTS) \
		$(SRC) \
		pkgout/* \
		$(DISTDOC) \
	hbo@egbok.com:www/htdocs/sudoscript/

# Housekeeping
clean:
	rm -f *~ *.fo \#* $(DISTTARBALL) $(RPMDISTTARBALL) $(SPECFILE) 
	rm -fr $(DISTDIR) 
realclean: clean
	rm -f $(DOCTARGETS) $(RPM) $(SRPM) $(SDS) $(SDSD) $(MANS) $(MANSHTML)

