# $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)