# $Id: GNUmakefile,v 1.7 2023/12/12 22:47:56 karl Exp $
# Makefile for the mode_def collection. Public domain.

version = 4.3

default: check

testfonts = cmr5 cmtt8 cmti7 cmr10 cmti10 cmtt10 cmtt12 cmr17
%.600pk: %.600gf
	gftopk $<

%.tfm %.600gf: modes.base
	mf '&./modes \mode:=ljfour; nonstopmode; input $*'

test.ps: $(addsuffix .600pk,$(testfonts)) test.dvi
	dvips test -o 

test.dvi: $(addsuffix .tfm, $(testfonts)) test.tex
	tex test

# Upload in directory modes/ per CTAN. 
distdir = modes
distname = $(distdir)/modes.mf
dist: badnames
	test -z `rcslocks`
	rm -rf $(distdir) && mkdir $(distdir)
	expand <modes.mf | sed 's/[ 	]*$$//' >$(distname)
# ensure no trailing spaces crept into the source (sigh):
	diff modes.mf $(distname)
# these three commands are tiny shell scripts, not distributed (better to
# start with the versioned file).
	add-version $(version) $(distname)
	add-date $(distname)
	fix-checksum $(distname)
#
	cp -p ChangeLog GNUmakefile README $(distdir)/
	cp -p modedpicheck $(distdir)/
	cp -p list $(distdir)/modelist.txt
	cp -p shortlist $(distdir)/modenames.txt
	cd $(distdir) && mft ./modes.mf && pdftex ./modes.tex && rm -f *.log modes.tex
	rm -f modes.zip; zip -r modes.zip modes

# old stuff for karl.
#	mv $$HOME/mail/2modes $(archive)/$(version).mail && gzip $(archive)/$(version).mail
#	cp -p $(distname) $(archive) && gzip -f $(archive)/$(distname) && rooo
#	cp -p $(distname) $(mfsys)/modes.mf
#archive = $(HOME)/misc/archive/modes

list: modes.mf
	grep \^mode_def modes.mf | grep -v help | sed 's/\\\[//' >list

shortlist: list
	sed 's/^mode_def \(.*\) =.*$$/\1/' list >$@

badnames: shortlist
	sort $< | uniq -d
#
# don't check this any more; we don't need to limit to eight chars,
# and hitexlaptop and hitexmobile are longer.
#	gawk '{if (length ($$0) > 8) {print $0; count++} } END {exit count}' $<

dvi: modes.dvi
modes.dvi: modes.tex
	tex '\scrollmode \input modes.tex'

pdf: modes.pdf
modes.pdf: modes.tex
	texfot pdftex '\nonstopmode \input modes.tex'

modes.tex: modes.mf
	mft modes.mf

modes.base: modes.mf
	mf -ini plain input modes\; dump
	mv plain.base $@

# systematically check all modes, and some known past problems.
check: badnames modes.dvi checkx check-primitives check-modedpi \
cmr10.300pk logo10.2540gf test.ps cmbsy7.1200gf

# Check that Xerox info is included if requested. Must use -ini because
# mf.base includes modes.mf by default, and it intentionally stops
# itself from being read twice. So, for development convenience, do it
# all by hand (instead of depending on modes.base and dumping it anew
# every time). The conditional here is exactly what mktextfm does.
# 
checkx cx:
	rm -f plain.tfm
	-mf -ini '\input plain; nonstopmode; input modes; mode:=cx; if known mode_include_extra_info_available: mode_include_extra_info fi; input logo10'
	tftopl ./plain.tfm | fgrep CODING

check-mktextfm:
	rm -f logo10.tfm
	mktextfm --destdir=`pwd` logo10
# no xerox info by default:
	! (tftopl ./logo10.tfm | fgrep CODING)
#
	rm -f logo10.tfm
	env MF_MODE_EXTRA_INFO=1 mktextfm --destdir=`pwd` logo10
# xerox info if requested:
	tftopl ./logo10.tfm | fgrep CODING
# This will fail unless the new mktextfm is in PATH, and
# unless the correct modes.mf is compiled into mf.base.
# It seems like overkill to have a new option to mktextfm so we can
# specify a fake mf, something like "inimf \input plain \input modes ...".
# We'll just test after installation.

check-primitives: modes.base
# test for knuth: primitives work as designed, no Xerox info by default.
	mf "&./modes \fontmaking:=1; end"
	! (tftopl ./mfput.tfm | fgrep CODING)

check-modedpi:
	modedpicheck

gft: cmr10.600gf
	gftype -m -i ./$< >cmr10.600gft
cmr10.600gf: modes.base
	mf '&./modes \mode:=ricoh; mag:=2; input cmr10'

# Make sure write-white works.
cmr10.300pk: modes.base
	mf "&./modes \mode:=ricoh; scrollmode; input cmr10"

# cmbsy7 fails with blacker >= 3 and pixels_per_inch >= 1200.
cmbsy7.1200gf: modes.base
	mf "&./modes \mode:=lexmarkr; scrollmode; input cmbsy7"

logo10.2540gf: shortlist modes.base
	for f in `cat shortlist`; do echo $${f};			\
          mf "&./modes \mode:=$${f}; scrollmode; input logo10";	\
	done

realclean distclean clean mostlyclean:
	rm -f *gf *.gft *pk *.tfm *.pl *.ps *.log *.base *.dvi
	rm -f modes.dvi list shortlist modes.tex modes.pdf