# Makefile for web2c, a port of TeX, Metafont, and friends --karl@cs.umb.edu.
version = 6.1

# The following make definitions (down to `end of installation
# directories') are repeated in several Makefiles, because different
# installations like to change them at different levels. If you edit the
# top-level Makefile, the changes should propagate, however.
# 
# The following define installation directories. The default paths are
# defined in kpathsea/paths.h, which is built from kpathsea/paths.h.in.
# See kpathsea/INSTALL for a description of how the various path-related
# files are used and created.

# Generic installation directories.
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = $(exec_prefix)/bin
scriptdir = $(bindir)
libdir = $(exec_prefix)/lib
datadir = $(prefix)/lib
infodir = $(prefix)/info
includedir = $(prefix)/include
manext = 1
mandir = $(prefix)/man/man$(manext)

# TeX & MF-specific directories. Not all of the following are relevant
# for all programs, but it seems cleaner to collect everything in one place.

# The default paths are now in kpathsea/Makefile.in. Passing all the
# paths to sub-makes can make the arg list too long on system V.

# The root of the tree.
texmf_prefix = $(datadir)/texmf

# TeX and MF source files.
texinputdir = $(texmf_prefix)/tex
mfinputdir = $(texmf_prefix)/mf

# The top-level font directory.
fontdir = $(texmf_prefix)/fonts

# Where memory dumps are installed.
fmtdir = $(texmf_prefix)/ini
basedir = $(fmtdir)

# Pool files.
texpooldir = $(texmf_prefix)/ini
mfpooldir = $(texpooldir)

# The PostScript TFM and VF files get installed in subdirectories of
# this directory, named for the typeface families of these directories.
psfontdir = $(fontdir)/adobe

# Where the configuration files get installed.
dvips_prefix = $(texmf_prefix)/dvips
configdir = $(dvips_prefix)

# Where the PostScript prologues go.
headerdir = $(configdir)

# Where dvips' TeX macro files get installed.
psmacrodir = $(texinputdir)/dvips

# If a font can't be found close enough to its stated size, we look for
# each of these sizes in the order given.  This colon-separated list is
# overridden by the envvar TEXSIZES, and by a program-specific variable
# (e.g., XDVISIZES), and perhaps by a config file (e.g., in dvips).
default_texsizes = 300:600

# End of installation directory definitions.

# These lines define the format and base files that `make fmts' and
# `make bases' will try to make, and `make install-fmts' and `make
# install-bases' will try to install.  See `README' for a brief
# description of each of these formats.
bases = mf.base cmmf.base
fmts = tex.fmt latex.fmt
# slitex.fmt etex.fmt amslatex.fmt amstex.fmt texinfo.fmt
# inrstex.fmt picplus.fmt

# The name of the file that defines your local devices, for use with
# Metafont.  (Only relevant during `make bases'.)  I urge you to get the
# file `modes.mf', which defines all known modes, plus useful
# definitions for all fonts.  It's available from ftp.cs.umb.edu as
# pub/tex/modes.mf, among other places.
localmodes = modes


# Compilation options.
DEFS = $(XDEFS)

# CFLAGS is used for both compilation and linking.
CFLAGS = $(XCFLAGS)

# Do not override CPPFLAGS; change CFLAGS or DEFS instead.
CPPFLAGS = $(XCPPFLAGS) -I. -I$(srcdir) -I$(kpathsea_parent) \
           $(x_include_flags) $(DEFS) 
.c.o:
	$(CC) $(CPPFLAGS) $(CFLAGS) -c $<

# Linking.
LDFLAGS = $(CFLAGS) $(XLDFLAGS)
LOADLIBES = $(kpathsea) $(x_libs) $(LIBS) -lm $(x_extra_libs)

# This is so kpathsea will get remade automatically if you change
# something in it and recompile from the package directory.
kpathsea_parent = ..
kpathsea_dir = $(kpathsea_parent)/kpathsea
kpathsea_srcdir_parent = $(srcdir)/..
kpathsea_srcdir = $(kpathsea_srcdir_parent)/kpathsea
kpathsea = $(kpathsea_dir)/kpathsea.a

CC = @CC@

LEX = @LEX@
LEXLIB = @LEXLIB@
YACC = @YACC@

# Command to link an executable.
CCLD = $(CC)
RANLIB = @RANLIB@
LN = @LN_S@

# Make `#include <X11/...>' and `-lX...' work.
# wlibs is substituted by web2c's configure, LIBS by general configure
# routines, and the others by AC_PATH_XTRA.
x_include_flags = @X_CFLAGS@
x_lib_flags = @X_LIBS@
x_extra_libs = @X_EXTRA_LIBS@
wlibs = @wlibs@
LIBS = @LIBS@ $(extralibs)

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@

SHELL = /bin/sh
srcdir = @srcdir@
VPATH = @srcdir@


# 
# Things below here not changed by configure.

# What to do by default.
default: programs
.PHONY: default

# Where we need to make things.
# 
triptrapdirs = dviutil fontutil
progdirs = $(triptrapdirs) tex mf bibtex web
alldirs = $(progdirs) lib man web2c

# What to pass to subdirectories when making various things.
# $(MAKEARGS) is for the user.
makeargs=$(MFLAGS) SHELL='$(SHELL)' CC='$(CC)' CFLAGS='$(CFLAGS)'	\
  RANLIB='$(RANLIB)' LN='$(LN)' DEFS='$(DEFS)'                          \
  CCLD='$(CCLD)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' 			\
  x_extra_libs='$(x_extra_libs)' x_include_flags='$(x_include_flags)'	\
  x_lib_flags='$(x_lib_flags)' $(MAKEARGS) 
web2cmakeargs=$(makeargs) YACC='$(YACC)' LEX='$(LEX)' LEXLIB='$(LEXLIB)'
installargs=$(makeargs) 						\
  INSTALL_DATA='$(INSTALL_DATA)'					\
  INSTALL_PROGRAM='$(INSTALL_PROGRAM)'					\
  bindir=$(bindir)							\
  fontdir=$(fontdir)							\
  texpooldir=$(texpooldir)						\
  mfpooldir=$(mfpooldir)


# The TeX and Metafont torture tests.
triptrap: trip trap
.PHONY: triptrap

common-trip: do-tangle
	for name in $(triptrapdirs); do					\
          (cd $${name}; $(MAKE) $(makeargs) triptrap); done

check run-triptrap: run-trip run-trap
.PHONY: check run-triptrap

clean-triptrap: clean-trip clean-trap
.PHONY: clean-triptrap


run-trip: trip
	cd tex; $(MAKE) $(makeargs) run-trip
.PHONY: run-trip

trip: common-trip
	cd tex; $(MAKE) $(makeargs) triptrap
.PHONY: trip

clean-trip: 
	cd tex; $(MAKE) clean-trip
.PHONY: clean-trip


run-trap: trap
	cd mf; $(MAKE) $(makeargs) run-trap
.PHONY: run-trap

trap: common-trip
	cd mf; $(MAKE) $(makeargs) triptrap
.PHONY: trap

clean-trap:
	cd mf; $(MAKE) clean-trap
.PHONY: clean-trap


# 
# The following targets build production TeX and MF.

all: programs manpages formats
.PHONY: all

programs: do-tangle
	for d in $(progdirs); do (cd $$d; $(MAKE) $(makeargs) all); done
.PHONY: programs

TeX:	do-tangle
	cd tex; $(MAKE) $(makeargs) all
.PHONY: TeX

MF:	do-tangle
	cd mf; $(MAKE) $(makeargs) all
.PHONY: MF

BibTeX: do-tangle
	cd bibtex; $(MAKE) $(makeargs) all
.PHONY: BibTeX


do-tangle: do-web2c
	cd web; $(MAKE) $(makeargs) tangle
.PHONY: do-tangle

do-web2c: do-kpathsea do-lib
	cd web2c; $(MAKE) $(web2cmakeargs) all
.PHONY: do-web2c

do-kpathsea: $(kpathsea_srcdir)/*.c $(kpathsea_srcdir)/*.h
	cd $(kpathsea_dir); $(MAKE) $(makeargs)
.PHONY: do-kpathsea

do-lib: $(srcdir)/lib/*.c
	cd lib; $(MAKE) $(makeargs) all
.PHONY: do-lib


c-sources: do-tangle
	for d in $(progdirs); do (cd $$d; $(MAKE) $(makeargs) c-sources); done
.PHONY: c-sources

manpages: $(kpathsea_dir)/paths.h
	cd man; $(MAKE) bindir=$(bindir) texdatadir=$(texdatadir)	\
		texpooldir=$(texpooldir) fmtdir=$(fmtdir)		\
		texinputdir=$(texinputdir) fontdir=$(fontdir)		\
		mfdatadir=$(mfdatadir) mfpooldir=$(mfpooldir)		\
		basedir=$(basedir) mfinputdir=$(mfinputdir)		\
                localmodes='$(localmodes)'				\
                all
.PHONY: manpages

formats: bases fmts
.PHONY: formats

bases: MF
	cd mf; \
          $(MAKE) $(makeargs) bases="$(bases)" localmodes='$(localmodes)' bases
.PHONY: bases

fmts: TeX
	cd tex; $(MAKE) $(makeargs) fmts="$(fmts)" fmts
.PHONY: fmts


# 
# Installation targets.

install: install-exec install-data
.PHONY: install
install-data: install-fmts install-bases install-manpages
	for name in $(progdirs); do					\
          (cd $${name}; $(MAKE) $(installargs) install-data);		\
        done
.PHONY: install-data

install-exec: programs
	$(SHELL) $(srcdir)/../mkdirchain $(bindir)
	for name in $(progdirs); do					\
          (cd $${name}; $(MAKE) $(installargs) install-exec);		\
        done
	for f in $(fmts); do						\
	  rm -f $(bindir)/`basename $$f .fmt`;				\
          cp -p $(bindir)/virtex $(bindir)/`basename $$f .fmt`;		\
	done
	for f in $(bases); do						\
	  rm -f $(bindir)/`basename $$f .base`;				\
	  cp -p $(bindir)/virmf $(bindir)/`basename $$f .base`;		\
	done
.PHONY: install-exec

install-fmts: fmts
	$(SHELL) $(srcdir)/../mkdirchain $(fmtdir)
	for f in $(fmts); do						\
          $(INSTALL_DATA) tex/$$f $(fmtdir)/$$f;			\
	done
	cd $(fmtdir); rm -f plain.fmt; cp -p tex.fmt plain.fmt
.PHONY: install-fmts

install-bases: bases
	$(SHELL) $(srcdir)/../mkdirchain $(basedir)
	for f in $(bases); do						\
          $(INSTALL_DATA) mf/$$f $(basedir)/$$f;			\
	done
	cd $(basedir); rm -f plain.base; cp -p mf.base plain.base
.PHONY: install-bases

install-manpages: manpages
	cd man; $(MAKE) $(installargs)					\
           mandir=$(mandir) manext=$(manext) install
.PHONY: install-manpages


# 
# Other targets.


# We can't make useful tags files out of the web sources, more's the pity.
TAGS:

# Prevent GNU make 3 from overflowing arg limit on system V.
.NOEXPORT:

# Need GNU tar for this.
distname = web2c
program_files = PROBLEMS
program_rm = */Makefile
version_files = lib/version.c

pre-dist-$(distname):
	cd lib; $(MAKE) c-auto.h.in
	cd web2c; $(MAKE) lex.yy.c y.tab.c
	cd web; $(MAKE) tangleboot.c
# Save the subdir list for the next command.
	find * -type d -print | sed '/$(top_distdir)/d' >/tmp/subdir

post-dist-$(distname):
# Make the subdirectories.
	for d in `cat /tmp/subdir`; do \
	  mkdir -p $(top_distdir)/$(distname)/$$d; done
#
# Link files in subdirectories.
	dirs="`grep -v / /tmp/subdir`";         \
	for f in `find $$dirs                   \
                       \(    -name README       \
                          -o -name .gdbinit     \
                          -o -name ChangeLog    \
                          -o -name MakeTeX\*    \
                          -o -name convert      \
                          -o -name tr\*penv     \
                          -o -name \*.add       \
                          -o -name \*.ch        \
                          -o -name \*.defines   \
                          -o -name \*.in        \
                          -o -name \*.lex       \
                          -o -name \*.man       \
                          -o -name \*.map       \
                          -o -name \*.sed       \
                          -o -name \*.sok       \
                          -o -name \*.start     \
                          -o -name \*.yacc      \
                       \) -print`; do           \
          cp -p $$f $(distdir)/`dirname $$f`;	\
        done
	cp -p lib/*.c lib/*.h $(distdir)/lib
	rm -f lib/c-auto.h
	cp -p mf/MFwindow/*.c $(distdir)/mf/MFwindow
	rm -f mf/MFwindow/x11.c mf/MFwindow/sun.c
	cp -p mf/MFtrap/trap.* mf/MFtrap/trapin.log mf/MFtrap/trapman.tex \
	  $(distdir)/mf/MFtrap
	cp -p fontutil/gftodmem.h $(distdir)/fontutil
	cp -p tex/TeXtrip/trip.* tex/TeXtrip/tripin.log \
           tex/TeXtrip/tripman.tex tex/TeXtrip/tripos.tex \
	  $(distdir)/tex/TeXtrip
	for d in tex mf bibtex; do rm -f $(distdir)/$$d/c$$d.ch; done
	cp -p web/tangleboot.* $(distdir)/web
	rm -f $(distdir)/web/tangleboot.o
	cp -p web2c/*.c web2c/*.h $(distdir)/web2c
	(cd $(distdir)/web2c; mv y.tab.c y.tab.c-dist; \
	  mv y.tab.h y.tab.h-dist; \
	  mv lex.yy.c lex.yy.c-dist)
	cd $(distdir); ungnumake */Makefile.in */*/Makefile.in
top_distdir = $(distname)-$(version)
top_files = ChangeLog Makefile.in configure configure.in README \
  $(HOME)/gnu/gnuorg/COPYING* $(HOME)/bin/mkdirchain \
  $(plain)/texinfo.tex
distdir = $(top_distdir)/$(distname)
kpathsea_distdir = ../$(distname)/$(top_distdir)/kpathsea
ln_files = AUTHORS ChangeLog INSTALL MACHINES NEWS README TAGS *.in *.h *.c \
  configure *.make .gdbinit

dist: pre-dist-$(distname)
	rm -rf $(top_distdir)*
	mkdir -p $(distdir)
	cd ..; cp -p $(top_files) $(distname)/$(top_distdir)
	cd ..; echo >>$(distname)/$(top_distdir)/ChangeLog
	cd ..; cat kutil/ChangeLog >>$(distname)/$(top_distdir)/ChangeLog
	-cp -p $(ln_files) $(distdir)
	cp -p $(program_files) $(distdir)
	cd $(kpathsea_dir); $(MAKE) distdir=$(kpathsea_distdir) \
	  ln_files='$(ln_files)' distdir
	ungnumake $(distdir)/Makefile.in $(kpathsea_distdir)/Makefile.in \
	  $(top_distdir)/Makefile.in
# *.make gets us depend.make.
	rm -f $(distdir)/*.make $(kpathsea_distdir)/*.make
	cd $(distdir); rm -f c-auto.h $(program_rm)
	$(MAKE) post-dist-$(distname)
	cd $(distdir); add-version $(version) $(version_files)
	chmod -R a+rw $(top_distdir)
	GZIP=-9 tar czf $(top_distdir). $(top_distdir)
	rm -rf $(top_distdir)



# I define $(autoconf) to acgeneral.m4 and the other Autoconf files, so
# configure automatically gets remade with a new Autoconf release.  But
# since some people do not have AC installed, I take out the variable
# $(autoconf) definition before release.
configure_in = $(srcdir)/configure.in $(srcdir)/../kpathsea/common.ac
$(srcdir)/configure: $(configure_in) $(autoconf)
	cd $(srcdir); autoconf

config.status: $(srcdir)/configure
	$(SHELL) $(srcdir)/configure --no-create --verbose

Makefile: $(srcdir)/Makefile.in config.status
	$(SHELL) config.status

# This rule isn't used for web2c or the top-level Makefile, but it
# doesn't hurt.  We don't depend on config.status because configure
# always rewrites config.status, even when it doesn't change. Thus it
# might be newer than c-auto.h when we don't need to remake the latter.
c-auto.h: $(srcdir)/c-auto.h.in
	$(SHELL) config.status

web-dist:
	rm -rf $(top_distdir)
	mkdir -p $(top_distdir)/$(distname)
	cd $(top_distdir)/$(distname); \
          mkdir `cd ../..; find -name \*.web -exec dirname '{}' \; | uniq`
	for d in `find . -name $(distdir) -prune -o -name \*.web -print` ; do\
          cp -p $$d $(distdir)/`dirname $$d`;				\
        done
	GZIP=-9 tar czf web-$(version). $(top_distdir)
	rm -rf $(top_distdir)

web/tangleboot.c:
	cd web; $(MAKE) tangleboot.c


mostlyclean clean distclean extraclean realclean::
	for name in $(alldirs); do (cd $${name}; $(MAKE) $@); done

realclean distclean::
	rm -f Makefile config.status config.log config.cache

extraclean::
	rm -f *~ *\#* patch* *.orig *.rej core a.out *.i *.s
	rm -f *log *gf *pk *.tfm *.pl *.dvi

configclean:
	rm -f configure lib/c-auto.h.in lib/c-auto.h

# 
# Local variables:
# page-delimiter: "^# \f"
# End:
