VERSION=        0.2.10
RPMRELEASE=	1
DEBRELEASE=	1
CYGRELEASE=	1

#----------------------------------------------------------------------
# Table of contents
#
#   Build, test, and install targets
#   Selfcompilation targets
#   Distribution targets
#   Debugging targets
#   Cleaning targets
#----------------------------------------------------------------------


#----------------------------------------------------------------------
# Build, test, and install targets
#
# 'make'
#    Compile the Logiweb Abstrac Machine (lgwam)
# 'make test'
#    Run testsuite
# 'make install' (as root)
#    Install lgwam, lgc, man pages, and example source files
# 'make uninstall' (as root)
#    Remove the above
# 'make pages.c'
#    Regenerate pages.c using CLISP
#----------------------------------------------------------------------

.PHONY:		all check test gctest install version self self1 fix fix1

# If you change DESTDIR, remember to make *suitable* consequential
# changes, c.f. the README
DESTDIR=

BINDIR=		${DESTDIR}/usr/bin
MANDIR=		${DESTDIR}/usr/share/man
DOCDIR=		${DESTDIR}/usr/share/doc/logiweb
CFLAGS=
CC=		gcc ${CFLAGS} -ldl -DVERSION=${VERSION}
XXD=		xxd
CPTIME=		cp --preserve=timestamps
SELFARG=	-r ../self/logiweb/: -l ../self/name/: \
		-p ../self/logiweb/:/rack.lgr -n ../self/name/:/rack.lgr
all:		version src/lgwam
src/lgwam:	src/lgwam.c src/pages.c
		${CC} -o src/lgwam src/lgwam.c
full:		version
		${CC} -DFULL_TESTSUITE -o src/lgwam src/lgwam.c
check:		test
test:		version src/lgwam
		cd src/testsuite;./test
# lgwam is invoked using #!/usr/bin/lgwam, so its path is hardcoded
install:
		mkdir -p ${DESTDIR}/usr/bin
		${CPTIME} -f src/lgwam ${DESTDIR}/usr/bin
		mkdir -p ${BINDIR}
		${CPTIME} -f src/lgc ${BINDIR}
		mkdir -p ${MANDIR}
		${CPTIME} -r -f doc/man/* ${MANDIR}
		mkdir -p ${DOCDIR}/examples
		${CPTIME} -r -f src/testsuite/pages/* ${DOCDIR}/examples
		${CPTIME} -r -f src/*.lgs ${DOCDIR}/examples
		${CPTIME} -f src/logiweb.* ${DOCDIR}/examples
		${CPTIME} -f src/version ${DOCDIR}/examples
pages:
		${MAKE} -C /usr/share/doc/logiweb/examples
uninstall:
		rm -f ${BINDIR}/lgc
		rm -f ${DESTDIR}/usr/bin/lgwam
		rm -f ${MANDIR}/man1/lgc.1*
		rm -f ${MANDIR}/man1/lgwam.1*
		rm -f ${MANDIR}/man5/lgc.5*
		rm -f ${MANDIR}/man5/lgc.conf.5*
		rm -f ${MANDIR}/man5/logiweb.5*
		rm -f ${MANDIR}/man7/logiweb.7*
		rm -r -f ${DOCDIR}
version:
		echo "${VERSION}" > src/version
src/pages.c:
		# Clean up after previous build, if any
		rm -r -f src/boot1
		# Use CLISP to generate first lgc
		cp -r src/boot src/boot1
		cp src/logiweb.* src/boot1/lgc
		cd src/boot1 ; \
		env logiweb_httphost=127.0.0.1 \
		env LD_LIBRARY_PATH=../common:./common \
		clisp make lgc-only
		if [ -e src/boot1/lgc/lgc.exe ]; \
		then editbin /STACK:20111000:20111000 src/boot1/lgc/lgc.exe; fi
		# Use first lgc to generate
		#   second lgc
		#   first pages.c
		#   first lgwam
		cp src/lgwam.c src/boot1/lgc/build/src
		cp src/version src/boot1/lgc/build/src
		cd src/boot1/lgc ; ${MAKE} build/src/lgwam
		# Use second lgc to generate
		#   third lgc
		#   second pages.c
		#   second lgwam
		# Ignore the warning that first and second
		# pages.c differ
		cp makefile src/boot1/lgc/build
		cp src/*.lgs src/boot1/lgc/build/src
		cp src/logiweb.* src/boot1/lgc/build/src
		cd src/boot1/lgc/build ; ${MAKE} self
		# Copy result
		cp src/boot1/lgc/build/self/src/pages.c src/pages.c
		cp src/boot1/lgc/build/self/src/lgc src/lgc
		# Clean up
		rm -r -f src/boot1

#----------------------------------------------------------------------
# Selfcompilation targets
#
# make self
#   Compile lgc using lgc itself
#   Then print a note if current and new lgc differ
#   The current lgc is in src/lgc
#   The new lgc ends up in src/self/lgc
# make fix
#   Keep invoking self until a fixpoint is reached (if ever)
#   The current lgc is in src/lgc
#   The fixpoint ends up in src/self/lgc
#
# To use these targets:
# Invoke 'make self' or 'make fix'.
# Move self/ out of . and give is a reasonable name like logiweb-7.9.13
# Delete . if you want to get rid of the old version
#----------------------------------------------------------------------

self:		self1
		diff -q -x self -r . self || exit 0
self1:		clean version src/lgwam
		mkdir .self
		cp -r * .self
		mv .self self
		cd src ; ./lgwam script lgc base.lgs ${SELFARG}
		cd src ; ./lgwam script lgc lgc.lgs ${SELFARG}
		cp -f src/base.lgs self/src/base.lgs
		cp -f src/lgc.lgs self/src/lgc.lgs
		cd self ; cp -f name/lgc/page/bin/lgc src/lgc
		cd self ; cat name/base/rack.lgr name/lgc/rack.lgr > src/pages
		cd self/src ; xxd -i pages pages.c
		${MAKE} -C self almostclean
		${MAKE} almostclean
fix:		self1
		diff -q -x self -r . self || ${MAKE} fix1
fix1:
		${MAKE} -C self fix
		rm -r -f .self
		mv self/self .self
		rm -r -f self
		mv .self self

#----------------------------------------------------------------------
# Distribution targets
#
# make gz
#   make .tar.gz tarball
# make bz2
#   make .tar.bz2 tarball
# make rpm
#   Make Rpm Package Manager (RPM) package (.rpm)
# make deb
#   Make Debian package (.deb)
# make cyg
#   Make Cygwin package
#----------------------------------------------------------------------

.PHONY: 	dist
DIR=		logiweb-${VERSION}
RPM=		logiweb-${VERSION}-${RPMRELEASE}
DEB=		logiweb-${VERSION}-${DEBRELEASE}
CYG=		logiweb-${VERSION}-${CYGRELEASE}
ARCH=		x86_64
#ARCH=		i386
DATE:=		GRD-`date --rfc-3339=date`

dist:
		@echo
		@echo "Use one of these:"
		@echo
		@echo "     make gz  (make .tar.gz archive)"
		@echo "     make bz2 (make .tar.bz2 archive)"
		@echo "(*)  make rpm (make RPM and yum repository)"
		@echo "(*)  make deb (make Debian package)"
		@echo "(*)  make cyg (make Cygwin package)"
		@echo
		@echo "(*) Run on 'native' platform"
		@echo
gz:		clean
		rm -r -f dist/gz
		mkdir -p dist/gz
		rm -f ${DIR}
		ln -s . ${DIR}
		tar -chf ${DIR}.tar ${DIR} \
		--exclude ${DIR}/${DIR} \
		--exclude ${DIR}/${DIR}.tar \
		--exclude ${DIR}/dist
		gzip ${DIR}.tar
		rm -f ${DIR}
		mv ${DIR}.tar.gz dist/gz
bz2:		clean
		rm -r -f dist/bz2
		mkdir -p dist/bz2
		rm -f ${DIR}
		ln -s . ${DIR}
		tar -chf ${DIR}.tar ${DIR} \
		--exclude ${DIR}/${DIR} \
		--exclude ${DIR}/${DIR}.tar \
		--exclude ${DIR}/dist
		bzip2 ${DIR}.tar
		rm -f ${DIR}
		mv ${DIR}.tar.bz2 dist/bz2
rpm:		bz2
# Make RPM
		mkdir -p rpm/BUILD
		mkdir -p rpm/RPMS
		mkdir -p rpm/SOURCES
		mkdir -p rpm/SPECS
		mkdir -p rpm/SRPMS
		cp dist/bz2/${DIR}.tar.bz2 rpm/SOURCES
		cp src/dist/yum/rpmspec rpm/SPECS/logiweb.spec
		perl -pi -e "s/VERSION/${VERSION}/g" rpm/SPECS/logiweb.spec
		perl -pi -e "s/RELEASE/${RPMRELEASE}/g" rpm/SPECS/logiweb.spec
		rm -r -f dist/yum
		mkdir -p dist/yum
		cp rpm/SPECS/logiweb.spec dist/yum
		mkdir -p fakehome
		cp -r ~/.gnupg fakehome
		cp src/dist/yum/rpmmacros fakehome/.rpmmacros
		perl -pi -e "s!PWD!${PWD}!g" fakehome/.rpmmacros
		env HOME=${PWD}/fakehome \
		rpmbuild -ba rpm/SPECS/logiweb.spec
# Make yast repository
		mkdir -p dist/yum/${ARCH}
		mkdir -p dist/yum/src
		cp rpm/RPMS/*/*${ARCH}.rpm dist/yum/${ARCH}
		cp rpm/SRPMS/*.rpm dist/yum/src
		env HOME=${PWD}/fakehome rpm --addsign \
		dist/yum/${ARCH}/logiweb-${VERSION}-${RPMRELEASE}*.${ARCH}.rpm
		createrepo dist/yum
		gpg -a --detach-sign dist/yum/repodata/repomd.xml
		cp ~/.gnupg/rpm-gpg-key dist/yum/repodata/repomd.xml.key
		rm -r -f fakehome
		rm -r -f rpm
rpmtest1:
		cd dist/yum/${ARCH}; \
		rpmlint -i logiweb-${VERSION}-${RPMRELEASE}*.${ARCH}.rpm
rpmtest2:
		cd dist/yum/src; \
		rpmlint -i logiweb-${VERSION}-${RPMRELEASE}*.src.rpm
rpmtest3:
		cd dist/yum/src; mock -r fedora-11-x86_64 rebuild \
		logiweb-${VERSION}-${RPMRELEASE}*.src.rpm
rpmtest4:
		cd dist/yum/src; mock -r fedora-11-i386 rebuild \
		logiweb-${VERSION}-${RPMRELEASE}*.src.rpm
rpminstall:
		sudo rpm -i dist/yum/x86_64/logiweb-0.2.*.rpm
rpmuninstall:
		sudo rpm -e logiweb
deb:		gz debclean
		mkdir -p dist/deb
		cp dist/gz/logiweb-${VERSION}.tar.gz dist/deb
		cp dist/deb/logiweb-${VERSION}.tar.gz \
		dist/deb/logiweb_${VERSION}.orig.tar.gz
		cd dist/deb; tar zxf logiweb-${VERSION}.tar.gz
		cp -r src/dist/deb/debian dist/deb/logiweb-${VERSION}
		cd dist/deb/logiweb-${VERSION}; dpkg-buildpackage -rfakeroot
		cd dist/deb; \
		dpkg-scanpackages . /dev/null | gzip -9c >  Packages.gz
		cd dist/deb; \
		dpkg-scansources . /dev/null | gzip -9c >  Sources.gz
debtest:	debtest2 debtest3 debtest4 debtest5 debtestp debtest1
debtestp:
		@echo "---------------------"
		ls /var/cache/pbuilder/*/result
		@echo "---------------------"
debtest1:
		cd dist/deb; \
		lintian -i logiweb_${VERSION}-${DEBRELEASE}_amd64.changes
DEBPACK=	"dist/deb/logiweb_${VERSION}-${DEBRELEASE}.dsc"
DEBCONF=	--configfile src/dist/deb/pbuilderrc
debtest2:
		sudo rm -r -f /var/cache/pbuilder/hardy-amd64/result
		if [ -e /var/cache/pbuilder/hardy-amd64-base.tgz ] ; then \
		sudo DIST=hardy ARCH=amd64 pbuilder update ${DEBCONF} ; else \
		sudo DIST=hardy ARCH=amd64 pbuilder create ${DEBCONF} ; fi
		sudo DIST=hardy ARCH=amd64 pbuilder build ${DEBCONF} ${DEBPACK}
		ls /var/cache/pbuilder/hardy-amd64/result
debtest3:
		sudo rm -r -f /var/cache/pbuilder/hardy-i386/result
		if [ -e /var/cache/pbuilder/hardy-i386-base.tgz ] ; then \
		sudo DIST=hardy ARCH=i386 pbuilder update ${DEBCONF} ; else \
		sudo DIST=hardy ARCH=i386 pbuilder create ${DEBCONF} ; fi
		sudo DIST=hardy ARCH=i386 pbuilder build ${DEBCONF} ${DEBPACK}
		ls /var/cache/pbuilder/hardy-i386/result
debtest4:
		sudo rm -r -f /var/cache/pbuilder/sid-amd64/result
		if [ -e /var/cache/pbuilder/sid-amd64-base.tgz ] ; then \
		sudo DIST=sid ARCH=amd64 pbuilder update ${DEBCONF} ; else \
		sudo DIST=sid ARCH=amd64 pbuilder create ${DEBCONF} ; fi
		sudo DIST=sid ARCH=amd64 pbuilder build ${DEBCONF} ${DEBPACK}
		ls /var/cache/pbuilder/sid-amd64/result
debtest5:
		sudo rm -r -f /var/cache/pbuilder/sid-i386/result
		if [ -e /var/cache/pbuilder/sid-i386-base.tgz ] ; then \
		sudo DIST=sid ARCH=i386 pbuilder update ${DEBCONF} ; else \
		sudo DIST=sid ARCH=i386 pbuilder create ${DEBCONF} ; fi
		sudo DIST=sid ARCH=i386 pbuilder build ${DEBCONF} ${DEBPACK}
		ls /var/cache/pbuilder/sid-i386/result
# debtest2:
#		cd dist/deb; \
#		sudo rm -r -f /var/cache/pbuilder/result/ ; \
#		if [ -e /var/cache/pbuilder/base.tgz ] ; then \
#		sudo pbuilder update --components "main universe" \
#		--override-config ; else \
#		sudo pbuilder create --components "main universe" ; fi ; \
#		sudo pbuilder build logiweb_${VERSION}-${DEBRELEASE}.dsc
#		ls /var/cache/pbuilder/result/
# Use debtest2a (pbuilder create) first time
# debtest2a:
#		cd dist/deb; sudo pbuilder create
#		cd dist/deb; sudo pbuilder build logiweb_${VERSION}-1.dsc
#		ls /var/cache/pbuilder/result/
# Use debtest2b (pbuilder update) after first time
# debtest2b:
#		cd dist/deb; sudo pbuilder update
#		cd dist/deb; sudo pbuilder build logiweb_${VERSION}-1.dsc
#		ls /var/cache/pbuilder/result/
debclean:
		rm -r -f dist/deb
cyg:		gz all
		rm -r -f dist/cyg/
		mkdir -p dist/cyg/
		cd dist/cyg ; tar zxf ../gz/${DIR}.tar.gz
		cd dist/cyg ; cp -r ${DIR} ${CYG}
		cp src/dist/cygwin/README dist/cyg/${CYG}/${CYG}.README
		cp src/dist/cygwin/configure dist/cyg/${CYG}/configure
		mkdir -p dist/cyg/${CYG}/CYGWIN-PATCHES
		cp src/dist/cygwin/setup.hint \
		dist/cyg/${CYG}/CYGWIN-PATCHES/
		- cd dist/cyg ; diff -Nrup ${DIR} ${CYG} > ${CYG}.patch
		cd dist/cyg ; tar -cf ${CYG}.tar ${CYG} ${CYG}.patch
		cd dist/cyg ; bzip2 ${CYG}.tar
		cd dist/cyg ; mv ${CYG}.tar.bz2 ${CYG}-src.tar.bz2
		rm -r dist/cyg/${DIR}
		rm -r dist/cyg/${CYG}
		rm dist/cyg/${CYG}.patch
		cp src/dist/cygwin/setup.hint dist/cyg/
		mkdir -p dist/cyg/bin/usr/bin
		mv src/lgwam.exe dist/cyg/bin/usr/bin/
		cp src/lgc dist/cyg/bin/usr/bin/
		mkdir -p dist/cyg/bin/usr/share
		cp -r doc/man dist/cyg/bin/usr/share/
		mkdir -p dist/cyg/bin/usr/share/doc/Cygwin
		cp src/dist/cygwin/README \
		dist/cyg/bin/usr/share/doc/Cygwin/${CYG}.README
		mkdir -p dist/cyg/bin/usr/share/doc/${CYG}
		cp CHANGELOG dist/cyg/bin/usr/share/doc/${CYG}/
		mkdir -p dist/cyg/bin/usr/share/doc/logiweb/examples
		cp -r src/testsuite/pages/* \
		dist/cyg/bin/usr/share/doc/logiweb/examples
		cp -r src/*.lgs dist/cyg/bin/usr/share/doc/logiweb/examples
		cp src/logiweb.* dist/cyg/bin/usr/share/doc/logiweb/examples
		cp src/version dist/cyg/bin/usr/share/doc/logiweb/examples
		cd dist/cyg/bin ; tar -cf ${CYG}.tar * --exclude ${CYG}.tar
		mv dist/cyg/bin/${CYG}.tar dist/cyg
		bzip2 dist/cyg/${CYG}.tar
		rm -r dist/cyg/bin
		rm -r -f dist/cygwin
		mkdir -p dist/cygwin/dist
		mv dist/cyg dist/cygwin/dist/logiweb
		cp src/dist/cygwin/setup.exe dist/cygwin/

		cd dist/cygwin ; perl ../../src/dist/cygwin/genini.txt \
		--output=setup dist/logiweb
		cp dist/cygwin/setup dist/cygwin/setup.ini
		bzip2 dist/cygwin/setup
cygtest:
		scp -r dist/cygwin/* ydun:/var/www/html/grue/cygwin
		@echo
		@echo "Run insecure setup.exe on http://logiweb.eu/grue/cygwin"
		@echo

#----------------------------------------------------------------------
# Debugging targets
#
# make gctest
#   Run built in testsuite with garbarge collection for each
#   allocation. Useful for finding bugs where the garbage collector
#   incorrectly deallocates storage which is still in use.
#
# make recompile
#   Recompile base.lgs and lgc.lgs into pages.c using /usr/bin/lgc
#   Useful when finding bugs in a new version of lgc or lgwam
#----------------------------------------------------------------------

src/gclgwam:	src/lgwam.c src/pages.c
		${CC} -DALWAYSGC=TRUE -o src/gclgwam src/lgwam.c
gctest:		src/gclgwam
		src/gclgwam test


RECOMPILEARG=	-r ../logiweb/: -l ../name/: \
		-p ../logiweb/:/rack.lgr -n ../name/:/rack.lgr
name/base/rack.lgr: \
		src/base.lgs
		cd src ; lgc base.lgs ${RECOMPILEARG}
name/lgc/rack.lgr: \
		src/lgc.lgs name/base/rack.lgr
		cd src ; lgc lgc.lgs ${RECOMPILEARG}
recompile:	name/lgc/rack.lgr
		cp -f name/lgc/page/bin/lgc src/lgc
		cat name/base/rack.lgr name/lgc/rack.lgr > src/pages
		cd src ; xxd -i pages pages.c

#----------------------------------------------------------------------
# Cleaning targets
#
# make almostclean
#   Cleanup, but spare distribution packages and the result of
#   selfcompilation
# make clean
#   Cleanup, but spare distribution packages
# make distclean
#   Even wipe out distribution packages
#   Distribution packages are in dist/
#   Package making targets do 'make clean' and exclude dist/
#   Thus you can run the package making targets one at a time
#   and the results will accumulate in dist/ without interfering
#   with each other
#----------------------------------------------------------------------

.PHONY: 	maintainerclean distclean clean almostclean
maintainerclean:\
		distclean
		rm -f src/pages.c
distclean:	clean
		rm -r -f dist
clean:		almostclean
		rm -r -f .self
		rm -r -f self
almostclean:
		rm -f src/lgwam
		rm -f src/lgwam.exe
		rm -f src/lgwam.exe.stackdump
		rm -f src/gclgwam
		rm -f src/gclgwam.exe
		rm -f src/gclgwam.exe.stackdump
		rm -f src/version
		rm -f src/pages
		rm -r -f name
		rm -r -f logiweb
		rm -f ${DIR}
		rm -f logiweb-${VERSION}.tar
		rm -f logiweb-${VERSION}.tar.gz
		rm -f logiweb-${VERSION}.tar.bz2
		rm -r -f fakehome
		rm -r -f rpm
		rm -r -f src/boot1
