%% Oh Emacs, this is a -*- Makefile -*-, so give me tabs.
\documentclass{article}
\usepackage{axiom}

\title{\$SPAD/src/hyper Makefile}
\author{Timothy Daly \and Gabriel Dos~Reis}

\begin{document}

\maketitle

\begin{abstract}
\end{abstract}

\tableofcontents
\eject

NOTE:

The programs \Tool{hypertex}, \Tool{htadd}, and \Tool{htsearch}, used
to be installed in [[$(axiom_target_bindir)]].  Now all executable
from HyperDoc component are installed in [[$(axiom_target_libdir)]].

\section{Environment variables}

The programs \Tool{hypertex} and \Tool{spadbuf} require either
X11 support or socket support, or both.
<<environment>>=
bin_PROGRAMS = htadd$(EXEEXT) hthits$(EXEEXT) ex2ht$(EXEEXT)
ifeq ($(strip $(axiom_use_x)),yes)
bin_PROGRAMS += hypertex$(EXEEXT) spadbuf$(EXEEXT)
endif

# this is where to put the various commands
OUTLIB=	$(axiom_target_libdir)

# this is where the include files live
INC=    $(axiom_src_srcdir)/include

# this is where the hypertex documentation files are
HYPER=$(axiom_target_datadir)/hypertex

HTADD=$(OUTLIB)/htadd

BITMAPS = mouse11.bitmap mouse11.mask sdown3d.bitmap sdown3dpr.bitmap \
	sdown.bitmap sup3d.bitmap sup3dpr.bitmap sup.bitmap ht_icon

SCRIPTS=${OUTLIB}/htsearch ${OUTLIB}/presea

BINFILES= $(addprefix $(OUTLIB)/,$(bin_PROGRAMS))

HEADERS = addfile.h cond.h dialog.h display.h event.h extent.h \
	group.h hterror.h hyper.h initx.h keyin.h lex.h mem.h \
	parse.h parse-aux.h parse-paste.h parse-types.h scrollbar.h \
	show-types.h titlebar.h token.h $(axiom_c_macros_h)


build_libdir = $(abs_top_builddir)/src/lib

hypertex_sources = addfile.c cond.c dialog.c display.c event.c extent1.c \
		extent2.c form-ext.c group.c halloc.c hash.c hterror.c \
		htinp.c hyper.c initx.c input.c item.c keyin.c lex.c \
		macro.c mem.c parse.c parse-aux.c parse-input.c \
		parse-paste.c parse-types.c ReadBitmap.c scrollbar.c \
		show-types.c spadint.c titlebar.c

libspad_la = $(axiom_target_libdir)/libspad.la

hypertex_SOURCES = $(hypertex_sources:.c=.pamphlet)
hypertex_objects = $(hypertex_sources:.c=.lo)
hypertex_LDADD = $(libspad_la)
hypertex_DEPENDENCIES =

htadd_sources = addfile.c halloc.c hash.c htadd.c hterror.c lex.c
htadd_SOURCES = $(htadd_sources:.c=.pamphlet)
htadd_objects = $(htadd_sources:.c=.lo)
htadd_LDADD = $(libspad_la)
htadd_DEPENDENCIES =

htsearch_SOURCES = search.pamphlet

spadbuf_sources = spadbuf.c
spadbuf_SOURCES = $(spadbuf_sources:.c=.pamphlet)
spadbuf_objects = $(spadbuf_sources:.c=.lo)
spadbuf_LDADD = $(libspad_la)
spadbuf_DEPENDENCIES =

hthits_sources = hthits.c
hthits_SOURCES = $(hthits_sources:.c=.pamphlet)
hthits_objects = $(hthits_sources:.c=.lo)
hthits_LDADD = $(libspad_la)
hthits_DEPENDENCIES =

ex2ht_sources = ex2ht.c
ex2ht_SOURCES = $(ex2ht_sources:.c=.pamphlet)
ex2ht_objects = $(ex2ht_sources:.c=.lo)
ex2ht_LDADD = $(libspad_la)
ex2ht_DEPENDENCIES =

pamphlets = Makefile.pamphlet $(hypertex_SOURCES) $(htadd_SOURCES) \
		$(htsearch_SOURCES) $(spadbuf_SOURCES) $(hthits_SOURCES) \
		$(ex2ht_SOURCES)
@

\section{header files}

We use a very simple and general rule to extract C source code and header
files.  The names of the corresponding files are conveniently named after
the pamphlet files.
<<header files>>=
.PRECIOUS: %.h

$(HEADERS): %.h: $(srcdir)/%.pamphlet
	$(axiom_build_document) --tangle=$*.h --output=$@ $<
@

For that naming scheme to work correctly with noweb --- the tool 
currently used by Axiom, to support its notion implementation of literate
programming --- it must be
ensured that the filenames contain only characters that can be rendered
properly by \LaTeX{} in non-math mode.  There are various ways to
ensure that, ranging from restricted character set to escaping active
characters.  We have retained the restricted character set solution.

<<objects>>=
.PRECIOUS: %.lo %.$(OBJEXT)
.PRECIOUS: %.c

%.lo: %.c $(HEADERS)
	$(COMPILE) -o $@ $(CFLAGS) ${CCF} $(axiom_includes) $(AXIOM_X11_CFLAGS) -I. $<

%.c: $(srcdir)/%.pamphlet
	$(axiom_build_document) --tangle --output=$@ $<

@


\section{bitmaps}
There are two files for each (special) character glyph, one
for the upper case form, and one for the lower case form.
For more information about hese bitmaps see 'util.ht' in the
section 'pages', below.

<<bitmaps>>=
mouse11.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=mouse11.bitmap --output=$@ $< 

mouse11.mask: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=mouse11.mask --output=$@ $< 

sdown3d.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sdown3d.bitmap --output=$@ $< 

sdown3dpr.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sdown3dpr.bitmap --output=$@ $< 

sdown.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sdown.bitmap --output=$@ $< 

sup3d.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sup3d.bitmap --output=$@ $< 

sup3dpr.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sup3dpr.bitmap --output=$@ $< 

sup.bitmap: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=sup.bitmap --output=$@ $< 

ht_icon: $(srcdir)/bitmaps.pamphlet
	$(axiom_build_document) --tangle=hticon --output=$@ $< 
@

\section{search}
<<search>>=
${OUTLIB}/htsearch: $(srcdir)/search.pamphlet
	$(axiom_build_document) --tangle=htsearch --output=$@ $<
	chmod a+x ${OUTLIB}/htsearch

${OUTLIB}/presea: $(srcdir)/search.pamphlet
	$(axiom_build_document) --tangle=presea --output=$@ $<
	chmod a+x ${OUTLIB}/presea
@

\section{ex2ht binary}
<<ex2ht (BIN)>>=
${OUTLIB}/ex2ht$(EXEEXT): $(ex2ht_objects) $(ex2ht_DEPENDENCIES)
	${LINK} -o $@ $(ex2ht_objects) $(ex2ht_LDADD) $(AXIOM_X11_LDFLAGS) -lm
@

\section{htadd binary}
<<htadd (BIN)>>=
$(OUTLIB)/htadd$(EXEEXT): $(htadd_objects) $(htadd_DEPENDENCIES)
	${LINK} -o $@ $(htadd_objects) $(htadd_LDADD) $(AXIOM_X11_LDFLAGS) -lm
@

\section{hthits binary}
<<hthits (BIN)>>=
${OUTLIB}/hthits$(EXEEXT): $(hthits_objects) $(hthits_DEPENDENCIES)
	${LINK} -o $@ $(hthits_objects) $(hthits_LDADD) $(AXIOM_X11_LDFLAGS) -lm

@

\section{hypertex binary}
<<hypertex (BIN)>>=
$(OUTLIB)/hypertex$(EXEEXT): $(hypertex_objects) $(hypertex_DEPENDENCIES)
	 ${LINK} -o $@ $(hypertex_objects) $(hypertex_LDADD) \
		$(AXIOM_X11_LDFLAGS) -lm
@

\section{spadbuf binary}
<<spadbuf (BIN)>>=
${OUTLIB}/spadbuf$(EXEEXT): $(spadbuf_objects) $(spadbuf_DEPENDENCIES)
	${LINK} -o $@ $(spadbuf_objects) $(spadbuf_LDADD) \
		$(AXIOM_X11_LDFLAGS) -lm
@

\section{pages}
The 'ht.db' is built when pages from 'src/hyper/pages' such as 'util.ht'
and 'util.pht' are installed in the target directory. Because the .db
file must be kept in sync with the page filesof course care must be
taken not to overwrite these files at a later time without re-building
the database.

The Axiom system from which this branch had been made appears 
to contain a redundant copy of util.ht. Removing the version of
'util.ht' in 'src/share/doc/hypertex/pages/util.ht' would make
Makefile logic simpler so it has been removed to minimize problems
when this file is updated.

The [[.pht]] files contain hardcoded pathnames to viewport directories
in the installed system.  Of course, that is asking for trouble.  During
installation, we must change those paths to reflect the correct
location of the viewports.  That necessary step is implemented
as:
\begin{verbatim}
             for A in `ls *.pht`; do \
                sed 's,/doc/viewports/,/share/viewports/,g' $$A \
                                        > ${HYPER}/pages/$$A; \
             done
\end{verbatim}

In the long term, the [[.pht]] and viewports should be generated at either
build time or installation time using commands like:
\begin{verbatim}
             rm -f ht.db
             ${HTADD} *.ht
             for A in `ls *.ht`; do ${SMAN} -paste $$a ; done
             rm -f ht.db
             ${HTADD} *.ht *.pht
\end{verbatim}

On case-insensitive filesytems such as Windows and traditional Mac
checkout from the source archive can fail if files have names
differing only in case: poly.ht contra POLY.ht and
poly.pht contra POLY.pht. To avoid conflicts on case-insensitive
filesytems we renamed [[poly.ht]] to [[polys.ht]] and [[poly.pht]]
to [[polys.pht]].

The page [[util.ht]] refers to two files for each (special) character
glyph, one for the upper case form, and one for the lower case form.
The names for these files avoid the use of upper and lower letters
to distinguish these forms. Intstead we use 'xxx.bitmap' for lower case
and 'xxx-cap.bitmap' for upper case, where "xxx" is the common name for
the glyth. For example alpha.bitmap and alpha-cap.bitmape.

We need to make sure that [[ht.db]], the hypertex database file
is up to date. The file contains absolute offsets into the various
[[ht]] and [[pht]] files so it must reflect the current pages. In
order to do this we run [[htadd]] in the [[${HYPER}/pages]] directory.
<<pages>>=
${HYPER}/pages/ht.db: $(HTADD) $(srcdir)/pages/*.ht $(srcdir)/pages/*.pht
	@echo making ${HYPER}/pages from $(axiom_src_srcdir)/pages directory
	@ mkdir -p ${HYPER}/pages
	@ cp -pr $(srcdir)/pages/*.ht ${HYPER}/pages
	@ for A in `ls $(srcdir)/pages/*.pht`; do \
	     sed 's,/doc/viewports/,/share/viewports/,g' $$A \
			> ${HYPER}/pages/`basename $$A`; \
	     done
	@ rm -f ${HYPER}/pages/ht.db ; \
          rm -f ${HYPER}/pages/*~ ; AXIOM=$(AXIOM) \
	  ${HTADD} -s ${HYPER}/pages/*.ht ${HYPER}/pages/*.pht
	@ cp -pr $(srcdir)/bitmaps ${HYPER}
	@ cp -pr $(srcdir)/viewports $(axiom_target_datadir)

@

<<*>>=
<<environment>>

subdir = src/hyper/

.PHONY: all all-hyper
.SUFFIXES:
.SUFFIXES: .c .o .h

all: all-ax

all-ax all-hyper: stamp
	@ echo finished $(builddir)

stamp: $(HEADERS) ${BITMAPS} ${SCRIPTS} ${BINFILES} ${HYPER}/pages/ht.db  
	-rm -f stamp
	$(STAMP) stamp

mostclean-local:

clean-local: mostclean-local
	-rm -f $(objects)
	-rm -f $(hypertex_sources)
	-rm -f $(htadd_sources)
	-rm -f $(htsearch_sources)
	-rm -f $(spadbuf_sources)
	-rm -f $(hthits_sources)
	-rm -f $(ex2ht_sources)
	-rm -f $(BINFILES)

distclean-local: clean-local

<<header files>>

<<objects>>

<<bitmaps>>

<<pages>>

<<search>>

<<ex2ht (BIN)>>

<<htadd (BIN)>>

<<hthits (BIN)>>

<<hypertex (BIN)>>

<<spadbuf (BIN)>>
@
\eject
\begin{thebibliography}{99}
\bibitem{1} nothing
\end{thebibliography}
\end{document}