1# $Id: Makefile,v 1.37 2004/11/22 16:09:39 hbo Exp $
2
3VMAJ=2
4VMIN=1
5VTEENY=2
6VRPM=1
7VERSION=${VMAJ}.${VMIN}.${VTEENY}
8
9DIST=sudoscript-${VERSION}
10
11# Tarballs
12DISTTARBALL=$(DIST).tar.gz
13RPMDISTTARBALL=$(DIST).tar.bz2
14
15
16
17# Names of the executable scripts we will install
18SS=sudoscript
19SDS= sudoshell
20SDSI=$(SDS)-in
21SDSD= $(SS)d
22SDSDI=$(SDSD)-in
23SDSLr= Sudoscript
24SDSL= $(SDSLr).pm
25sds=ss
26SRC= $(SDSI) $(SDSDI) $(SDSL)
27
28# Locations
29# The first of several gnumakeisms
30SRCDIR := $(shell pwd)
31
32DISTDIR=$(DIST)
33
34# Startup scripts
35BSDINITSCR=$(SDSD).bsd.rc
36NETBSDINITSCR=$(SDSD).netbsd.rc
37LINUXINITSCR=$(SDSD).linux.init
38IRIXINITSCR=$(SDSD).irix.init
39SOLARISINITSCR=$(SDSD).solaris.init
40INITSCRIPTS= $(BSDINITSCR) $(NETBSDINITSCR) $(LINUXINITSCR) $(SOLARISINITSCR)
41
42# Gnumakeism
43# Get the user's effective user id
44UID := $(shell perl -e 'print $$>')
45
46# Gnumakeism
47# If the user is root, don't use sudo
48ifeq "$(UID)" "0"
49else
50  SUDO=sudo
51endif
52
53INSTALL=$(SUDO) install
54# Default install locations (overridden below if needed)
55INSTINI=$(INSTETC)/init.d
56INSTININAME=$(SDSD)
57
58# We'll set this to 0 if we don't recognize the OS
59SUPPORTED=1
60
61PERLPATH=/usr/bin/perl
62
63# Gnumakeism
64# Get Perl's idea of the OS.
65OS := $(shell perl -e 'print $$^O')
66
67# Set install locations and file names based on OS
68
69ifeq "$(OS)" "linux"
70DISTRO := $(shell perl -e 'chomp($$_=`head -1 /etc/issue`);if (/^Debian/){print "debian"} elsif (/^Red Hat/){print "redhat"} else {print "unknown"}')
71
72ifeq "$(DISTRO)" "redhat"
73
74RPMPKGDIR=packages/redhat
75SPECFILE=sudoscript.spec
76SPECFILESOURCE=$(RPMPKGDIR)/$(SPECFILE).src
77RPM=$(DIST)-$(VRPM).noarch.rpm
78SRPM=$(DIST)-$(VRPM).src.rpm
79RPMS=$(RPM) $(SRPM)
80endif
81GROUP=root
82^PREFIX?=/usr
83MANPREFIX=$(PREFIX)/share/man
84ADMINSECT=8
85DOCPREFIX=$(PREFIX)/share/doc
86INIPREFIX=/etc/init.d
87INITSCR=$(LINUXINITSCR)
88
89else
90ifeq "$(OS)" "irix"
91
92GROUP=root
93^PREFIX?=/usr/local
94MANPREFIX=$(PREFIX)/man
95ADMINSECT=1m
96DOCPREFIX=$(PREFIX)/doc
97INIPREFIX=/etc/init.d
98INITSCR=$(IRIXINITSCR)
99
100else
101ifeq "$(OS)" "hpux"
102
103GROUP=wheel
104^PREFIX?=/usr/local
105MANPREFIX=$(PREFIX)/man
106ADMINSECT=1m
107DOCPREFIX=$(PREFIX)/doc
108INIPREFIX=/sbin/init.d
109INITSCR=$(SOLARISINITSCR)
110INSTALL=$(SUDO)  ./install-sh -c
111
112else
113ifeq "$(OS)" "solaris"
114
115GROUP=root
116^PREFIX?=/usr/local
117MANPREFIX=/usr/local/man
118ADMINSECT=1m
119DOCPREFIX=$(PREFIX)/doc
120INIPREFIX=/etc/init.d
121INITSCR=$(SOLARISINITSCR)
122INSTALL=$(SUDO) ./install-sh -c
123# Solaris package related
124SOLPKGDIR=packages/solaris
125PKGI=pkginfo
126PKGII=${SOLPKGDIR}/${PKGI}-in
127PTYP=prototype
128PTYPI=${SOLPKGDIR}/${PTYP}-in
129PKGMK=pkgmk
130PKGTRANS=pkgtrans
131
132else
133ifeq "$(OS)" "dragonfly"
134
135GROUP=wheel
136^PREFIX?=/usr/local
137MANPREFIX=$(PREFIX)/man
138ADMINSECT=8
139DOCPREFIX=$(PREFIX)/share/doc
140INIPREFIX=$(PREFIX)/etc/rc.d
141INSTININAME=$(SDSD).sh
142INITSCR=$(BSDINITSCR)
143PORTDIR=packages/dragonfly
144PLIST=$(PORTDIR)/pkg-plist
145PORTMK=$(PORTDIR)/Makefile
146DISTFILEDIR=/usr/ports/distfiles
147PKGOUT=$(PORTDIR)/$(DIST).tbz
148PKGSHIP=pkgout/$(DIST)-dragonfly-pkg.tbz
149
150else
151ifeq "$(OS)" "freebsd"
152
153GROUP=wheel
154^PREFIX?=/usr/local
155MANPREFIX=$(PREFIX)/man
156ADMINSECT=8
157DOCPREFIX=$(PREFIX)/share/doc
158INIPREFIX=$(PREFIX)/etc/rc.d
159INSTININAME=$(SDSD).sh
160INITSCR=$(BSDINITSCR)
161PORTDIR=packages/freebsd
162PLIST=$(PORTDIR)/pkg-plist
163PORTMK=$(PORTDIR)/Makefile
164DISTFILEDIR=/usr/ports/distfiles
165PKGOUT=$(PORTDIR)/$(DIST).tbz
166PKGSHIP=pkgout/$(DIST)-freebsd-pkg.tbz
167
168else
169ifeq "$(OS)" "openbsd"
170
171GROUP=wheel
172^PREFIX?=/usr/local
173MANPREFIX=$(PREFIX)/man
174ADMINSECT=8
175DOCPREFIX=$(PREFIX)/share/doc
176INIPREFIX=$(PREFIX)/etc/rc.d
177INSTININAME=$(SDSD).sh
178INITSCR=$(BSDINITSCR)
179
180PORTDIR=packages/openbsd
181PLIST=$(PORTDIR)/pkg/PLIST
182PORTMK=$(PORTDIR)/Makefile
183DISTFILEDIR=/usr/ports/distfiles
184PKGOUT=/usr/ports/packages/i386/All/$(DIST).tgz
185PKGSHIP=pkgout/$(DIST)-openbsd-pkg.tgz
186
187else
188ifeq "$(OS)" "netbsd"
189
190GROUP=wheel
191^PREFIX?=/usr/pkg
192PERLPATH=$(PREFIX)/bin/perl
193MANPREFIX=$(PREFIX)/man
194ADMINSECT=8
195DOCPREFIX=$(PREFIX)/share/doc
196INIPREFIX=$(PREFIX)/etc/rc.d
197INSTININAME=$(SDSD)
198INITSCR=$(NETBSDINITSCR)
199
200PORTSRCDIR=packages/netbsd
201PORTDIR=/usr/pkgsrc/security/sudoscript
202PLIST=$(PORTDIR)/PLIST
203PORTMK=$(PORTDIR)/Makefile
204DISTFILEDIR=/usr/pkgsrc/distfiles
205PKGOUT=/usr/pkgsrc/packages/All/$(DIST).tgz
206PKGSHIP=pkgout/$(DIST)-netbsd-pkg.tgz
207
208
209else
210SUPPORTED=0
211endif
212endif
213endif
214endif
215endif
216endif
217endif
218endif
219
220ifeq "$(SSRPM)x" "x"
221    DAEMONINSTARGS=-o root -g $(DGROUP)
222    INSTARGS=-o root -g $(GROUP)
223else
224    DAEMONINSTARGS=
225    INSTARGS=
226    SUDO=
227endif
228
229INSTBIN=$(DESTDIR)$(PREFIX)/bin
230INSTSBIN=$(DESTDIR)$(PREFIX)/sbin
231INSTLIB=$(DESTDIR)$(PREFIX)/lib/sudoscript
232INSTLIBFINAL=$(PREFIX)/lib/sudoscript
233INSTMAN1=$(DESTDIR)$(MANPREFIX)/man1
234INSTMAN3=$(DESTDIR)$(MANPREFIX)/man3
235INSTMAN8=$(DESTDIR)$(MANPREFIX)/man$(ADMINSECT)
236INSTDOC=$(DESTDIR)$(DOCPREFIX)/$(DIST)
237INSTINI=$(DESTDIR)$(INIPREFIX)
238
239SSPOD=$(SS).pod
240SDSM8=$(SS).8
241sdsM=$(sds).1
242SDSM=$(SDS).1
243SDSDM=$(SDSD).$(ADMINSECT)
244SDSLM=$(SDSLr).3pm
245
246MANS=$(SDSM) $(SDSM8) $(SDSDM) $(SDSLM)
247
248# HTMLified mans
249SDSHM=$(SDSM).html
250SDSHM8=$(SDSM8).html
251SDSDHM=$(SDSDM).html
252SDSLHM=$(SDSLM).html
253MANSHTML=$(SDSHM) $(SDSHM8) $(SDSDHM) $(SDSLHM)
254
255
256# Perltidy'd sources
257SDSH=$(SDS)-src.html
258SDSDH=$(SDSD)-src.html
259SDSLH=$(SDSL)-src.html
260SRCHTML=$(SDSH) $(SDSDH) $(SDSLH)
261
262# ;login paper
263PAPER=PORCMOLSULB
264PAPERSRC=${PAPER}.xml
265PAPERHTM=${PAPER}.html
266PAPERPDF=${PAPER}.pdf
267PAPERFOP=${PAPER}.fo
268
269# paper sources
270PAPERS= $(PAPERSRC) \
271	$(PAPERHTM) \
272	$(PAPERPDF)
273# paper targets
274PAPERT= $(PAPERHTM) \
275	$(PAPERPDF)
276
277# Tools for xsl processing the paper and homepage
278DTD=dtd/egbokdoc.dtd
279XSLHTM=xsl/egbokdoc.xsl
280XSLFOP=xsl/egbokdoc2fop.xsl
281XMLSTUFF= 	$(DTD) \
282		$(XSLHTM) \
283		$(XSLFOP)
284FOP=${HOME}/fop-0.20.3/fop.sh
285
286# 2.0 architecture document
287ARCH20GIF=2.0arch.gif
288ARCH20SRC=2.0arch.xml
289ARCH20HTM=2.0arch.html
290
291
292DISTDOC=	README \
293		INSTALL \
294		PORTING \
295		PROBLEMS \
296		SUDOCONFIG \
297		CHANGELOG \
298		SECURITY \
299		RELEASENOTES \
300		$(MANSHTML) \
301		$(SRCHTML) \
302		$(PAPERS) \
303		$(ARCH20GIF) \
304		$(ARCH20SRC) \
305		$(ARCH20HTM)
306
307
308# Documents that we must build
309DOCTARGETS=     $(MANS) \
310		$(MANSHTML) \
311		$(SRCHTML) \
312		$(PAPERT) \
313		$(ARCH20HTM)
314
315
316
317# Sources required to build the RPMs
318RPMDISTSRC= $(SRC) \
319	$(LINUXINITSCR) \
320	Makefile \
321	sub_src.pl \
322	sub_vers.pl \
323	$(SSPOD) \
324	$(DISTDOC) \
325	$(PAPERS) \
326	$(XMLSTUFF) \
327	$(PERLTIDY)
328
329# Files to include in the tarball distribution
330DISTSRC= $(SRC)					\
331	sub_src.pl				\
332	sub_vers.pl				\
333	$(SSPOD)				\
334	$(SRCHTML)				\
335	$(MANS)					\
336	$(MANSHTML)				\
337	$(IRIXINITSCR)				\
338	$(LINUXINITSCR)				\
339	$(SOLARISINITSCR)			\
340	$(BSDINITSCR)				\
341	$(NETBSDINITSCR)				\
342	$(PKGII)				\
343	$(PTYPI)				\
344	Makefile				\
345	install-sh				\
346	$(ARCH20HTM)				\
347	$(DISTDOC)				\
348	$(PERLTIDY)
349
350
351
352# Other tools we need
353
354LN = $(SUDO) ln
355TAR = $(SUDO) tar
356RM =  $(SUDO) rm
357
358# These come in a full Perl 5 installation
359# (Oh, thank you, Sun. Can I have another?)
360POD2MAN=pod2man
361POD2HTML=pod2html
362
363# perltidy is available at http://prdownloads.sourceforge.net/perltidy/
364# but this older version doesn't require a module installation
365PERLTIDY=./perltidy
366
367# Default target checks OS and builds mans and some html pages
368oscheck: $(SRCHTML) $(MANS) $(MANSHTML)
369	@if [ "$(SUPPORTED)" != "1" ]; then \
370	echo "Your OS isn't supported yet!";1; fi
371# Dummy 'all' target for FreeBSD ports
372all:
373$(SDS): $(SDSI)
374	perl sub_src.pl $< $(PERLPATH) $(INSTLIBFINAL) > sdstmp
375	perl sub_vers.pl $(VERSION) sdstmp $@
376	rm -f sdstmp
377$(SDSD): $(SDSDI)
378	perl sub_src.pl $< $(PERLPATH) $(INSTLIBFINAL) > sddtmp
379	perl sub_vers.pl $(VERSION) sddtmp $@
380	rm -f sddtmp
381
382# Target to build all the documentation, including the ;login paper
383doc: $(DOCTARGETS)
384
385# HTML versions of source code via perltidy
386
387$(SDSH): $(SDS)
388	$(PERLTIDY) -html -st $< >$@
389
390$(SDSDH): $(SDSD)
391	$(PERLTIDY) -html -st $< >$@
392
393$(SDSLH): $(SDSL)
394	$(PERLTIDY) -html -st $< >$@
395
396# Man pages
397
398$(SDSM): $(SDS)
399	$(POD2MAN) --section=1 $< > $@
400
401
402$(SDSM8): $(SSPOD)
403	$(POD2MAN) --section=8 $< > $@
404
405$(SDSLM): $(SDSL)
406	$(POD2MAN) --section=3pm $< > $@
407
408$(SDSDM): $(SDSD)
409	$(POD2MAN) --section=$(ADMINSECT) $< > $@
410
411
412# HTML man pages
413
414$(SDSHM): $(SDS)
415	$(POD2HTML) $< > $@
416
417
418$(SDSHM8): $(SSPOD)
419	$(POD2HTML) $< > $@
420
421
422$(SDSLHM): $(SDSL)
423	$(POD2HTML) $< > $@
424
425$(SDSDHM): $(SDSD)
426	$(POD2HTML) $< > $@
427
428
429
430# 2.0 architecture document
431$(ARCH20HTM):	$(ARCH20SRC) $(DTD) $(XSLHTM)
432	xalan $(ARCH20SRC) $(XSLHTM) $(ARCH20HTM)
433
434
435# ;login paper
436$(PAPERHTM):	$(PAPERSRC) $(DTD) $(XSLHTM)
437	xalan $(PAPERSRC) $(XSLHTM) $(PAPERHTM)
438
439$(PAPERPDF):	$(PAPERSRC) $(DTD) $(XSLFOP)
440	xalan $(PAPERSRC) $(XSLFOP) $(PAPERFOP)
441	$(FOP) $(PAPERFOP) $(PAPERPDF)
442
443
444# Install section
445
446# Create our installation directories if they don't exist
447dircheck:
448	if [ ! -d $(INSTBIN) ]; then $(SUDO) mkdir -p $(INSTBIN); fi
449	if [ ! -d $(INSTSBIN) ]; then $(SUDO) mkdir -p $(INSTSBIN); fi
450	if [ ! -d $(INSTLIB) ]; then $(SUDO) mkdir -p $(INSTLIB); fi
451	if [ ! -d $(INSTMAN1) ]; then $(SUDO) mkdir -p $(INSTMAN1); fi
452	if [ ! -d $(INSTMAN3) ]; then $(SUDO) mkdir -p $(INSTMAN3); fi
453	if [ ! -d $(INSTMAN8) ]; then $(SUDO) mkdir -p $(INSTMAN8); fi
454	if [ ! -d $(INSTDOC) ]; then $(SUDO) mkdir -p $(INSTDOC); fi
455	if [ ! -d $(INSTDOC)/xsl ]; then $(SUDO) mkdir -p $(INSTDOC)/xsl; fi
456	if [ ! -d $(INSTDOC)/dtd ]; then $(SUDO) mkdir -p $(INSTDOC)/dtd; fi
457	if [ ! -d $(INSTINI) ]; then $(SUDO) mkdir -p $(INSTINI); fi
458
459
460install: oscheck dircheck install-daemon install-program install-module install-mans install-init install-doc
461
462install-daemon: $(SDSD)
463	$(INSTALL) $(INSTDAEMONARGS) -m 700 $(SDSD) $(INSTSBIN)/$(SDSD);
464
465install-program: $(SDS)
466	$(INSTALL) $(INSTARGS) -m 755 $(SDS) $(INSTBIN)/$(SDS);
467	$(RM) -f $(INSTBIN)/$(sds);
468	$(LN) -sf $(SDS) $(INSTBIN)/$(sds);
469
470install-module: $(SDSL)
471	$(INSTALL)  $(INSTARGS) -m 755 $(SDSL) $(INSTLIB)/$(SDSL);
472
473install-mans:
474	$(INSTALL) $(INSTARGS) -m 644 $(SDSM) $(INSTMAN1)/$(SDSM);
475	$(RM) -f $(INSTMAN1)/$(sdsM);
476	$(LN) -sf $(SDSM) $(INSTMAN1)/$(sdsM);
477	$(INSTALL) $(INSTARGS) -m 644 $(SDSLM) $(INSTMAN3)/$(SDSLM);
478	$(INSTALL) $(INSTARGS) -m 644 $(SDSDM) $(INSTMAN8)/$(SDSDM);
479	$(INSTALL) $(INSTARGS) -m 644 $(SDSM8) $(INSTMAN8)/$(SDSM8);
480
481install-init: $(INITSCR)
482	$(INSTALL) $(INSTARGS) -m 755 $(INITSCR) $(INSTINI)/$(INSTININAME);
483
484install-doc: $(DISTDOC) $(XMLSTUFF)
485	for d in $(DISTDOC) $(SSPOD);  do \
486	  $(INSTALL) $$d $(INSTDOC); \
487	done
488	$(INSTALL) $(DTD) $(INSTDOC)/dtd;
489	$(INSTALL) $(XSLHTM) $(INSTDOC)/xsl;
490	$(INSTALL) $(XSLFOP) $(INSTDOC)/xsl;
491
492
493# (Free|Open)BSD port section
494
495port:
496	cp $(DISTTARBALL) $(DISTFILEDIR)
497	perl  sub_vers.pl ${VERSION} $(PLIST)-in $(PLIST);
498	perl  sub_vers.pl ${VERSION} $(PORTMK)-in $(PORTMK);
499	(	cd $(PORTDIR); \
500		make clean; \
501		make makesum; \
502		make package; \
503		make clean \
504	)
505	mv $(PKGOUT) $(PKGSHIP)
506
507# NetBSD port section
508
509nbsdport:
510	rm -fr $(PORTDIR)
511	mkdir $(PORTDIR)
512	(cd $(PORTSRCDIR);tar cf - .|(cd $(PORTDIR);tar xf -))
513	cp $(DISTTARBALL) $(DISTFILEDIR)
514	perl  sub_vers.pl ${VERSION} $(PLIST)-in $(PLIST);
515	perl  sub_vers.pl ${VERSION} $(PORTMK)-in $(PORTMK);
516	(	cd $(PORTDIR); \
517		make clean; \
518		make makesum; \
519		make package; \
520		make clean \
521	)
522	mv $(PKGOUT) $(PKGSHIP)
523
524# Solaris package section
525
526${PKGI}:		${PKGII}
527	perl sub_vers.pl ${VERSION} $< $@
528
529${PTYP}:		${PTYPI}
530	perl sub_vers.pl ${VERSION} $< $@
531
532solpkg:	${PKGI} ${PTYP} install
533	${PKGMK} -o -f ${PTYP} EGsdosc
534	${PKGTRANS} -o -s /var/spool/pkg ./EGsdosc-${VERSION} EGsdosc
535	cp /var/spool/pkg/EGsdosc-${VERSION} pkgout
536	gzip -f pkgout/EGsdosc-${VERSION}
537
538# RPM section
539
540# Substitute the dist names and revisions in the spec file
541$(SPECFILE):	$(SPECFILESOURCE)
542	perl sub_rpm.pl ${VMAJ} ${VMIN} ${VTEENY} ${VRPM} $< $@
543
544# Grab the built RPMs
545getrpms:
546	cp rpm/RPMS/noarch/* pkgout
547	cp rpm/SRPMS/* pkgout
548
549# Make the source tarball RPM wants
550rpmdist:  $(RPMDISTSRC)
551	mkdir $(DISTDIR)
552	(tar cf - $(RPMDISTSRC)|(cd $(DISTDIR);tar xf -))
553	tar cjf $(RPMDISTTARBALL) $(DISTDIR)
554	rm -fr $(DISTDIR)
555
556# Put the tarball where RPM expects it
557prep-rpmtree: rpmdist
558	rm -fr rpm
559	mkdir -p rpm/SOURCES rpm/SPECS rpm//BUILD rpm/RPMS/noarch rpm/SRPMS
560	cp $(RPMDISTTARBALL) rpm/SOURCES
561	cp $(SPECFILE) rpm/SPECS
562
563# Build the RPMs
564rpm: $(SRC)  $(SPECFILE) prep-rpmtree
565	rpmbuild -ba --sign --define "_topdir `pwd`/rpm/" \
566		--target noarch rpm/SPECS/$(SPECFILE)
567
568
569# Tarball distribution section
570# Make the tarball
571dist: $(DISTSRC)
572	mkdir $(DISTDIR)
573	cp $(DISTSRC) $(DISTDIR)
574	mkdir $(DISTDIR)/dtd
575	cp $(DTD) $(DISTDIR)/dtd
576	mkdir $(DISTDIR)/xsl
577	cp $(XSLHTM) $(DISTDIR)/xsl
578	cp $(XSLFOP) $(DISTDIR)/xsl
579	cp -r packages $(DISTDIR)
580	cp sub_dist.pl $(DISTDIR)
581	cp sub_rpm.pl $(DISTDIR)
582	perl sub_dist.pl $(DIST) $(DISTTARBALL) $(RPM) ${DISTDIR} $(CHANGEDOC)
583	find ${DISTDIR} -type d -name CVS -print | xargs rm -fr
584	mkdir $(DISTDIR)/pkgout
585	tar czf $(DISTTARBALL) $(DISTDIR)
586	rm -fr $(DISTDIR)
587
588
589# Publish the distribution. (If this works for you,
590# please let me know! 8)
591ship:
592	scp  $(DISTTARBALL) \
593		$(MANS) \
594		$(MANSHTML) \
595		$(SRCHTML) \
596		$(INITSCRIPTS) \
597		$(SRC) \
598		pkgout/* \
599		$(DISTDOC) \
600	hbo@egbok.com:www/htdocs/sudoscript/
601
602# Housekeeping
603clean:
604	rm -f *~ *.fo \#* $(DISTTARBALL) $(RPMDISTTARBALL) $(SPECFILE)
605	rm -fr $(DISTDIR)
606realclean: clean
607	rm -f $(DOCTARGETS) $(RPM) $(SRPM) $(SDS) $(SDSD) $(MANS) $(MANSHTML)
608
609