# Makefile for documentation
# 
# Generally called from the top level Makefile with 'make docs'
#
# If you want to run this manually, you'll have to set your variable
# properly:  'make KVER=2.0.35 LINGUA=C RELEASE=2.1 DEB_VERSION=test	\
#		DATE="`date`" architecture=i386'

# fdisk documentation to include (varies per platform)
FDISK_DOCS	:= $(shell grep fdisk 					\
			../scripts/rootdisk/SMALL_BASE_LIST_$(architecture)\
			| sed -e 's/^.*\/\(.*\)/\1.txt/')

# set extension of source/dest files based on LINGUA
ifeq ($(LINGUA),C)
SRCEXT		:=
DESTEXT		:= .en
else
SRCEXT		:= .$(LINGUA)
DESTEXT		:= .$(LINGUA)
endif

# programs for creating output
DEBIANDOC2HTML	:= debiandoc2html -l $(LINGUA) -c -d /usr/lib/sgml/declaration/debiandoc.decl
DEBIANDOC2PS	:= debiandoc2ps -l $(LINGUA) -d /usr/lib/sgml/declaration/debiandoc.decl
DEBIANDOC2TEXT	:= debiandoc2text -l $(LINGUA) -d /usr/lib/sgml/declaration/debiandoc.decl
DEBIANDOC2LATEX	:= debiandoc2latex2e -l $(LINGUA) -d /usr/lib/sgml/declaration/debiandoc.decl

# maximum times we're willing to run TeX to get cross-references right
MAX_TEX_RECURSION	:= 5

# documents to build
TARGETDOCS	:= install$(DESTEXT).txt install$(SRCEXT).html/install$(DESTEXT).html 	\
		   dselect-beginner$(SRCEXT).html/dselect-beginner$(DESTEXT).html	\
		   dselect-beginner$(DESTEXT).txt $(FDISK_DOCS)

# you might want to remove this if it is failing for you
TARGETDOCS	+= install$(DESTEXT).pdf


# just an unreasonable default
DESTDIR		:= /tmp

install_file	:= install -m 644 -p
makedir		:= mkdir -m 0755

# needed for dynamic.ent target
DATEFORM_hr	:= %-d. %-m. %Y.
ifeq ($(DATEFORM_$(LINGUA)),)
DATEFORM_$(LINGUA) := %d %B, %Y
endif

DEB_VERSION	:= $(shell cd .. && LC_ALL=C dpkg-parsechangelog |	\
			grep '^Version: ' | sed 's/^Version: *//')
DATE		:= $(shell cd .. && date --date="`dpkg-parsechangelog |	\
			grep '^Date: ' | sed 's/^Date: *//'`" \
			'+$(strip $(DATEFORM_$(LINGUA)))')

DINSTALL_DIR	:= ../utilities/dinstall

# derived entity files
DERIVED_ENTS	:= messages.ent dynamic.ent

.PHONY:	default
default:	supplemental_makefile $(TARGETDOCS)

.PHONY:	test
test:
	@echo TARGETDOCS: $(TARGETDOCS)
	@echo util-linux is at: $(util-linux)

.PHONY:	supplemental_makefile
supplemental_makefile:
	[ ! -f $(LINGUA)/Makefile ] || $(MAKE) -C $(LINGUA)

.PHONY:	all-arches
all-arches:	default							\
		release-notes$(SRCEXT).html/index.html release-notes$(DESTEXT).txt\
		all-messages.ent
	[ -d arch/$(architecture) ] || mkdir -p arch/$(architecture)
	$(install_file) install$(SRCEXT).html/*				\
		install$(DESTEXT).txt dselect-beginner$(DESTEXT).txt	\
		dselect-beginner$(SRCEXT).html/* arch/$(architecture)/
	[ ! -f install$(DESTEXT).pdf ] ||				\
	    $(install_file) install$(DESTEXT).pdf arch/$(architecture)/
	[ -d arch/$(architecture)/release-notes ] ||			\
		mkdir -p arch/$(architecture)/release-notes
	$(install_file) release-notes$(SRCEXT).html/*			\
	    arch/$(architecture)/release-notes/
	mv release-notes$(DESTEXT).txt					\
	    arch/$(architecture)/release-notes/index$(DESTEXT).txt
	@# setting our nice content-negotiation symlinks
	set -e								;\
	for file in `find arch/$(architecture) -name '*.en.*'`; do	\
	    ln -sf `echo $$file | sed -e 's/^.*\///'` 			\
		   `echo $$file | sed -e 's/\.en//'`			;\
	done
	[ -d arch/source ] || mkdir -p arch/source
	$(install_file) dynamic.ent arch/source/dynamic.ent.$(architecture)
	@# repetitive
	$(install_file) *.sgml *.ent ChangeLog README-authors arch/source/
	tar c --exclude CVS `find . -maxdepth 1 -type d -name '??'`	\
	    | tar x -C arch/source/

.PHONY:	mirror-to-master
mirror-to-master:
	[ -d arch ]
	rsync -rltDgvz --rsh ssh --exclude 'powerpc' arch/		\
	  master.debian.org:/org/www.debian.org/debian.org/releases/slink/

install$(SRCEXT).html/install$(DESTEXT).html:	install$(SRCEXT).sgml	\
					$(DERIVED_ENTS) defaults.ent
	$(DEBIANDOC2HTML) -t install $<

install$(DESTEXT).txt:	install$(SRCEXT).sgml defaults.ent $(DERIVED_ENTS)
	$(DEBIANDOC2TEXT) -O $< > $@

install$(DESTEXT).ps:	install$(SRCEXT).sgml defaults.ent $(DERIVED_ENTS)
	$(DEBIANDOC2PS) -O $< > $@

install$(DESTEXT).tex:	install$(SRCEXT).sgml defaults.ent $(DERIVED_ENTS)
	$(DEBIANDOC2LATEX) -O $< > $@

%.pdf:	%.tex
#	 note that I have seen bi-stable .aux files, thus we check two levels deep
	-cp -pf prior.aux pprior.aux
	-cp -pf $(shell basename $< .tex).aux prior.aux
#	 fail if we don't have pdflatex correctly installed
	kpsewhich pdflatex.fmt > /dev/null
#	 due to a bug in debiandoc2latex2e output, this might fail
	-pdflatex '\nonstopmode\input{$<}'
	set -e								;\
	if ! cmp $(shell basename $< .tex).aux prior.aux &&		\
	   ! cmp $(shell basename $< .tex).aux pprior.aux &&		\
	   expr $(MAKELEVEL) '<' $(MAX_TEX_RECURSION); then		\
		rm -f $@						;\
		$(MAKE) $@						;\
	fi
	rm -f prior.aux pprior.aux

dselect-beginner$(SRCEXT).html/dselect-beginner$(DESTEXT).html:		\
		dselect-beginner$(SRCEXT).sgml defaults.ent $(DERIVED_ENTS)
	$(DEBIANDOC2HTML) -t dselect-beginner $<

dselect-beginner$(DESTEXT).txt:	dselect-beginner$(SRCEXT).sgml defaults.ent	\
			$(DERIVED_ENTS)
	$(DEBIANDOC2TEXT) -O $< > $@

dselect-beginner$(DESTEXT).ps:	dselect-beginner$(SRCEXT).sgml defaults.ent	\
			$(DERIVED_ENTS)
	$(DEBIANDOC2PS) $<

dselect-beginner$(DESTEXT).tex:	dselect-beginner$(SRCEXT).sgml defaults.ent	\
			$(DERIVED_ENTS)
	$(DEBIANDOC2LATEX) -O $< > $@

release-notes$(SRCEXT).html/index.html:	release-notes$(SRCEXT).sgml 		\
			defaults.ent $(DERIVED_ENTS)
	$(DEBIANDOC2HTML) $<

release-notes$(DESTEXT).txt:	release-notes$(SRCEXT).sgml defaults.ent	\
			$(DERIVED_ENTS)
	$(DEBIANDOC2TEXT) -O $< > $@

cfdisk.txt:
	-[ -f "$(util-linux)" ] && (					\
	  dpkg --fsys-tarfile $(util-linux) |				\
		tar -xOf - '*/man8/cfdisk.8.gz' | zcat > tmp		;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

fdisk.txt:
	-[ -f "$(util-linux)" ] && (					\
	  dpkg --fsys-tarfile $(util-linux) |				\
		tar -xOf - '*/man8/fdisk.8.gz' | zcat > tmp		;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

atari-fdisk.txt:
	-[ -f "$(atari-fdisk)" ] && (					\
	  dpkg --fsys-tarfile $(atari-fdisk) |				\
		tar -xOf - '*/man8/atari-fdisk.8.gz' | zcat > tmp	;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

amiga-fdisk.txt:
	-[ -f "$(amiga-fdisk)" ] && (					\
	  dpkg --fsys-tarfile $(amiga-fdisk) |				\
		tar -xOf - '*/man8/amiga-fdisk.8.gz' | zcat > tmp	;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

mac-fdisk.txt:
	-[ -f "$(mac-fdisk)" ] && (					\
	  dpkg --fsys-tarfile $(mac-fdisk) |				\
		tar -xOf - '*/man8/pdisk.8.gz'  | zcat > tmp	;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

pmac-fdisk.txt:
	-[ -f "$(pmac-fdisk-cross)" ] && (				\
	  dpkg --fsys-tarfile $(pmac-fdisk-cross) |			\
		tar -xOf - '*/man8/pdisk.8.gz'  | zcat > tmp		;\
	  man -l tmp | col -b > $@					;\
	  rm -f tmp							;\
	)
	[ -f $@ ] || echo '** man page not found ** ' > $@

.PHONY:	install
install:	default
	$(install_file) $(TARGETDOCS)					\
		$(wildcard dselect-beginner$(SRCEXT).html/*		\
		install$(SRCEXT).html/*) $(DESTDIR)

.PHONY:	clean
clean:
	rm -rf arch
	rm -f $(DERIVED_ENTS)
	rm -f $(TARGETDOCS)
	rm -rf install*.html dselect-beginner*.html release-notes*.html
	rm -f *fdisk*.txt release-notes*.txt dselect-beginner*.txt install*.txt
	rm -f messages*.ent
	rm -f *~ *.log *.aux *.bak *.out *.sasp *.toc *.tex *.dvi *.pdf *.ps
	set -e ; for dir in `find . -type d -mindepth 1 -maxdepth 1`; do\
	    [ ! -f $$dir/Makefile ] || $(MAKE) -C "$$dir" $@		;\
	done

.PHONY:	distclean
distclean: clean

.PHONY:	validate
validate:	$(DERIVED_ENTS)
	set -e; for i in *.sgml; do					\
	  nsgmls -wall -s -E20 $$i.sgml					;\
	done

.PHONY: dynamic.ent
dynamic.ent: ../debian/changelog Makefile
#	entities which are dynamically defined by the settings of this build
#	run, generally set in the top-level makefile
ifeq ($(architecture),)
	@echo "error: invoke '$(MAKE) docs' from top level Makefile"
	exit 1
endif
#	 to avoid false dependancy rebuilds, we try to be a bit tricky,
#	 keeping the previous copy around and moving it back if there's no difference
	[ ! -f $@ ] || mv -f $@ $@.old
	: > $@			# clear the file
	echo "<!entity docversion    \"$(DEB_VERSION)\">" >> $@
	echo "<!entity docdate       \"$(DATE)\">" >> $@
	echo "<!entity language      \"$(LINGUA)\">" >> $@
	echo "<!entity release       \"$(RELEASE)\">" >> $@
	echo "<!entity kernelversion \"$(KVER)\">" >> $@
	echo "<!entity altkernelversion \"$(ALTKVER)\">" >> $@
	echo "<!entity architecture  \"$(architecture)\">" >> $@
	echo "<!entity % $(architecture) \"INCLUDE\">" >> $@
	echo "<!entity % lang-$(LINGUA) \"INCLUDE\">" >> $@
	set -e; for i in $(FDISK_DOCS); do			\
		echo "<!entity % $$i \"INCLUDE\">" >> $@	;\
	done
#	 now test if the new version is in fact the same
	set -e; if cmp $@ $@.old; then				\
		mv -f $@.old $@					;\
		echo dynamic.ent has no changes			;\
	else							\
		rm -f $@.old					;\
	fi

# all messages.ent files
all-messages.ent:
	set -e							;\
	for file in $(DINSTALL_DIR)/messages/lang_*.h; do	\
	  lang=`basename $$file | sed -e 's/lang_//; s/\.h//;'`	;\
	  ./cpp2sgml $$file > messages_$$lang.ent		;\
	done

messages.ent:	$(DINSTALL_DIR)/messages/lang_$(LINGUA).h cpp2sgml
#	entities which are dynamically defined from the dinstall messages
	./cpp2sgml $(DINSTALL_DIR)/messages/lang_$(LINGUA).h > $@

# in case LINGUA isn't set, give a decent err message
$(DINSTALL_DIR)/messages/lang_.h:
	@echo LINGUA is not set -- see the documentation at the top of this Makefile
	exit 1

install$(SRCEXT).sgml: defaults.ent $(DERIVED_ENTS)
